Como criar jogos com rolagem?

7

Em jogos como a história da cidade ou a fazenda, como eles implementam a rolagem?

  1. Para fazer rolagem usando o UIScrollView, o tamanho do EAGLView deve ser maior. Nesses jogos, o tamanho do EAGLView parece mais do que 1024 * 1024. Mas há limitações no tamanho da janela de exibição nos dispositivos iphone (no 3G iphone max é 1024).

  2. Eu joguei esses jogos no iPhone 3G eles estão funcionando bem.

  3. Alguma idéia de como eles implementaram seu mecanismo de rolagem?

Chandan Shetty SP
fonte

Respostas:

4

Bem, eles não usam algo como um UIScrollView, isso é certo. Você apenas moveria a câmera sobre um mundo estacionário ou moveria o mundo sob uma câmera estacionária. Estou um pouco enferrujado no meu GL, mas acho que você deve empurrar uma nova matriz de tradução antes de todo o seu desenho.

Para a parte de arrasto real, você também implementaria isso. Provavelmente seria algo em que você verifica se existe uma certa quantidade de delta de movimento do cursor / dedo em um determinado período de tempo para ver se é um "arrastar" ou um "clique". Ou talvez você sempre arraste, a menos que o usuário clique em um elemento da interface do usuário ou algo assim. Realmente depende do design de como você deseja que esse sistema funcione.

Tetrad
fonte
Mesmo eu pensei que eles estão usando a tradução OpengGL ...
Chandan Shetty SP
É apenas uma questão de fazê-lo, para que você não faça uma pinça rígida quando chegar às margens do mundo. Se você puder mover a câmera, poderá descobrir como imitar o salto.
Tétrada
4

Um scroller é bastante simples, uma "viewport virtual" que empurra novos blocos / objetos na direção em que você está rolando.

Um exemplo simples para ver isso é criar uma marca de seleção simples de 1 linha (textoscroller).

Vamos, por exemplo, dizer que temos uma linha com 20 caracteres / letras / caracteres.

Nós os colocamos em uma string / array como:

String viewport = "....................";
String text = "Hello World (how original!)";

Agora, se imprimirmos isso, veremos apenas os "pontos".

Console.WriteLine(viewport);

Agora, para rolar, precisamos fazer os pontos irem para a esquerda. Para que possamos ler o texto chegando.

Para que isso aconteça, removemos a primeira letra da esquerda e adicionamos a próxima a ser mostrada da direita.

então dizemos:

viewport = viewport.Substring(2);

para levar a 2ª letra e encaminhar, o que é igual ao restante do visor de conteúdo atual.

Agora, a janela de visualização tem 1 caractere / letra para restringir, portanto, precisamos adicionar o próximo caractere do scroller. Portanto, precisamos de uma variável para controlar onde estamos no texto de rolagem.

// place this outside your scroll loop
int scrollPos =0;

Agora, com este índice, podemos encontrar o próximo caractere.

char next = text.substring(scrollPos,1);

Em seguida, adicione isso à viewport.

viewport += next;

E aumente sua posição no texto de rolagem.

scrollPos++;

Agora, rolamos o conteúdo 1 caractere restante.

Continue fazendo isso repetidamente, e parecerá que o "Hello World" está rolando pela sua janela de visualização.

Agora imagine esse truque em todas as direções. Em vez de caracteres, você usa seus próprios "ladrilhos". Em segundo lugar, para facilitar o processo, você também adiciona uma "rolagem de pixels" dentro do seu rolador ou apenas multiplica seus scrollpos para simplificar. Então, quando você precisar descobrir qual bloco adicionar em seguida, divida seus scrollpos atuais com a largura do bloco e saberá se precisa mover o conteúdo da rolagem da viewport em qualquer direção.

se você precisar rolar matrizes (com dados de bloco / bloco), poderá fazê-lo com simples for-loops.

rolagem esquerda

for (int pos=0;pos<viewwidth;pos++)
{
    tilemap[pos] = tilemap[pos+1];
}

tilemap[width] = newTile; // from maparray.

Ufa

Essa foi uma longa explicação. Você entende meu argumento aqui ou precisa de mais explicações?

BerggreenDK
fonte
Ótima maneira de mostrar o conceito de viewport / câmera, usá-lo-á em explicações futuras = D
DFectuoso
11
Boa explicação ... Significa que eles estão corrigindo o tamanho da visualização e usam traduções para mostrar a rolagem.
Chandan Shetty SP
Eu não inventei isso. Eu venho de volta no tempo no antigo Commodore 64 dias (8 bits com 64 KB de RAM), então aprendi da maneira mais difícil. Não havia nenhuma viewport ou GUI sofisticada, então você teve que desenvolver uma maneira de fazer uma rolagem. É o mesmo para Super Mario e muitos outros jogos antigos baseados em til. Mas também pode ser usado para jogos de vetor 3D. Os "ladrilhos" são um pouco diferentes.
BerggreenDK
Basta alterar a "visualização" em um dos botões e você poderá ver as "peças" sendo adicionadas no horizonte e, se alterar os campos para a frente do avião, também poderá vê-los sendo removidos atrás do avião.
BerggreenDK
2

Rolagem não significa necessariamente carregar tudo na memória. A maneira usual de lidar com isso é separar seu conteúdo em blocos que são carregados na memória conforme necessário. A Apple tem um exemplo em http://developer.apple.com/library/ios/#samplecode/ScrollViewSuite/Introduction/Intro.html para mostrar imagens grandes.

Jogos, no entanto, tendem a fazer outra coisa. Mesmo que seja possível usar a técnica anterior, o carregamento de dados do disco é lento e pode atrapalhar a experiência do jogo para o usuário. Por esse motivo, a área a ser rolada geralmente é cortada em pedaços que você pode reutilizar mais tarde, dando a sensação de que o mundo inteiro é maior do que realmente poderia caber na memória.

Você pode aprender mais sobre blocos com um editor de mapas como o Tiled Map Editor e pesquisar na rede por tutoriais sobre como usá-lo / integrar em seu jogo. Jogos como Diablo são conhecidos por usar mapas lado a lado, que são logicamente divididos em peças maiores, coladas juntas, criando imensos mapas pseudo-aleatórios em cada jogo diferente.

Grzegorz Adam Hankiewicz
fonte
0

Outra maneira de implementar a rolagem para um jogo 2D é manipular sua matriz de projeção para refletir onde a tela / câmera está localizada no mundo do jogo.

O que eu fiz foi implementar uma classe de câmera 2D que tinha sua posição e a largura / altura da área visível. Então, antes de desenhar o mundo do jogo, você configura a matriz de projeção orto.

por exemplo

float left = camera->X - (camera->Width / 2.0f);
float bottom = camera->Y - (camera->Height / 2.0f);
float right = left + camera->Width;
float top = bottom + camera->Height;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrthof(left, right, bottom, top, -50.0f, 1.0f);

Eu espero que isso ajude. Ah, e você redefiniria a matriz de projeção para outra coisa se desejasse desenhar os elementos da interface do usuário posteriormente etc.

Obviamente, tudo isso se aplica apenas se você estiver escrevendo seu jogo em openGL.

bcowcher
fonte