Countdown

Final Countdown

Faltam dias. Ou segundos.

sexta-feira, 10 de abril de 2015

#14) Estrutura de um Jogo & Multithreading

Olá, hoje venho aqui apresentar a segunda proposta de projeto do curso, o Projeto Anima. Nosso projeto se chamará Bizuca um jogo de tiro em 2D com programação gráfica em Java, contando com o uso de inteligência artificial (Bots).

 ---//---

[Estrutura de um Jogo]

Primeiramente, é preciso estruturar o esqueleto do jogo, enumerando os seus principais recursos e funcionalidades que irão garantir o seu funcionamento, conforme o esquema abaixo:
 
 -------------------------------------------\\-----------------------------------------------
{Menu que antecede o início do jogo}
: Início do Jogo :

-> Setar valores iniciais
(Carregar cenário, configurações iniciais)
-> Loop principal 
   {
      -> Redesenho  da Tela

       -> Ciclo de Animações

      -> Decisões do Jogador  [ Comandos (Mouse, Teclado) ]

      -> Decisões da AI

      -> Processamento
      (Checa colisões e consequências das decisões)

      -> Comando de espera


   }

: Fim do Jogo : 
-------------------------------------------\\-----------------------------------------------

Cada funcionalidade do jogo pode vir na forma de um método relacionado a uma Classe do projeto, deixando o código mais limpo e organizado.
 Entretanto, checar todas as colisões do jogo, com diversos bots (AI's), jogadores, itens dos cenários e objetos extras (como por exemplo tiros) pode tornar o processo lento, sendo necessário para isso o uso de Threads.

 ---//---
 
[Uso do Multithreading]


Usado para processos "simultâneos" executados em paralelo, prevenindo, por exemplo, que a tela congele enquanto uma tarefa que demanda tempo está executando.
Diferente da linguagem C/C++, Java possui suporte nativo a multithreading, facilitando o seu uso. Java Thread é um processo criado pela Máquina Virtual Java:

Runnable: Interface que representa algo que pode ser executado em um Thread.


Thread: Classe que executa a implementação de Runnable em processo paralelo.




-------------------------------------------\\-----------------------------------------------

public class CounterPrinter extends Thread {
public void run () {
for(int i=0; i<10; i++)
System.out.println(i);
}
}

CounterPrinter p = new CounterPrinter();
p.start();


-------------------------------------------\\-----------------------------------------------
Código 1 - Uso de Thread.

Um processo Thread possui diversos estados. Ele pode estar em execução, em estado de Espera, Sleep, Bloqueio, Terminado, etc. Dentre os Threads de Java, existem 10 níveis de prioridade.


Figura 1 - Estados de um Thread Java.


Sleep: Thread.sleep ( SleepTime );
Usado para que o Thread pause por um certo período de tempo.

Método synchronized:
Métodos desse tipo usam a instância como um semáforo, permitindo somente o processamento do Thread somente se este receber o devido "Sinal Verde".

Wait: Thread.wait ();
Força a suspensão do Thread liberando o acesso a outro Thread.

Notify: Thread.notify ();
Acorda uma Thread suspensa no objeto.



No caso deste projeto, usaremos a funcionalidade para:

-> Checar todas as colisões, cada uma com um Thread distinto, agilizando muito a velocidade de processamento, sendo que cada um é colocado para dormir após terminar a sua tarefa. Para checar a colisão novamente, basta acordar todos os Threads que estavam anteriormente dormindo.

-> Tomar todas as decisões das AI's simultaneamente, a análise demorada Ordem N (N AI's) se torna Ordem 1, agilizando o jogo e melhorando a experiência do jogador. 

-> Comando de espera para recomeçar o Loop dos eventos do jogo.

Nenhum comentário:

Postar um comentário