我正在使用网格系统开发 Java Bomberman 克隆,但我现在对这个动作并不满意。当玩家按下移动键时,角色开始移动(速度为 0.25)。玩家失去控制,角色继续移动,直到它移动了一个完整的瓷砖。玩家只有在角色到达下一个图块的中心时才能重新获得控制权。
这使得它太“滞后”了。如果我现在想改变方向,我做不到。
也许我可以让角色的底部小于精灵的大小,这意味着我必须在角落之前检查它是否是有效的移动。有什么想法吗?
谢谢!
不要禁用用户输入。曾经。不断地轮询它。
具有执行以下操作的 Tick() 或 OnFrameEnter() 函数:
轮询键盘/操纵杆/任何东西,并缓存用户输入的最后一个方向。
检查角色的位置。
如果角色在方格的中心处于空闲状态,请将其速度设置为正确的方向并将移动提高一步,除非途中有墙壁/碰撞物体。还将最后一次按键清除为一些无效值。
否则,如果角色已经在移动,则更新角色的位置,检查与墙壁的碰撞,或靠近方向改变节点(交叉点)。如果它与墙壁发生碰撞,请停止角色。如果靠近变向节点并且可以沿缓存的方向行进,则改变方向并清除缓存的方向。否则,如果输入方向与当前方向相反(在走廊中并且玩家想要反转),则反转方向然后清除按键。这一切都假设角色应该继续移动,一直到它撞到墙并停止。如果你想让角色在任何地方停下来,一个反向键应该简单地把它停在原地。
缓存按键允许玩家在角色接近十字路口时抢先改变方向。这样,角色在继续前进之前不必等待停止,并且玩家不会觉得游戏反应迟钝。轮询不断地让玩家可以随时反转方向,并让十字路口的方向变化看起来更快。
几分钟前我刚玩过炸弹人 :) 你可以很流畅地移动,没有网格计算。我没有那么多使用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
听起来您通过更改其包含的网格单元格来更新玩家位置(动画的开始)。
为了能够达到预期的效果,精灵的渲染位置应该独立于该精灵表示的实体在网格上的位置。并允许用户在单元格中心范围内的网格内移动,而无需更改单元格。如果此范围选择不正确,您可能会遇到“doh!im in this(visually)cell but it says im in the future cell”问题,或者“我的头像与墙重叠”。
不要更改玩家单元格,直到他在包含他的单元格的限制/边界范围内(假设是精灵边界球的 1/3)。您还必须修改动画过程以使其可中断。
这与您赋予玩家的自由度无关(例如,它只能向上、向下、向左、向右和对角线移动,而不是 360 度)
您应该注意的另一件事是,如果精灵大于单元格大小。例如,一个胖怪物,或一个跨越 X 个单元但不一定是矩形的蛇老板。
您应该能够摆脱当前精灵并在需要时准确加载新精灵 - 即,如果角色移动到下一个图块的一半并且玩家按下键返回,取消精灵并加载新精灵开始在 0.5。
我想这取决于你希望它如何表现。
假设您正在向上移动,然后单击右键..您希望它停止向上移动并向右移动吗?当您进行移动时,我会存储以前的网格位置。这样,如果您单击以移动到其他位置,则可以向后跳并更改移动方向..
或者,如果您正在向上移动并单击向下...您可以将移动速度设置为与实际速度相反...
在不知道您希望它的行为方式的情况下很难回答。