Jogo da Forca Tutorial Pong Tutorial SQLite
Mostrando postagens com marcador jogos. Mostrar todas as postagens

Tutorial Pong #5 - Implementando pontuação

Boa tarde!!

Hoje vamos dar mais um pequeno passo neste tutorial. Vamos implementar uma pontuação. Primeiro criaremos algumas variáveis.
-- Instruções
local instrucoes

-- Pontuação
local score
local scoreTF

Vamos começar implementando elas na função mostrarTelaJogo:
instrucoes = display.newImage( 'instrucoes.png', 112, 370 )
instrucoes.x = _W / 2
instrucoes.y = _H / 2 + 150

score = display.newImage( 'pontuacao.png', 260, 10 )
scoreTF = display.newText( '0', 278, 40, 'Marker Felt', 30 )
scoreTF:setFillColor( 238, 238, 238 )

Ao começar o jogo é preciso remover essas instruções da tela:
display.remove( instrucoes )

E agora precisamos incrementar a pontuação sempre que a bolinha acertar a raquete:
scoreTF.text = tostring( tonumber( scoreTF.text ) + 1 )

Com isso já deve estar tudo ok, qualquer dúvida é só postarem aí. Até o próximo post!! Ah, para baixar o projeto, clique aqui.

Tutorial Forca #9 - Botão de Dicas

Bom dia!!

Para hoje, vou complementar o tutorial do Jogo da Forca, conforme uma sugestão.
Para isso, primeiro vamos alterar a classe Palavras, onde será acrescentado um array com as dicas para cada palavra. Aqui no tutorial, eu apenas dupliquei o array de palavras para exemplificar o funcionamento.
private String[] dicas = new String[] {"AVIÃO", "AERONAVE", "AUTOMÓVEL", "MOTOCICLETA",
        "BICICLETA", "IATE", "NAVIO", "TERRA", "MERCÚRIO", "PLUTÃO", "MARTE", "JUPTER", "NETUNO",
        "ELEFANTE", "ESCORPIÃO", "RINOCERONTE", "DINOSSAURO", "REFRIGERADOR", "LIQUIDIFICADOR",
        "TELEVISOR", "POLTRONA", "SECADORA", "ESCORREDOR", "BRASIL", "ÁFRICA", "EUROPA", "AMSTERDÃ", "ESTADOS UNIDOS",
        "GRÉCIA", "ARGENTINA", "VENEZUELA", "BOTAFOGO", "SÃO PAULO", "FLAMENGO", "PALMEIRAS", "FLUMINENSE", "AMOR",
        "INTELECTUAL", "SÁBIO", "CULTURA", "SABEDORIA", "TUCANO", "BEIJA-FLOR", "ZEBRA", "CRUZEIRO", "COMPUTADOR",
        "FACULDADE", "PIPOCA", "MACARRÃO", "FEIJOADA", "SABÃO EM PÓ", "LAVANDERIA", "COZINHA", "CHURRASCO",
        "CATARINENSE", "AFRICANO", "BRASILEIRO", "AMERICANO", "GAÚCHO", "PARANAENSE", "MINEIRO", "SANTISTA",
        "LIXEIRO", "PROGRAMADOR", "LUMINÁRIA", "LUTADOR", "COZINHEIRO", "CARTEIRO", "VENDEDOR", "FLORICULTURA",
        "JAPÃO", "ARÁBIA SAUDITA", "EQUADOR", "MÉXICO", "PORTUGUAL", "ALEMANHA", "PROFESSOR", "CHAVEIRO", "DOCUMENTOS",
        "DOCUMENTÁRIO", "FAMÍLIA", "FAMILIARES", "LANCHONETE"};

Feito isso, vamos alterar a classe sorteio para que ela retorne a palavra sorteada e a dica para esta palavra.
public String[] sorteio() {
    int numero = (int) (random() * palavras.length);
    String palavraSorteada = palavras[numero];

    String dica = dicas[numero];

    return new String[] { palavraSorteada, dica };
}

Ok. Agora a nossa classe Palavras já está funcionando. Agora vamos alterar as telas do jogo. Como estamos utilizando o RelativeLayout, basta inserirmos o botão e definirmos a sua posição. Layout vertical:
<Button
    android:id="@+id/btDica"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:text="Dica" />

Layout horizontal:
<Button
    android:id="@+id/btDica"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginBottom="5dp"
    android:layout_marginLeft="5dp"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:text="Dica" />

Bom, agora só está faltando a activity do jogo e tudo estará pronto. Declare e instancie o botão de dica, mas a principal alteração mesmo fica na função onClick
    public void onClick(View v) {
        if (v.getId() == R.id.btDica) {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("Dica")
            .setMessage(dica)
            .setCancelable(true).create().show();
        } else {
            verificarClick(v);

            boolean acerto = verificarAcerto();

            if (!acerto) {
                nTentativas--;
                switch (nTentativas) {
                case 5:
                    forca.setImageResource(R.drawable.forca_5);
                    break;
                case 4:
                    forca.setImageResource(R.drawable.forca_4);
                    break;
                case 3:
                    forca.setImageResource(R.drawable.forca_3);
                    break;
                case 2:
                    forca.setImageResource(R.drawable.forca_2);
                    break;
                case 1:
                    forca.setImageResource(R.drawable.forca_1);
                    break;
                case 0:
                    forca.setImageResource(R.drawable.forca_0);
                    desabilitarBotoes();
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
                    dialogBuilder.setTitle("Perdeu!")
                    .setMessage("Deseja jogar novamente?")
                    .setCancelable(false)
                    .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                            iniciarJogo();
                        }
                    })
                    .setNegativeButton("Não", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                            finish();
                        }
                    })
                    .create().show();
                }
            }
        }

        if (Replace.replaceAll(tracos, " ", "").equalsIgnoreCase(palavraSecreta)) {
            desabilitarBotoes();
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
            dialogBuilder.setTitle("Parabéns!")
            .setMessage("Deseja jogar novamente?")
            .setCancelable(false)
            .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    iniciarJogo();
                }
            })
            .setNegativeButton("Não", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            })
            .create().show();
        }
    }

Bom, de qualquer forma segue o código todo abaixo, para quem deixou passar alguma coisa. Até o próximo post pessoal!
package br.com.blogspot.androidandrekunde.forcalite;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import br.com.blogspot.androidandrekunde.forcalite.utils.Palavras;
import br.com.blogspot.androidandrekunde.forcalite.utils.Replace;

public class GameActivity extends Activity implements OnClickListener {

    TextView tvPalavra;
    ImageView forca;
    Button bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,
           bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ;

    Button btDica;

    Palavras palavras = new Palavras();

    private String palavraSecreta, tracos, tipoJogo;
    private String dica;
    private int nTentativas;
    private char letra;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
        tipoJogo = getIntent().getExtras().getString("tipo");

