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:
 

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: