Como faço para lidar com movimentos RPG de cima para baixo?


13

Eu tenho um jogo que estou escrevendo em Java. É um RPG de cima para baixo e estou tentando lidar com o movimento no mundo. O mundo é amplamente processual e estou tendo dificuldades em lidar com o movimento de personagens em todo o mundo e fazer as alterações na tela. Eu tenho o mundo carregado em blocos que contém todas as peças.

Como eu lido com o movimento do personagem?

Estou perplexo e não consigo descobrir para onde devo ir.

EDIT : Bem, eu estava abstrata com o problema em questão.

No momento, só consigo pensar em colocar tudo rigidamente em uma matriz 2D e salvar o ID do bloco e o deslocamento do jogador no bloco, ou eu poderia simplesmente "flutuar" tudo e mover-se entre as peças, por assim dizer.

Respostas:


11

Usar coordenadas mundiais

(Ou como você diz, flutue tudo.)

Geralmente, você trabalha com coordenadas mundiais e há muitas razões para isso. Eles são a maneira mais simples e intuitiva de representar sua posição no mundo e a única maneira de realmente comparar as posições de quaisquer duas entidades no mesmo mundo.

Você não ganha nada além de trabalhar fazendo com que ele seja rastreado em blocos individuais. Bem, uma vantagem é que você pode determinar em qual bloco ele está, mas você já pode calcular isso com as coordenadas do mundo.


O restante desta resposta será uma explicação de como calcular o bloco mundial em que um jogador está, com base em suas coordenadas mundiais.

Escreverei o trecho de código como se você tivesse uma classe de vetores 2D denominada Vector2- o tipo de vetor encontrado em geometria, não o Vectortipo de lista oferecido por java.util. Se você não tem nenhuma classe geométrica de vetores, deve encontrar algumas on-line ou escrever algumas (você conhece alguma biblioteca de geometria de qualidade para Java?)

A classe Vector2 terá um Xcampo e um Ycampo, que são números públicos (não importa qual tipo numérico aqui).

// Current player X,Y position in the world
Player.Position.X, Player.Position.Y

// An array of map blocks with consistent width and height
Block[x][y] blocks = World.GetBlocks();

// We'll wing it with an example global width/height for all blocks
Block.GetWidth() == 100;
Block.GetHeight() == 100;

// To ensure we're on the same page:
// blocks[0][0] should be at position (0,0) in the world.
// blocks[2][5] should be at position (200,500) due to the width/height of a block.

// Also:
// Assuming (0,0) is in the top-left of the game world, the origin of a block
// is its top-left point. That means the point (200,500) is at the top-left of
// blocks[2][5] (as oppose to, say, its center).

public Vector2 GetPlayersBlockPosition() {
    Vector2 blockPosition = new Vector2();
    blockPosition.X = (int)(Player.Position.X / Block.GetWidth());
    blockPosition.Y = (int)(Player.Position.Y / Block.GetHeight());

    return blockPosition;
}

public Block GetPlayersBlock() {
    Vector2 bp = GetPlayersBlockPosition();
    return blocks[bp.X, bp.Y];
}

Block block = GetPlayersBlock();

2 funções> toda a bagunça do rastreamento dentro do bloco e da transferência entre blocos


1
Melhor resposta que eu estava procurando
WarmWaffles

0

Sua pergunta é um pouco abstrata, mas talvez você esteja procurando um algoritmo de localização de caminho, sugiro A * (http://en.wikipedia.org/wiki/A*_search_algorithm). Isso o ajudará a mover o ladrilho do personagem para o ladrilho se o ladrilho não estiver bloqueado.


1
É mais como abordar a renderização. Eu salvo o ID do bloco e o deslocamento do jogador em cada bloco?
WarmWaffles
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.