        iniciarObjetos();
        iniciarJogo();
    }

    public void onClick(View v) {
        if (v.getId() == R.id.btDica) {
            AlertDialog.Builder alert = new AlertDialog.Builder(this);
            alert.setTitle("Dica")
            .setMessage(dica)
            .setCancelable(true).create().show();
        } else {
            verificarClick(v);

            boolean acerto = verificarAcerto();

            if (!acerto) {
                nTentativas--;
                switch (nTentativas) {
                case 5:
                    forca.setImageResource(R.drawable.forca_5);
                    break;
                case 4:
                    forca.setImageResource(R.drawable.forca_4);
                    break;
                case 3:
                    forca.setImageResource(R.drawable.forca_3);
                    break;
                case 2:
                    forca.setImageResource(R.drawable.forca_2);
                    break;
                case 1:
                    forca.setImageResource(R.drawable.forca_1);
                    break;
                case 0:
                    forca.setImageResource(R.drawable.forca_0);
                    desabilitarBotoes();
                    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
                    dialogBuilder.setTitle("Perdeu!")
                    .setMessage("Deseja jogar novamente?")
                    .setCancelable(false)
                    .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface arg0, int arg1) {
                            iniciarJogo();
                        }
                    })
                    .setNegativeButton("Não", new DialogInterface.OnClickListener() {

                        public void onClick(DialogInterface arg0, int arg1) {
                            finish();
                        }
                    })
                    .create().show();
                }
            }
        }

        if (Replace.replaceAll(tracos, " ", "").equalsIgnoreCase(palavraSecreta)) {
            desabilitarBotoes();
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
            dialogBuilder.setTitle("Parabéns!")
            .setMessage("Deseja jogar novamente?")
            .setCancelable(false)
            .setPositiveButton("Sim", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    iniciarJogo();
                }
            })
            .setNegativeButton("Não", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            })
            .create().show();
        }
    }

    private void verificarClick(View v) {
        switch (v.getId()) {
        case R.id.bA:
            bA.setEnabled(false); letra = 'A'; break;
        case R.id.bB:
            bB.setEnabled(false); letra = 'B'; break;
        case R.id.bC:
            bC.setEnabled(false); letra = 'C'; break;
        case R.id.bD:
            bD.setEnabled(false); letra = 'D'; break;
        case R.id.bE:
            bE.setEnabled(false); letra = 'E'; break;
        case R.id.bF:
            bF.setEnabled(false); letra = 'F'; break;
        case R.id.bG:
            bG.setEnabled(false); letra = 'G'; break;
        case R.id.bH:
            bH.setEnabled(false); letra = 'H'; break;
        case R.id.bI:
            bI.setEnabled(false); letra = 'I'; break;
        case R.id.bJ:
            bJ.setEnabled(false); letra = 'J'; break;
        case R.id.bK:
            bK.setEnabled(false); letra = 'K'; break;
        case R.id.bL:
            bL.setEnabled(false); letra = 'L'; break;
        case R.id.bM:
            bM.setEnabled(false); letra = 'M'; break;
        case R.id.bN:
            bN.setEnabled(false); letra = 'N'; break;
        case R.id.bO:
            bO.setEnabled(false); letra = 'O'; break;
        case R.id.bP:
            bP.setEnabled(false); letra = 'P'; break;
        case R.id.bQ:
            bQ.setEnabled(false); letra = 'Q'; break;
        case R.id.bR:
            bR.setEnabled(false); letra = 'R'; break;
        case R.id.bS:
            bS.setEnabled(false); letra = 'S'; break;
        case R.id.bT:
            bT.setEnabled(false); letra = 'T'; break;
        case R.id.bU:
            bU.setEnabled(false); letra = 'U'; break;
        case R.id.bV:
            bV.setEnabled(false); letra = 'V'; break;
        case R.id.bW:
            bW.setEnabled(false); letra = 'W'; break;
        case R.id.bX:
            bX.setEnabled(false); letra = 'X'; break;
        case R.id.bY:
            bY.setEnabled(false); letra = 'Y'; break;
        case R.id.bZ:
            bZ.setEnabled(false); letra = 'Z'; break;
        }
    }

    private boolean verificarAcerto() {
        boolean acerto = false;
        for (int x = 0; x < palavraSecreta.length(); x++) {
            char tmp = ' ';
            char vogal = palavraSecreta.charAt(x);
            if (vogal == 'Á') tmp = 'A';
            if (vogal == 'Ã') tmp = 'A';
            if (vogal == 'À') tmp = 'A';
            if (vogal == 'É') tmp = 'E';
            if (vogal == 'Ê') tmp = 'E';
            if (vogal == 'Í') tmp = 'I';
            if (vogal == 'Ó') tmp = 'O';
            if (vogal == 'Õ') tmp = 'O';
            if (vogal == 'Ò') tmp = 'O';
            if (vogal == 'Ô') tmp = 'O';
            if (vogal == 'Ú') tmp = 'U';
            if (vogal == 'Ç') tmp = 'C';
            if (vogal == letra || tmp == letra) {
                tracos = tracos.substring(0, 3 * x + 1) + vogal + tracos.substring(3 * x + 2);
                acerto = true;
            }
        }
        tvPalavra.setText(tracos);

        return acerto;
    }

    public void iniciarJogo() {
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        if (tipoJogo.equals("jogador1")) {
         String[] retorno = palavras.sorteio();
            palavraSecreta = retorno[0];
            dica = retorno[1];
            procedimentosInicio();
        } else {
            final EditText input = new EditText(this);
            dialogBuilder.setTitle("Palavra Secreta")
            .setMessage("Digite uma palavra para seu adversário.")
            .setView(input)
            .setPositiveButton("OK", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    palavraSecreta = input.getText().toString().toUpperCase();
                    procedimentosInicio();
                }
            })
            .setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            })
            .create().show();
        }
    }

    private void procedimentosInicio() {
        nTentativas = 6;
        tracos = "";
        letra = ' ';
        for (int x = 0; x < palavraSecreta.length(); x++) {
            if (palavraSecreta.charAt(x) == '-') {
                tracos += " - ";
            } else if (palavraSecreta.charAt(x) == ' ') {
                tracos += "   ";
            } else {
                tracos += " _ ";
            }
        }

        habilitarBotoes();
        tvPalavra.setText(tracos);
        forca.setImageResource(R.drawable.forca_6);
    }

    private void habilitarBotoes() {
        bA.setEnabled(true);
        bB.setEnabled(true);
        bC.setEnabled(true);
        bD.setEnabled(true);
        bE.setEnabled(true);
        bF.setEnabled(true);
        bG.setEnabled(true);
        bH.setEnabled(true);
        bI.setEnabled(true);
        bJ.setEnabled(true);
        bK.setEnabled(true);
        bL.setEnabled(true);
        bM.setEnabled(true);
        bN.setEnabled(true);
        bO.setEnabled(true);
        bP.setEnabled(true);
        bQ.setEnabled(true);
        bR.setEnabled(true);
        bS.setEnabled(true);
        bT.setEnabled(true);
        bU.setEnabled(true);
        bV.setEnabled(true);
        bW.setEnabled(true);
        bX.setEnabled(true);
        bY.setEnabled(true);
        bZ.setEnabled(true);
    }

    private void desabilitarBotoes() {
        bA.setEnabled(false);
        bB.setEnabled(false);
        bC.setEnabled(false);
        bD.setEnabled(false);
        bE.setEnabled(false);
        bF.setEnabled(false);
        bG.setEnabled(false);
        bH.setEnabled(false);
        bI.setEnabled(false);
        bJ.setEnabled(false);
        bK.setEnabled(false);
        bL.setEnabled(false);
        bM.setEnabled(false);
        bN.setEnabled(false);
        bO.setEnabled(false);
        bP.setEnabled(false);
        bQ.setEnabled(false);
        bR.setEnabled(false);
        bS.setEnabled(false);
        bT.setEnabled(false);
        bU.setEnabled(false);
        bV.setEnabled(false);
        bW.setEnabled(false);
        bX.setEnabled(false);
        bY.setEnabled(false);
        bZ.setEnabled(false);
    }

    private void iniciarObjetos() {
        tvPalavra = (TextView) findViewById(R.id.tvPalavra);
        forca = (ImageView) findViewById(R.id.ivForca);

        btDica = (Button) findViewById(R.id.btDica);
        btDica.setOnClickListener(this);

        bA = (Button) findViewById(R.id.bA);
        bB = (Button) findViewById(R.id.bB);
        bC = (Button) findViewById(R.id.bC);
        bD = (Button) findViewById(R.id.bD);
        bE = (Button) findViewById(R.id.bE);
        bF = (Button) findViewById(R.id.bF);
        bG = (Button) findViewById(R.id.bG);
        bH = (Button) findViewById(R.id.bH);
        bI = (Button) findViewById(R.id.bI);
        bJ = (Button) findViewById(R.id.bJ);
        bK = (Button) findViewById(R.id.bK);
        bL = (Button) findViewById(R.id.bL);
        bM = (Button) findViewById(R.id.bM);
        bN = (Button) findViewById(R.id.bN);
        bO = (Button) findViewById(R.id.bO);
        bP = (Button) findViewById(R.id.bP);
        bQ = (Button) findViewById(R.id.bQ);
        bR = (Button) findViewById(R.id.bR);
        bS = (Button) findViewById(R.id.bS);
        bT = (Button) findViewById(R.id.bT);
        bU = (Button) findViewById(R.id.bU);
        bV = (Button) findViewById(R.id.bV);
        bW = (Button) findViewById(R.id.bW);
        bX = (Button) findViewById(R.id.bX);
        bY = (Button) findViewById(R.id.bY);
        bZ = (Button) findViewById(R.id.bZ);
        bA.setOnClickListener(this);
        bB.setOnClickListener(this);
        bC.setOnClickListener(this);
        bD.setOnClickListener(this);
        bE.setOnClickListener(this);
        bF.setOnClickListener(this);
        bG.setOnClickListener(this);
        bH.setOnClickListener(this);
        bI.setOnClickListener(this);
        bJ.setOnClickListener(this);
        bK.setOnClickListener(this);
        bL.setOnClickListener(this);
        bM.setOnClickListener(this);
        bN.setOnClickListener(this);
        bO.setOnClickListener(this);
        bP.setOnClickListener(this);
        bQ.setOnClickListener(this);
        bR.setOnClickListener(this);
        bS.setOnClickListener(this);
        bT.setOnClickListener(this);
        bU.setOnClickListener(this);
        bV.setOnClickListener(this);
        bW.setOnClickListener(this);
        bX.setOnClickListener(this);
        bY.setOnClickListener(this);
        bZ.setOnClickListener(this);
    }
}

