Sobre o “Pollus”, um jogo de ação casual que estou desenvolvendo

Bem, na realidade gostaria de falar sobre o projeto que estou tocando, o jogo de codinome “Pollus”.

Sobre o nome: na realidade esse nome bobo provavelmente será o definitivo, pelo fato de querer um nome que não significasse outra coisa (ou seja, fosse único) e de fácil pronúncia e lembrança por aí. Sei lá, talvez dê na cabeça de lançar uma enquete ou mudar geral, mas vou deixar isso por último…

Enfim, sem delongas, o jogo será casual (ou seja, não será um game AAA suuuuper ferrado de 3D e IA, mas sim daquele gênero de games simplificados e divertidos seguido por equipes pequenas indie, como é o meu caso). Inicialmente será lançado na Web usando a plataforma Flash, e posteriormente para PC e, se não for dispendioso demais, lançá-lo para mobile (iOS e Android). Vou buscar patrocinadores através de portais ou do FGL (mais viável), mas se não rolar irei de Google AdSense (for Games) ou MochiMedia mesmo. Continue lendo “Sobre o “Pollus”, um jogo de ação casual que estou desenvolvendo”

Novo site: Neoludo

Bem, continuando os textos falando sobre os novos planos, segue aí o link do site onde pretendo hospedar meus games: http://neoludo.net/

Nele já tem um exposto: o BluZone, um jogo de tiro (shooting) que combina um pouco de puzzle e memória (!). Está em fase de avaliação na MochiMedia e pretendo hospedar em sites maiores de games, como o Newgrounds, entre outros.

É o meu primeiro jogo, teve um propósito de estudo também, por isso, e pretendo fazer melhores e mais elaborados, claro.

Abraços! 😀

PS: e a página no Facebook é www.facebook.com/neoludo.web

O hype do HTML 5, o “fim” do Flash e as más intenções

Apesar do que parece, este post não é sobre tecnologias Web.

Na última semana vimos uma enxurrada de notícias e comentários (uns relevantes, outros sem total embasamento) sobre do anúncio da Adobe em por fim ao desenvolvimento do plugin Flash para dispositivos móveis (apenas dispositivos móveis, e não no geral). Realmente, acredito que a Adobe foi sensata na decisão e deva ter seus motivos para isso. Enfim, não vou falar mais acerca disso pois há muitos posts bons que tratam sobre o futuro da plataforma – recomendo este do ASDevs, que é imparcial realista sobre este assunto.

No entanto, quero me ater nesta postagem sobre o hype em torno do HTML5. De uma hora para outra começou a se anunciar que o futuro seria esse padrão aberto, e o Flash, de repente, virou uma coisa imprestável, um lixo, “lento”, “pesado”, uma tecnologia paga (é possível desenvolver usando Flex SDK sem precisar pagar pedágio para Adobe, mas enfim…), entre outras. O Flash virou um novo IE: algo que deveria ser combatido e eliminado, para dar lugar ao futuro maravilhoso e aberto proporcionado pelo HTML5…

Pois bem. É lamentável que muitas críticas, muitas vezes infundadas, tenham ganho espaço. Mas o que se é de lamentar mesmo é que muitos só tenham se prestado a criticar a tecnologia de maneira oportunista, apenas querendo se aproveitar do momento. Cursos, livros e eventos em torno do HTML5 começaram a surgir do nada tratando o padrão como salvação para tudo, em que se pode usar ele em sua plenitude substituindo o Flash (inclusive no IE 8, né?…). Para entender como essa visão é equivocada recomendo este post do blog Mochila Binária.

Não há dúvida de que o HTML5 veio para ficar, mas o que não se pode dizer é que ele está pronto em definitivo para substituir o Flash, como muitos dizem por aí. Só fico chateado de que muitos prefiram especular e acabem difundindo informações errôneas sobre o assunto, fazendo com que muitos que não são da área de Web acabem mal informados, como usuários comuns e pessoas que desejam ter um site – aliás, o que já vem ocorrendo.

 

CASA Lib, a biblioteca ActionScript que é uma verdadeira “mão na roda”

Neste post vou tratar sobre uma biblioteca que conheço há muito tempo mas que, curiosamente, nunca dei espaço para usar em um projeto: CASA Lib.

A biblioteca, olhando por cima, tem recursos interessantes e que cobre muitos vácuos encontrados na linguagem AS 3, como, por exemplo, um método para remover um item determinado numa Array. Para isso o CASA Lib oferece um objeto List que tem um método removeItem() que cobre esse vazio e facilita a remoção de um item, independentemente da sua posição:

var arr:List = new List(['francisco', 'joão', 'maria', 'daniel']);
arr.removeItem('joão');
trace(arr); // exibe francisco,maria,daniel

