help with implementing point and click movement

heater19

Newcomer
Joined
Apr 15, 2011
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;
}
}
}
 
Top Bottom