我正在尝试创建一个2D平台游戏,我即将尝试实现跳跃。但是,我有点迷失在如何使播放器只落在平台上。
我在想创建一个名为Platform的新类,然后创建一个包含游戏中所有平台所有坐标的ArrayList。
然后我创建一个while循环,每当玩家跳跃时,当他摔倒时,除非他站在一个平台上,否则它会继续下降?
类似的东西:
<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<div class="panel panel-primary" id="form1" runat="server">
<div class="panel panel-heading">Registration</div>
<div class="panel-body">
<label>
From:
<asp:TextBox ID="datepicker" runat="server" CssClass="form-control"></asp:TextBox>
<asp:Timer runat="server"></asp:Timer>
</label>
</div>
</div>
<script src="Scripts/jquery-1.10.2.js"></script>
<script src="Scripts/jquery-ui.js"></script>
<script>
$(function () {
$("#datepicker").datepicker();
});
</script>
</asp:Content>
我在这里采取了正确的方法吗? 我复杂了吗?有没有更简单的方法来实现这一目标?
答案 0 :(得分:1)
通常你的playerobject中有一个update()和一个render()方法。为了方便重力,您可以在每次更新通话时更新您的玩家y位置,例如POSY + = 5。对于高级重力,您有一个y速度,您可以使用该速度更新每次更新的y位置。这种y速度变化可以使运动更平稳。
你应该有一个控制器类,它可以在一些集合中保存游戏中的每个实体。在我的游戏中,这个类被称为EntityManager,它将每个实体保存在LinkedLists中。我建议为不同的实体类型提供多个集合。在这种情况下,您可以使用BlockEntities来表示构成平台的方块。
现在最重要的概念。每个实体都有一个方法,它返回一个Rectangle对象作为hitbox。 以下是我制作的游戏示例:
public Rectangle getBounds() {
return new Rectangle( x, y, width, height);
}
x,y,width和height是实体的属性。
此外,您的播放器需要一个位于播放器底部的hitbox。例如,如果玩家大小为32x32像素:
public Rectangle getBottomBounds() {
return new Rectangle( x, y+30, width, 2);
}
现在出现了碰撞控制: 在你的播放器中你需要一个这样的字段:
protected LinkedList<Block> blocks = null;
在你的播放器中你实现了这个方法:
public void checkBottomCollision() {
blocks = game.getEntityManager().getBlocks();
for (int i = 0; i < blocks.size(); i++) {
Block tempBlock = blocks.get(i);
if(this.getBottomBounds().intersects(tempBlock.getBounds())){
this.y = tempBlock.getY() + this.height;
}
}
}
}
game.getEntityManager()获取ControllerClass,它包含我游戏中的所有实体。方法getBlocks()返回包含所有块的LinkedList。 您可以检查每个区块的玩家是否发生碰撞。如果底部命中框发生碰撞,则更新位置,以便您的玩家站在该区块上。 在更新y位置后,在update-method中调用此方法。
玩得开心; - )