Outras classes úteis são Key e KeyCombo, que facilitam a manipulação de teclas pressionadas simultaneamente.

Mais um recurso bacana são os carregadores. Há para vários tipos, assim como o carregador em grupo (GroupLoad), que permite carregar vários objetos exibindo uma só porcentagem de progresso do conjunto. Carregar imagens, por exemplo, é mais simples do que escrever os objetos “na unha”:

var imageLoader:ImageLoad = new ImageLoad("imagem-de-exemplo.jpg");
imageLoader.addEventListener(LoadEvent.COMPLETE, onComplete);
imageLoader.start();

function onComplete(evt:LoadEvent):void 
{
	addChild(imageLoader.contentAsBitmap);
}

Para ver outros recursos é recomendável ver a documentação. Apesar de ser documentação há os exemplo de como usá-las.

Usando Box2D no Flash / ActionScript 3.0 – tutorial básico

Garimpei muito na Web buscando um tutorial simples para o uso da biblioteca de física Box2D e que funcionasse no Flash. Encontrei códigos com formato antigo, que rodam em versões anteriores da biblioteca (ou em Flash Player anteriores), e principalmente pouco interessantes

Foi então que resolvi experimentar usar por conta própria o manual do Box2D, que tem um tutorial que, apesar de estar em C/C++, é muito didático. Adaptei o código para o Actionscript 3.0 e funcionou.

Para ver o programa funcionando usei a as3isolib, para geração de gráficos isométricos – a intenção é tornar visível o funcionamento. Porém, você pode usar o próprio trace() do Flash para exibir a posição da caixa que cai sobre um piso e dá uma leve quicada. Mais detalhes sobre o código veja no tutorial do manual.

package{
import flash.display.*;
import flash.events.*;
import Box2D.Dynamics.*;
import Box2D.Collision.*;
import Box2D.Collision.Shapes.*;
import Box2D.Common.Math.*;
import as3isolib.display.primitive.IsoBox;
import as3isolib.display.scene.IsoScene;

public class Main extends Sprite{

public var world:b2World;
public var groundBodyDef, bodyDef:b2BodyDef;
public var body, groundBody:b2Body;
public var groundBox:b2PolygonShape = new b2PolygonShape();
public var dynamicBox:b2PolygonShape = new b2PolygonShape();
public var fixtureDef:b2FixtureDef = new b2FixtureDef();
public var timeStep:Number = Number(1 / 60);
public var velocityIterations:Number = 6;
public var positionIterations:Number = 2;

/*objetos as3isolib - se não quiser baixar a biblioteca você pode usar o trace() para exibir a posição da caixa*/
public var scene:IsoScene = new IsoScene();
public var groundIso:IsoBox = new IsoBox();
public var bodyIso:IsoBox = new IsoBox();

public function Main() {
stage.scaleMode = StageScaleMode.NO_SCALE;

// função que fará tudo se mover
stage.addEventListener(Event.ENTER_FRAME, update);

/* CÓDIGO BOX2D */
// criação do ambiente
world = new b2World(new b2Vec2(0, -10), true);

// criação do chão, onde a caixa irá cair
groundBodyDef = new b2BodyDef();
groundBodyDef.position.Set(250, -50);

// adicionando o corpo ao ambiente
groundBody = world.CreateBody(groundBodyDef);

groundBox.SetAsBox(50, 10);

groundBody.CreateFixture2(groundBox);

// a caixa que cairá
bodyDef = new b2BodyDef();
bodyDef.type = b2Body.b2_dynamicBody;
bodyDef.position.Set(250, 50);

body = world.CreateBody(bodyDef);

dynamicBox.SetAsBox(1, 1);

fixtureDef.shape = dynamicBox;
fixtureDef.density = 1;
fixtureDef.friction = 0.3;
fixtureDef.restitution = 0.1;

body.CreateFixture(fixtureDef);
// -X-

/* CÓDIGO AS3ISOLIB - NÃO ESSENCIAL */
// gráficos do chão
groundIso.setSize(50, 50, 10);

bodyIso.width = 10;
bodyIso.length = 10;
bodyIso.height = 10;

scene.hostContainer = this;
scene.addChild(bodyIso);
scene.addChild(groundIso);
// -X-
}

public function update(evt:Event):void {
// executando a ação física
world.Step(timeStep, velocityIterations, positionIterations);
world.ClearForces();

groundIso.x = groundBody.GetPosition().x;
groundIso.z = groundBody.GetPosition().y;

/* CÓDIGO AS3ISOLIB - NÃO ESSENCIAL */
bodyIso.x = body.GetPosition().x;
bodyIso.z = body.GetPosition().y;

scene.render();
// -x-
}
}
}