Kevin Fishburne ha scritto: > Just to be clear on what -should- be happening, here's an example. > Player is facing up (0 degrees): left stick pushed up moves up, pushed down > moves down, pushed left moves left, pushed right moves right. > Player is facing right (90 degrees): left stick pushed up moves right, > pushed down moves left, pushed left moves up, pushed right moves down. > Well, you need to rotate the data from the left joystick around the player. This is the formula of rotation: xr := xp*g92cos - yp*g92sin; yr := xp*g92sin + yp*g92cos;
Sorry, I took them from an old pascal program, but I explain. The above code rotates a point (xp; yp) around the origin, by a given angle "g92", of which g92cos and g92sin are the cosine and sine. The new rotated point is (xr; yr). Please note that 0 degrees is toward right, 90° up, 180 left, but a computer screen is flipped up side down (which is not a rotation but a mirror), so the y coordinates must be mirrored (choose the opposite sign if a coordinate is relative, or subtract the coordinate from the maximum Y coordinate if absolute). In addition, you say that 0° is up, and 90° right, which is both mirrored and rotated in respect to the canonical trigonometry... this kind of things can drive me crazy... :-) Back to the problem. If I well understand, at every frame you take the left joystick, and apply its "command" to the player. But the direction of the movement depends on the orientation of the player. Well, you take the left joystick data (x and y) and rotate them using the formulas above, basin on current player orientation. This way, when the left joystick slides up, the player will always move ahead, along its current direction. Now I will make an example. Suppose your player is at X=0 and Y=0, facing up (0 degrees), and you move the left joystick "up". You receive y=10 and x=0 from the left joystick. The above formula gives (cos(0)=1, sin(0)=0): xr := xp*g92cos - yp*g92sin = 0*1 - 10*0 = 0 yr := xp*g92sin + yp*g92cos = 0*0 + 10*1 = 10 So you add 0 to X and subtract 10 from Y (or add "-yr" to Y). The player moves up. Note that X is added and Y is subtracted because of the screen. Now, suppose that the player instead is facing right (90°). The formula gives (cos(90)=0, sin(90)=1: xr := xp*g92cos - yp*g92sin = 0*0 - 10*1 = -10 yr := xp*g92sin + yp*g92cos = 0*1 + 10*0 = 0 So you add -10 to X, and subtract 0 from Y. The player moves left. Why not to the right? Because if you rotate your head to the left, you turn 90 degrees, and if you turn your head to the right, you turn -90°. So if you say that 0° is up and 90° is right, there is something wrong. I hope that what I write is comprehensible... I don't know at which extent your program is already using this strange coordinates, so I prefer to elaborate no more (a little tired this night), but by inverting the readings from the joystick, and/or swapping X and Y from the joystick, or by using "90-angle" instead of "angle" when calculating cos() and sin(), you should quickly solve without touching the rest of the program. I presume you should use both "90-angle" and subtract from Y instead of adding to it, but I am not sure - sorry. In a few days I will go to visit those URLs you posted, I am always curious about math and videogames :-) Cheers, Doriano ------------------------------------------------------------------------------ Colocation vs. Managed Hosting A question and answer guide to determining the best fit for your organization - today and in the future. http://p.sf.net/sfu/internap-sfd2d _______________________________________________ Gambas-user mailing list Gambas-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/gambas-user