让玩家只落在平台上

时间:2016-09-18 18:25:07

标签: java game-physics

我正在尝试创建一个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>

我在这里采取了正确的方法吗? 我复杂了吗?有没有更简单的方法来实现这一目标?

1 个答案:

答案 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中调用此方法。

玩得开心; - )