segunda-feira, 30 de julho de 2012

Slender - The Game


Descobri um jogo através do canal Ze Graça Games no YouTube chamado Slender.

Pelos vídeos, parece bem simples, mas dá algum medo... :P

O objetivo do jogo é recuperar 8 páginas de um caderno sem que a criatura (chamada Slender) te pegue...

Para mais informações no site oficial:
http://www.parsecproductions.net/slender/

Ou no fansite do jogo:
http://slendergame.com/

Ah, só para citar, o jogo foi feito com a engine Unity 3D e, por enquanto, a versão 0.9.5 (beta) esta de graça para MacOSX e MS-Windows.

Bons sustos e até mais!

quinta-feira, 26 de julho de 2012

Xadrez + Card Game = Knightmare Chess


Para os "nerds" de plantão:

Já pensou se juntassem o jogo de xadrez com um jogo de cartas (do tipo Magic)?

Pois é, e não é que imaginaram isso! :)

Knightmare Chess é um jogo de xadrez que usa cartas feito pela Steve Jackson Games (a mesma produtora de GURPS).

Nunca joguei, mas pelo que pesquisei na Internet, as regras parecem um tanto "caóticas" (seja o que isso quer dizer...).

Para maiores informações, no site da Steve Jackson:
http://www.sjgames.com/knightmare/

Ou na Wikipédia:
http://en.wikipedia.org/wiki/Knightmare_Chess

Obs.: O jogo não é recente (foi lançado em 1996).
Obs.2: Não tenho certeza, mas acho que não tem versão em português... :(

Até mais!

terça-feira, 17 de julho de 2012

Drag'n Drop de elementos gráficos (Java-AWT)

Um rapaz me perguntou como seria fazer um drag'n drop (na mão) de um elemento gráfico em uma tela.
Então resolvi postar uma resposta aqui no blog. :)
Como ele não especificou a linguagem, vou fazer em Java/AWT (será que alguém ainda usa isso?!? :P ), que foi a linguagem que mais trabalhei nos últimos 10 anos...

Primeiramente, vamos criar uma janela de tamanho fixo (no caso, 300x300):

//Herda de Frame (Janela)
public class MainClass extends Frame {

    //Construtor da classe
    public MainClass() {
        //Tamanho da janela
        this.setSize(300, 300);
        //Título da janela
        this.setTitle("Exemplo Gráfico");
    }

    //Método principal que inicia a aplicação
    public static void main(String arg[]) {
        //Instância o objeto
        MainClass main = new MainClass();
        //Exibe a tela
        main.setVisible(true);
    }
}

Para evitar que a janela fique "ad-eterno" na tela, mesmo clicando no "X", vamos implementar a função de fechar da janela em seu construtor:

...
    //Construtor da classe
    public MainClass() {
         ...
         //"Escutador" de eventos de janela
         this.addWindowListener(new WindowAdapter() {
             //Método que é executado quando o usuário clicar no botão de fechar da janela (ou algum evento que tenha a mesma funcionalidade, como o Ctrl+X no MS-Windows)
            @Override
            public void windowClosing(WindowEvent e) {
                //Encerra a aplicação
                System.exit(0);
            }
        });
        ...    
    }

...

Legal, temos uma janela feita em Java! :)

Vamos para o segundo passo: criamos um objeto gráfico (neste caso, um retângulo) como uma propriedade da classe e instanciamos esta em seu construtor:

public class MainClass extends Frame {
    private Rectangle rect;
    ...
    public MainClass() {
          ...
          //Retângulo a ser desenhado
          rect = new Rectangle(50, 50, 60, 30);
          ...
    }
    ...
}

E agora vamos desenhar este retângulo na tela, reescrevendo os métodos paint e update:

...

   //Para evitar o "pisca-pisca" (efeito de blink) da tela
    @Override
    public void update(Graphics g) {
        this.paint(g);
    }
   
    //Desenha um retângulo vermelho em um fundo preto (retângulo do tamanho da tela)
    @Override
    public void paint(Graphics g) {
        //Pinta a tela de preto
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        //Pinta um retângulo vermelho
        g.setColor(Color.RED);
        g.fillRect((int)rect.getX(), (int)rect.getY(),
                (int)rect.getWidth(), (int)rect.getHeight());
    }
...


Executamos e temos um retângulo vermelho em um fundo preto (eu já disse isso em algum lugar?). :)

