Anuncios
Anuncios

Bienvenidos sean a este post, en este post veremos todo lo necesario para poder crear nuestro primer juego en este nuevo curso.

Primero vamos a ver el listado con todos los posts por si quieren saber como trabaja el codigo:

Con esto hemos cubierto las explicaciones para poder crear el proyecto desde cero pero a continuacion les dejo el link para descargar el fondo de pantalla del juego y les adjunto los codigos finales del proyecto para compararlos con los de ustedes.

Anuncios

Requisitos para generar el juego en Android Studio:

  • Dispositivos: Phone and Tablet
  • Actividad: Empty Activity
  • Nombre: Cazador de Submarinos
  • Nombre de paquete: org.example.cazadordesub
  • API Minimo: API 14 (Android 4.0)

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="@drawable/fondo"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/texto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginBottom="20dp"
        android:textSize="25sp"
        android:textColor="@android:color/white"
        android:text="Cazador de Submarinos v. 1.0" />

    <Button
        android:id="@+id/inicio"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginLeft="70dp"
        android:layout_marginRight="70dp"
        android:layout_below="@id/texto"
        android:text="Iniciar Juego" />

    <Button
        android:id="@+id/preferencias"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:layout_marginLeft="70dp"
        android:layout_marginRight="70dp"
        android:layout_below="@id/inicio"
        android:text="Preferencias" />

</RelativeLayout>
Anuncios

MainActivity.java

package org.example.cazadordesub;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;

import java.util.Random;

public class MainActivity extends Activity {
    int numHorPixels;
    int numVerPixels;
    int tamBloque;
    int ancGrilla;
    int altGrilla;
    int vertTocado;
    int horizTocado;
    int subHorPosicion;
    int subVerPosicion;
    boolean impacto;
    int disparos;
    boolean depuracion;
    boolean grilla;
    int alfa;
    int distDesdeSub;
    Display vista;
    Point tamano;

    ImageView juegoVista;
    Bitmap bitmapBlanco;
    Canvas canvas;
    Paint pincel;

