Anuncios

Bienvenidos sean a este post, tal como vimos en el proyecto anterior hoy crearemos una clase encargada de “renderizar” nuestra pantalla.

Anuncios

Para comenzar crearemos una nueva clase con las siguientes caracteristicas:

  • Nombre: Renderer
  • Tipo: Class
Anuncios

Nuestro siguiente paso sera modificar el codigo con el siguiente:

package org.example.pepeaventura;

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

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

    private Camara mCamara;

    Renderer(SurfaceView sh, Point tamanoPantalla){
        mSurfaceHolder = sh.getHolder();
        mPincel = new Paint();
        mCamara = new Camara(tamanoPantalla.x, tamanoPantalla.y);
    }

    int getPixelsPorMetro(){
        return mCamara.getPixelsPorMetro();
    }
}
Anuncios
Anuncios

En este caso vamos a crear unas variables para el Canvas, donde se grafica, otra para el contenedor de nuestra superficie (SurfaceHolder), otro para el pincel (el cual dibuja en el Canvas) y por ultimo uno de tipo Camara que nos servira ver la parte del nivel donde esta nuestro jugador pero de esto hablaremos cuando hagamos esta clase, con nuestras variables creadas tenemos el constructor para iniciar/definir nuestras variables por medio de un SurfaceView y el metodo getHolder definimos a mSurfaceHolder, despues iniciamos al pincel y por ultimo construimos la camara, despues tenemos un metodo encargado de obtener los pixelsPorMetro de la clase Camara, cuando lleguemos a la clase hablaremos mas profundamente, recuerden que ese valor nos sirve para escalar la misma, nuestro ultimo paso sera agregar el siguiente metodo:

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

            if (gs.getDibujando()){
                mCamara.setCentroMundo(objetos.get(ManagerNivel.JUGADOR_INDICE)
                        .getTransformar().getUbicacion());

                for(GameObjeto objeto : objetos){
                    if (objeto.chekaActivo())
                        objeto.dibujar(mCanvas,mPincel,mCamara);

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

Este metodo sera el encargado de graficar a nuestro Canvas, recibe tres datos:

  • objetos, contiene todos los objetos (tanto moviles como inertes) del nivel
  • gs, el estado actual del juego
  • hud, la interfaz del usuario
Anuncios
Anuncios

El ultimo atributo aun no existe pero pronto lo crearemos, luego por medio de mSurfaceHolder chequearemos si existe o es valido, en caso de ser verdadero lo primero que haremos sera bloquear al Canvas, luego lo pintaremos de negro por medio de drawColor, despues tenemos un condicional donde verificamos si se esta dibujando (es decir que el juego esta activo), en caso de ser cierto primero llamara una funcion que no existe por el momento pero su tarea basica sera mantener al jugador en el centro de la pantalla, cuando hagamos esta clase hablaremos mas a fondo sobre la misma, por ultimo tenemos un bucle for mejorado para pasar por todos los objetos, dentro de este bucle miraremos cuales son los objetos activos del nivel, recuerden que cada nivel tiene sus propios objetos, y en caso de ser verdadero procedera a dibujarlo donde corresponda, con esto ya terminamos los dos condicionales, el primero para verificar si la superficie es valida y el segundo de si esta dibujando, por ultimo dibujaremos el hud o la interfaz del usuario, una vez realizado para finalizar desbloquearemos el Canvas para que la actualizacion tenga efecto, con esto concluimos nuestra clase veamos el codigo final:

Renderer.java

package org.example.pepeaventura;

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

import java.util.ArrayList;

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

    private Camara mCamara;

    Renderer(SurfaceView sh, Point tamanoPantalla){
        mSurfaceHolder = sh.getHolder();
        mPincel = new Paint();
        mCamara = new Camara(tamanoPantalla.x, tamanoPantalla.y);
    }

    int getPixelsPorMetro(){
        return mCamara.getPixelsPorMetro();
    }

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

            if (gs.getDibujando()){
                mCamara.setCentroMundo(objetos.get(ManagerNivel.JUGADOR_INDICE)
                        .getTransformar().getUbicacion());

                for(GameObjeto objeto : objetos){
                    if (objeto.chekaActivo())
                        objeto.dibujar(mCanvas,mPincel,mCamara);

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

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

En resumen, hoy hemos creado la clase encargada de renderizar a cada uno de los objetos en el nivel que estemos jugando, en este caso utilizaremos el Canvas y tambien se “dibujara” la interfaz (aunque todavia no existe la clase) y por otro lado tenemos a la camara que nos limite la vision de nuestro nivel, en el proximo post haremos una clase mucha mas divertida asi que les pido un poco de paciencia, 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.

Donación

Es para mantenimento del sitio, gracias!

$1.00