Tutorial Pong #4 - Animação do Jogo


Bom dia!!
Hoje vou mostrar como o jogo vai funcionar. A lógica dele é bem simples, vocês vão ver.
Primeiro vamos adicionar mais algumas variáveis e declarar mais algumas funções:
-- Variáveis
local escala    = 0.9
local variation = 0.05
local ballX     = 0
local ballY     = 0
local ballVar   = 0.5

-- Fim do Jogo
local fimJogo
local gameListeners   = {}
local comecarJogo     = {}
local update          = {}
local moverRquete     = {}
local fim             = {}

Agora vamos deixar a função mostrarTelaJogo da seguinte forma:
function gameListeners( action )
    if ( action == 'add' ) then
        bg:addEventListener( 'touch', moverRaquete )
    else
        bg:removeEventListener( 'touch', moverRaquete )
        Runtime:removeEventListener( 'enterFrame', update )
    end
end

function comecarJogo()
    bg:removeEventListener( 'tap', comecarJogo )
    Runtime:addEventListener( 'enterFrame', update )
end

function hitTestObject( objeto1, objeto2 )
    local esquerda = objeto1.contentBounds.xMin <= objeto2.contentBounds.xMin and objeto1.contentBounds.xMax >= objeto2.contentBounds.xMax
    local direita  = objeto1.contentBounds.xMin >= objeto2.contentBounds.xMin and objeto1.contentBounds.xMax <= objeto2.contentBounds.xMax
    local cima     = objeto1.contentBounds.yMin <= objeto2.contentBounds.yMin and objeto1.contentBounds.yMax >= objeto2.contentBounds.yMax
    local baixo    = objeto1.contentBounds.yMin >= objeto2.contentBounds.yMin and objeto1.contentBounds.yMax <= objeto2.contentBounds.yMax

    return ( esquerda or direita ) and ( cima or baixo )
end

function update()
    escala = escala - variation
    ball.xScale = escala
    ball.yScale = escala

    -- Raising
    if ( math.floor( ball.xScale * 10 ) >= 15 ) then
        variation = 0.05
    end
    -- Missed
    if ( math.floor( ball.xScale * 10 ) < 3 ) then
        fim()
    end

    -- Movendo a bolinha
    ball.x = ball.x - ballX
    ball.y = ball.y - ballY

    -- Falling and Hit with paddle
    if ( math.floor( ball.xScale * 10 ) == 3 and hitTestObject( paddleTop, ball ) ) then
        variation = -0.05
        if ( ball.x < paddle.x + 50 ) then
            ballX = ( math.random() * 0.5 ) + ballVar
        end
        if ( ball.x > paddle.x ) then
            ballX = ( math.random() * -0.5 ) - ballVar
        end
        if ( ball.y < paddle.y + 75 ) then
            ballY = ( math.random() * 0.5 ) + ballVar
        end
        if ( ball.y > paddle.y - 70 ) then
            ballY = ( math.random() * -0.5 ) - ballVar
        end

        ballVar = ballVar + 0.025
    end
end

function moverRaquete( e )
    if ( e.phase == 'moved' ) then
        paddle.x = e.x
        paddle.y = e.y
    end
end

function fim()
    fim = display.newImage( 'alert.png', _W / 2, _H / 2 )
    transition.to( fimJogo, { time = 300, xScale = 0.5, yScale = 0.5 } )
end

Bom, hoje foi um post relâmpago, só para tentar não perder este ritmo de postagens antes de acabar o tutorial.
Para quem tiver interesse, pode fazer o download do andamento do projeto aqui.

Tutorial Pong #3 - Tela do Jogo


Bom dia pessoal!
Hoje temos mais uma pequena parte do tutorial, vamos iniciar a tela do jogo. Para isso, vamos criar as variáveis que vão armazenar as informações desta tela:

-- Raquete
local paddle
local paddleTop
local paddleBottom

-- Bolinha
local ball

-- Variáveis
local escala = 0.9
local mostrarTelaJogo = {}

Também é preciso alterar a função startButtonListener, para que fique desta forma:
function startButtonListener( action )
    if ( action == 'add' ) then
        btnJogar:addEventListener( 'tap', mostrarTelaJogo )
        btnCreditos:addEventListener( 'tap', mostrarCreditos )
    else
        btnJogar:removeEventListener( 'tap', mostrarTelaJogo )
        btnCreditos:removeEventListener( 'tap', mostrarCreditos )
    end
end

E criaremos a função mostrarTelaJogo, já declarada anteriormente:
function mostrarTelaJogo:tap( e )
    transition.to( telaInicial, { time = 300, x = - telaInicial.height,
        onComplete = function()
            startButtonListener( 'rmv' )
            display.remove( telaInicial )
            telaInicial = nil
            -- bg:addEventListener( 'tap', startGame )
        end } )

    -- Paddle
    paddleBottom = display.newImage( 'paddleBottom.png', _W / 2, ( _H / 2 ) * 1.5 )
    paddleTop    = display.newImage( 'paddleTop.png'   , _W / 2, ( ( _H / 2 ) * 1.5 ) - 72 )
    paddle       = display.newGroup( paddleBottom, paddleTop )

    -- Ball
    ball = display.newImage( 'ball.png', _W / 2, ( _H / 2 ) + 55 )
    ball:scale( escala, escala )
end

Bom, está aí a tela do jogo já.
No próximo vamos adicionar a movimentação do jogo!!
Para baixar essa parte do tutorial, clique aqui.

Tutorial Pong #2 - Tela de Créditos


Bom dia a todos!!

Hoje vou colocar a tela de créditos deste jogo.
Para isso, vamos adicionar as seguintes linhas:
-- [Tela Créditos]
local telaCreditos
local mostrarCreditos = {}
local ocultarCreditos = {}

