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

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!!

Criando Notificações no Android


Boa noite!!

Hoje vou falar um pouco sobre Notificações.
Elas são utilizadas pois, em geral, uma aplicação que esteja executando em segundo plano não deve exibir um alerta para o usuário, ou abrir uma tela, pois ele pode estar em uma ligação, ou em qualquer outra aplicação, e isso o atrapalharia.
Para essa finalidade o Android tem a classe Notification (android.app.Notification), que serve para enviar notificações que aparecem na barra de status do telefone, podendo inclusive fazer o celular vibrar ou acender as luzes.

Bom, vamos à prática para exemplificar melhor sua utilização. Criem um projeto ExemploNotificacao que conterá as duas seguintes Activities:

public class ExemploCriaNotificacao extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView text = new TextView(this);
        text.setText("Notificação disparada.");
        setContentView(text);

        // Texto que aparecerá na barra de status (chamada para a notificação)
        String tickerText = "Você recebeu uma mensagem.";

        // Detalhes da notificação
        CharSequence titulo = "André";
        CharSequence mensagem = "Exemplo de notificação";

        // Exibe a notificação
        criarNotificacao(this, tickerText, titulo, mensagem, ExemploExecutaNotificacao.class);
    }

    // Exibe a notificacao
    protected void criarNotificacao(Context context, CharSequence mensagemBarraStatus,
            CharSequence titulo, CharSequence mensagem, Class activity) {
        // Recupera o serviço do NotificationManager
        NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        Notification n = new Notification(R.drawable.chat, mensagemBarraStatus, System.currentTimeMillis());

        // PendingIntent para executar a Activity se o usuário selecionar a notificação
        PendingIntent p = PendingIntent.getActivity(this, 0, new Intent(this, activity), 0);

        // Flag utilizada para remover a notificação da barra de status
        // quando o usuário clicar nela
        n.flags |= Notification.FLAG_AUTO_CANCEL;

        // Informações
        n.setLatestEventInfo(this, titulo, mensagem, p);

        // Espera 100ms e vibra por 250ms, espera por mais 100ms e vibra por 500ms
        n.vibrate = new long[] { 100, 250, 100, 500 };

        // id da notificacao
        nm.notify(R.string.app_name, n);
    }

}

public class ExemploExecutaNotificacao extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        nm.cancel(R.string.app_name);
        TextView text = new TextView(this);
        text.setText("Usuário selecionou a notificação");
        setContentView(text);
    }

}

Não esqueça de adicionar ao AndroidManifest a Activity adicional e a permissão para o celular vibrar:
<uses-permission android:name="android.permission.VIBRATE" />
<activity android:name="br.com.blogspot.androidandrekunde.ExemploExecutaNotificacao" />
Vejamos como ficou a aplicação:




Assim que possível eu atualizo o post com o link para download do projeto.

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.

Desenvolvimento multi-plataforma com Corona SDK

Boa tarde!

No post de hoje, vou falar um pouco sobre um SDK para desenvolvimento mobile, no qual é possível desenvolver para iPhone, Android e Windows Phone.
Sim, isso é possível com o Corona SDK, disponível para download aqui.

Para fazer o download, basta clicar em download e se registrar (bem simples e de graça).
Ele possui a versão starter (free) e a versão pro (paga).
A versão free já é bastante coisa para começar a desenvolver, pois ela já permite desenvolver para iPhone e Android e gerar os aplicativos e publicar nas devidas lojas.
Tá, mas e como eu desenvolvo nesta plataforma?
É muito simples, ela utiliza a liguagem lua, que é uma linguagem de programação poderosa, rápida e leve.
Para saber mais sobre lua lua.org ou em português.

Bom, ao fazer o download e instalar o Corona SDK, ele cria um atalho para o simulador, que como o próprio nome já diz, ele simula os aparelhos para os quais você quer desenvolver (iPhone, iPhone4, iPhone5, iPad, Galaxy SIII, Galaxy Tab, Nexus One).
E como programar com o Corona SDK?
Para isto, você pode utilizar um simples editor de texto (lembram quando eu disse que lua era uma linguagem simples?) como o notepad. Eu utilizo o Notepad++ que é bem tranquilo.

Para ser mais claro, vamos fazer um HelloWorld!
Crie um pasta com o nome HelloWorld e, dentro dela, crie um arquivo com o nome main.lua:
display.setStatusBar( display.HiddenStatusBar )

local texto = display.newText( 'Hello World Corona SDK', 15, 15, native.systemFont, 25 )
Na primeira linha, foi especificado para esconder a barra de status e logo a seguir foi criada uma variável para armazenar o texto do nosso HelloWrold, especificando a sua posição na tela (x, y), o tipo de fonte e o tamanho.

Bom, acho que é isso para esse primeiro post sobre Corona SDK. Espero poder postar mais coisas sobre esse SDK.

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