首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >平台碰撞?

平台碰撞?
EN

Stack Overflow用户
提问于 2011-08-16 00:38:55
回答 2查看 638关注 0票数 3

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

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

1111111111111111111111111

1111111111111111111111111

1111111111111111111111111

1111111111111111111111111

222222222222222222222

要创建地图,请执行以下操作:这是正确的吗,或者开发人员如何在超级马里奥兄弟或Mega man游戏中制作地图?

我想知道的是..如果我想让我的玩家在某个平台或者别的什么地方跳起来..这就是我要找的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-16 01:09:09

一个非常简单的例子:

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

代码语言:javascript
复制
                   [000000]              [      ]
int[] map    ==    [000000]      ==      [      ]
                   [000111]              [   xxx]
                   [001111]              [  xxxx]

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

代码语言:javascript
复制
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。

代码语言:javascript
复制
    int mapObstacle = map[xPos, yPos];
    if (mapObstacle == 1) {
        // Stop player movement
        xSpeed = 0;
        ySpeed = 0;
    }
}

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

代码语言:javascript
复制
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++;
}
票数 2
EN

Stack Overflow用户

发布于 2014-08-13 14:06:22

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

首先,你应该有一个"Entity“或"GameObject”类,场景中的任何东西都可以继承。示例:

代码语言:javascript
复制
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类,可能还有Coin类:

代码语言:javascript
复制
public class Player extends Entity {...}
public class Wall extends Entity {...}
public class Coin extends Entity {...}

您的下一步将是覆盖玩家的step事件,并在该step事件中迭代所有墙实体,如下所示:

代码语言:javascript
复制
@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();
            }
        }
    }
}

最后,是创建你自己的阶段加载器。这将根据当前像素的颜色遍历屏幕上的图形和绘图对象。

代码语言:javascript
复制
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;
        }
    }

这就是我关于游戏对象处理、碰撞检测和关卡加载的两个要点。任何在这方面遇到困难的人都非常欢迎在他们的软件中使用这段代码或这段代码的概念。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7067821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档