Столкновение платформера? - PullRequest
3 голосов
/ 15 августа 2011

Я пытался выяснить, есть ли у меня карта в моей платформерной игре, и я хочу, чтобы мой персонаж мог прыгать на какой-нибудь платформе, например ... Есть ли какой-нибудь простой способ сообщить игре, где находятся платформы? а где игрок может прыгнуть и начать ??

Кроме того, такие игры, как Super Mario Bros и их карты сделаны в файлах .txt? Потому что я посмотрел учебник по картам и сказал, что все разработчики профессиональных игр создают для карты файл .txt и пишут числа, например:

111111111111111111111

111111111111111111111

111111111111111111111

111111111111111111111

222222222222222222222

Чтобы создать карту .. Это правильно или как разработчики делали карты в играх Super mario bros или Mega man ??

Что мне интересно, так это ... Если я хочу, чтобы мой игрок мог прыгать на какую-то платформу или что-то в этом роде ... Это то, что я ищу.

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Очень простой пример:

Вы можете представить карту с помощью, например, матрицы.Число один будет представлять собой препятствие, а число ноль - открытое пространство.

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

Объект игрока также должен иметь координату внутри матрицы, где горизонтальная позиция (X) - это столбец, а вертикальная -позиция (Y) - это строка, а скорость (направление и скорость).Скорость контролируется пользовательским вводом, как, например, нажатие стрелки вправо установит направление Х на скорость + 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;

// ...

Теперь вам просто нужно проверить число в матрице для текущей позицииобъект игрока имеет в матрице.Если это ноль, ничего не делайте, если это 1: установите скорость на 0.

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

Чтобы сохранить карту в текстовом файле, вы должны заставить свою игру читать / записывать матрицу карты из файла.Ниже приведен пример для чтения.

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++;
}
0 голосов
/ 13 августа 2014

С текстовыми файлами все в порядке, но лучше использовать PNG или растровую графику. Пиксель может потенциально хранить до 4 байтов информации и может быть легко создан с использованием инструментов манипуляции с фотографиями.

Прежде всего, у вас должен быть класс "Entity" или "GameObject", который может наследовать все в вашей сцене. Пример:

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 * 1011. * класс:

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

Следующим вашим шагом будет переопределение события шага Player, и в этом событии шага, выполните итерацию по всем настенным объектам следующим образом:

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

Это завершает мои два цента обработки игровых объектов, обнаружения столкновений и загрузки уровней. Любой, кто спотыкается об этом, может использовать этот код или эту концепцию кода в своем программном обеспечении.

...