MonoGame Tutorial — Parte 3: Movimentação dos Objetos do Jogo
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