Barco passando sob uma ponte em um RTS com base em mosaico 2D


10

Estou escrevendo um RTS com base em blocos 2D. E eu quero adicionar um recurso 'pseudo 3D' a ele - pontes sobre os rios.

Ainda não iniciei nenhuma codificação, apenas tentando pensar como ela se encaixa no modelo de detecção de colisão. Um barco que passa por baixo da ponte e uma unidade que se move sobre a ponte acabarão ocupando a mesma célula no mapa. Como elogiá-los de colidir?

Existe uma abordagem comum para resolver esse problema? Ou eu preciso implementar um mundo 3D para fazer isso?


bem, se você estiver executando um sistema baseado em blocos, poderá adicionar algo como um método "isOccupied" a cada vez. Basta fazer com que a ponte verifique abaixo e acima.
Benjamin Danger Johnson

2
se as unidades terrestres não interagirem com as unidades de água, você poderá lidar com colisões separadas para os dois conjuntos de unidades. E talvez considere que um barco no harboor é uma unidade de terra para permitir interações como o jogador / um npc entrando no barco.
GameAlchemist

Respostas:


7

Você basicamente precisará criar uma terceira dimensão, embora, no caso mais simples, ela possa consistir em apenas dois valores: "no solo / na ponte" e "na água / abaixo da ponte".

Uma inspiração pode ser encontrada da maneira que o Comando Estratégico Avançado faz: As unidades ocupam um nível de altura específico, só podem se mover em níveis de altura adequados ao seu tipo, a menos que existam recursos específicos que permitam fazê-lo (por exemplo, pistas para aeronaves) e alterá-los geralmente custa pontos de movimento, com penalidades em alguns níveis de altura ou outros. Um bloco pode ser ocupado por qualquer número de unidades, desde que cada um esteja em um nível de altura diferente.

No caso de ASC, os níveis são:

  • espaço
  • alta altitude (bombardeio)
  • altitude média (interceptores)
  • altitude de ataque ao solo
  • solo (a maioria das unidades terrestres e hovercraft, mesmo sobre a água)
  • água
  • parcialmente submerso (submarinos)
  • submerso (submarinos "ocultos")

9

Você pode adicionar um atributo simples a cada bloco que especifica seu nível.

Então, por exemplo:

tileA.layer = 0 // Will be at the bottom
tileB.layer = 1 // Will be above level 0, on top of it. 

// Add tiles to layered list
List<List<Tile>> tiles = new List<List<Tile>>();
tiles[0].add(tileA);
tiles[1].add(tileB);

// Draw 'em in the right order!
void Draw(List<List<Tile>> tiles) {
    foreach( var listOfTiles in tiles ) {
        foreach( var tile in listOfTiles ) {
            tile.draw();
        }
}

Agora você pode classificar seus ladrilhos, dependendo dos valores de suas camadas e desenhá-los de baixo para cima! Isso fará com que pareça que você tem uma certa profundidade no seu jogo. A maioria dos mecanismos de blocos suporta isso. Outra coisa interessante que você pode adicionar é a transparência de suas texturas, para que você possa ver até a camada inferior.

Isso pode ser feito com a água, por exemplo - imagine a água no nível 1 e depois no fundo do oceano no nível 0. Se a textura da água for um pouco transparente, você poderá ver o fundo do oceano de cima.


@aleguna Não se preocupe! É divertido ajudar. :)
Zolomon
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.