javafx quadrado na tela v2

On February 15, 2009, in trecos, by athanazio
3

Esta e a segunda versão do quadrado na tela, agora com o efeito de manter a tecla pressionada e o movimento acontecer ! para isto acabei definindo uma classe Game que fica com loop principal e todos os Nodes da Scene atual são verificados para execução de um método update(), não sei ainda se dava para fazer com alguma estrutura do próprio JavaFx, mas assim funcionou.

Olha como ficou o movimento

esta é a classe Game, que cria um Timer que executa continuamente, e chama o método update() para todos os Nodes que sao filhos da classe Updatable, no método update() o nosso quadrado muda a sua posicao de acordo com as teclas que estão pressionadas

package javafxmeuquadradinho2;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.scene.Scene;
import javafx.stage.Stage;

/**
 * @author athanazio
 */
public class Game extends Stage {

    public var tick: Timeline = Timeline {
        repeatCount: Timeline.INDEFINITE
        keyFrames: [
            KeyFrame {
                time: 0.05s
                action: function() {
                    mainLoop();
                }
        }]
    };

    // main game loop
    public function mainLoop(){
        for (node in scene.content) {
            if( node instanceof Updatable){
                (node as Updatable).update();
            }
        }
    }

    public function play(){
        tick.play();
    }

}

A classe KeyState é usada para manter as informações de que teclas estão pressionadas ou não, Esta solução não permite uma fácil expansão para suportar outras teclas, outra forma seria armazenar uma lista das teclas atualmente pressionadas, e possuir um método para verificar se a tecla X esta pressionada.

package javafxmeuquadradinho2;

/**
 * @author athanazio
 */
public class KeyState {
    public var keyUp = false;
    public var keyLeft = false;
    public var keyRight = false;
    public var keyDown = false;
}

A classe Updatable define o metodo update() a ser executado no loop principal do jogo.

package javafxmeuquadradinho2;

/**
 * @author athanazio
 */
public class Updatable{
    public function update(){

    }
}

A classe MovableChar cria neste exemplo um Retangulo associado com as propriedades da classe, e gera os event handlers baseados neste retangulo, melhor seria usar um ImageView para exibir uma imagem, mas isto jah é outra estória … além disto mantém controle da tecla pressionada, através de uma instância de KeyState, e quando a tecla é liberada desmarca, fazendo com q no próximo update() o movimento naquela direção não ocorra.


/*
 * MovableChar.fx
 *
 * Created on Feb 15, 2009, 3:47:31 PM
 */

package javafxmeuquadradinho2;

import javafx.scene.CustomNode;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.Node;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;

/**
 * @author athanazio
 */
public class MovableChar extends CustomNode, Updatable{
    public var speed = 10;
    public var x = 0;
    public var y = 0;
    public var width = 60;
    public var height = 60;
    public var fill: Color;

    var keyState: KeyState = KeyState{
        keyUp: false;
        keyLeft: false;
        keyRight: false;
        keyDown: false;
     };

    public override function create():Node {
        return Rectangle {
            x: bind this.x;
            y: bind this.y;
            width: bind this.width;
            height: bind this.height;
            fill: bind this.fill;

            onKeyPressed: function (e: KeyEvent){
                if( e.code == KeyCode.VK_LEFT ){
                    keyState.keyLeft = true;
                }
                if( e.code == KeyCode.VK_RIGHT ){
                    keyState.keyRight = true;
                }
                if( e.code == KeyCode.VK_UP ){
                    keyState.keyUp = true;
                }
                if( e.code == KeyCode.VK_DOWN ){
                    keyState.keyDown = true;
                }
            }
            onKeyReleased: function(e: KeyEvent){
                if( e.code == KeyCode.VK_LEFT ){
                    keyState.keyLeft = false;
                }
                if( e.code == KeyCode.VK_RIGHT ){
                    keyState.keyRight = false;
                }
                if( e.code == KeyCode.VK_UP ){
                    keyState.keyUp = false;
                }
                if( e.code == KeyCode.VK_DOWN ){
                    keyState.keyDown = false;
                }
            }
        };
    }

    public override function update(){

        if( keyState.keyLeft){
            x = x - speed;
        }

        if( keyState.keyRight){
            x = x + speed;
        }

        if( keyState.keyDown){
            y = y + speed;
        }

        if( keyState.keyUp){
            y = y - speed;
        }
    }

}

