0

我正在使用网格系统开发 Java Bomberman 克隆,但我现在对这个动作并不满意。当玩家按下移动键时,角色开始移动(速度为 0.25)。玩家失去控制,角色继续移动,直到它移动了一个完整的瓷砖。玩家只有在角色到达下一个图块的中心时才能重新获得控制权。

这使得它太“滞后”了。如果我现在想改变方向,我做不到。

也许我可以让角色的底部小于精灵的大小,这意味着我必须在角落之前检查它是否是有效的移动。有什么想法吗?

谢谢!

4

5 回答 5

1

不要禁用用户输入。曾经。不断地轮询它。

具有执行以下操作的 Tick() 或 OnFrameEnter() 函数:

轮询键盘/操纵杆/任何东西,并缓存用户输入的最后一个方向。

检查角色的位置。

如果角色在方格的中心处于空闲状态,请将其速度设置为正确的方向并将移动提高一步,除非途中有墙壁/碰撞物体。还将最后一次按键清除为一些无效值。

否则,如果角色已经在移动,则更新角色的位置,检查与墙壁的碰撞,或靠近方向改变节点(交叉点)。如果它与墙壁发生碰撞,请停止角色。如果靠近变向节点并且可以沿缓存的方向行进,则改变方向并清除缓存的方向。否则,如果输入方向与当前方向相反(在走廊中并且玩家想要反转),则反转方向然后清除按键。这一切都假设角色应该继续移动,一直到它撞到墙并停止。如果你想让角色在任何地方停下来,一个反向键应该简单地把它停在原地。

缓存按键允许玩家在角色接近十字路口时抢先改变方向。这样,角色在继续前进之前不必等待停止,并且玩家不会觉得游戏反应迟钝。轮询不断地让玩家可以随时反转方向,并让十字路口的方向变化看起来更快。

于 2009-04-17T21:00:46.670 回答
1

几分钟前我刚玩过炸弹人 :) 你可以很流畅地移动,没有网格计算。我没有那么多使用Java。我经常使用 Flash。是用于检查碰撞的网格吗?它到底是为了什么?

有类似的东西有意义吗(我会试着画一下):

float vx,vy = 0;//velocity on x and y 
Character bomberman

void keyDownHandler(KeyboardEventSomething event){
 if(key is Left && ! Right ) vx -= .5;
else if(key is Right && !Left ) vx += .5;
//idem for Y axis
}

void keyUpHandler(KeyboardEventSomething event){
vx = vy = 0;
}

void updateLoop(){
  bomberman.x += vx;
  bomberman.y += vy;
}

我可能有点不对劲,因为我不确定你想克隆多少炸弹人。您所描述的网格运动似乎更接近hopmon

于 2009-04-14T18:16:09.963 回答
0

听起来您通过更改其包含的网格单元格来更新玩家位置(动画的开始)。

为了能够达到预期的效果,精灵的渲染位置应该独立于该精灵表示的实体在网格上的位置。并允许用户在单元格中心范围内的网格内移动,而无需更改单元格。如果此范围选择不正确,您可能会遇到“doh!im in this(visually)cell but it says im in the future cell”问题,或者“我的头像与墙重叠”。

不要更改玩家单元格,直到他在包含他的单元格的限制/边界范围内(假设是精灵边界球的 1/3)。您还必须修改动画过程以使其可中断。

这与您赋予玩家的自由度无关(例如,它只能向上、向下、向左、向右和对角线移动,而不是 360 度)

您应该注意的另一件事是,如果精灵大于单元格大小。例如,一个胖怪物,或一个跨越 X 个单元但不一定是矩形的蛇老板。

于 2009-09-09T11:17:38.450 回答
0

您应该能够摆脱当前精灵并在需要时准确加载新精灵 - 即,如果角色移动到下一个图块的一半并且玩家按下键返回,取消精灵并加载新精灵开始在 0.5。

于 2009-04-14T00:39:01.923 回答
0

我想这取决于你希望它如何表现。

假设您正在向上移动,然后单击右键..您希望它停止向上移动并向右移动吗?当您进行移动时,我会存储以前的网格位置。这样,如果您单击以移动到其他位置,则可以向后跳并更改移动方向..

或者,如果您正在向上移动并单击向下...您可以将移动速度设置为与实际速度相反...

在不知道您希望它的行为方式的情况下很难回答。

于 2009-04-14T06:15:34.360 回答