Jump to content
  • Advertisement
Sign in to follow this  
AhmedCoeia

setting the displacement between snake segments

This topic is 1784 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I have a problem in maths or I do not know. I have drawn few circles that simulates the body of a snake, the head of the snake moves and others should follow. but the is no offset or displacement between the circles, because the current code sets the previous position of the nodes to the current, when I add few numbers to both x, y axis, the body segments get distorted. How do I set the offsets between the segments?

each frame

for ( int i = nodes.size()-1 ; i >=0; --i )
{


if ( i != 0 )
{
// Here Do not think about offset. just follow old position of next snake part
nodes[i].m_Pos.x = nodes[i-1].m_Pos.x ;
nodes[i].m_Pos.y = nodes[i-1].m_Pos.y ;
}
 
}


nodes[0].m_Pos.x-=(nodes[0].m_Vel.x);
nodes[0].m_Pos.y-=(nodes[0].m_Vel.y);

 

Share this post


Link to post
Share on other sites
Advertisement

Could you explain how exactly the body of the snake gets distorted?

 

In case the snake is constantly moving, in each loop the only node that gets updated properly is the nodes[1] the rest will get older values(each loop will update nodes with nodes[i-1]'s previous value instead of nodes[i-1]) because you loop from the bottom of the snake instead of it's head. (If your snake would stopped moving, after nodes.size() amount of frames the snake would get back together)

No, that's the way it is supposed to be happy.png but you're wasting the first node.size()-1 repeats of the loop/frame

 

In your code you have setted c.vy = 0; so when you use circles[0].yPosition-=circles[0].vy*(2*5); it doesnt really do anything cause this is always circles[0].yPosition-=0. 

 

So you are currently only moving horrizontally.

 

 

Moreover, the following loop wouldn't work with the way you update the circles[0]'s position: (The circles wouldnt stay chainned)

 

for ( var i:int =4; i>0; i--)

{

                circles[i].xPosition = circles[i-1].xPosition;

                circles[i].yPosition = circles[i-1].yPosition;

}

 

// update circles[0] position

 

 

To fix the current way you handle the snake's head movement, try doing something like this: (Haven't tested it and it IS missing cases)

 

//update circles[0] position anyhow.

circles[0].xPosition-=circles[0].vx*(2*5);
circles[0].yPosition-=circles[0].vy*(2*5);

 

// Submit the changed position properly to the rest of the circles.

for (int i=1; i<5; i++)

{

if (circles.yPosition != circles[i-1].yPosition)

{

if (circles.xPosition != circles[i-1].xPosition)

circles.xPosition = circles[i-1].xPosition;

 

circles.yPosition-=( circles[i].vy*(2*5) - (the diameter of the circle)*i);

}

else {

circles.xPosition-=circles.vx*(2*5); //apply the same you used on circles[0]

}

 

}

 

 

Incase I'm wrong and that doesnt work dry.png, I would maybe advise you to control your FPS value(ie. lower it to like 1-5 in some cases), I think it would be easier to spot these kind of problems.

Edited by rijvgt

Share this post


Link to post
Share on other sites
Remember that the x and y pos is usually the position of the top left corner, and the position may also hold the hight and width.

Can't say more without the declaration of documentation of the position structure or class.

Share this post


Link to post
Share on other sites

My question is about the offset between the body of the segements. How to set it ?

The snake's head should move, change its velocity, and the body segements should follow the direction of the head's move.

I'm trying to implement the same snake as here with the same movements http://www.flashbynight.com/nanopedes/

Edited by AhmedCoeia

Share this post


Link to post
Share on other sites


My question is about the offset between the body of the segements. How to set it ?

 

Your current loop is wrong...

 


in each loop the only node that gets updated properly is the nodes[1] the rest will get older values(each loop will update nodes with nodes[i-1]'s previous value instead of nodes[i-1]) because you loop from the bottom of the snake instead of it's head. (If your snake would stopped moving, after nodes.size() amount of frames the snake would get back together)

 

In case you want support with anything above your posted code you should also include it in your post.

Edited by rijvgt

Share this post


Link to post
Share on other sites

I have done all things, but still the offset is not correctly set. This is the whole code:

 public var circles:Vector.<circle> = new Vector.<circle>(5);
        public function t()
        {
        
        var offset:int = 10;    
        for ( var i:int = 0; i<5; i++)
        {
            var c:circle = new circle();
            
            c.xPosition= 120+offset;
            c.yPosition = 120;
            c.vx = 1;
            c.vy = 0;
            circles[i] = c;
            offset+=40;
        
            
        }
        
    
        
        addEventListener(Event.ENTER_FRAME, gameLoop);
        
        
            
        }
        
        public function gameLoop(event:Event):void
        {
            for ( var i:int = 0; i<5; i++)
            {
                addChild(circles[i]);
                circles[i].drawCircle(circles[i].xPosition, circles[i].yPosition);
            }
            
            
            for ( var i:int = 0; i<5; i++)
            {
                if ( i != 0 )
                {
                circles[i].xPosition = circles[i-1].xPosition;
                circles[i].yPosition = circles[i-1].yPosition;
                }
                else {
                
                }
            }
            
            circles[0].xPosition-=circles[0].vx*(2*5);
            circles[0].yPosition-=circles[0].vy*(2*5);
            
            
        }

Share this post


Link to post
Share on other sites

 

I have done all things, but still the offset is not correctly set. This is the whole code:

 

I have updated my post. Gl smile.png

Edited by rijvgt

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!