E finalmente a classe Main que instancia MovableChar e Game e chama o método start de Game.

package javafxmeuquadradinho2;

import java.lang.Object;
import javafx.scene.paint.Color;
import javafx.scene.Scene;

/**
 * @author athanazio
 */
var littleBox: MovableChar = MovableChar{
    x: 20,
    y: 20
    width: 60,
    height: 60
    fill: Color.RED
}

var game: Game = Game {
        title: "Movendo um quadrado pela tela"
        width: 640
        height: 480
        scene: Scene {
            content: [
                littleBox
            ]
        }
    }

function run(__ARGS__ : String[]) {
    game.play();
}
Tagged with:
 

camera do globalgamejam no Rio

On January 30, 2009, in trecos, by athanazio
0

Tagged with:
 

começou o gamejam

On January 30, 2009, in trecos, by athanazio
0

ehh galera começou o globalgamejam !!
http://globalgamejam.org/
começou na nova zelândia hehehhe,
aqui no Rio/Niterói soh as 17:00h

Tagged with:
 

c# xna criação de cenas e scroll de mapa

On January 11, 2009, in games, programacao, by athanazio
1

Uai ! em ateh map scroll hehehe, bem parte das minhas reflexões sobre a forma de implementar o jogo estão se materalizando, criei o conceito de cena, contendo o gerenciador de eventos e deslocamento da tela para permitir o scroll da tela de fundo.

o primeiro detalhe eh a classe Scene em si

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace ChickenMaze
{
public abstract class Scene
{
public Game game;
public EventManager eventManager;
public int X;
public int Y;

public Scene(Game game, EventManager eventManager)
{
this.game= game;
this.eventManager= eventManager;
this.X = 0;
this.Y = 0;
}

public abstract void Initialize();
public abstract void LoadContent();
public abstract void Draw(GameTime gameTime, SpriteBatch spriteBatch);

}
}

que em alguns aspectos tentei manter o design semelhante a classe Game, com excessão do método Draw que adicionei o objeto spriteBatch sendo passado como parâmetro para evitar esta complexidade na cena atual, assim na classe Game principal do jogo um objeto scene é criado, e ao executar initialize, loadcontent e draw os respectivos metodos da Scene corrente serão chamados.

Esta abaixo eh a SceneMainMaze que determina os detalhes especificos do jogo, como sprite que vai ser usado como personagem, mapa e tratadores de eventos, note que a implementação dos eventos fica separada deste código.

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;

namespace ChickenMaze
{
class SceneMainMaze : Scene
{
Sprite chicken;
Map map;

public SceneMainMaze(Game game, EventManager eventManager)
: base(game, eventManager)
{

}

public override void Initialize(){

map = new Map(this);
chicken = new Sprite(“chicken”, this);
chicken.Position = map.GetFirstFreeSpot();
chicken.SetMap(map);

eventManager.addHandler(new EventCantMoveHere(this));
eventManager.addHandler(new EventKeyboardLeft(this, chicken, map));
eventManager.addHandler(new EventKeyboardRight(this, chicken, map));
eventManager.addHandler(new EventKeyboardUp(this, chicken, map));
eventManager.addHandler(new EventKeyboardDown(this, chicken, map));
eventManager.addHandler(new EventNeedScrollMap(this, chicken, map ));
}

public override void LoadContent()
{
chicken.LoadContent(game.Content);
map.LoadContent(game.Content);
}

public override void Draw(GameTime gameTime, SpriteBatch spriteBatch)
{
Color color = new Color(0, 136, 0);
game.GraphicsDevice.Clear(color);

map.Draw(spriteBatch);
chicken.Draw(spriteBatch);
}
}
}

Então o trecho abaixo mostra como os eventos são registrados para que ao serem disparados, o tipo de evento é testado e em seguida o métido run() dos eventos é executado

eventManager.addHandler(new EventKeyboardDown(this, chicken, map));
eventManager.addHandler(new EventNeedScrollMap(this, chicken, map ));

