我正在为我的游戏寻找一种简单的方法,这样当你按住空格键时,你会跳得更高。当您“点击”时,您不会跳到最大高度。需要有一个最大值,但是是的,我不知道如何进行编程。
任何帮助,非常感谢。将给予反馈。谢谢。
在处理跳跃的更新函数中,您可以让它跟踪角色离开地面的时间,并让它的向上速度在一段时间后停止增加。
例如,类似下面的东西应该可以工作
class Player
{
private const int gravity = 2; //force of gravity on the object
private const int maxHeight = 5; //change as needed
private const int msecsToMax = 1500; //change as needed
private int yPos = 0;
private int timeOffGround = 0;
private yVel = 0;
//other functions and stuff
void update(GameTime gt)
{
//check if the player is on the ground and update as necessary
if(isOnGround())
timeOffGround = 0;
else
timeOffGround += gt.ElapsedGameTime.TotalMilliseconds;
//update the player's velocity
yVel -= isOnGround() ? 0 : gravity; //no velocity when on the ground
if(Keyboard.GetState().IsKeyDown(Keys.SPACE) && timeOffGround < msecsToMax))
yVel += (maxHeight / msecToMax);
yPos += yVel;
}
}
在跳跃的重音期间,Y 速度完全被功率曲线覆盖。在体面期间,重力接管。跳跃速度由jumpTime
测量当前跳跃重音的时间的场控制。
首先你需要一些简单的全局变量,
public bool isJumping; //Is the player in a jump?
private bool wasJumping; //Did the player just exit a jump?
private float jumpTime; //Time the player has been in a jump (Useful for adding a power curve or to max out on jump height)
MaxJumpTime = .8f; //If you want to max out a jump, otherwise remove the relevant parts of the code
JumpLaunchVelocity = -3000.0f; //How much velocity to "jump" with, this may depend on your speed of your player, so it will need some ajustment
这是完成大部分工作的函数:
private float DoJump(float velocityY, GameTime gameTime)
{
// If the player wants to jump
if (isJumping)
{
// Begin or continue a jump
if ((!wasJumping && IsOnGround) || jumpTime > 0.0f)
{
//Do things like animate, or play a sound here
jumpTime += (float)gameTime.ElapsedGameTime.TotalSeconds;
}
// If we are in the ascent of the jump
if (0.0f < jumpTime && jumpTime <= MaxJumpTime)
{
// Fully override the vertical velocity with a power curve that gives players more control over the top of the jump (If you dont want this you can remove the Math.Pow)
velocityY = JumpLaunchVelocity * (1.0f - (float)Math.Pow(jumpTime / MaxJumpTime, JumpControlPower));
}
else
jumpTime = 0.0f; // Reached the apex of the jump
}
else
{
// Continues not jumping or cancels a jump in progress
jumpTime = 0.0f;
}
wasJumping = isJumping;
return velocityY;
}
在计算位置和内容时的更新中:
velocity.Y = DoJump(velocity.Y, gameTime);
如果遇到任何问题,请查看Platformer Starter Kit !