【问题标题】:Platformer collision?平台游戏碰撞?
【发布时间】:2011-08-15 16:38:54
【问题描述】:

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

还有像超级马里奥兄弟这样的游戏,他们的地图是用 .txt 文件制作的吗?因为我看了一个地图教程,他说所有专业的游戏开发者都会为地图制作一个 .txt 文件并写下数字,例如:

111111111111111111111

111111111111111111111

111111111111111111111

111111111111111111111

222222222222222222222

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

我想知道的是..如果我希望我的播放器能够在某个平台或其他东西上跳起来..这就是我想要的。

【问题讨论】:

  • “所有专业游戏开发者都会为地图制作一个 .txt 文件并写入数字” 这一点都不正确。许多开发人员使用某种地图编辑器,这些地图的格式变化很大。
  • 但是如果从地图编辑器完成地图,我将如何解决创建一个平台的问题,例如,如果玩家跳跃,他会留在那个平台上而不是通过它..?
  • @thedaian - 实际上,2D 游戏使用 tileID 数字矩阵来表示其地图是很常见的。显然这不是手工完成的,它是由地图编辑器生成的。它也不是文本文档,因为那样会很慢。二进制文件更有可能。

标签: 2d collision-detection


【解决方案1】:

一个非常简单的例子:

你可以用一个矩阵来表示地图,例如数字。数字 1 表示障碍物,数字 0 表示开放空间。

                   [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++;
}

【讨论】:

  • 但是如果从地图编辑器完成地图,我将如何解决创建平台的问题,例如,如果玩家跳跃,他会留在那个平台上而不是通过它..?
  • 它涉及一些进一步的机制,您可以在其中检查地图矩阵中的障碍物并改变玩家的速度,就像我上面描述的那样。我建议从创建游戏 "Snake" 开始,以掌握使用矩阵和速度的窍门。完成 Snake 后,您将了解如何创建平台游戏。
【解决方案2】:

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

首先,首先,您应该有一个“实体”或“游戏对象”类,场景中的所有内容都可以继承。示例:

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;
    }
}

其次,您应该有一些扩展实体类的不同类,例如 Player 类、Wall 类,可能还有 Coin 类:

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

您的下一步将是覆盖玩家的 step 事件,并且 该 step 事件中,像这样遍历所有墙壁实体:

@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;
        }
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多