O código abaixo é o tratador de eventos para quando o scroll de mapa eh necessário

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace ChickenMaze
{
class EventNeedScrollMap: EventHandler
{
protected Sprite sprite;
protected Map map;

protected int HorizontalBorderLimit;
protected int VerticalBorderLimit;

const byte BORDER_DIVISION_INDEX = 4;

public EventNeedScrollMap(Scene scene, Sprite sprite, Map map)
: base(EventHandler.EventType.SPRITE_MOVED, scene)
{
this.sprite = sprite;
this.map = map;

HorizontalBorderLimit = scene.game.GraphicsDevice.Viewport.Width / BORDER_DIVISION_INDEX;
VerticalBorderLimit = scene.game.GraphicsDevice.Viewport.Height / BORDER_DIVISION_INDEX;
}

///

/// if the sprite is close to the border of the viewport,
/// for each direction of the movement change the viewport
/// of the GraphicsDevice
///

/// public override void run(Object source) {

int SceneShift = sprite.speed;
int x = (int)sprite.Position.X – scene.X;
int y = (int)sprite.Position.Y – scene.Y;

// into left limit
if (x < scene.game.GraphicsDevice.Viewport.X + HorizontalBorderLimit)
{
if (scene.X - SceneShift > 0)
{
scene.X -= SceneShift;
}
}

// into right limit
if (x > scene.game.GraphicsDevice.Viewport.X
+ scene.game.GraphicsDevice.Viewport.Width – HorizontalBorderLimit)
{
scene.X += SceneShift;
}

// into top limit
if (y < scene.game.GraphicsDevice.Viewport.Y + VerticalBorderLimit)
{
if (scene.Y - SceneShift > 0)
{
scene.Y -= SceneShift;
}
}

// into bottom limit
if (y > scene.game.GraphicsDevice.Viewport.Y
+ scene.game.GraphicsDevice.Viewport.Height – VerticalBorderLimit)
{
scene.Y += SceneShift;
}

}

}
}

Desta maneira tratadores de evento podem ser facilmente reaproveitados entre jogos, e inclusive escrever código para realizar testes destes tratadores.

os próximos passos são :

  • carregar o mapa de uma arquivo
  • determinar que a galinha chegou no fim do mapa e criar evento para isto
  • adicionar sons
  • adicionar timer na tela
  • adicionar os marcadores de labirinto com ovos (1 ovo a cada 10 segundos com duração de 60 segundos cada)
  • adciionar cena de tela inicial
  • adicionar cena de pontuação
Tagged with:
 

xna uma lista de tutoriais

On January 11, 2009, in games, programacao, by athanazio
0
Tagged with:
 

c# xna fontes e movimento

On January 11, 2009, in games, programacao, trecos, by athanazio
1

Em minha exploração atual enfrentei algumas duvidas que foram interessantes: ao movimentar o personagem pela tela os movimentos para baixo e para a a direita nao permitiam que o personagem ficasse colado no obstáculo, mantendo sempre uma certa distância, e o segundo que ocorreu logo apos quando tentei exibir no personagem a posicao na tela, que foi como carregar e exibir texto.

vamos por partes, esta tela abaixo mostra o resultado do esforço de debugar o movimento do personagem na tela, exibindo a posição atual na janela

e depois na interface escolha Spritefont

primeiro quanto a discussão do movimento para baixo e para a direita, o trecho de código abaixo mostra como fiz a implementação dos tratadores de eventos isolada da implementação do Sprite e do bloco principal

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;

namespace ChickenMaze
{
class EventKeyboardDown: EventHandler
{
protected Sprite sprite;
protected Map map;

public EventKeyboardDown(EventManager manager, Sprite sprite, Map map)
: base(EventHandler.EventType.KEYBOARD_DOWN, manager)
{
this.sprite = sprite;
this.map = map;
}

public override void run(Object source) {

int x = (int)sprite.Position.X;
int y = (int)sprite.Position.Y + sprite.speed;

if (map.IsAvailable(x + sprite.GetWidth()-1, y + sprite.GetHeight()-1)
&& map.IsAvailable(x, y + sprite.GetHeight()-1))
{
sprite.Position.Y = y;
}
else
{
manager.trigger(this, EventHandler.EventType.CANT_MOVE_THERE);
}

}

}
}