    SharedPreferences preferencias;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button botonI = (Button) findViewById(R.id.inicio);
        Button botonP = (Button) findViewById(R.id.preferencias);
        botonI.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                nuevo();
                dibujar();
            }
        });
        botonP.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                lanzarPreferencias(null);
            }
        });

        Log.d("Depurando","En el onCreate");
    }

    public void lanzarPreferencias(View view){
        Intent i = new Intent(this, Preferencias.class);
        startActivity(i);
    }

    void dibujar()
    {
        if (grilla)
            alfa = 255;
        else
            alfa = 0;
        bitmapBlanco = Bitmap.createBitmap(numHorPixels,
                numVerPixels, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmapBlanco);
        juegoVista = new ImageView(this);
        pincel = new Paint();
        setContentView(juegoVista);

        juegoVista.setImageBitmap(bitmapBlanco);
        canvas.drawColor(Color.argb(255,255,255,255));
        pincel.setColor(Color.argb(alfa,0,0,0));
        for(int i=0; i < altGrilla; i++) {
            canvas.drawLine(0, tamBloque * i,
                    numHorPixels - 1, tamBloque * i, pincel);
        }
        for(int i =0; i < ancGrilla; i++){
            canvas.drawLine(tamBloque * i,0,
                tamBloque * i, numVerPixels -1, pincel);
        }
        pincel.setColor(Color.argb(255,0,0,0));
        canvas.drawRect(horizTocado * tamBloque,
                vertTocado * tamBloque,
                (horizTocado * tamBloque) + tamBloque,
                (vertTocado * tamBloque) + tamBloque,
                pincel);

        pincel.setTextSize(tamBloque * 1.5f);
        pincel.setColor(Color.argb(255,0,0,255));
        canvas.drawText("Disparos realizados: " +
                disparos + " - Distancia del submarino: " +
                distDesdeSub, tamBloque, tamBloque * 1.75f, pincel);

        Log.d("Depurando","En el dibujar()");
        if (depuracion) {
            imprimirDebug();
        }
    }

    void nuevo()
    {
        vista = getWindowManager().getDefaultDisplay();
        preferencias = PreferenceManager.getDefaultSharedPreferences(this);
        tamano = new Point();
        vista.getSize(tamano);
        numHorPixels = tamano.x;
        numVerPixels = tamano.y;
        ancGrilla = 40;
        tamBloque = numHorPixels / ancGrilla;
        altGrilla = numVerPixels / tamBloque;
        disparos = 0;
        distDesdeSub = 0;
        impacto = false;
        depuracion = preferencias.getBoolean("depuracion",false);
        grilla = preferencias.getBoolean("grilla", false);
        Random alazar = new Random();
        subHorPosicion = alazar.nextInt(ancGrilla);
        subVerPosicion = alazar.nextInt(altGrilla);
        horizTocado = -100;
        vertTocado = -100;

        Log.d("Depurando","En el nuevo()");
    }

    void disparar(int x, int y) {
        disparos++;
        horizTocado = x / tamBloque;
        vertTocado = y / tamBloque;
        impacto = horizTocado == subHorPosicion
                && vertTocado == subVerPosicion;
        int horBrecha = horizTocado - subHorPosicion;
        int verBrecha = vertTocado - subVerPosicion;
        distDesdeSub = (int) Math.sqrt((horBrecha * horBrecha)
                + (verBrecha * verBrecha));
        if (impacto) {
            boom();
        }
        else {
            dibujar();
        }

        Log.d("Depurando","En el disparar()");
    }

    void boom()
    {
        juegoVista.setImageBitmap(bitmapBlanco);
        canvas.drawColor(Color.argb(255,255,0,0));
        pincel.setColor(Color.argb(255,255,255,255));
        pincel.setTextSize(tamBloque * 10);
        canvas.drawText("BOOM!", tamBloque * 4,
                tamBloque * 14, pincel);
        pincel.setTextSize(tamBloque * 2);
        canvas.drawText("Dispara para jugar de nuevo!",
                tamBloque * 8,
                tamBloque * 18, pincel);
        nuevo();

        Log.d("Depurando","Hizo Boom! Verdaderamente");
    }

    void imprimirDebug()
    {
        pincel.setTextSize(tamBloque);
        canvas.drawText("numHorPixels = " + numHorPixels,
                50, tamBloque * 3, pincel);
        canvas.drawText("numVerPixels = " + numVerPixels,
                50, tamBloque * 4, pincel);
        canvas.drawText("tamBloque = " + tamBloque,
                50, tamBloque * 5, pincel);
        canvas.drawText("ancGrilla = " + ancGrilla,
                50, tamBloque * 6, pincel);
        canvas.drawText("altGrilla = " + altGrilla,
                50, tamBloque * 7, pincel);
        canvas.drawText("subHorPosicion = " + subHorPosicion,
                50, tamBloque * 8, pincel);
        canvas.drawText("subVerPosicion = " + subVerPosicion,
                50, tamBloque * 9, pincel);
        canvas.drawText("horizTocado = " + horizTocado,
                50, tamBloque * 10, pincel);
        canvas.drawText("verTocado = " + vertTocado,
                50, tamBloque * 11, pincel);
        canvas.drawText("impacto = " + impacto,
                50, tamBloque * 12, pincel);
        canvas.drawText("depuracion = " + depuracion,
                50, tamBloque * 13, pincel);
        canvas.drawText("grilla = " + grilla,
                50, tamBloque * 14, pincel);
        canvas.drawText("alfa = " + alfa,
                50, tamBloque * 15, pincel);
    }

    @Override
    public boolean onTouchEvent(MotionEvent evento)
    {
        horizTocado = (int)evento.getX();
        vertTocado = (int)evento.getY();
        if ((evento.getAction() &
                MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP){
            disparar(horizTocado,vertTocado);
        }
        Log.d("Depurando","En el onTouchEvent");
        Log.d("Depurando","horizTocado: " + horizTocado);
        Log.d("Depurando","vertTocado: " + vertTocado);
        return true;
    }
}
Anuncios

preferencias.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="preferencias_ppal" >

    <CheckBoxPreference
        android:key="depuracion"
        android:title="Habilitar Depuracion"
        android:summary="Habilita o deshabilita datos para la depuracion" />
    <CheckBoxPreference
        android:key="grilla"
        android:title="Habilitar Grilla"
        android:summary="Habilita o deshabilita datos para la grilla" />

</PreferenceScreen>
Anuncios

Preferencias.java

package org.example.cazadordesub;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class Preferencias extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferencias);
    }
}
Anuncios

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.example.cazadordesub">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Preferencias"
            android:label="Preferencias del juego" />
    </application>

</manifest>
Anuncios

Con esto podran crear su primer juego para Android y en el interin aprenderan algunas cosas de Java, para ver su funcionamiento final les recomiendo el siguiente video

Anuncios

Espero que les haya gustado esto, en los proximos posts iremos viendo otros estilo de juegos para Android, pero tambien hablaremos brevemente sobre algunos conceptos, como siempre si no tenes ningun conocimiento de Android y Java te recomiendo este post, este es un curso inicial donde no solamente aprenderan sobre Android sino tambien crearan un juego desde cero y una aplicacion, tambien viendo como agregar publicidad y como publicar en el play store, 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