gpt4 book ai didi

2d - 专注于制作2D游戏运动引擎

转载 作者:行者123 更新时间:2023-12-03 04:07:01 24 4
gpt4 key购买 nike

我正在为自上而下的 2D 游戏制作一个运动引擎,但我在尝试解决以下问题时陷入困境:

  • 玩家可以使用箭头键移动,这会加速你朝各自的方向移动。由于存在摩擦力,因此释放按键后您会停止移动,但不会立即停止。
  • 当您按住两个垂直键时,您会在此 45° 方向上以与在一个轴上相同的速度加速
  • 存在一个最大速度,超过该速度您就无法步行加速,这显然也限制了您的最大步行速度。然而,你可能会被撞开,从而超过这个速度。
  • 如果你的移动速度超过了最大速度。步行速度,如果你向相反方向按住按键,你可以放慢速度

第一点的伪代码,没有摩擦:

gameTick(){

tempX += LeftKeyHeld ? -1 : 0;
tempX += RightKeyHeld ? 1 : 0;
tempY += UpKeyHeld ? -1 : 0;
tempY += DownKeyHeld ? 1 : 0;
ratio = 0.71;

if( |tempX| == |tempY| ) {
tempX =tempX* ratio;
tempY =tempY* ratio;
}
player.x += tempX;
player.y += tempY;
}

我可以解决摩擦问题(获取运动矢量的长度,通过摩擦力来减少它,以相同的 x:y 比例将其投影回来),但是,我无法集中注意力来完成 maxSpeed。

我尝试了一种解决方案,即在高于 maxSpeed 时根本不允许玩家行走,但这违反了第 4 点。此外,它还有令人讨厌的副作用,即当您以 MaxSpeed 向左移动并开始按下时,移动方向没有或几乎没有改变。

然后我开始考虑向量的众多产品、差异和其他内容,但我大多无法再遵循它或遇到早期问题。

总之,有人可以解释一个满足上述所有要点的系统,或者指出一篇文章来解释如何实现这样的系统吗?不用担心建议一些复杂的东西,只要花点时间,我甚至可以掌握困难的概念。

感谢您的帮助!

最佳答案

很抱歉没有让你思考这个问题超过一天,但我设法解决了它,而且它不是两行代码。 (不过还是感谢大家的想法)

因为我又懒又累,所以不会改成伪代码,除了下面两个方法:

updateGame(){
player.walk();
player.move();
}
player.move(){
player.x += player.speedX
player.y += player.speedY
}

代码(java):

public void walk() {
float tempX = 0;
float tempY = 0;
float accelX;
float accelY;
float nextSpeedX;
float nextSpeedY;
float nextSpeed;
float speed;
tempX += walkLeft ? -1 : 0;
tempX += walkRight ? 1 : 0;
tempY += walkUp ? -1 : 0;
tempY += walkDown ? 1 : 0;

if (Math.abs(tempX) == Math.abs(tempY)) {
tempX = (float) tempX * rat;
tempY = (float) tempY * rat;
}

accelX = tempX * (float) runSpeed;
accelY = tempY * (float) runSpeed;
speed = (float) Math.sqrt(speedX * speedX + speedY * speedY);
nextSpeedX = speedX + accelX;
nextSpeedY = speedY + accelY;
nextSpeed = (float) Math.sqrt(nextSpeedX * nextSpeedX + nextSpeedY * nextSpeedY);

if (nextSpeed > maxSpeed) { //can't accelerate by running
if (nextSpeed > speed) { //wants to accelerate
if (speed > maxSpeed) { //the current speed is larger than maximum.
float diff = (float)(speed / nextSpeed);
float greenX = nextSpeedX*diff;
float greenY = nextSpeedY*diff;
accelX = greenX-speedX;
accelY = greenY-speedY;
} else { //speed <= maxspeed
float diff = (float)(maxSpeed / nextSpeed);
float greenX = nextSpeedX*diff;
float greenY = nextSpeedY*diff;
accelX = greenX-speedX;
accelY = greenY-speedY;
}
} else { //wants to slow! allow it!
//acceleration doesn't need to be changed
}
} else { //no problem, allow it!
//acceleration doesn't need to be changed
}
speedX += accelX;
speedY += accelY;
}

可以更短,可以更优化一点,但它有效。我希望这对将来遇到这个问题的人有所帮助。

关于2d - 专注于制作2D游戏运动引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6191116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com