A chave da solução do problema esta no fato de comparar os pontos -1 hehehe bobagem pura da minha parte, porque se estou por exemplo no ponto 60 e somo 60 com certeza nao vou poder colocar este ponto numa posicao 120 porque 60+60 = 120 e estando 120 ocupado a resposta vai ser sempre, ok, ali nao pode, mas se faço a comparação com -1 ai sim vou testar o ultimo pixel do bloco que estou movimentando.

Outra questão é desenhar o texto, que não teve mistério, o mistério foi descobrir como carregar a fonte :) o trecho abaixo exibe o texto

public static void DrawText(string text, Vector2 position)
{
spriteBatch.DrawString(spriteFont, text, position, Color.White);
}

e para carregar uma fonte basta criar uma nova sprite font que eh uma referencia dentro do projeto para uma fonte que vai ser carregada na hora de gerar o projeto para deploy, clique com o botão direito em content conforme a figura abaixo

e no codigo fonte faça referência ao Spritefont criado

spriteFont = Content.Load(“SpriteFont1″);

agora vou empacotar o pxóximo post trocando a caixinha amarela pela galinha e preparar as explicações de como foi organizado o código :)

Tagged with:
 

idéias em game coding design

On January 7, 2009, in games, programacao, by athanazio
4

ontem pela manhã apertado no ônibus, parece que tenho um imã para gente que ocupa espaço !! fui pensando em algumas idéias sobre a implementação de um jogo, e apartir de alguns rascunhos veja que idéias interessante

usar o conceito de cena, não sei ainda se o XNA oferece isto … e inicialmente possuir as seguintes cenas :

  • abertura
  • início de fase
  • jogo
  • fim de fase
  • fim de jogo

com estas cenas um jogo básico jah pode ser feito com um mínimo de interação, alem disto para cada cena é necessário definir um viewport do que esta sendo exibido facilitando assim scrolling de tela e coisas assim, de novo preciso investigar no XNA se tem isto :)

lembro que preciso também de alguma forma registrar os eventos que cada cena podem ter… isto vai ajudar …

e a vigam continua e o cara do meu lado com os braços cruzados, e continuo a rabiscar idéias

opa mais coisas para a cena, agora as definições de audio :

  • som de abertura
  • loop
  • sons para eventos
  • término

Me parece que os tais dos eventos podem ser definidos para cada cena, e possuem um nome, som atribuido, se dispara outro evento e coisa e tal, precisa de um método para testar se o evento foi disparado, e outro para executar alguma coisa … ehehhe virou uma interface para ser implementada e registrada em cada cena, ou registrada em um gerente de eventos.

Outra necessidade e a lista de elementos que estão contidos na cena, e onde estão posicionados

além do gerente de eventos, vejo como necessário um gerente de posicionamento de elementos na cena, ou seja antes de mover qualquer coisa solicitar o movimento a este gerente para cuidar de colisão e somente permitir movimentos para locais na tela onde é permitido.

exemplos conceituais de event handler

  • verificar se personagem chegou perto da borda e rolar a tela
  • verificar se houve colisao de um projetil com um NPC

tenho de pensar em uma maneira de tornar este registro de eventos simples o suficiente para nao ficar burocratico, contudo usar eles isolados com um Gerente de eventos me dah ideias bem legais de permitir testes automatizados dos codigos dos eventos.

bem são só rascunhos, e nas minhas investigações do XNA vou vendo o que tem e o que não tem …

Tagged with:
 

mamãe eu quero ser um game designer =)

On January 5, 2009, in games, by athanazio
1

pra galera que entende inglês e tem pretensões de game designer !


SAND 2008: “Mum, Dad, I want to be a game designer” from SAND on Vimeo.

Tagged with:
 

sioti esta se mexendo na tela

On September 24, 2008, in games, sioti, by athanazio
1

iau ! mor legal ! o personagem se mexe na tela hehehe, eh claro que isto não eh quase nada, mas jah é algum avanço, veja o demo : http://game.sioti.com/dev/draft1/

Por enquanto a classe que cuida do personagens, CharManager, carrega cada desenho de cada direcao, entrega quando solicitada a imagem de cada posicao, a o plano eh que a composicao do personagem seja feita em memoria mesmo, e estou considerando o uso do script para a definicao das animacoes, mantendo assim somente as imagens de cada parte do boneco, e as animacoes em codigo script.

