平台碰撞?

时间:2011-08-15 16:38:55

标签: 2d collision-detection

我一直想弄清楚我是否在我的平台游戏中有一张地图,我希望我的角色可以跳到某个平台上。例如,是否有任何简单的方法可以告诉游戏平台在哪里玩家可以跳跃并开始的地方吗?

像超级马里奥兄弟这样的游戏也是用.txt文件制作的地图吗?因为我观看了地图教程,他说所有专业游戏开发人员为地图制作.txt文件并编写数字,例如:

111111111111111111111

111111111111111111111

111111111111111111111

111111111111111111111

222222222222222222222

创建地图..这是正确的还是开发人员如何在超级马里奥兄弟或超级男人游戏中做地图?

我想知道的是..如果我希望我的玩家能够在某个平台或其他东西上跳起来......那就是我在寻找的东西。

2 个答案:

答案 0 :(得分:2)

一个非常简单的例子:

您可以通过例如矩阵来表示地图。数字。多个将代表一个障碍,零个数将代表开放空间。

                   [000000]              [      ]
int[] map    ==    [000000]      ==      [      ]
                   [000111]              [   xxx]
                   [001111]              [  xxxx]

玩家对象还必须在矩阵内有一个坐标,其中水平位置(X)是列,垂直位置(Y)是行,速度(方向和速度)。速度由用户输入控制,例如按下向右箭头将X方向设置为速度+1。

int xPos;
int yPos

int xSpeed;
int ySpeed;

while(true) {
    // Check user input
    if (upArrow()) {
        ySpeed = 1;
    }
    if (downArrow()) {
        ySpeed = -1;
    }
    if (leftArrow()) {
        ySpeed = -1;
    }
    if (rightArrow()) {
        ySpeed = 1;
    }

    // Update player position
    xPos = xPos + xSpeed;
    yPos = yPos + ySpeed;

// ...

现在你只需要检查矩阵中的数字,了解玩家对象在矩阵中的当前位置。如果它为0则不执行任何操作,如果它为1:将速度设置为0。

    int mapObstacle = map[xPos, yPos];
    if (mapObstacle == 1) {
        // Stop player movement
        xSpeed = 0;
        ySpeed = 0;
    }
}

要将地图保存在txt文件中,您必须让游戏从文件中读取/写入地图矩阵。以下是阅读的例子。

int n = 0;
while (mapFile.hasNextLine()) {
    String mapLine = mapFile.nextLine();

    for (int i = 0, n = mapLine.length; i < n; i++) {
        int mapObstacle = Integer.parseInt(mapLine.charAt(i));
        map[n, i] = mapObstacle; // Read map layout
    }
    n++;
}

答案 1 :(得分:0)

使用文本文件是可以的,但使用PNG或位图图形会更好。像素可以存储多达4个字节的信息,并且可以使用照片处理工具轻松创建。

首先,你应该拥有一个&#34;实体&#34;或者&#34; GameObject&#34;类,您的场景中的所有内容都可以继承。例如:

public class Entity
{
    public float x, y, width, height;

    public void onStep() {}
    public void onDraw() {}

    public RectF getRectF()
    {
        RectF rect = new RectF();
        rect.left = x;
        rect.top = y;
        rect.right = x + width;
        rect.bottom = y + height;
        return rect;
    }
}

其次,你应该有一些扩展Entity类的不同类,比如 Player 类, Wall 类,也许还有硬币类:

public class Player extends Entity {...}
public class Wall extends Entity {...}
public class Coin extends Entity {...}

下一步是覆盖播放器的步骤事件,该步骤事件中,遍历所有墙体实体,如下所示:

@Override public void onStep()
{
    for (Entity e : my_active_entities)
    {
        if (e instanceof Wall)
        {
            Wall wall = (Wall) e;

            if (RectF.intersects(wall.getRectF(), this.getRectF()))
            {
                // We now know that our player is intersecting with "e"
                // We also know that "e" is a wall

                wall.doSomething();
                this.doSomething();
            }
        }
    }
}

最后,将创建自己的舞台加载器。这将根据当前像素的颜色在屏幕上迭代图形和绘图对象。

Bitmap bitmap = getOurBitmapFromSomewhere();

for (int x = 0; x < bitmap.getWidth(); x++)
    for (int y = 0; y < bitmap.getHeight(); y++)
    {
        int color = bitmap.getPixel(x, y);

        switch (color)
        {
            case 0xFF00FF00:
                // First byte is Alpha
                // Second byte is Red
                // Third byte is Green
                // Fourth byte is Blue

                Player player = new Player();
                player.x = x * TILE_SIZE; // For example, 16 or 32
                player.y = y * TILE_SIZE;

                my_active_entities.add(player);
                break;
        }
    }

这包含了我的两分钱游戏对象处理,碰撞检测和关卡加载。任何因此而绊倒的人都非常欢迎在他们的软件中使用此代码或此代码概念。