Agora criaremos o listener do botão, o evento que será disparado ao clicar no botão.
startButtonListener( 'add' )
function startButtonListener( action )
    if action == 'add' then
        btnCreditos:addEventListener( 'tap', mostrarCreditos )
    end
end

function mostrarCreditos:tap( e )
    btnJogar.isVisible    = false
    btnCreditos.isVisible = false

    telaCreditos = display.newImage( 'creditos.png', _W / 2, _H / 2 + 90 )

    telaCreditos:addEventListener( 'tap', ocultarCreditos )
end

function ocultarCreditos:tap( e )
    btnJogar.isVisible    = true
    btnCreditos.isVisible = true

    telaCreditos:removeEventListener( 'tap', ocultarCreditos )
    display.remove( telaCreditos )
    telaCreditos = nil
end

Com isso, já deve estar aparecendo a tela de créditos ao clicar no botão. Mas não é só isso não. Vamos colocar um efeito nesta transição de telas. Para isso, vamos adicionar algumas linhas à função mostrarCreditos:
    lastY = titulo.y
    transition.to( titulo, { time = 300, y = ( display.contentHeight * 0.5 ) - ( titulo.height + 50 ) } )
    transition.to( telaCreditos, { time = 300, y = ( display.contentHeight * 0.5 ) + 35,
        onComplete = function()
            telaCreditos:addEventListener( 'tap', ocultarCreditos )
        end } )

E vamos alterar a função ocultarCreditos para que fique assim:
function ocultarCreditos:tap( e )
    transition.to( telaCreditos, { time = 300, y = _H / 2 + 90,
        onComplete = function()
            btnJogar.isVisible = true
            btnCreditos.isVisible = true
            telaCreditos:removeEventListener( 'tap', ocultarCreditos )
            display.remove( telaCreditos )
            telaCreditos = nil
        end } )
    transition.to( titulo, { time = 300, y = lastY } )
end

Bom, a animação desta tela não foi nada muito grandioso, mas já deu outra cara ao app.
Para baixar essa parte do tutorial, clique aqui.
Espero que estejam gostando deste tutorial. Até o próximo!!

Tutorial Pong #1 - Começando o Projeto


Boa tarde!

Me desculpem por ter sumido e deixado o blog um tanto abandonado, mas é que as coisas ficaram bem corridas por aqui.
Mudança de emprego, idéias para meus aplicativos...
Espero que logo eu consiga postar aqui as novidades sobre eles e compartilhar com vocês.

Bom, mas vamos ao que interessa.
Hoje venho falar novamente sobre o desenvolvimento multi-plataforma que o Corona SDK oferece.
Recentemente foi lançado o Corona Editor (http://coronalabs.com/products/editor/), que auxilia no desenvolvimento.

E para não passar em branco o começo deste ano e a volta das postagens, vou começar um tutorial de um jogo.
Não fui eu que fiz este tutorial, estou seguindo um modelo que encontrei no próprio site do corona. Para quem quiser ver tudo, o endereço é este: http://mobile.tutsplus.com/tutorials/corona/create-a-balance-ping-pong-game/
Vamos começar criando uma pasta chamada Tutorial Pong, com um arquivo config.lua dentro dela. Esse arquivo de configuração tornará a aplicação em tela cheia para todos os aplicativos. Nele consta o tamanho original da tela e o método utilizado para dimensionar o conteúdo no caso do aplicativo ser executado em outra resolução.
application =
{
    content =
    {
        width  = 320,
        height = 480,
        scale  = "letterbox"
    }
}

Vamos criar também o arquivo main.lua, que é o nosso projeto em si.
-- Oculta Barra de Status
display.setStatusBar(display.HiddenStatusBar)

-- Constantes que armazenam o tamanho da tela
local _W = display.contentWidth
local _H = display.contentHeight

-- [Fundo]
local bg = display.newImage( 'bg.png', _W / 2, _H / 2 )

Ao colocar uma imagem na tela é preciso informar o nome desta imagem e o seu posicionamento na tela (X, Y). E como eu fiz isso? Utilizei as variáveis que eu criei - _W, _H - que capturam o tamanho da tela e dividi cada uma por 2, ou seja, posicionei minha imagem no centro da tela.
Vamos criar também as variáveis que irão armazenar a nossa tela inicial.
-- [Tela Inicial]
local titulo
local btnJogar
logal btnCreditos
local telaInicial

E a função principal do jogo:
-- Funções
local Main = {}

-- Função Main
function Main()
    titulo      = display.newImage( 'titulo.png'     , _W / 2, _H / 2        )
    btnJogar    = display.newImage( 'btnJogar.png'   , _W / 2, _H / 1.5 + 10 )
    btnCreditos = display.newImage( 'btncreditos.png', _W / 2, _H / 1.5 + 70 )

    telaInicial = display.newGroup( titulo, btnJogar, btnCreditos )
end

Main()
Bom, neste ponto já é para ser possível visualizar a tela inicial do jogo, quer dizer, se você tiver colocado as imagens já... hehehe


Vou mudar um pouco a sequência do tutorial no qual eu tive como base, de uma forma que eu acho que vai ser mais fácil para entender e ir visualizando também.
Para baixar essa parte do tutorial, clique aqui.
Qualquer dúvida, sugestão ou dificuldade, postem aí que farei o possível para ajudar!!

Tutorial Forca #8 - Layout Paisagem

Boa tarde!

O jogo está funcionando, certo? Bom... funcionar até funciona, mas o que acontece caso você vire o seu celular (Ctrl+F12 no emulador)? Ele desconfigura toda a tela, tentando manter o layout criado.
Para resolver isso temos duas saídas:

  • Podemos alterar o AndroidManifest.xml, alterando a tag actvity para conter a opção screenOrientation, onde não permitirá que o layout se ajuste às rotações do celular
<activity android:name=".GameActivity" android:screenOrientation="portrait" />
<activity android:name=".MainActivity" android:screenOrientation="portrait" />


  • Ou criar uma outra pasta de layout chamada layout-land, que armazenará os layouts feitos para o quando o celular ficar como landscape. (que é o caminho que escolhi para este tutorial)
Depois de criar a pasta citada acima (layout-land), é só copiar os arquivos que estão na pasta layout e colar lá dentro. Só isso? Infelizmente não...
É preciso deixar os arquivos conforme abaixo:
activity_game.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ImageView
        android:id="@+id/ivForca"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginTop="10dp"
        android:contentDescription="@null"
        android:src="@drawable/forca_6" /v
    <LinearLayout
        android:id="@+id/lBotoes"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_toRightOf="@id/ivForca"
        android:layout_alignParentBottom="true" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bA"
                android:text="A" />
            <Button
                style="@style/letras"
                android:id="@+id/bB"
                android:text="B" />
            <Button
                style="@style/letras"
                android:id="@+id/bC"
                android:text="C" />
            <Button
                style="@style/letras"
                android:id="@+id/bD"
                android:text="D" />
            <Button
                style="@style/letras"
                android:id="@+id/bE"
                android:text="E" />
            <Button
                style="@style/letras"
                android:id="@+id/bF"
                android:text="F" />
            <Button
                style="@style/letras"
                android:id="@+id/bG"
                android:text="G" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bH"
                android:text="H" />
            <Button
                style="@style/letras"
                android:id="@+id/bI"
                android:text="I" />
            <Button
                style="@style/letras"
                android:id="@+id/bJ"
                android:text="J" />
            <Button
                style="@style/letras"
                android:id="@+id/bK"
                android:text="K" />
            <Button
                style="@style/letras"
                android:id="@+id/bL"
                android:text="L" />
            <Button
                style="@style/letras"
                android:id="@+id/bM"
                android:text="M" />
            <Button
                style="@style/letras"
                android:id="@+id/bN"
                android:text="N" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bO"
                android:text="O" />
            <Button
                style="@style/letras"
                android:id="@+id/bP"
                android:text="P" />
            <Button
                style="@style/letras"
                android:id="@+id/bQ"
                android:text="Q" />
            <Button
                style="@style/letras"
                android:id="@+id/bR"
                android:text="R" />
            <Button
                style="@style/letras"
                android:id="@+id/bS"
                android:text="S" />
            <Button
                style="@style/letras"
                android:id="@+id/bT"
                android:text="T" />
            <Button
                style="@style/letras"
                android:id="@+id/bU"
                android:text="U" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="35dp"
            android:layout_marginRight="35dp"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bV"
                android:text="V" />
            <Button
                style="@style/letras"
                android:id="@+id/bW"
                android:text="W" />
            <Button
                style="@style/letras"
                android:id="@+id/bX"
                android:text="X" />
            <Button
                style="@style/letras"
                android:id="@+id/bY"
                android:text="Y" />
            <Button
                style="@style/letras"
                android:id="@+id/bZ"
                android:text="Z" />
        </LinearLayout>
    </LinearLayout>
    <TextView
        android:id="@+id/tvPalavra"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/lBotoes"
        android:layout_toRightOf="@id/ivForca"
        android:gravity="center"
        android:text="PALAVRA SECRETA" />
</RelativeLayout>
activity_main.xml
<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" >
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_margin="30dp"
        android:contentDescription="@null"
        android:src="@drawable/forca_0" />
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toRightOf="@id/imageView1"
        android:orientation="vertical" >
        <Button
            android:id="@+id/bSair"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="50dp"
            android:layout_marginLeft="85dp"
            android:layout_marginRight="85dp"
            android:text="Sair" />
        <Button
            android:id="@+id/bStart2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_above="@id/bSair"
            android:layout_marginLeft="35dp"
            android:layout_marginRight="35dp"
            android:text="2 Jogadores" />
        <Button
            android:id="@+id/bStart1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_above="@id/bStart2"
            android:layout_marginLeft="35dp"
            android:layout_marginRight="35dp"
            android:text="1 Jogador" />
        <ImageView
            android:id="@+id/ivConfig"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="20dp"
            android:layout_marginBottom="20dp"
            android:contentDescription="@null"
            android:src="@drawable/config" />
    </RelativeLayout>
</RelativeLayout>
É isso! Agora, ao girar o celular, o layout vai se adaptar ao invés de desconfigurar. Dá um pouco de trabalho a mais que a primeira opção, mas também dá uma incrementada no visual da aplicação. Agora cabe a vocês escolherem o melhor caminho!



Clique aqui para ver as alterações de hoje, e para o projeto completo, clique aqui.

Tutorial Forca #7 - Tela de entrada (splashscreen)

Boa tarde amigos!

Sei que o blog está a um tempo parado já, mas é que as coisas estão um pouco corridas.
Estou tentando retomar as postagens, mas hoje vai ser jogo rápido.
A tela de entrada do aplicativo. Alguns tem, outros não, vai de cada desenvolvedor. Geralmente conta com a logo da empresa/desenvolvedor do aplicativo ou com alguma propaganda (um assunto que pretendo abordar em breve aqui).

Bom... vamos ao que interessa. Vamos criar primeiro o layout da nossa tela de entrada:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" />
    <ImageView
        android:id="@+id/imageView1"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:contentDescription="@null"
        android:src="@drawable/tuto_forca" />
</RelativeLayout>
É um layout simples, contendo apenas uma imagem antes de iniciar realmente a aplicação.
Agora vamos criar a classe chamada SplashscreenActivity com o seguinte código:
public class SplashscreenActivity extends Activity implements Runnable {

    private final int DELAY = 3000;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);

        Handler handler = new Handler();
        handler.postDelayed(this, DELAY);
    }

    public void run() {
        Intent i = new Intent(SplashscreenActivity.this, MainActivity.class);
        startActivity(i);
        SplashscreenActivity.this.finish();
    }
}
Não lembro se já comentei em alguma outra postagem, mas para fazer as importações necessárias, basta pressionar Ctrl + o que todos os imports necessários são feitos. A variável DELAY é a responsável pelo tempo de exibição da tela.
Bom, um ponto importante deste código é lembrar de finalizar esta activity assim que ela chamar a tela principal do jogo, pois caso isso não seja feito, ao clicar em voltar, essa tela inicial volta a aparecer e isso não seria muito legal.
É preciso fazer uma alteração também no AndroidManifest, deixando-o assim:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.blogspot.androidandrekunde.forcalite"
    android:versionCode="1"
    android:versionName="1.0"
    android:installLocation="auto" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".SplashscreenActivity"
            android:label="@string/title_activity_main"
            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=".GameActivity" />
        <activity android:name=".MainActivity" />
    </application>

