Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre una clase para controlarlos a todos.

Anuncios

La clase que veremos que hoy es la encargada de supervisar el control de lo que dibujamos en pantalla, como este juego va a ser mucho mas complejo que los anteriores a medida que vayamos evolucionando este juego tendra muchas clases distintas que se iniciaran para “dibujarse” a si mismas a su debido tiempo, como consecuencia estaremos agregando nuevo codigo a esta clase asi como tambien argumentos a nuestros metodos pero como por ahora solo tenemos el HUD ajustaremos a la clase para mostrar a esta ultima.

Anuncios

Para comenzar vamos a crear una nueva clase:

  • Nombre: Renderer
  • Tipo: Class
Anuncios

Una vez creada reemplazaremos el codigo generado automaticamente con el siguiente:

package org.example.invasores;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Renderer {
    private Canvas mCanvas;
    private SurfaceHolder mSurfaceHolder;
    private Paint pincel;

    Renderer(SurfaceView sv){
        mSurfaceHolder = sv.getHolder();
        pincel = new Paint();
    }
}
Anuncios
Anuncios

En este caso, lo primero que haremos es dejarla como privada quitando la palabra public, en caso de estar, y luego creamos tres objetos, uno de tipo Canvas, otro de SurfaceHolder y uno Paint, lo siguiente es el constructor de la clase donde recibiremos un atributo de tipo SurfaceView el cual usaremos para asignarle por medio de getHolder el contenedor de la vista a mSurfaceHolder, lo ultimo es la definicion o creacion de nuestro “pincel”, pasemos a agregar el siguiente metodo:

    void dibujar(GameState gs, HUD hud){
        if (mSurfaceHolder.getSurface().isValid()){
            mCanvas = mSurfaceHolder.lockCanvas();
            mCanvas.drawColor(Color.argb(255,0,0,0));

            if (gs.getDibujando()){

            }

            if (gs.getGameOver()){

            }

            hud.dibujar(mCanvas,pincel,gs);
            mSurfaceHolder.unlockCanvasAndPost(mCanvas);
        }
    }
Anuncios
Anuncios

Este metodo se encargara de dibujar por medio de esta clase, para este metodo recibiremos dos datos, el GameState y el HUD, la primera linea se encargara de bloquear al Canvas, luego cambiaremos el color del mismo y tendremos dos condicionales vacios por ahora pero el primero si esta activo el juego o dibujando y el segundo verifica si ya se perdio todas las vidas y termino el juego, la siguiente linea se encarga de dibujar el HUD por fuera de todo lo demas y la ultima linea se encarga de desbloquear el Canvas y postear al estado actual del mismo, con esto tenemos nuestra clase completa, por ahora, veamos como quedo su codigo:

Renderer.java

package org.example.invasores;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

class Renderer {
    private Canvas mCanvas;
    private SurfaceHolder mSurfaceHolder;
    private Paint pincel;

    Renderer(SurfaceView sv){
        mSurfaceHolder = sv.getHolder();
        pincel = new Paint();
    }

    void dibujar(GameState gs, HUD hud){
        mCanvas = mSurfaceHolder.lockCanvas();
        mCanvas.drawColor(Color.argb(255,0,0,0));

        if (gs.getDibujando()){

        }

        if (gs.getGameOver()){

        }

        hud.dibujar(mCanvas,pincel,gs);
        mSurfaceHolder.unlockCanvasAndPost(mCanvas);
    }
}
Anuncios

Para nuestro siguiente paso implementaremos esta clase con el HUD y para ello debemos ir a nuestra clase GameEngine a la cual le implementaremos estas dos clases, lo primero que debemos hacer es crear los dos objetos al comienzo de la misma:

    HUD mHud;
    Renderer mRenderer;
Anuncios

Con estos objetos declarados nuestra siguiente modificacion va a ser en el constructor donde definiremos a los objetos de la siguiente manera:

        mHud = new HUD(tamano);
        mRenderer = new Renderer(this);
Anuncios

Al HUD le informamos los datos de nuestra pantalla para que pueda ubicar a los objetos, la siguiente linea crea el “renderizador” donde el this le envia cual la vista que debe usar, por ultimo debemos agregar la siguiente linea dentro del metodo run justo despues del condicional donde verifica si no esta pausado y antes de averiguar los fps del juego:

mRenderer.dibujar(mGameState,mHud);
Anuncios

Esta linea se encarga de dibujar a nuestro HUD en pantalla, antes de probarlo vamos a ver como quedo el codigo de nuestro GameEngine hasta ahora:

GameEngine.java

package org.example.invasores;

import android.content.Context;
import android.graphics.Point;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceView;

class GameEngine extends SurfaceView implements Runnable, Iniciador {
    private Thread mThread = null;
    private long mFPS;

    private GameState mGameState;
    private SoundEngine mSoundEngine;

    HUD mHud;
    Renderer mRenderer;

    public GameEngine(Context contexto, Point tamano){
        super(contexto);
        mGameState = new GameState(this, contexto);
        mSoundEngine = new SoundEngine(contexto);
        mHud = new HUD(tamano);
        mRenderer = new Renderer(this);
    }

    @Override
    public void run(){
        while(mGameState.getThreadCorriendo()){
            long frameInicio = System.currentTimeMillis();
            if (!mGameState.getPausado()){

            }
            mRenderer.dibujar(mGameState,mHud);
            long frameActual = System.currentTimeMillis() - frameInicio;
            if (frameActual >= 1){
                final int MILISEGUNDOS = 1000;
                mFPS = MILISEGUNDOS / frameActual;
            }
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent evento){
        mSoundEngine.repDisparar();
        return true;
    }

    public void stopThread(){
        mGameState.detenerTodo();

        try{
            mThread.join();
        } catch (InterruptedException e){
            Log.e("Exception","stopThread" +
                    e.getMessage());
        }
    }

    public void startThread(){
        mGameState.startThread();
        mThread = new Thread(this);
        mThread.start();
    }

    public void desapareceReaparece(){

    }
}
Anuncios

Con todo esto podemos probarlo y nuestro juego se vera de la siguiente forma

Anuncios

Como pueden observar ya tenemos nuestros distintos “botones” en pantalla, tenemos los datos para la nave del jugador y un mensaje desplegado en pantalla.

Anuncios

En resumen, hoy hemos visto a la clase Renderer, para que la usaremos, como nos puede ayudar, como trabaja, como se implementa y cuales son las ventajas de trabajar de esta forma, tambien mas adelante como con muy pocas modificaciones podemos ir mejorandola sin demasiados inconvenientes, espero les haya gustado sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00