Suporte no desenvolvimento de jogos


    [Java]Mudando de telas/cenários

    avatar
    /_Lucas
    Novato
    Novato

    Mensagens : 19
    Créditos : 0

     [Java]Mudando de telas/cenários Empty [Java]Mudando de telas/cenários

    Mensagem por /_Lucas em Sab Abr 13, 2019 2:26 am

    Tipo: Tutorial
    Nível: Intermediário.
    Linguagem: java.
    Contato e mais informações:  https://lucasindiesh1p.wordpress.com/ 
    Mais tutorais sobre:  https://lucasindiesh1p.wordpress.com/2019/04/13/javamudando-de-telas-cenarios/


    Os games atuais normalmente são organizados em telas, por exemplo: tela inicial (novo jogo, carregar jogo salvo, sair do jogo), e cada opção leva o usuário para outras telas (por exemplo:  tela do mapa inicial do personagem do jogador, tela do mapa inicial da casa de um personagem), essas telas são ambientes, ou seja, cenários organizados pelo programador de forma que o usuário possa navegar entre elas. 


    De forma simples, não necessariamente precisa-se criar uma classe para cada cenário, basta criar uma uma estrutura de variáveis que possibilite o cenário se reconstruir conforme as condições dadas pelo programador sejam atendidas durante a interação do usuário.


    Por exemplo:
     
    game> executa o cenário> o responsável por desenhar os objetos no cenário é o paint() ou o paintComponent()> Se o usuario apertar tecla x ENTÃO o cenário modifica a variável booleana Cenario2 para que seja então desenhado o cenário do menu, e desativa a variável booleana do Cenário1 assim o que ela desenha não será mais desenhado.




    Ou seja:


    Por exemplo, criando a variavel que controlará se o cenário está ativo ou não na classe que executa o game:

    Código:
    .
    .
    .
    private boolean cenario1;
    .
    .
    .

    em seguida:



    Dentro do construtor da classe que é anexada ao frame e executada pelo main, pode-se inicializar as variáveis cenário1, 2,3,etc...
    Código:
    public NomeDaClasse(){
    .
    .
    .
    cenario1 = true;
    .
    .
    .

    }



    Dentro do paint() ou do paintComponent() (o que você estiver usando para desenhar os objetos do cenário):

    Código:
    public void paint(Graphics g){
    //cenário padrão: uma tela preta, não está sendo manipulado por nenhuma variável, ou seja, estará sempre visivel

    g.setColor(Color.BLACK);
    g.fillRect(0, 0, getWidth(), getHeight());

    //cenário1: é apenas uma mensagem (uma String) pedindo para o usuário apertar a tecla ENTER para iniciar o game
    //No construtor definimos ela como true a variavel cenario1
    //por isso será apresentada pelo usuario por padrão, mas ao apertar ENTER, ela se transformara em FALSE
    //portanto não vai ser mais desenhada no próximo repaint() do loop.        
             if(cenario1 == true){
    g.setFont(new Font("Times new Roman", Font.BOLD, 20));
    g.drawString("Novo Jogo (aperte enter para começar)", 50, 150);
    }

    if(cenario1 == false){
    //..aqui é o que vai ocorrer quando o usuario apertar enter, podemos desenhar outras coisas aqui e
    //ate mesmo fazer uma outra condição para Desenhar ou NÃO de acordo com uma variavel cenario2 por exemplo.
    g.setFont(new Font("Times new Roman", Font.BOLD, 20));
    g.drawString("cena2", 50, 150);
    }


    e então definindo como o usuario vai conseguir ativar e desativar essa variável, por exemplo, apertando ENTER desativar e ativar novamente:
    Código:
    @Override
    public void keyPressed(KeyEvent e) {
    int c = e.getKeyCode();
     if(c == KeyEvent.VK_ENTER){
                 if(cenario1 == true)
                     cenario1 = false;
                 else
                     cenario1 = true;
             }

    }


    E então, ao começar a criar muitos cenários, pode-se criar por exemplo uma lista e manipular o indice com valor booleano, ao inves de criar várias variáveis(cenario1, cenario2, cenario3...)

    Referências:
    https://docs.oracle.com/javase/7/docs/api/java/awt/event/KeyEvent.html
    https://gamedev.stackexchange.com/questions/86580/dealing-with-multiple-scenes-levels

      Data/hora atual: Sex Abr 19, 2019 3:33 pm