</manifest>
Basicamente o que foi feito foi declarar a SplashscreenActivity no lugar da MainActivity, fazendo dela a activity principal.
Com isso o nosso app já terá sua tela inicial.
Clique aqui para conferir todas as alterações que eu fiz no projeto.

Tutorial Forca #6 - Botão Jogador 2

Antes de fazer funcionar o botão do Jogador 2, gostaria de compartilhar com vocês algumas alterações que eu fiz.
Ao fazer alguns testes, notei que o nome do aplicativo estava errado, aí alterei lá no arquivo strings.xml, dentro da pasta values.
Também alterei o local de instalação do aplicativo, adicionando a seguinte linha ao cabeçalho do AndroidManifest
android:installLocation="auto"
E agora, dando continuidade à série, vamos criar a ação que permitirá que o jogo seja jogado em dois.
Como assim? Uma pessoa digita a palavra a ser adivinhada, e a outra tenta adivinhar!
Para isso, vamos alterar o arquivo MainActivity, no método onClick, que ficará assim:
public void onClick(View v) {
    Intent i = new Intent(MainActivity.this, GameActivity.class);
    switch (v.getId()) {
    case R.id.bStart1:
        i.putExtra("tipo", "jogador1");
        startActivity(i);
        break;
    case R.id.bStart2:
        i.putExtra("tipo", "jogador2");
        startActivity(i);
        break;
    case R.id.bSair:
        finish();
    }
}
Bom, agora que passamos a string "tipo" para GameActivity precisamos declarar uma string chamada tipoJogo junto com as outras strings e recuperar o valor passado para a nossa activity adicionando a seguinte linha no nosso método onCreate
tipoJogo = getIntent().getExtras().getString("tipo");
Lembrando que essa linha deve ser colocada antes da chamada do método que inicia o jogo.
Agora vamos até o método iniciarJogo() e vamos modifica-lo.
public void iniciarJogo() {
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
    if (tipoJogo.equals("jogador1")) {
        palavraSecreta = palavras.sorteio();
        procedimentosInicio();
    } else {
        final EditText input = new EditText(this);
        dialogBuilder.setTitle("Palavra Secreta")
        .setMessage("Digite uma palavra para seu adversário.")
        .setView(input)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                palavraSecreta = input.getText().toString().toUpperCase();
                procedimentosInicio();
            }
        })
        .setNegativeButton("Cancelar", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                finish();
            }
        })
        .create().show();
    }
}

private void procedimentosInicio() {
    nTentativas = 6;
    tracos = "";
    letra = ' ';
    for (int x = 0; x < palavraSecreta.length(); x++) {
        if (palavraSecreta.charAt(x) == '-') {
            tracos += " - ";
        } else if (palavraSecreta.charAt(x) == ' ') {
            tracos += "   ";
        } else {
            tracos += " _ ";
        }
    }

    habilitarBotoes();
    tvPalavra.setText(tracos);
    forca.setImageResource(R.drawable.forca_6);
} 
Fazendo isso, deve funcionar já.
Caso eu tenha esquecido de mencionar alguma alteração, clique aqui para conferir todas as alterações que eu fiz no projeto. Até o próximo post pessoal!

