Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

I've got a bad version of this algorithm working, bad because my graphic object which i'm trying to move to where i clicked the mouse, still doesn't move in a straight line to the final x,y position

 

I realise i could do this easier with XNA and vectors, but i'm just obsessed at this point since people have been doing this sort of movement in games for over 15 years (Diablo, Baldurs Gate, Age of Empires, blah, blah, blah...)

 

It's just a straight on movement, so i don't need any sort of pathfinding(A* or something like that)

 

here is the relevant code, I know I'm losing precision when I update the playerShip position, which is the cause of the problem, but how to fix that?

 

thanks in advance

 

 

private void Form1_Load(object sender, EventArgs e)

{

// Setup clock interval.

timer1.Interval = 100;

timer1.Enabled = true;

 

this.Size = new Size(themapwidth + 8, themapheight + 24);

 

backbuffer = new Bitmap(themapwidth, themapheight);

// gfx is aimed at the backbuffer.

gfx = Graphics.FromImage(backbuffer);

// formgfx is aimed at the form.

formgfx = this.CreateGraphics();

 

playerShip = new Rectangle(themapwidth/2, themapheight/2,6,6);

// Instantiate the player location.

 

// Make our drawing when the timer ticks.

updateartwork = true;

}

 

private void drawonform()

{

formgfx.DrawImage(backbuffer, 0, 0);

// The backbuffer was drawn on by the gfx.

}

 

void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)

{

updateartwork = true;

}

 

private void timer1_Tick_1(object sender, EventArgs e)

{

if (mouseClik)

{

deltaX = MousePos.X - playerShip.X;

deltaY = MousePos.Y - playerShip.Y;

dist = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);

if (dist >=2)

{

theta = Math.Atan2(deltaY, deltaX);

 

thetaX = (float)(movespeed * (Math.Cos(theta)));

thetaY = (float)(movespeed * (Math.Sin(theta)));

 

playerShip.X += (int)(thetaX);

playerShip.Y += (int)(thetaY);

}

else

{

playerShip.Offset(0, 0);

}

 

updateartwork = true;

}

 

if (updateartwork)

{

gfx.FillRectangle(Brushes.Black, Rectangle.FromLTRB(0, 0, themapwidth, themapheight));

 

gfx.FillEllipse(Brushes.Azure, playerShip);

 

updateartwork = false;

// set it back to false.

}

this.drawonform();

}

 

private void Form1_MouseClick(object sender, MouseEventArgs e)

{

MousePos = PointToClient(Cursor.Position);

mouseClik = true;

}

}

}

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...