MonoGame Tutorial — Parte 3: Movimentação dos Objetos do Jogo

Ronildo Souza
4 min readApr 29, 2018

--

Baixe o Game: https://goo.gl/4p3YdA

Anteriormente…

MonoGame Tutorial — Parte1: Introdução

MonoGame Tutorial — Parte2: Planejamento do Jogo e Inicio do Projeto

Desta parte do tutorial em diante eu devo seguir a dinâmica de mostrar código e explicar os pontos principais do mesmo, talvez tenha a necessidade de breves teorias, mas creio que nada muito complexo, então:

Regras adicionadas ao plano do jogo:

* Para movimentar o carro o usuário deverá manter o dedo pressionado sobre o mesmo e arrastar para a direção desejada.

* O carro se movimenta para todas as direções, porem não pode ultrapassar 80% da tela do dispositivo quando for para a frente.

Show me the code!

Foi criado a propriedade Limites na classe GameObject2D.cs para tratar o pressionamento sobre o carro de acordo com sua posição atual e o tamanho da textura (Width e Height).

Se você já deu uma vasculhada no MonoGame, neste momento deve estar indagando: Porque ele fez isso, a propriedade Textura que é do tipo Texture2D já tem uma propriedade Bounds que é do tipo Rectangle!?.

Sim ela tem uma propriedade Bounds que é do tipo Rectangle, porém a mesma não me retorna a posição da textura ela retorna apenas as dimensões.

Na classe Carro.cs foi criado o método Mover que recebe como parâmetro um TouchCollection que contem informações da ação de toque na tela do dispositivo e um GraphicsDeviceManager que contem informações sobre a parte gráfica do dispositivo.

No inicio do método foi criado a variável touchLocationAnterior para obter a ação de touch que tenha ocorrido utilizando o touch atual de TouchCollection, isto foi necessário para que o carro mude a sua posição apenas quando o usuário manter a tela pressionada e mover para a direção desejada.

A parte interessante deste método é a utilização da classe Microsoft.Xna.Framework.MathHelper está classe contem algumas constantes e métodos para auxiliar em operações matemáticas, como o método Clamp que restringe um valor para estar dentro de um intervalo especificado.

Utilizando o método Clamp eu:

1- Impedi que ao movimentar o carro o mesmo saia dos limites da tela.

2- O carro não ultrapasse 80% da tela ao se mover para a frente.

Também foi criado o método SetaPosicaoInicial que recebe como parâmetro um GraphicsDeviceManager.

Na classe Buraco.cs foi criado o método SetaPosicaoAleatoria que recebe como parâmetro um GraphicsDeviceManager, aqui não tem nada de muito especial.

E finalmente a classe Game1.cs, a primeira mudança nesta classe foi remover 3 linhas de código do construtor, são elas:

_graphics.PreferredBackBufferWidth = 800; _graphics.PreferredBackBufferHeight = 480; _graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;

Na classe Activity1.cs eu também fiz a seguinte mudança na linha 14:

De:

ScreenOrientation = ScreenOrientation.FullUser

Para:

ScreenOrientation = ScreenOrientation.Portrait

Estás alterações faz com que a rotação da tela seja desabilitada para o jogo e o width e height seja considerado o tamanho da tela do dispositivo.

Voltando a classe Game1.cs, foi adicionado uma lista de buracos onde a mesma é instanciada no método Initialize e populada com 5 objetos.

A definição da posição dos objetos foi movida para o método LoadContent logo abaixo do carregamento das texturas, pois os métodos que definem a posição dos objetos utiliza a largura e altura da textura para o correto posicionamento dos mesmos, desta forma os métodos só podem ser utilizados se as texturas já estiverem carregadas.

No método de Upload foi obtido o TouchCollection utilizando o método GetState da classe TouchPanel e passado o mesmo como referência para o método Mover do objeto _carro.

Como os buracos se movimentam apenas de cima para baixo optei por não criar uma método de mover para a classe Buraco.cs, desta forma eu apenas atualizo o eixo Y de acordo com a velocidade Y do buraco que está sendo iterado em seguida verifico se o mesmo saiu da tela para setar uma nova posição para o mesmo.

No método Draw a alteração significante que fiz foi mover a ação de draw do carro para baixo da ação de draw do buraco, desta forma ao ocorrer a interseção do carro com o buraco, o carro ficará por cima do buraco.

Após realizado tuuudo isso o resulta obtido será o seguinte:

OBSERVAÇÃO:

O eixo X = 0 e Y = 0, refere-se ao canto superior esquerdo da tela, o mesmo vale para os objetos Texture2D, visto que não foi definido o parâmetro Origin do método Draw do objeto SpriteBatch.

Repositório dos Exemplos:

https://github.com/RonildoSouza/MonoGameTutorial/tree/Parte3

MonoGame Tutorial — Parte 4: Colisão e Cenário

--

--

No responses yet