Tutorial Forca #5 - Fazendo o jogo funcionar

Boa tarde pessoal!
Para começar a fazer o jogo funcionar, vamos implementar o método OnClickListener à nossa activity
public class GameActivity extends Activity implements OnClickListener {
Ao fazer isso, será preciso criar o seguinte método:
public void onClick(View v) {

}
Vamos declarar os objetos que tem no layout.
TextView tvPalavra;
ImageView forca;
Button bA, bB, bC, bD, bE, bF, bG, bH, bI, bJ, bK, bL, bM,
       bN, bO, bP, bQ, bR, bS, bT, bU, bV, bW, bX, bY, bZ;
E vamos criar um método para instancia-los.
private void iniciarObjetos() {
    tvPalavra = (TextView) findViewById(R.id.tvPalavra);
    forca = (ImageView) findViewById(R.id.ivForca);

    bA = (Button) findViewById(R.id.bA);
    bB = (Button) findViewById(R.id.bB);
    bC = (Button) findViewById(R.id.bC);
    bD = (Button) findViewById(R.id.bD);
    bE = (Button) findViewById(R.id.bE);
    bF = (Button) findViewById(R.id.bF);
    bG = (Button) findViewById(R.id.bG);
    bH = (Button) findViewById(R.id.bH);
    bI = (Button) findViewById(R.id.bI);
    bJ = (Button) findViewById(R.id.bJ);
    bK = (Button) findViewById(R.id.bK);
    bL = (Button) findViewById(R.id.bL);
    bM = (Button) findViewById(R.id.bM);
    bN = (Button) findViewById(R.id.bN);
    bO = (Button) findViewById(R.id.bO);
    bP = (Button) findViewById(R.id.bP);
    bQ = (Button) findViewById(R.id.bQ);
    bR = (Button) findViewById(R.id.bR);
    bS = (Button) findViewById(R.id.bS);
    bT = (Button) findViewById(R.id.bT);
    bU = (Button) findViewById(R.id.bU);
    bV = (Button) findViewById(R.id.bV);
    bW = (Button) findViewById(R.id.bW);
    bX = (Button) findViewById(R.id.bX);
    bY = (Button) findViewById(R.id.bY);
    bZ = (Button) findViewById(R.id.bZ);
    bA.setOnClickListener(this);
    bB.setOnClickListener(this);
    bC.setOnClickListener(this);
    bD.setOnClickListener(this);
    bE.setOnClickListener(this);
    bF.setOnClickListener(this);
    bG.setOnClickListener(this);
    bH.setOnClickListener(this);
    bI.setOnClickListener(this);
    bJ.setOnClickListener(this);
    bK.setOnClickListener(this);
    bL.setOnClickListener(this);
    bM.setOnClickListener(this);
    bN.setOnClickListener(this);
    bO.setOnClickListener(this);
    bP.setOnClickListener(this);
    bQ.setOnClickListener(this);
    bR.setOnClickListener(this);
    bS.setOnClickListener(this);
    bT.setOnClickListener(this);
    bU.setOnClickListener(this);
    bV.setOnClickListener(this);
    bW.setOnClickListener(this);
    bX.setOnClickListener(this);
    bY.setOnClickListener(this);
    bZ.setOnClickListener(this);
}
Vamos declarar algumas variáveis que utilizaremos ao longo das próximas funções e instanciar a classe Palavras:
Palavras palavras = new Palavras();

private String palavraSecreta, tracos;
private int nTentativas;
private char letra;
Bom, agora precisamos identificar o click de cada botão no método onClick, e para isso vou criar um método chamado verificarClick(View v) e chamá-lo dentro do método onClick
public class onClick(View v) {
    verificarClick(v);
}

private void verificarClick(View v) {
    switch (v.getId()) {
    case R.id.bA:
        bA.setEnabled(false); letra = 'A'; break;
    case R.id.bB:
        bB.setEnabled(false); letra = 'B'; break;
    case R.id.bC:
        bC.setEnabled(false); letra = 'C'; break;
    case R.id.bD:
        bD.setEnabled(false); letra = 'D'; break;
    case R.id.bE:
        bE.setEnabled(false); letra = 'E'; break;
    case R.id.bF:
        bF.setEnabled(false); letra = 'F'; break;
    case R.id.bG:
        bG.setEnabled(false); letra = 'G'; break;
    case R.id.bH:
        bH.setEnabled(false); letra = 'H'; break;
    case R.id.bI:
        bI.setEnabled(false); letra = 'I'; break;
    case R.id.bJ:
        bJ.setEnabled(false); letra = 'J'; break;
    case R.id.bK:
        bK.setEnabled(false); letra = 'K'; break;
    case R.id.bL:
        bL.setEnabled(false); letra = 'L'; break;
    case R.id.bM:
        bM.setEnabled(false); letra = 'M'; break;
    case R.id.bN:
        bN.setEnabled(false); letra = 'N'; break;
    case R.id.bO:
        bO.setEnabled(false); letra = 'O'; break;
    case R.id.bP:
        bP.setEnabled(false); letra = 'P'; break;
    case R.id.bQ:
        bQ.setEnabled(false); letra = 'Q'; break;
    case R.id.bR:
        bR.setEnabled(false); letra = 'R'; break;
    case R.id.bS:
        bS.setEnabled(false); letra = 'S'; break;
    case R.id.bT:
        bT.setEnabled(false); letra = 'T'; break;
    case R.id.bU:
        bU.setEnabled(false); letra = 'U'; break;
    case R.id.bV:
        bV.setEnabled(false); letra = 'V'; break;
    case R.id.bW:
        bW.setEnabled(false); letra = 'W'; break;
    case R.id.bX:
        bX.setEnabled(false); letra = 'X'; break;
    case R.id.bY:
        bY.setEnabled(false); letra = 'Y'; break;
    case R.id.bZ:
        bZ.setEnabled(false); letra = 'Z'; break;
    }
}
Vamos criar mais dois métodos para auxiliar no funcionamento do jogo
private void habilitarBotoes() {
    bA.setEnabled(true);
    bB.setEnabled(true);
    bC.setEnabled(true);
    bD.setEnabled(true);
    bE.setEnabled(true);
    bF.setEnabled(true);
    bG.setEnabled(true);
    bH.setEnabled(true);
    bI.setEnabled(true);
    bJ.setEnabled(true);
    bK.setEnabled(true);
    bL.setEnabled(true);
    bM.setEnabled(true);
    bN.setEnabled(true);
    bO.setEnabled(true);
    bP.setEnabled(true);
    bQ.setEnabled(true);
    bR.setEnabled(true);
    bS.setEnabled(true);
    bT.setEnabled(true);
    bU.setEnabled(true);
    bV.setEnabled(true);
    bW.setEnabled(true);
    bX.setEnabled(true);
    bY.setEnabled(true);
    bZ.setEnabled(true);
}

private void desabilitarBotoes() {
    bA.setEnabled(false);
    bB.setEnabled(false);
    bC.setEnabled(false);
    bD.setEnabled(false);
    bE.setEnabled(false);
    bF.setEnabled(false);
    bG.setEnabled(false);
    bH.setEnabled(false);
    bI.setEnabled(false);
    bJ.setEnabled(false);
    bK.setEnabled(false);
    bL.setEnabled(false);
    bM.setEnabled(false);
    bN.setEnabled(false);
    bO.setEnabled(false);
    bP.setEnabled(false);
    bQ.setEnabled(false);
    bR.setEnabled(false);
    bS.setEnabled(false);
    bT.setEnabled(false);
    bU.setEnabled(false);
    bV.setEnabled(false);
    bW.setEnabled(false);
    bX.setEnabled(false);
    bY.setEnabled(false);
    bZ.setEnabled(false);
}
Precisamos criar também um método para iniciar o jogo, que também servirá para reiniciá-lo
private void iniciarJogo() {
    palavraSecreta = palavras.sorteio();
    nTentativas = 6;
    tracos = "";
    letra = ' ';
    for (int x = 0; x < palavraSecreta.length(); x++) {
        if (palavraSecreta.charAt(x) == '-') {
            tracos += " - ";
        } else if (palavraSecreta.charAt(x) == ' ') {
            tracos += "   ";
        } else {
            tracos += " _ ";
        }
    }

    habilitarBotoes();
    tvPalavra.setText(tracos);
    forca.setImageResource(R.drawable.forca_6);
}
O que a função acima faz? Ela "lê" a palavra que foi sorteada e substitui cada letra por um " _ " (underline), como forma de esconder a palavra que foi sorteada.
E para que ela tenha efeito, é preciso chamá-la no método onCreate
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    iniciarObjetos();
    iniciarJogo();
}
Calma... Estamos quase no final já...
Vamos criar um método para verificar a letra escolhida está certa
private boolean verificarAcerto() {
    boolean acerto = false;
    for (int x = 0; x < palavraSecreta.length(); x++) {
        char tmp = ' ';
        char vogal = palavraSecreta.charAt(x);
        if (vogal == 'Á') tmp = 'A';
        if (vogal == 'Ã') tmp = 'A';
        if (vogal == 'À') tmp = 'A';
        if (vogal == 'É') tmp = 'E';
        if (vogal == 'Í') tmp = 'I';
        if (vogal == 'Ó') tmp = 'O';
        if (vogal == 'Ô') tmp = 'O';
        if (vogal == 'Õ') tmp = 'O';
        if (vogal == 'Ú') tmp = 'U';
        if (vogal == 'Ç') tmp = 'C';
        if (vogal == letra || tmp == letra) {
            tracos = tracos.substring(0, 3 * x + 1) + vogal + tracos.substring(3 * x + 2);
            acerto = true;
        }
    }
    tvPalavra.setText(tracos);

    return acerto;
}
Antes que você pergunte o motivo de tantos ifs... Eles estão ali, para caso exista alguma palavra com algum caracter especial (acento por exemplo), ele seja substituído pelo seu equivalente não especial (ex.: Á = A)
E agora, para funcionar mesmo, basta adicionar o seguinte código ao método onClick
public void onClick(View v) {
    verificarClick(v);

    boolean acerto = verificarAcerto();

    if (!acerto) {
        nTentativas--;
        switch (nTentativas) {
        case 5:
            forca.setImageResource(R.drawable.forca_5);
            break;
        case 4:
            forca.setImageResource(R.drawable.forca_4);
            break;
        case 3:
            forca.setImageResource(R.drawable.forca_3);
            break;
        case 2:
            forca.setImageResource(R.drawable.forca_2);
            break;
        case 1:
            forca.setImageResource(R.drawable.forca_1);
            break;
        case 0:
            forca.setImageResource(R.drawable.forca_0);
            desabilitarBotoes();
            AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(GameActivity.this);
            dialogBuilder.setTitle("Perdeu!")
            .setMessage("Deseja jogar novamente?")
            .setCancelable(false)
            .setPositiveButton("Sim", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    iniciarJogo();
                }
            })
            .setNegativeButton("Não", new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface arg0, int arg1) {
                    finish();
                }
            });
            AlertDialog dialog = dialogBuilder.create();
            dialog.show();
        }
    }

    if (Replace.replaceAll(tracos, " ", "").equalsIgnoreCase(palavraSecreta)) {
        desabilitarBotoes();
        AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this);
        dialogBuilder.setTitle("Parabéns!")
        .setMessage("Deseja jogar novamente?")
        .setCancelable(false)
        .setPositiveButton("Sim", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                iniciarJogo();
            }
        })
        .setNegativeButton("Não", new DialogInterface.OnClickListener() {

            public void onClick(DialogInterface arg0, int arg1) {
                finish();
            }
        });
        dialogBuilder.create().show();
    }
}
Por enquanto é isso... o jogo está funcionando.
Nos próximos post o que vamos fazer é ir aprimorando esse jogo, ir melhorando ele.
Caso alguém tenha alguma sugestão, é só postar aí!