Para os curiosos de plantao a biblioteca do cliente que roda num applet usa o pulpcore, olha a API aeee http://www.interactivepulp.com/pulpcore/api/

Tagged with:
 

ipod end of game

On September 17, 2008, in games, by athanazio
0

I had to share this, very funny surprise at the end of the game in Ipod !! LOL

Tagged with:
 

sioti javascript integration

On September 2, 2008, in games, sioti, by athanazio
0

thinking about the script engine to sioti, nothing better than javascript, and to do this I’m looking at rhino from mozilla.

For me my big concern about scripting, is what level of access the script will have to the virtual machine, so it seems that Rhino have clear way to filter what classes can and cannot be used by the script, by defining a ClassShutter, where the method visibleToScripts() will filter wich class can be used in the script, by default all Java classes can be used, so create this filter is a must to allow good behavior of future plugins :)

Also have to check if is necessary to seal the context where the script will be running.

My idea is having the basic behavior of the game implemented in java, in a client that has to be downloaded, to avoid map loading thru the web, have the rules in the server, and interface definition + event handling created with javascript.

creating like this, the game already born with a plugin capability, feature that usually requires an extra effort in the future, due to decisions like, what features to publish to the script, creating the UI using the script, the needs will happens at the beginning, and the maturity of the script will come naturally.

Tagged with:
 

thinking about sioti

On September 2, 2008, in games, sioti, by athanazio
1

One day I was at home with my sweet daughters, and I come with this crazy idea, that most of the developers already had of making a game :) . But as I’m more stupid than the average bears, we decide to move forward …

We designed the map, I discussed with some friends, made a website, had meetings, and so on … but forces, probably from the future shamans of the game, made the movement stop a little, and sioti is pretty much sleeping for now.

I remember y friend Paulo telling me: “Man do it 2D and then one day you think about 3D…” Oh well when we don’t hear good advices, we usually make stupid things :) hehehe and with all my ignorance about 3D programming dive into the subject, getting some small results, but not enough to move forward with the game, cubes moving over an surface are not exactly a game, lol.

Then I rethink my ideas and I’m thinking about to restart the development using pulpcore as client, and the back-end with php.

For the admin tools thinking about to make then embeded in the wordpress =) So I don’t have to create user management code, and the admin to create the inventory will have a nice user interface also, and the game it self will have a blog, and some fixed pages.

Beside my isometric efforts, I will follow my friend advice, and make plain 2D, lets see If I can make it enjoyable :)

Sioti rulez !

Tagged with:
 

sioti está vivo

On June 23, 2008, in games, sioti, by athanazio
0

Hehehe, após alguns contratempos SIOTI esta de volta na estrada, o código fonte inicial está no google code http://code.google.com/p/sioti/

novidades aos pouquinhos … =)

Tagged with:
 

sioti eh legal

On April 27, 2008, in games, java, sioti, by athanazio
0

arre !

eu e mais um grupo de loucos esta trabalhando em um projeto de jogo ! imagino que muita gente jah comecou projetos assim, mas espero que possamos nao soh comecar como tambem colocar no ar o projeto !! jah tem umas 3 semanas que comecamos a trabalhar e algumas coisas jah comecaram a criar vida, e jah comecaram a sair do papel !

para ver as novidades do que estamos fazendo visite www.sioti.com em breve a estoria do jogo vai estar lah disponivel bem como outras informacoes legais !

jah temos ateh um cubo andando no cenario !! huahuahuahua que tosqueira puro teste tecnico mesmo, mas se quizer ver esta online … http://www.youtube.com/watch?v=uOrRReoJIKw

e nesta empreitada, meus horarios livres sao para mergulhar no blender, jmonkey engine, pesquisar bichos, plantas, modelos 3d, estorias, roupas, armaduras, coordenar a galera, acordar uns e outros, sorrir junto, chorar junto, caminhar, caminhar, caminhar … vamos caminhando e quem sabe nesta jornada saimos com um jogo interessante para se jogar :)

o mais importante eh fazermos algo que seja divertido de fazer e divertido de jogar !!

e vamos caminhando

Tagged with:
 

mac donalds the game

On February 25, 2008, in games, by athanazio
0

http://www.mcvideogame.com

This game is fantastic !!!

Tagged with: