我是一个新的程序员,有点做相对基本的东西。过去虽然(虽然我没有经常这样做),但在SDL的帮助下,我一直在制作2D游戏。现在,我正在研究导致玩家在按下w键时跳转的代码(控件是wsad)。我很快意识到我无法保持速度不变,因为这会导致跳转更像是y = - | x |的图形。比y = -x ^ 2,看起来更像是前者的实际跳跃。以下是使其有效的代码。
//The part which happens when the jump key is pressed (w)
case SDLK_w:
if(InAir != true) {
StartOfJump = PlayerYCoord;
InAir = true;
velocity = 0.01;
break;
}
//And skip to a different part.
if(InAir == true) {
if(StartOfJump - PlayerYCoord < JumpHeight) {
PlayerYCoord = PlayerYCoord - velocity;
velocity = velocity * velocity;
速度是使得玩家的Y坐标增加的速度,以指数方式增加。现在,它在程序开始时设置为0.01。
JumpHeight是玩家跳跃的像素数。这是为了能够轻松地修改它。实际上,JumpHeight设置为100像素。
StartOfJump确保在正确的位置切断跳跃,因为目前游戏的地图是平的,我不希望保持这种状态。
PlayerYCoord相当不言自明,但基本上它是飞机上玩家的Y坐标。这是双重的。
是的,我知道现在没有堕落的代码。当我甚至无法获得上升部分时,这并不重要。
无论如何,我不确定为什么,但由于某种原因,在按下w键时,玩家的位置只增加了一个像素,而且它没有做任何其他事情。我尝试修改代码来说明这个
if(InAir == true) {
if(StartOfJump - PlayerYCoord < JumpHeight) {
//PlayerYCoord = PlayerYCoord - 0.1;
PlayerYCoord = PlayerYCoord - velocity;
velocity = velocity * velocity;
cout << fixed << setprecision(4);
cout << "The velocity is" << velocity << " " << endl;
不幸的是,它开始打印0.0001然后永远打印0.000。但这不对,是吗?......速度的值是0.01 ......所以,我改变了最后一行来说:
cout << "The velocity is" << velocity * 100 << " " << endl;
果然,输出0.0100然后像上次一样无限输出0.0000。老实说,我不确定是什么导致了这个问题,但我认为这与玩家的Y坐标只增加一个像素然后停止这一事实有关。
我可能犯了一个非常容易修复的愚蠢错误。无论如何,如果我需要包含任何其他代码(第一次在编程论坛上,我还没有把这些东西固定下来)我很乐意将它包括在内。在此先感谢您的帮助!
P.S。如果我的任何代码都依赖于系统,我使用的是Ubuntu 13.10,32位。
答案 0 :(得分:0)
你没有错误地实施重力。你需要从向上的速度开始。然后,您需要在每个单位时间内减去重力的向下加速度。这将处理上升的和下降。你的代码确实......奇怪的事情。
velocity = 50
each unit of time while player is in the air:
playerY -= velocity
velocity -= acceleration
答案 1 :(得分:0)
我不同意上述解决方案。
你的玩家应该总是受到引力的影响,对吧?即使我们在地面,我们也受到重力的影响?
总是通过重力影响玩家但是当我们按下一个左右的跳跃按钮时,添加反击力使玩家向上挥动(但只有一次),然后重力将消耗此力并推动玩家。
布尔值InAir
应该只确定玩家是否可以再次跳跃。因此,如果我们在空中,我们就不能执行另一个跳转命令。但如果我们坚持(InAir = false )
那么我们应该能够再次跳起来。
这也使得添加双跳等效率更高。
快乐的编码!