Ah, para ver as alterações deste post você pode clicar aqui.

Tutorial Forca #4 - Classes auxiliares

Boa tarde pessoal!!

Voltando de um final de semana com dia das mães, vamos recomeçar devagar...
Hoje vamos criar duas classes que vão auxiliar nosso app. Para isso, vamos criar um pacote utils, para deixar essas classes separadas das nossas activitys.
Dentro desse pacote, vamos criar a classe Palavras que, por enquanto, vai conter as palavras que serão sorteadas no jogo.
package br.com.blogspot.androidandrekunde.forcalite.utils;

import java.util.Random;

public class Palavras {

    private String[] palavras = new String[] {"AVIÃO", "AERONAVE", "AUTOMÓVEL",
            "MOTOCICLETA", "BICICLETA", "IATE", "NAVIO", "TERRA", "MERCÚRIO",
            "PLUTÃO", "MARTE", "JUPTER", "NETUNO", "ELEFANTE", "ESCORPIÃO",
            "RINOCERONTE", "DINOSSAURO", "REFRIGERADOR", "ÁFRICA", "BRASIL",
            "TELEVISOR", "POLTRONA", "SECADORA", "ESCORREDOR", "LIQUIDIFICADOR",
            "EUROPA", "AMSTERDÃ", "ESTADOS UNIDOS", "GRÉCIA", "ARGENTINA",
            "VENEZUELA", "BOTAFOGO", "SÃO PAULO", "FLAMENGO", "PALMEIRAS",
            "FLUMINENSE", "AMOR", "INTELECTUAL", "SÁBIO", "CULTURA", "SABEDORIA",
            "TUCANO", "BEIJA-FLOR", "ZEBRA", "CRUZEIRO", "COMPUTADOR", "FACULDADE",
            "PIPOCA", "MACARRÃO", "FEIJOADA", "SABÃO EM PÓ", "LAVANDERIA",
            "COZINHA", "CHURRASCO", "PARANAENSE", "MINEIRO", "SANTISTA", "GAÚCHO",
            "CATARINENSE", "AFRICANO", "BRASILEIRO", "AMERICANO", "CARTEIRO",
            "LIXEIRO", "PROGRAMADOR", "LUMINÁRIA", "LUTADOR", "COZINHEIRO",
            "VENDEDOR", "FLORICULTURA", "JAPÃO", "ARÁBIA SAUDITA", "EQUADOR",
            "MÉXICO", "PORTUGUAL", "ALEMANHA", "PROFESSOR", "CHAVEIRO", "FAMÍLIA",
            "DOCUMENTÁRIO", "DOCUMENTOS", "FAMILIARES", "LANCHONETE"};

    public Palavras() {
    }

    public String sorteio() {
        String palavraSorteada = palavras[(int)(random()*palavras.length)];

        return palavraSorteada;
    }

    public static double random() {
        Random r = new Random();

        return r.nextDouble();
    }
}

Vamos criar também uma classe chamada Replace, que será responsável por verificar se a palavra está completa e certa.
package br.com.blogspot.androidandrekunde.forca.utils;

public class Replace {

    public static String replaceAll(String source, String pattern, String replacement) {
        if (source == null)
            return "";

        StringBuffer sb = new StringBuffer();

        int idx = 0;

        String palavra = source;

        while ((idx = palavra.indexOf(pattern, idx)) != -1) {

            sb.append(palavra.substring(0, idx));
            sb.append(replacement);
            sb.append(palavra.substring(idx + pattern.length()));

            palavra = sb.toString();
            sb.delete(0, sb.length());

            idx += replacement.length();
        }

        return palavra;
    }
}
Bom, por hoje seria só isso... Amanhã pretendo começar a fazer funcionar toda essa lógica.
Espero que estejam gostando da série e até amanhã.
Ah... e para quem quiser baixar as alterações do projeto, clique aqui.

Tutorial Forca #3 - Tela inicial e ação dos botões

Bom pessoal, dando continuidade ao tutorial, vamos fazer agora a tela inicial e a ligação entre as telas, para vocês já irem vendo o app funcionar.
Primeiro vamos alterar a tela inicial (activity_main.xml), deixando-a conforme segue abaixo:
<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" >
    <Button
        android:id="@+id/bSair"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="50dp"
        android:layout_marginLeft="85dp"
        android:layout_marginRight="85dp"
        android:text="Sair" />
    <Button
        android:id="@+id/bStart2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_above="@id/bSair"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:text="2 Jogadores" />
    <Button
        android:id="@+id/bStart1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_above="@id/bStart2"
        android:layout_marginLeft="35dp"
        android:layout_marginRight="35dp"
        android:text="1 Jogador" />
    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_above="@id/bStart1"
        android:layout_margin="30dp"
        android:src="@drawable/forca_0" />
    <ImageView
        android:id="@+id/ivConfig"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:layout_marginLeft="20dp"
        android:layout_marginBottom="20dp"
        android:src="@drawable/config" />
</RelativeLayout>

Já fiz a adição de algumas imagens a mais que serão utilizadas mais para frente. Elas podem ser baixadas aqui e colocadas todas naquela pasta res/drawable criada no post anterior.
A tela deve ficar mais ou menos assim:


Vamos alterar a nossa activity principal agora (MainActivity) retirando o trecho que cria o menu, que não será necessário para nós e adicionando as ações dos botões que criamos, deixando o arquivo assim:

package br.com.blogspot.androidandrekunde.forcalite;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button bStart1 = (Button) findViewById(R.id.bStart1);
        Button bStart2 = (Button) findViewById(R.id.bStart2);
        Button bSair   = (Button) findViewById(R.id.bSair);
        bStart1.setOnClickListener(this);
        bStart2.setOnClickListener(this);
        bSair.setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.bStart1:
            Intent i = new Intent(MainActivity.this, GameActivity.class);
            startActivity(i);
            break;
        case R.id.bStart2:
            // Vamos apenas "mapear" este click por enquanto
            Toast.makeText(getApplicationContext(), "2 Jogadores", Toast.LENGTH_SHORT).show();
            break;
        case R.id.bSair:
            finish();
        }
    }
}
Logo no começo da Activity, eu implementei o método OnClickListener, pois acho que fica um pouco mais fácil de lidar com as ações dos botões.
Com a ação do botão para iniciar o jogo implementada, precisamos criar a classe GameActivity que é onde o jogo rodará.
Vou apenas criar a classe nesta etapa, e na próxima vou implementar as ações dela. Ela vai ficar mais ou menos assim:
package br.com.blogspot.androidandrekunde.forcalite;

import android.app.Activity;
import android.os.Bundle;

public class GameActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);
    }
}
Depois disso, basta apenas declará-la no AndroidManifest e é para estar mostrando as duas telas já.
<activity android:name=".GameActivity" />
Para quem quiser baixar o projeto todo, acesse aqui.
 Até a próxima pessoal!!
Ah... se tiverem alguma dúvida/sugestão é só postar aí! Valeu!

Tutorial Forca #2 - Tela do jogo

Boa tarde pessoal!

Para dar continuidade neste tutorial, vamos fazer hoje a tela do jogo. Vamos pular a tela de abertura e vamos direto criar a tela principal do jogo.
Vamos criar um arquivo na pasta res/layout chamado activity_game.xml, com o seguinte conteúdo:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ImageView
        android:id="@+id/ivForca"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:src="@drawable/forca_6" />
    <LinearLayout
        android:id="@+id/lBotoes"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_alignParentBottom="true" >
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bA"
                android:text="A" />
            <Button
                style="@style/letras"
                android:id="@+id/bB"
                android:text="B" />
            <Button
                style="@style/letras"
                android:id="@+id/bC"
                android:text="C" />
            <Button
                style="@style/letras"
                android:id="@+id/bD"
                android:text="D" />
            <Button
                style="@style/letras"
                android:id="@+id/bE"
                android:text="E" />
            <Button
                style="@style/letras"
                android:id="@+id/bF"
                android:text="F" />
            <Button
                style="@style/letras"
                android:id="@+id/bG"
                android:text="G" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bH"
                android:text="H" />
            <Button
                style="@style/letras"
                android:id="@+id/bI"
                android:text="I" />
            <Button
                style="@style/letras"
                android:id="@+id/bJ"
                android:text="J" />
            <Button
                style="@style/letras"
                android:id="@+id/bK"
                android:text="K" />
            <Button
                style="@style/letras"
                android:id="@+id/bL"
                android:text="L" />
            <Button
                style="@style/letras"
                android:id="@+id/bM"
                android:text="M" />
            <Button
                style="@style/letras"
                android:id="@+id/bN"
                android:text="N" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bO"
                android:text="O" />
            <Button
                style="@style/letras"
                android:id="@+id/bP"
                android:text="P" />
            <Button
                style="@style/letras"
                android:id="@+id/bQ"
                android:text="Q" />
            <Button
                style="@style/letras"
                android:id="@+id/bR"
                android:text="R" />
            <Button
                style="@style/letras"
                android:id="@+id/bS"
                android:text="S" />
            <Button
                style="@style/letras"
                android:id="@+id/bT"
                android:text="T" />
            <Button
                style="@style/letras"
                android:id="@+id/bU"
                android:text="U" />
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <Button
                style="@style/letras"
                android:id="@+id/bV"
                android:text="V" />
            <Button
                style="@style/letras"
                android:id="@+id/bW"
                android:text="W" />
            <Button
                style="@style/letras"
                android:id="@+id/bX"
                android:text="X" />
            <Button
                style="@style/letras"
                android:id="@+id/bY"
                android:text="Y" />
            <Button
                style="@style/letras"
                android:id="@+id/bZ"
                android:text="Z" />
        </LinearLayout>
    </LinearLayout>
    <TextView
        android:id="@+id/tvPalavra"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/ivForca"
        android:layout_above="@id/lBotoes"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center"
        android:text="PALAVRA SECRETA" />
</RelativeLayout>

Como vocês puderam ver na criação dos botões, ao invés de sempre colocar o tamanho eu transferi essas informações para o arquivo styles.xml, adicionando o seguinte cógido:
<style name="letras" >
    <item name="android:layout_width">0dp</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:layout_weight">1</item>
</style>

Bom... layout do game feito. Falta apenas a imagem que eu utilizei.
Para esta imagem, eu criei uma outra pasta, chamada drawable. Deixei para lidar com as diferenças de tela mais pra frente.
É uma imagem bem simples, mas para começar está valendo. (imagem)

Veja aqui as alterações de hoje no projeto.
E para quem quiser fazer o download do projeto todo até agora, aqui.

Tutorial Forca #1 - Criação do projeto android

Bom dia pessoal!

Para começar, o começo, vamos criar o projeto:

File > New > Other > Android Application Project
Preencha os campos da forma que quiser, ou copie como está aí.
Depois, Next, Next, Finish.





Bom, como estou com a vida um pouco corrida, por enquanto é só (infelizmente).
Mas espero poder postar a continuação o quanto antes.
Para baixar o projeto, acesse no bitbucket.
Copyright © 2013 Aprendendo Android and Blogger Themes.