Nesta terceira etapa, precisamos identificar os eventos de drag'n drop, que são (eu acho...):
1) O evento de botão do mouse pressionado para obter o efeito de "pegar" o retângulo;
2) O evento de soltar o botão do mouse para obter o efeito de "largar" o retângulo;
3)  E o evento de movimento do mouse, para que o retângulo acompanhe o "ponteiro" do mouse enquanto ele não for solto;

Com isso, a classe vai ficar mais ou menos assim:


import java.awt.*;
import java.awt.event.*;


//Herda de Frame (Janela)
public class MainClass extends Frame {

    //Retângulo a ser desenhado
    private Rectangle rect;
    //Flag que indica se o objeto esta sendo "arrastado"
    private boolean elementDragged;
    //Ponto (x,y) da tela onde o ponteiro do mouse estava inicialmente
    private Point initial;
 
    //Construtor da classe  
    public MainClass() {
        //Retângulo a ser desenhado
        rect = new Rectangle(50, 50, 50, 50);
        //Tamanho da janela
        this.setSize(300, 300);
        //Título da Janela
        this.setTitle("Exemplo Gráfico");
        this.addEventListener();
    }
   
     //Método privado que adiciona os eventos
    private void addEventListener() {
        //"Escutador" de eventos de janela
        this.addWindowListener(new WindowAdapter() {
             //Método que é executado quando o usuário clicar no botão de fechar da janela (ou algum evento que tenha a mesma funcionalidade, como o Ctrl+X no MS-Windows)
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        //"Escutador" de eventos do mouse
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                mousePressedEvent(e);
            }           
            @Override
            public void mouseReleased(MouseEvent e) {
                mouseReleasedEvent(e);
            }
        });
        //"Escutador" de eventos de movimento do mouse
        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                mouseDraggedEvent(e);
            }
        });
    }
   
    //Quando o botão do mouse é pressionado, este método é executado
    private void mousePressedEvent(MouseEvent e) {
        //Se o ponteiro do mouse esta dentro do retângulo...
        if (rect.contains(e.getPoint())) {
            //Obtenho o ponto inicial do ponteiro do mouse
            initial = new Point((int)(e.getPoint().getX() - rect.getX()),
                    (int)(e.getPoint().getY() - rect.getY()));
            //E digo que o retângulo pode ser "arrastado"
            elementDragged = true;
        }       
    }
   
    //Quando o mouse é "arrastado", este método é executado
    private void mouseDraggedEvent(MouseEvent e) {
        //Se o retângulo pode ser "arrastado"
        if (elementDragged) {
            //Faço ele movimentar-se de acordo com a posição do ponteiro do mouse
            rect.setLocation((int)((e.getPoint().getX() - initial.getX())),
                    (int)(e.getPoint().getY() - initial.getY()));
            //Redesenho a tela
            this.repaint();
        }
    }           
 
   //Quando o botão do mouse é "solto", este método é executado
    public void mouseReleasedEvent(MouseEvent e) {
        //Digo que o retângulo não esta mais "arrastavel"
        elementDragged = false;
        //E "zero" a posição inicial
        initial = null;
    }
   
    //Para evitar o "pisca-pisca" (efeito de blink) da tela
    @Override
    public void update(Graphics g) {
        this.paint(g);
    }
   
     //Desenha um retângulo vermelho em um fundo preto (retângulo do tamanho da tela)
    @Override
    public void paint(Graphics g) {
        //Pinta a tela de preto
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, this.getWidth(), this.getHeight());
        //Pinta um retângulo vermelho
        g.setColor(Color.RED);
        g.fillRect((int)rect.getX(), (int)rect.getY(),
                (int)rect.getWidth(), (int)rect.getHeight());
    }
 
    //Método principal que inicia a aplicação (tudo começa aqui... :) )
    public static void main(String arg[]) {
        //Instância a classe
        MainClass main = new MainClass();
        //Exibe a tela
        main.setVisible(true);
    }
}

Parece que funciona... (eu testei no MacOSX 10.7.4, com o JDK 1.6.0_33)

Até mais!

segunda-feira, 9 de julho de 2012

Python para IOS


Para quem não sabe, Python é uma linguagem de programação interpretada onde sua característica principal é distinguir blocos de execução através de indentação.

Se você não entendeu a explicação, a Wikipédia pode te ajudar. :P

Mas até ai, tudo bem. A linguagem até que é famosa e nem estou falando nada que a maioria dos programadores sabe...

O que me surpreendeu, foi saber que alguém teve a idéia de criar um interpretador Python para iOS:

http://pythonforios.com/

E que a Apple liberou esta aplicação na App Store (ou seja, não usa um JailBreak)!

Até mais!