平滑的网格运动

时间:2009-04-14 00:34:39

标签: java 2d

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

这使得它太“迟钝”了。如果我想改变方向现在,我不能。

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

谢谢!

5 个答案:

答案 0 :(得分:1)

我几分钟前刚刚玩过Bomberman :) 你可以移动得非常流畅,没有网格计算。 我没有那么多使用Java。我经常使用Flash。 Grid是否用于检查碰撞? 究竟是什么?

有类似的东西是有意义的(我会尝试草绘它):

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

答案 1 :(得分:1)

不要禁用用户输入。永远。不断轮询它。

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

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

检查角色的位置。

如果角色在网格正方形的中心处于空闲状态,请将其速度设置在正确的方向,并将运动向上移动一步,除非路上有墙/碰撞对象。同时清除最后一次按键以显示某些无效值。

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

缓存按键允许玩家在角色接近十字路口时抢先改变方向。这样,角色不必等待在继续前停下来,并且玩家不会觉得游戏没有反应。轮询不断让玩家随时反转方向,并使交叉点的方向变化看起来更快。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我想这取决于你希望它的表现方式。

假设您正在向上移动,并且您单击右键..您是否希望它停止向上移动并向右移动? 当你做一个动作时,我会存储前一个网格位置。这样,如果你点击移动到其他地方,你可以向后跳并改变移动方向..

或者,如果你向上移动并且你单击...你可以将移动速度设置为与它相反...

很难回答知道你想要它的行为。

答案 4 :(得分:0)

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

为了能够达到预期的效果,精灵渲染位置应该与该精灵所代表的实体位于网格上的位置无关。并允许用户在单元格中心的范围内移动该网格,而无需更改单元格。如果未正确选择此范围,您可能会使用“doh!im in this(visual)单元格但它在未来单元格中表示”问题,或“我的头像与墙重叠”。

不要更改玩家单元格,直到他在距离包含他的单元格的边界/边界的范围内(比如精灵的边界球体的1/3)。您还必须修改动画过程才能使其可中断。

这与你给予玩家的自由度无关(例如,它只能向上,向下,向左,向右和对角线向上移动360度)

另一件值得注意的事情是,如果精灵大于单元格大小。例如,一个胖怪物,或一个跨越X细胞但不一定是长方形的蛇老板。