Movement problem in C++.
This is my first post here and it will be fun the see how fast you can crack this little problem of mine:
I am creating a actionpacked game with a game engine simular to Blood Omen: Legacy Kain. It all works fine with the layers and so on(using CDX to wrap DirectX). Now heres where I have messed up. All the character is supossed to be turning with the same funtion but I dont get it to work. So here is the layout.
Every guy has 8 positions:
1:Up
2:Diagonal RightUp
3:Right
4:Diagonal RightDown
5:Down
6:Diagonal LeftDown
7:Left
8:Diagonal LeftUp
When you press RIGHT the guy shall turn his body around so he faces right and then walk. But he shall turn the fastest way. For example:
If he is at postion 7:left and we press UP he should rotate to the right(+1) and not to the left(-1).
I really want the whole thing to be with only ONE ''if''. Something like this:
if (x - y = 1)
{
rotate(left);
}
else
{
rotate (right);
}
x where he is, y where he wants to get. I know this isnt the right formula to use and that is what I want you to help me with or if you have another solution.
Here''s the first thing I came up with. I doubt you''re going to get anything to fit within a single nice looking if statement.
if (x > y){ if (x - y > y + 8 - x) rotate(right); else rotate(left);}else if (y > x){ if (y - x > x + 8 - y) rotate(left); else rotate(right);}
The idea is that if the old direction (x) is greater than the new direction (y), then typically you would turn left. However, you need to check for the wrap-aroud case, and simply adding 8 to the y makes it equal to the same location, but greater than x. You can then comare the distances between x and y in one direction, and then the other. Whichever direction is shorter, take that one. The same goes for when y > x, but in just the opposite direction.
Worked like a charm. Even cleaner code then I wrote(almost a page...) Tnx alot.
[edited by - tgn376j on April 20, 2004 9:45:52 AM]
[edited by - tgn376j on April 20, 2004 9:45:52 AM]
And cleaning up the math a bit (just some basic algebra on the internal conditions):
shmoove
if (x > y){ if (x - y > 4) rotate(right); else rotate(left);}else if (y > x){ if (y - x > 4) rotate(left); else rotate(right);}
shmoove
wouldn''t
do the same thing with only one if ?
hope that helps !
Matt
if(x - y > 4 || y - x > 4) rotate(right);else rotate(left);
do the same thing with only one if ?
hope that helps !
Matt
This is amzing, in just one hour all this great response.
[edited by - tgn376j on April 20, 2004 10:47:02 AM]
[edited by - tgn376j on April 20, 2004 10:47:02 AM]
No. Try y=8 and x=1 for instance. The original rotates left and your examples rotates right.
It can be done in one if with a more complicated condition, but that would have no advantages, and it would make the code uglier.
shmoove
[edit]
this reply is to lemurion of course
[/edit]
[edited by - shmoove on April 20, 2004 10:47:38 AM]
It can be done in one if with a more complicated condition, but that would have no advantages, and it would make the code uglier.
shmoove
[edit]
this reply is to lemurion of course
[/edit]
[edited by - shmoove on April 20, 2004 10:47:38 AM]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement