Jogo da Forca Tutorial Pong Tutorial SQLite

App Meu Cartão


Boa noite pessoal!!
Sei que estou a um bom tempo sem aparecer por aqui, mas estive bem ocupado desde então.
Um dos motivos deste afastamento pude publicar ontem na loja no Google Play.
É o meu aplicativo para controle de faturas de cartão de crédito, o Meu Cartão.
Com ele é muito fácil e prático fazer o controle de seus gastos com o cartão de crédito.
Vocês podem verificar o resultado clicando aqui.

Ah, vocês podem ver o aplicativo através deste QR Code.














Ah, estou ansioso para voltar às postagens por aqui. Até breve...

Tutorial SQLite #3 - Tela de Listagem

Boa noite!

Dando continuidade na série, hoje vamos alterar a tela inicial do nosso programa, colocando uma listagem dos contatos. Vamos criar a tela que possuirá a listagem dos contatos, activity_listagem.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="@dimen/activity_vertical_margin" >
    <Button
        android:id="@+id/btCadastro"
        android:text="Cadastros"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />
    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@id/btCadastro" />
</RelativeLayout>

E vamos também criar um outro xml que servirá para sobrescrever as linhas da listagem que criamos, o xml linha_contato.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="7dp" >
    <TextView
        android:id="@+id/tvTelefone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Telefone"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true" />
    <TextView
        android:id="@+id/tvNome"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textStyle="bold"
        android:text="Nome Contato"
        android:layout_toLeftOf="@id/tvTelefone"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true" />
    <TextView
        android:id="@+id/tvEmail"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textStyle="italic"
        android:text="email@contato.com.br"
        android:layout_alignParentLeft="true"
        android:layout_below="@id/tvNome"
        android:layout_toLeftOf="@id/tvTelefone" />
</RelativeLayout>

Agora vamos criar uma nova classe chamada CadastroActivity e passar tudo o que tem na classe MainActivity para dar lugar a nossa listagem, que passará a ser a tela principal da nossa aplicação.
public class MainActivity extends ListActivity {

    private ContatoDAO contatoDAO;
    List contatos;
    ContatoAdapter adapter;
    BaseDAO baseDAO;
    int posicao = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listagem);
        baseDAO = new BaseDAO(this);

        Button btCadastro = (Button) findViewById(R.id.btCadastro);
        btCadastro.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, CadastroActivity.class));
            }
        });
    }

    @Override
    protected void onResume() {
        contatoDAO = new ContatoDAO(this);
        contatoDAO.open();
        contatos = contatoDAO.lerContatos();

        adapter = new ContatoAdapter(this, contatos);
        setListAdapter(adapter);

        super.onResume();
    }

}

Bom, como vocês puderam ver, instanciei uma classe chamada ContatoAdapter, que serve para criar cada uma das linhas da listagem, e agora vamos criar esta classe (dentro da mesma pasta da classe ContatoDAO):
public class ContatoAdapter extends BaseAdapter {

    private Context context;

    private List contatos;
    private LayoutInflater inflater;

    public ContatoAdapter(Context context, List contatos) {
        super();
        this.context = context;
        this.contatos = contatos;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public void notifyDataSetChanged() {
        try {
            super.notifyDataSetChanged();
        } catch (Exception e) {
            trace("Erro: " + e.getMessage());
        }
    }

    private void trace(String msg) {
        toast(msg);
    }

    public void toast(String msg) {
        Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    }
   
    public int getCount() {
        return contatos.size();
    }

    public void remove(final Contato contato) {
        this.contatos.remove(contato);
    }

    public void add(final Contato contato) {
        this.contatos.add(contato);
    }

    public Object getItem(int position) {
        return contatos.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup viewGroup2) {
        try {
            Contato contato = contatos.get(position);

            ViewHolder holder;

            if (convertView == null) {
                convertView = inflater.inflate(layout.linha_contato, null);

                holder = new ViewHolder();
                holder.tvNome = (TextView) convertView.findViewById(id.tvNome
);
                holder.tvTelefone = (TextView) convertView.findViewById(id.tvTelefone);
                holder.tvEmail = (TextView) convertView.findViewById(id.tvEmail);

                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.tvNome.setText(contato.getNome());
            holder.tvTelefone.setText(contato.getTelefone());
            holder.tvEmail.setText(contato.getEmail());

            return convertView;
        } catch (Exception e) {
            trace("Erro: " + e.getMessage());
        }

        return convertView;
    }

    static class ViewHolder {
        public TextView tvNome;
        public TextView tvTelefone;
        public TextView tvEmail;
    }

}

Bom, faltou apenas declarar a nova classe, (CadastroActivity), e tudo ok.
Qualquer dúvida, clique aqui para baixar o tutorial. Até a próxima postagem!!

Tutorial SQLite #2 - Criação do Banco de Dados

Boa noite amigos!

Hoje vamos montar a estrutura do banco de dados.
Primeiramente vamos criar o pacote br.com.blogspot.androidandrekunde.dao.banco onde a classe contendo o banco ficará.
E dentro dela criamos o arquivo BaseDAO:
package br.com.blogspot.androidandrekunde.dao.banco;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class BaseDAO extends SQLiteOpenHelper {

    //Nome do banco de dados
    public static final String NOME_BANCO = "exemplosqlite";
    //Versão do banco de dados
    public static final int VERSAO_SCHEMA = 1;

    //Nome da tabela
    public static final String TABELA_CONTATO = "contato";

    //Nome dos campos
    public static final String CAMPO_ID = "_id";
    public static final String CAMPO_NOME = "nome";
    public static final String CAMPO_TELEFONE = "telefone";
    public static final String CAMPO_EMAIL = "email";

    private static final String CRIAR_TABELA_CADASTRO = "CREATE TABLE "
            + TABELA_CONTATO + " (" + CAMPO_ID + " INTEGER PRIMARY KEY, "
            + CAMPO_NOME + " TEXT, "
            + CAMPO_TELEFONE + " TEXT, "
            + CAMPO_EMAIL + " TEXT)";

    public BaseDAO(Context context) {
        super(context, NOME_BANCO, null, VERSAO_SCHEMA);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CRIAR_TABELA_CADASTRO);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

Essa classe será a responsável por criar e atualizar o banco de dados.
Agora criaremos a classe de modelagem de dados, Contato:
package br.com.blogspot.androidandrekunde.model;

import java.io.Serializable;

public class Contato implements Serializable {

    private static final long serialVersionUID = 1L;
    private long id;
    private String nome;
    private String telefone;
    private String email;

    public Contato() {
    }

    public Contato(String nome, String telefone, String email) {
        this.nome = nome;
        this.telefone = telefone;
        this.email = email;
    }

    public Contato(long id, String nome, String telefone, String email) {
        this.id = id;
        this.nome = nome;
        this.telefone = telefone;
        this.email = email;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

Precisamos criar também uma classe para realizar a conexão com o banco de dados, chamada ContatoDAO:
package br.com.blogspot.androidandrekunde.dao;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import br.com.blogspot.androidandrekunde.dao.banco.BaseDAO;
import br.com.blogspot.androidandrekunde.model.Contato;

public class ContatoDAO {

    private SQLiteDatabase database;
    private BaseDAO baseDAO;

    public ContatoDAO(Context context) {
        baseDAO = new BaseDAO(context);
    }

    public void open() throws SQLException {
        database = baseDAO.getWritableDatabase();
    }

    public void close() {
        baseDAO.close();
    }

    public long novoContato(Contato contato) {
        ContentValues values = new ContentValues();

        values.put(BaseDAO.CAMPO_NOME, contato.getNome());
        values.put(BaseDAO.CAMPO_TELEFONE, contato.getTelefone());
        values.put(BaseDAO.CAMPO_EMAIL, contato.getEmail());

        return database.insert(BaseDAO.TABELA_CONTATO, null, values);
    }

    public List lerContatos() {
        Cursor c = database.rawQuery("SELECT * FROM " + BaseDAO.TABELA_CONTATO, null);
        List contatos = new ArrayList();
        if (c.moveToFirst()) {
            while (!c.isAfterLast()) {
                Contato contato = new Contato(
                        c.getLong(c.getColumnIndex(BaseDAO.CAMPO_ID)),
                        c.getString(c.getColumnIndex(BaseDAO.CAMPO_NOME)),
                        c.getString(c.getColumnIndex(BaseDAO.CAMPO_TELEFONE)),
                        c.getString(c.getColumnIndex(BaseDAO.CAMPO_EMAIL)));
                contatos.add(contato);
                c.moveToNext();
            }
        }
        c.close();

        return contatos;
    }

    public int atualizarContato(Contato contato) {
        long id = contato.getId();
        ContentValues values = new ContentValues();

        values.put(BaseDAO.CAMPO_NOME, contato.getNome());
        values.put(BaseDAO.CAMPO_TELEFONE, contato.getTelefone());
        values.put(BaseDAO.CAMPO_EMAIL, contato.getEmail());

        return database.update(BaseDAO.TABELA_CONTATO, values, BaseDAO.CAMPO_ID + " = " + id, null);
    }

    public void apagarContato(Contato contato) {
        long id = contato.getId();

        database.delete(BaseDAO.TABELA_CONTATO, BaseDAO.CAMPO_ID + " = " + id, null);
    }

}

Feito isso, vamos atualizar a classe Main, que ficará assim:
package br.com.blogspot.androidandrekunde.tutorialsqlite;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import br.com.blogspot.androidandrekunde.dao.ContatoDAO;
import br.com.blogspot.androidandrekunde.model.Contato;

public class MainActivity extends Activity {

    EditText etNome;
    EditText etTelefone;
    EditText etEmail;

    ContatoDAO contatoDAO;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        contatoDAO = new ContatoDAO(this);

        etNome = (EditText) findViewById(R.id.etNome);
        etTelefone = (EditText) findViewById(R.id.etTelefone);
        etEmail = (EditText) findViewById(R.id.etEmail);

        Button btCancelar = (Button) findViewById(R.id.btCancelar);
        Button btSalvar = (Button) findViewById(R.id.btSalvar);

        btCancelar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                limparTela();
            }
        });

        btSalvar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //Variáveis
                String nome = "";
                String telefone = "";
                String email = "";

                nome = etNome.getText().toString();
                telefone = etTelefone.getText().toString();
                email = etEmail.getText().toString();

                //Cria o contato
                Contato contato = new Contato(nome, telefone, email);

                //Abre a conexão com o banco de dados
                contatoDAO.open();

                //Salva o contato
                contatoDAO.novoContato(contato);

                //Fecha a conexão com o banco de dados
                contatoDAO.close();

                limparTela();
            }
        });
    }

    private void limparTela() {
         etNome.setText("");
         etTelefone.setText("");
         etEmail.setText("");
    }

}
Bom, com isso, o cadastro do contato já está sendo feito. No próximo post faremos a listagem dos contatos cadastrados.
Clique aqui, para baixar este tutorial.

Tutorial SQLite #1 - Tela de Cadastro

Boa noite amigos!

Vamos começar mais esta série de tutoriais. Desta vez vou mostrar como utilizar o banco de dados do Android, o SQLite.
Não é muito diferente dos demais bancos de dados existentes, e como os demais, também tem sua peculiaridades. De princípio, vamos criar o banco de dados pelo nosso aplicativo mesmo, sem a necessidade de um programa para isso.
<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"
    tools:context=".MainActivity" >
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:background="#DDDDDD"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_alignparentbottom="true"
        android:padding="@dimen/activity_vertical_margin" >
        <Button
            android:id="@+id/btCancelar"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:text="Cancelar" />
        <Button
            android:id="@+id/btSalvar"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:text="Salvar" />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/linearLayout2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="@dimen/activity_vertical_margin"
        android:layout_above="@id/linearLayout1"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Nome" />
        <EditText
            android:id="@+id/etNome"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textCapWords" />
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:text="Telefone" />
        <EditText
            android:id="@+id/etTelefone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="phone" />
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:text="E-mail" />
        <EditText
            android:id="@+id/etEmail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textEmailAddress" />
    </LinearLayout>
</RelativeLayout>

Bom, vamos começar com uma tela simples, apenas para fazer um cadastro, como se fosse para uma agenda de contatos, no nosso arquivo main.xml.
Agora vamos para a nossa activity:
package br.com.blogspot.androidandrekunde.tutorialsqlite;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {

    EditText etNome;
    EditText etTelefone;
    EditText etEmail;

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

        etNome = (EditText) findViewById(R.id.etNome);
        etTelefone = (EditText) findViewById(R.id.etTelefone);
        etEmail = (EditText) findViewById(R.id.etEmail);

        Button btCancelar = (Button) findViewById(R.id.btCancelar);
        Button btSalvar = (Button) findViewById(R.id.btSalvar);

        btCancelar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View arg0) {
                Toast.makeText(getApplicationContext(), "Click cancelar", Toast.LENGTH_SHORT).show();
            }
        });

        btSalvar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "Click salvar", Toast.LENGTH_SHORT).show();
            }
        });
    }

}

Por enquanto é isso, mas é somente o começo, no próximo post começaremos a estruturação do banco de dados.
Até o próximo post!!

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!!
Copyright © 2013 Aprendendo Android and Blogger Themes.