Posts Tagged ‘actionscript’

MUDAMOS DE ENDEREÇO

junho 9, 2010

olá pessoal, mudei de endereço e aguardo sua visita:

http://HamisterTower.com.br

Novidades:

Nessa nova fase do blog  continuaremos com o foco em no flash e jogos a novidade é que também abordaremos assuntos como: Flex, Air, outras engines (Away3d, Sandy, Alternativa3d, Box2d,Jiblib), Realidade Aumentada, Componentes especifico para jogos e alguns de meus projetos pessoais entre outras coisas.

Não deixem de acompanhar o blog, lembrando que estamos em outro endereço: http://HamisterTower.com.br espero a visita de vocês lá, vlw Abraços.

Emulador de Game Boy Classic em Flash

julho 23, 2009

Olá pessoal, muitos de vocês adoram jogar jogos emulados, final fantasy, chrono trigger, Pokémon. Pois bem, aposto que vocês nunca imaginaram fazer um emulador em flash, eu pessoalmente nunca me imaginei, acontece que eu acabei esbarrando com um site muito interessante aonde possuía um código de um emulador de game boy classic feito em flash.

emuladorgb

Clique na imagem para visualizar o código

O site é uma espécie de compilador de flash online, aonde o usuário escreve seu código, compila e compartilha com outros usuários do site, encontrei uns códigos bem simples para usar como referencia em meus estudos da engine box2d, também encontrei bons exemplos de papervision, vale apena dar uma conferida no site. http://wonderfl.net/. Agora que vocês tem acesso ao código de um emulador de game boy classic desafio vocês a criar um emulador de game boy color. Heheh. Bem pessoal até o próximo post.

Papervision MouseClick

maio 7, 2009

mundi

Olá pessoal como havia prometido nosso mais novo tutorial papervision não estamos usando o Cubo, para diversificar um pouco decidi utilizar a Esfera.

Este tutorial é essencial para ter uma base de criação de site em papervion, neste tutorial vamos aprender a colocar nosso viewport para aceitar interação e definiremos nossa esfera para funcionar como botão simples, onde a única funcionalidade será pausar e retomar a rotação.

Depois de uma seqüência de tutoriais sobre papervision existe muitos pontos que não precisarei explicar de novo, como  por exemplo: inserir uma esfera e importar uma textura para ela. Hoje me focarei somente nos pontos chaves.

Viewport3D

O viewport é o nosso ambiente 3d, extremamente essencial para criar algo com o papervision, quando criamos nosso viewport3d podemos definir alguns parâmetros iniciais.

    new niewport3D(width, height, autoscale, interactive)
  • width (Number): Define a largura de nosso viewport3d;
  • height (Number): Define a altura de nosso viewport3d;
  • autoscale (Boolean): Determina se o viewport vai se escalar ao Stage.
  • Interactive (Boolean): Permite o uso de interações com o mouse, possibilitando o uso do evento InteractiveScene3DEvent.

Criando Interação

Em nosso código passaremos a definir o parâmetro interativo para true. Com o viewport definido para true poderemos definir agora nosso material para interative possibilitando ele ser clicado quando estiver em um objeto primitivo.Neste exemplo eu usarei o MovieMaterial, mas vocês poderiam utilizar qualquer outro tipo de material, lembrando que com o movie material eu importo um movieclip que esteja em minha biblioteca ou que já tenha sido instanciado.

     skin = new MovieMaterial(mov);
     skin.interactive = true;

Agora poderemos adicionar um listener em nossa esfera chamando o evento de interação especifico seguido de um método que será executado.

    esfera.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,PRESS);

Código: main.as

package
{
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    import org.papervision3d.materials.MovieMaterial;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.render.BasicRenderEngine;
    import org.papervision3d.events.InteractiveScene3DEvent;
    public class main extends Sprite
    {
        public var cena:Scene3D;
        public var viewport:Viewport3D;
        public var camera:Camera3D;
        public var renderer:BasicRenderEngine;
        public var esfera:Sphere;
        public var mov:MovieClip = new earth();
        public var skin:MovieMaterial;
        public var paused:Boolean = false;
        public function main ()
        {
            Set ();
            Objetos ();
        }
        public function Set ():void
        {
            viewport = new Viewport3D(300,300,false,true);
            addChild (viewport);
            cena = new Scene3D ;
            renderer = new BasicRenderEngine ;
            camera = new Camera3D ;
        }
        public function Objetos ():void
        {
            skin = new MovieMaterial(mov);
            skin.interactive = true;

esfera = new Sphere(skin,300,30);

            cena.addChild(esfera);

esfera.addEventListener(InteractiveScene3DEvent.OBJECT_PRESS,PRESS);

            addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
        }
        public function PRESS (e:InteractiveScene3DEvent ):void
        {
            paused = !paused;
        }
        public function Loop (e:Event):void
        {
            if (!paused)
            {
                esfera.roll(1)
                esfera.yaw(3)
                esfera.pitch(1)
            }
            renderer.renderScene (cena,camera,viewport);
        }
    }
}

Lembrando que para este tutorial funcionar devemos importer as classes do papervision e definir como classe padrão do fla a classe main,
Tentei fazer algo bem simples para demonstrar a interação do mouse com o papervision, com isso podemos criar diversas coisas seguindo a criatividade de cada um. Tentarei fazer algo mais elaborado para próximo tutorial. Espero que tenham gostado e que estes tutoriais sobre papervision estejam sendo úteis para vocês em seus estudos. Bem ate a próxima.


									

Papervision MovieMaterial

maio 4, 2009

moviematerial

Clique na imagem para testar

Olá pessoal , para dar continuidade ao nosso estudo sobre papervision, hoje vamos falar sobre mais um tipo de material que podemos utilizar nos nosso objetos primitivos a textura MovieMaterial. Antes de começamos a falar sobre esse material vamos falar sobre um problema que ocorria com a classe MovieAssetMaterial.

Quando aprendemos sobre MovieAssetMaterial, passávamos uma string como parâmetro e importávamos de nossa biblioteca um movieclip onde o valor da propriedade linkage era igual da string referida. Mas a classe MovieAssetMaterial não aceita importar um movieclip que tenha come base uma classe que necessite de um parâmetro.

A classe MovieMaterial utiliza como parâmetro a instanciação de um movielip ao invés de uma string referindo sua propriedade linkage, com isso seu movieclip padrão não necessariamente precisa estar na bibliote, você pode trabalhar com um movieclip já instanciado, assim você pode utilizar o método gotoAndStop para indicar outro frame antes de ter instanciado ele como material..Outra vantagem é a possibilidade de utilizar um movieclip da biblioteca que tenha como base uma classe que exija parâmetro.

Construtor

Para criarmos um MovieMaterial devemos instanciar um objeto do tipo MovieMaterial.
Nosso único parâmetro obrigatório é um do tipo DisplayObject que é a referencia de nossa textura.

var  material:MovieMaterial =  new MovieMaterial(movieAsset);

movieAsset (DisplayObject): Referencia de um movieclip existente carregado na memória ou no stage.
Transparent (Boolean): Define se a textura possuirá transparência. [opcional]
Animated (Boolean): Define se o movieclip sera animado [opcional]

Tutorial

Neste tutorial eu quis brincar um pouco e mais uma vez dou uma demonstração de tile system com papervison, mas desta vez vamos ter uma classe que se comportará como movieclip aonde receberá como parâmetro um número que definirá qual vetor vai utilizar para criar o cenário, depois utilizaremos como material nosso cenário, A parte relacionada a papervision não terá mistério nenhum pois estarei usando a estrutura do tutorial anterior relacionado a materiais.

Arquivos

Neste tutorial trabalharemos com os seguintes arquivos:
1- MovieMaterial.fla
2- main.as
3- faceField.as: Classe que criará um cenário tile system para se comportar como material

MovieMaterial.fla:

obtile

1- faceField: Movieclip
2- obTile:MovieClip
3- main (definir como classe principal)

obs: para criar um movirclip vazio basta segurar ctrl + F8.

faceField.as

Esta classe não existe mistério nenhum, seu construtor recebe um numero como parâmetro e se for 1 desenha o vetor map1 e se for outro desenha o vetor map2. Em seguida percorre a seqüência de loops para desenhar o tile.

package
{
    import flash.display.MvieClip;
    public class faceField extends MovieClip
    {
        public var map1:Array = [
        [1,1,1,1,1,1,1,1,1,1,1],
        [1,0,0,0,0,0,0,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,1,1,0,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,1,1,1,0,0,0,1],
        [1,0,0,0,0,0,0,0,0,0,1],
        [1,1,1,1,1,1,1,1,1,1,1],
        ];
        public var map2:Array = [
        [1,1,1,1,1,1,1,1,1,1,1],
        [1,0,0,0,0,0,0,0,0,0,1],
        [1,0,0,0,1,1,1,0,0,0,1],
        [1,0,0,1,0,0,0,1,0,0,1],
        [1,0,0,1,0,0,0,1,0,0,1],
        [1,0,0,0,0,0,1,0,0,0,1],
        [1,0,0,0,0,1,0,0,0,0,1],
        [1,0,0,0,1,0,0,0,0,0,1],
        [1,0,0,1,1,1,1,1,0,0,1],
        [1,0,0,0,0,0,0,0,0,0,1],
        [1,1,1,1,1,1,1,1,1,1,1],
        ];
        public function faceField (n:Number)
        {
            for (var j =0; j<11; j++)
            {
                for (var i=0; i<11; i++)
                {
                    var t:MovieClip = new obTile();
                    addChild (t);
                    t.x = i * 20;
                    t.y = j * 20;
                    if (n==1)
                    {
                        t.gotoAndStop(map1[j][i]+1);
                    }
                    else
                    {
                        t.gotoAndStop(map2[j][i]+1);
                    }
                }
            }
        }
    }
 }

main.as

Nossa classe principal não possui nenhum mistério, utilizamos a estrutura do tutorial papervision materiais.

Utilizamos apenas MovieMaterial para formação das faces do cubo, com a diferença apenas na maneira de que são chamadas desta apenas uma fogem do padrão.

    skinTile1.gotoAndStop(1);
    skinTile2.gotoAndStop(2);
    faceMovTile1 =  new MovieMaterial(skinTile1);
    faceMovTile2 =  new MovieMaterial(skinTile2);

Apesar dos objetos terem sidos criados no começo da classe só neste ponto que instanciamos os objetos para se portar como material, desta maneira garante que os moviesclips vão estar em seus respectivos frames antes de instanciarmos os materiais.

package
{
    //flash
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    //papervision
    import org.papervision3d.scenes.Scene3D;
    import org.papervision3d.view.Viewport3D;
    import org.papervision3d.cameras.Camera3D;
    import org.papervision3d.render.BasicRenderEngine;
    //Material
    import org.papervision3d.materials.utils.MaterialsList;
    import org.papervision3d.materials.MovieMaterial;
    // objeto
    import org.papervision3d.objects.primitives.Cube;
    public class main extends Sprite
    {
        public var cena:Scene3D;
        public var viewport:Viewport3D;
        public var camera:Camera3D;
        public var renderer:BasicRenderEngine;
        //Material
        public var skinMaterial1:MovieClip = new faceField(1);
        public var faceMov1:MovieMaterial = new MovieMaterial(skinMaterial1);
        public var skinMaterial2:MovieClip = new faceField(2);
        public var faceMov2:MovieMaterial = new MovieMaterial(skinMaterial2);
        public var skinTile1:MovieClip = new obTile();
        public var skinTile2:MovieClip = new obTile();
        public var faceMovTile1:MovieMaterial;
        public var faceMovTile2:MovieMaterial;
        //objetos Primitivos
        public var obCube:Cube;
        public function main ()
        {
            Set ();
            Objetos ();
        }
        public function Set ():void
        {
            viewport = new Viewport3D(400,300,true,false,true,true);
            addChild (viewport);
            cena = new Scene3D ;
            renderer = new BasicRenderEngine ;
            camera = new Camera3D ;
            camera.focus = 600;
            camera.zoom = 1;
        }
        public function Objetos ():void
        {
            skinTile1.gotoAndStop(1);
            skinTile2.gotoAndStop(2);
            faceMovTile1 =  new MovieMaterial(skinTile1);
            faceMovTile2 =  new MovieMaterial(skinTile2);
            //Cube
            obCube = new Cube(
                new MaterialsList(
                {front: faceMov1,
                 back: faceMov1,
                 left: faceMovTile1,
                 right: faceMovTile2,
                 top: faceMov2,
                 bottom: faceMov2}
                )
            ,220,220,220,1,1,1);
            cena.addChild (obCube);
            addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
        }
        public function Loop (e:Event):void
        {
            obCube.yaw (-4);
            obCube.pitch (-2);
            renderer.renderScene (cena,camera,viewport);
        }
    }
}

Espero que tenham gostado do tutorial, apesar de MovieMaterial ser uma textura bem útil não devemos esquecer das outras texturas, é sempre bom usar a textura certa para cada momento assim deixa o programa mais leve. Ao que parece vocês já devem estar enjoados de exemplos com cubo, por isso tentarei mudar um pouco de objeto para o próximo tutorial, estou dando uma olhada em coisas interessantes com o objeto “Plane” quem sabe ele não vira tema do nosso próximo tutorial de papervision. Obrigado pela visita e volte sempre.

Papervision Tile

abril 2, 2009

Olá pessoal, estava me preparando para montar um novo tutorial sobre tile system, já estou a algum tempo uma atualização para a estruturação de cenários isométricos, mas eu pensei “por que não criar um cenário 3D tile?”

swf

Clique na imagem para testar.

Gostou, este será o nosso produto final, pois bem vamos seguir com o tutorial.

Lógica:

A lógica é bem simples, usaremos 2 vetores diferentes, um deles será para mostrar qual será o tile que usaremos na posição e o outro vetor que indicara a altura. Criaremos os loops para percorrer o vetor e criar cubos num plano 3D. Como termos alguns cubos suspensos, completaremos os espaços vazios com cubos, e colocaremos uma função para rotacionar nosso Field.

Tiles:

linkage

Estes sãos os movieclips que usaremos no nosso arquivo .fla, todos eles com exceção do water são estáticos, não possuem nenhum freme alem do desenhado, já o water eu coloquei uma pequena movimentação para dar um efeito de água se movendo. Todos os movieclips estão com a propriedade linkage definidos.

Usaremos a classe MovieAssetMaterial para importarmos cada movieclip para um material diferente

 public var matGrass:MovieAssetMaterial = new MovieAssetMaterial("grass");
 public var matBase0:MovieAssetMaterial = new MovieAssetMaterial("base0");
 public var matBase1:MovieAssetMaterial = new MovieAssetMaterial("base1");
 public var matFlower:MovieAssetMaterial = new MovieAssetMaterial("flower");
 public var matWater:MovieAssetMaterial = new MovieAssetMaterial("water", true);

Tiles x Materiais

materiaislist

Como vocês podem ver na imagem acima montaremos cubos para usarmos como tile, por enquanto vamos nos focar em criar as listas de materiais para as respectivas faces dos cubos.

 public var w:MaterialsList = new MaterialsList(
    {front: matWater, back: matWater, left: matWater,
     right: matWater,  top: matWater,  bottom: matWater});
 public var g:MaterialsList = new MaterialsList(
    {front: matBase1,  back: matBase1,  left: matBase1,
     right: matBase1,  top: matGrass,  bottom: matBase1});
 public var f:MaterialsList = new MaterialsList(
    {front: matBase1,  back: matBase1,  left: matBase1,
     right: matBase1,  top: matFlower,  bottom: matBase1});
 public var b:MaterialsList = new MaterialsList(
    {front: matBase0,  back: matBase0,  left: matBase0,
     right: matBase0,  top: matBase0,   bottom: matBase0});

Assim nosso Tile ficara formatado da seguinte forma.

 public var arrayTile:Array = [
  [w,w,w,w,w,w,w,w,w,w],
  [w,w,w,g,g,g,g,w,w,w],
  [w,g,g,g,g,g,f,w,w,w],
  [w,f,g,f,g,g,g,g,w,w],
  [w,g,g,g,f,g,g,g,w,w],
  [w,w,g,g,w,g,g,g,w,w],
  [w,w,w,g,g,f,g,g,w,w],
  [w,w,w,g,g,g,g,w,w,w],
  [w,w,f,g,g,f,w,w,w,w],
  [w,w,w,w,w,w,w,w,w,w]];

Tile x Altura

Para não poluir o vetor de tile decidi usar um vetor separado para mostrar o posicionamento do bloco no plano R3.

 public var arrayTileHeight:Array = [
  [0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,2,2,3,0,0,0],
  [0,3,2,0,1,1,2,0,0,0],
  [0,2,1,1,1,1,2,0,0,0],
  [0,0,1,1,1,1,1,0,0,0],
  [0,0,0,1,1,0,0,0,0,0],
  [0,0,0,0,1,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0,0],
  [0,0,0,0,0,0,0,0,0,0]];

Nós usaremos cada cubo com o tamanho 30x30x30 analogamente para subir um nível os blocos temos que multiplicarmos a posição demonstrada no vetor por 30.

espaco

Com isso acabamos criando espaços vagos.para resolvermos isso criaremos um loop que criará blocos do tipo base da altura 0 ate a altura definida.

Criando Tiles

A diferença dos tiles que vimos em R2 para o R3 é que alteramos a propriedades x e z com os loops ao invés de (x,y) a propriedade y utilizamos para altura.

public function Objetos () {
  for (var i = 0; i < arrayTile.length; i++) {
      for (var j = 0; j <  arrayTile[0].length; j++) {
          //Criando blocos extras na altura
          if (arrayTileHeight[i][j]>0) {
             for (var k=0; k< arrayTileHeight[i][j]; k++){
                var obCubeb:Cube = new Cube(b,30,30,30);
                cena.addChild (obCubeb);
                obCubeb.x = i * 30 -150;
                obCubeb.z = j * 30 -150;
                obCubeb.y = k * 30;
             }
          }
          //Criando bloco Tile
          var obCube:Cube = new Cube(arrayTile[i][j],30,30,30);
          cena.addChild (obCube);
          obCube.x = i * 30 -150;
          obCube.z = j * 30 -150;
          obCube.y = arrayTileHeight[i][j] * 30;
      }
    }
    addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
 }

Código extra: Movimentando a câmera

Para fazer a movimentação da câmera utilizei a seguinte lógica, criei um objeto do tipo plano no centro de nosso cenário, e travei a câmera nele com o método.

obcamera.lookAt (centro);

Assim independente o posicionamento do x, y e z da câmera, ele sempre terá como foco o centro do mapa. Agora podemos movimentar o x e z da câmera para circular o cenário que ele nunca mudara seu foco.

A cada frame colocaremos as propriedades x e z somarem um valor, valor este que estará armazenado em um vetor. Se sempre somarmos valores nossa câmera sempre se afastará, com as possibilidades definidas em um vetor podemos manipular para ele alem de somar subtrair também para trazer a câmera de voltar.

Código Completo

Arquivo main.as

package {
   //flash
   import flash.display.MovieClip;
   import flash.events.*;
   //Papervision
   import org.papervision3d.objects.primitives.Plane;
   import org.papervision3d.objects.primitives.Cube;
   import org.papervision3d.scenes.Scene3D;
   import org.papervision3d.render.BasicRenderEngine;
   import org.papervision3d.cameras.Camera3D;
   import org.papervision3d.view.Viewport3D;
   import org.papervision3d.materials.MovieAssetMaterial;
   import org.papervision3d.materials.utils.MaterialsList;
   public class main extends MovieClip {
      //papervision
      public var cena:Scene3D;
      public var viewport:Viewport3D;
      public var camera:Camera3D;
      public var renderer:BasicRenderEngine;
      public var centro:Plane;
      //material
      public var matGrass:MovieAssetMaterial = new MovieAssetMaterial("grass");
      public var matBase0:MovieAssetMaterial = new MovieAssetMaterial("base0");
      public var matBase1:MovieAssetMaterial = new MovieAssetMaterial("base1");
      public var matFlower:MovieAssetMaterial = new MovieAssetMaterial("flower");
      public var matWater:MovieAssetMaterial = new MovieAssetMaterial("water", true);
      public var w:MaterialsList = new MaterialsList(
         {front: matWater, back: matWater, left: matWater,
          right: matWater, top: matWater, bottom: matWater});
      public var g:MaterialsList = new MaterialsList(
         {front: matBase1, back: matBase1, left: matBase1,
          right: matBase1, top: matGrass, bottom: matBase1});
      public var f:MaterialsList = new MaterialsList(
         {front: matBase1, back: matBase1, left: matBase1,
          right: matBase1, top: matFlower, bottom: matBase1});
      public var b:MaterialsList = new MaterialsList(
         {front: matBase0, back: matBase0, left: matBase0,
          right: matBase0, top: matBase0, bottom: matBase0});
       //tiles
       public var arrayTile:Array = [
        [w,w,w,w,w,w,w,w,w,w],
        [w,w,w,g,g,g,g,w,w,w],
        [w,g,g,g,g,g,f,w,w,w],
        [w,f,g,f,g,g,g,g,w,w],
        [w,g,g,g,f,g,g,g,w,w],
        [w,w,g,g,w,g,g,g,w,w],
        [w,w,w,g,g,f,g,g,w,w],
        [w,w,w,g,g,g,g,w,w,w],
        [w,w,f,g,g,f,w,w,w,w],
        [w,w,w,w,w,w,w,w,w,w]];
       public var arrayTileHeight:Array = [
        [0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,2,2,3,0,0,0],
        [0,3,2,0,1,1,2,0,0,0],
        [0,2,1,1,1,1,2,0,0,0],
        [0,0,1,1,1,1,1,0,0,0],
        [0,0,0,1,1,0,0,0,0,0],
        [0,0,0,0,1,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0],
        [0,0,0,0,0,0,0,0,0,0]];
       //Camera
       public var cam:int = 0
       public var a:int = 0;
       public var arrayCam:Array = [[-45,0],[0,-45],[45,-0],[0,45]];
       public function main () {
          Set ();
          Objetos ();
       }
       public function Set ():void {
          viewport = new Viewport3D(400,300,true,false,true,true);
          addChild (viewport);
          cena = new Scene3D ;
          renderer = new BasicRenderEngine ;
          camera = new Camera3D ;
          camera.focus = 100;
          camera.zoom = 10;
          camera.x = 650;
          camera.z = 450;
          camera.y = 700;
          centro = new Plane();
          centro.y = 0;
          centro.z = 0;
          centro.x = 0;
      }
      public function Objetos ():void {
          for (var i = 0; i < arrayTile.length; i++) {
             for (var j = 0; j <  arrayTile[0].length; j++) {
                //Criando blocos extras na altura
                if (arrayTileHeight[i][j]>0) {
                    for (var k=0; k< arrayTileHeight[i][j]; k++){
                       var obCubeb:Cube = new Cube(b,30,30,30);
                       cena.addChild (obCubeb);
                       obCubeb.x = i * 30 -150;
                       obCubeb.z = j * 30 -150;
                       obCubeb.y = k * 30;
                    }
                }
                //Criando bloco Tile
                var obCube:Cube = new Cube(arrayTile[i][j],30,30,30);
                cena.addChild (obCube);
                obCube.x = i * 30 -150;
                obCube.z = j * 30 -150;
                obCube.y = arrayTileHeight[i][j] * 30;
             }
          }
          addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
      }
      public function Loop (e:Event):void {
          a++ ;
          rotaionCamera (camera,arrayCam[cam][0],arrayCam[cam][1])
          if (a % 30 == 0){
             nextCamera()
          }
          renderer.renderScene (cena,camera,viewport);
      }
      public function nextCamera():void{
          cam= cam+1
          if (cam>=4){
             cam = 0
          }else if (cam<=-1){
             cam = 3
          }
      }
      public function rotaionCamera (obcamera:Camera3D,newx,newz):void {
          obcamera.x+= newx;
          obcamera.z+= newz;
          obcamera.lookAt (centro);
      }
   }
}

Obs: Lembrando que estamos fazendo um aplicativo utilizando as classes do papervision, não podemos esquecer-nos de importalas.

+ Sprites

março 24, 2009

Olá pessoal, estava remodelando o jogo FireRunaway do jeito que ele esta eu já acho legal, mas a emoção do jogo só começa a vir mesmo depois de uns 3 mim jogando.mas o post de hoje não vai ser para falar sobre a continuação do Fire Runaway, e sim para falar de sprites.

Enquanto eu estava trabalhando nessa nova versão, tive a curiosidade de ver como seria uma fase completa de um game de plataforma tradicional no estilo Mario, mas para ficar dando Print Screen em cada tela daria muito trabalho foi quando eu decidi procurar no Google e encontrei uns sites muitos bons de sprites.

http://ian-albert.com/
Neste site vocês encontraram sprites de mapas, fases completas de games como Mario, Zelda, Ultima.

donut_plains_4

master_sword

http://sdb.drshnaps.com/
Este site possui uma infinidade de sprites estáticos de animações quadro a quadro.

Aproveitando a brincadeira decido fazer o teste em uma das fases do Mario world usando pedaços de códigos do meu jogo FireRunaway.

madrugaworld

Clique na imagem para poder testar a demo

Espero que tenham gostado e assim que encontrar mais sites legais de sprites eu vou postando aqui, quem souber de outros sites bons podem postar o link aqui também. Obrigado pela sua presença e até a próxima.

Papervision [Objetos Primitivos]

fevereiro 11, 2009

Ola pessoal, como havia mencionado no post anterior, hoje nós teremos a primeira parte de uma serie de tutoriais sobre Papervision.
Neste tutorial falaremos sobre os Objetos Primitivos geométricos 3Ds (Plano, Esfera, Cone, Cilindro, Cubo). Depois sobre materiais de preenchimento. Lembrando que é sempre bom ter uma noção básica de matemática analítica.

ppv_ob

Primeiro Passo

Criaremos 2 arquivos, ambos ficarão na mesma pasta um deles será o main.as e o outro será o arquivo .fla que você pode nomealo da maneira que quiser. Após criar os arquivos no arquivo .fla você deve escrever na propriedade Document Class = “main”. Você também terá que definir o pacote do papervision. (post relacionado a como baixar e definir pacote do papervision aqui)

Componentes Obrigatórios

Para criar um objeto primitivo no Flash usando Papervision é muito simples. Desde que já tenha estruturado o código para poder rodar os componentes do papervision. Vamos analisar o código obrigatório.

Primeiro teremos que importar os pacotes referentes ao ambiente 3d que será criado. Depois criaremos 2 métodos em nosso main, o primeiro deles “Set()” será responsável pela criação do ambiente 3d, o segundo será aonde criaremos nossos objetos 3ds, ainda no segundo método, nós vamos criar um eventListener para criar um loop de enterframe. Nesse loop usaremos um método do papervision para ele renderizar nossa cena 3D. Nosso código base ficará mais ou menos assim.

package {
	//flash
	import flash.display.Sprite;
	import flash.events.Event;
	//papervision
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.render.BasicRenderEngine;
	//Material
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.WireframeMaterial;
	// objeto
	//Aqui importaremos nossos Objetos 

	public class main extends Sprite {
		public var cena:Scene3D;
		public var viewport:Viewport3D;
		public var camera:Camera3D;
		public var renderer:BasicRenderEngine;
		//Material
		public var material:WireframeMaterial = new WireframeMaterial(0x00ff00, 1);
		//Aqui instanciaremos nossos Objetos
		public function main () {
			Set ();
			Objetos ();
		}
		public function Set ():void {
			viewport = new Viewport3D(400,300,true,false,true,true);
			addChild (viewport);
			cena = new Scene3D ;
			renderer = new BasicRenderEngine ;
			camera = new Camera3D ;
			camera.focus = 150;
			camera.zoom = 10;

		}
		public function Objetos ():void {
                        //Aqui colocaremos nossos objetos
			addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
		}
		public function Loop (e:Event):void {
			renderer.renderScene (cena,camera,viewport);
		}
	}
}

Objetos Primitivos:

Se observarem em nosso código existe 3 pontos marcados para inserimos códigos relacionados a objetos.
• Importar pacotes referentes a objetos
• Instanciar as variáveis que serão os nossos objetos
• Inserir o objeto na cena.

Importar pacotes referentes a objetos

Segue a lista de pacotes referentes aos objetos 3D que trabalharemos.

 import org.papervision3d.objects.primitives.Plane;
 import org.papervision3d.objects.primitives.Cone;
 import org.papervision3d.objects.primitives.Cylinder;
 import org.papervision3d.objects.primitives.Sphere;
 import org.papervision3d.objects.primitives.Cube;

Instanciar as variáveis que serão os nossos objetos

Criaremos uma variável para cada objeto diferente.

 //objetos Primitivos
 public var obPlano: Plane;
 public var obCone:Cone;
 public var obCylinder:Cylinder;
 public var obSphere:Sphere;
 public var obCube:Cube;

Inserir o objeto na cena

Ao criarmos um objeto 3d é necessário dizer qual é o material relacionado a sua face em nossos exemplos por enquanto com exceção do Cube todos estarão definidos como null, no cubo nós importamos o material básico wireframe, mas não entraremos em detalhes agora pois este será o tema do próximo tutorial de papervision, após o material é a definição da largura, altura e profundidade no caso do Cubo.

//Plano
 obPlano = new Plane(null,50,50);
 obPlano.x = -150;
 obPlano.y = 75;
 cena.addChild (obPlano);
//Cone
 obCone = new Cone(null,50,50);
 obCone.x = -50;
 obCone.y = 25;
 cena.addChild (obCone);
//Cylinder
 obCylinder = new Cylinder(null,50,50);
 obCylinder.x = 80;
 obCylinder.y = 50;
 cena.addChild (obCylinder);
//Sphere
 obSphere = new Sphere(null,50,50);
 obSphere.x = -125;
 obSphere.y = -75;
 cena.addChild (obSphere);
//Cube
 obCube = new Cube(
      new MaterialsList(
      {front: material,
      back: material,
      left: material,
      right: material,
      top: material,
      bottom: material}
      ) ,50,50,50);
 obCube.x = 100
 obCube.y = -75;
 cena.addChild (obCube);

Extra

Para dar uma noção melhor que os objetos criados são mesmo 3D utilizaremos no loop os métodos yaw(), roll() e picth() que servem para rotacionar os objetos sobre o seu próprio eixo. Experimente alterar os valores para observar novos resultados.

obPlano.yaw (5)
obPlano.roll (5)
obCone.roll (5)
obCone.pitch (5)
obCylinder.roll	(-5)
obCylinder.pitch (5)
obCylinder.yaw (-5)
obSphere.yaw (-5)
obSphere.pitch (-5)
obCube.yaw (-5)
obCube.pitch (-5)

Código completo: main.as

package {
	//flash
	import flash.display.Sprite;
	import flash.events.Event;
	//papervision
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.render.BasicRenderEngine;
	//Material
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.WireframeMaterial;
	// objeto
	import org.papervision3d.objects.primitives.Plane;
	import org.papervision3d.objects.primitives.Cone;
	import org.papervision3d.objects.primitives.Cylinder;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.objects.primitives.Cube;

	public class main extends Sprite {
		public var cena:Scene3D;
		public var viewport:Viewport3D;
		public var camera:Camera3D;
		public var renderer:BasicRenderEngine;
		//Material
		public var material:WireframeMaterial = new WireframeMaterial(0x00ff00, 1);
		//objetos Primitivos
		public var obPlano: Plane;
		public var obCone:Cone;
		public var obCylinder:Cylinder;
		public var obSphere:Sphere;
		public var obCube:Cube;

		public function main () {
			Set ();
			Objetos ();
		}
		public function Set ():void {
			viewport = new Viewport3D(400,300,true,false,true,true);
			addChild (viewport);
			cena = new Scene3D ;
			renderer = new BasicRenderEngine ;
			camera = new Camera3D ;
			camera.focus = 100;
			camera.zoom = 10;

		}
		public function Objetos ():void {

			//Plano
			obPlano = new Plane(null,50,50);
			obPlano.x = -150;
			obPlano.y = 75;
			cena.addChild (obPlano);

			//Cone
			obCone = new Cone(null,50,50);
			obCone.x = -50;
			obCone.y = 25;
			cena.addChild (obCone);

			//Cylinder
			obCylinder = new Cylinder(null,50,50);
			obCylinder.x = 60;
			obCylinder.y = 75;
			cena.addChild (obCylinder);

			//Sphere
			obSphere = new Sphere(null,50,50);
			obSphere.x = -125;
			obSphere.y = -75;
			cena.addChild (obSphere);

			//Cube
			obCube = new Cube(
				new MaterialsList(
				{front: material,
			      back: material,
			      left: material,
			      right: material,
			      top: material,
			      bottom: material}
				)
				,50,50,50);
			obCube.x = 100
			obCube.y = -75;
			cena.addChild (obCube);

			addEventListener (Event.ENTER_FRAME,Loop,false, 0, true);
		}
		public function Loop (e:Event):void {
			obPlano.yaw (5)
			obPlano.roll (5)

			obCone.roll (5)
			obCone.pitch (5)

			obCylinder.roll (-5)
			obCylinder.pitch (5)
			obCylinder.yaw (-5)

			obSphere.yaw (-5)
			obSphere.pitch (-5)

			obCube.yaw (-5)
			obCube.pitch (-5)

			renderer.renderScene (cena,camera,viewport);
		}
	}
}

Tile System [Enemy]

novembro 19, 2008

今日は皆-さん. Em fim dificuldade no nosso game, mas eu não estou falando de códigos avançados e complexos que vocês não entenderão, eu estou falando de inimigos. Como nosso grande amigos Ratysu (Dados Sujos) costumava dizer “A dificuldade valoriza o cumprimento da missão”. Pois bem um jogo com inimigos ganha muito mais emoção. E hoje daremos continuidade ao nosso tutorial tile system com a implementação de inimigos.

ssemeny

Clique aqui para jogar

Criando MovieClip Enemy:

Nosso movieclip enemy seguirá as mesmas proporções do player, com a diferença nos sprites e a propriedade linkage será definida como “Enemy”.

linkageenemy

Tipos de Inimigos:

Em nosso tutorial aprenderemos a montar 2 tipos de inimigos: os burros e os menos burros.

Burros: São aqueles inimigos que não se cansam de mover de um lado para o outro, anda anda anda , bate na parede, volta volta volta. Em nosso código chamaremos de inimigos tipo “Flip”.

Menos Burros: São aqueles inimigos que ao encostar em uma parede, escolhe uma direção aleatoriamente e segue ate o encontro da próxima parede. Chamaremos eles de tipo “Choose”.

Criando os objetos:

Nossos inimigos assim como criamos o jogador usaremos objetos com algumas propriedades pré definidas.

Enemy1 = {xtile:2, ytile:3, speed:2, enemy:true,  dirx:0, diry:-1, Type:"Flip"};
  • xtile,ytile (Number): Posição x e y inicial no tile system.
  • speed (Number): Velocidade do inimigo
  • enemy (Boolean): Esta propriedade especificara que o objeto é um inimigo, devemos implementar essa propriedade ao objeto Player também marcando como false.
  • dirx, diry (Number): Indica qual é a direção que nosso inimigo começará a percorrer. Seguindo as combinações:[1,0] direita, [-1,0] esquerda, [0,1] cima, [0,-1] baixo e [0,0] parado.
  • Type (“Choose” ou “Flip”): Indicará qual é o tipo do nosso inimigo

Junto com a criação dos objetos criaremos um vetor que armazenará todos os nosso objetos de inimigos. O código das declarações ficará mais ou menos assim:

char = {xtile:1,  ytile:1, speed:2, enemy:false};
Enemy1 = {xtile:2,  ytile:3, speed:2, enemy:true, dirx:0, diry:-1, Type:"Flip"};
Enemy2 = {xtile:6,  ytile:8, speed:2, enemy:true, dirx:-1, diry:0, Type:"Choose"};
Enemy3 = {xtile:2,  ytile:6, speed:2, enemy:true, dirx:0, diry:-1, Type:"Flip"};
arrayEnemy = [Enemy1, Enemy2, Enemy3];

Criando os MovieClips:

O processo de criação dos inimigos no field seguirá o mesmo padrão dos itens. Criaremos um loop que para cada índice fará referencia a um vetor para pegar as informações referentes as propriedades e logo em seguida substituirá o objeto do vetor pelo movieclip.

for (i = 0; i <  arrayEnemy.length; i++) {
  _root["Field"].attachMovie("Enemy","Enemy"  + i,5001 + i);
  _root["Field"]["Enemy"  + i]._x = arrayEnemy[i].xtile * TileP + 10;
  _root["Field"]["Enemy"  + i]._y = arrayEnemy[i].ytile * TileP + 10;
  _root["Field"]["Enemy"  + i].height = 7.5;
  _root["Field"]["Enemy"  + i].speed = arrayEnemy[i].speed;
  _root["Field"]["Enemy"  + i].enemy = arrayEnemy[i].enemy;
  _root["Field"]["Enemy"  + i].dirx = arrayEnemy[i].dirx;
  _root["Field"]["Enemy"  + i].diry = arrayEnemy[i].diry;
  _root["Field"]["Enemy"  + i].Type = arrayEnemy[i].Type;
  arrayEnemy[i] =  _root["Field"]["Enemy" + i];
}

Movendo os Inimigos:

O que difere os inimigos dos Playes? Ao meu ponto de vista o players você comanda e os inimigos andam sozinho. Vamos relembrar o funcionamento da estrutura de movimentação do Player.

Nos temos um loop que verifica quando pressionamos um botão. Depois se pressionarmos algo ele chama uma função passando os parâmetros da direção que o player vai ter que seguir. Na função armazenamos os valores de posicionamento em uma variável imagem fazemos cálculos com a velocidade, verificamos se depois do calculo se o tile no qual ele esta se dirigindo é walkable, senão deixamos o personagem parado.

Basicamente nosso inimigo também faz tudo isso com algumas mudanças, ao invés do jogador definir a direção com um botão, nosso inimigo já sabe qual é a direção que ele tem que seguir (dirx e diry), e ao invés dele ficar parado quando o destino não é permitido ele muda sua direção e segue o trajeto.

Pois bem no nosso loop criaremos um loop que percorrerá o vetor de inimigos e pedirá para todos andem suas respectivas direções, também aproveitaremos o loop para verificar se nosso player encostou em nosso inimigo, para o teste ficar perceptível colocaremos apenas para ele receber alpha 50 ao encostar. E na nossa função de movePlayer adicionaremos a verificação, se o objeto for encostar na parede ele criará uma variável wall e retornará true especificando o toque. Depois nós verificaremos. Se for um inimigo e encostou na parede mude de direção.

LoopFrame(){
   ..
 for (i in arrayEnemy) {
   movePlayer  (arrayEnemy[i],arrayEnemy[i].dirx,arrayEnemy[i].diry);
   if (arrayEnemy[i].hitTest  (Player)) {
     Player._alpha = 50;
   }
 }
 ..
..movePlayer (ob, dx, dy){
   ..
   if (_root["Field"][tileName].walk) {
     if ((dx == 1) or (dx == -1)) {
       ob._x += ob.speed * dx;
     }
   if ((dy == 1) or (dy == -1)) {
       ob._y += ob.speed * dy;
     }
   } else {
     hitwall = true;
   }
   ...

Nesta parte do código verificaremos se o inimigo é do tipo “Flip” ou “Choose”. Quando ele é Flip apenas multiplicamos as direções por -1 e quando for choose criamos um vetor com as 4 próximas possibilidades de movimento e usamos uma simples estrutura de random para escolher.

if (hitwall && ob.enemy) {
   if (ob.Type == "Flip")  {
     movePlayer (ob,dx * -1,dy *  -1);
     ob.dirx *= -1;
     ob.diry *= -1;
   } else if (ob.Type ==  "Choose") {
   var arraydir:Array = [[0, 1],  [1, 0], [0, -1], [-1, 0]];
   var rnddir = Math.round  (Math.random () * 4);
   movePlayer (ob,arraydir[rnddir][1],arraydir[rnddir][1]);
   ob.dirx = arraydir[rnddir][0];
   ob.diry = arraydir[rnddir][1];
   }
}

Código Final:

Agora vamos ver como ficou todo o código do na integra.

stop ();
arrayField = [[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],
              [2, 0, 0, 0, 0, 0, 1, 0, 2, 2, 2, 2, 2, 2, 2],
              [2, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 2],
              [2, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 2],
              [2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 2],
              [2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 2],
              [2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2],
              [2, 0, 0, 0, 1, 2, 0, 1, 0, 0, 2, 2, 2, 2, 2],
              [2, 2, 0, 0, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2],
              [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]];
itens = [[1, 2], [2, 8], [5, 6], [8, 7], [11, 4], [8, 4], [5, 1]];
var pontos:Number = 0;
_root.createEmptyMovieClip ("Field",1);
char = {xtile:1, ytile:1, speed:2, enemy:false};
Enemy1 = {xtile:2, ytile:3, speed:2, enemy:true, dirx:0,  diry:-1, Type:"Flip"};
Enemy2 = {xtile:6, ytile:8, speed:2, enemy:true, dirx:-1,  diry:0, Type:"Choose"};
Enemy3 = {xtile:2, ytile:6, speed:2, enemy:true, dirx:0,  diry:-1, Type:"Flip"};
arrayEnemy = [Enemy1, Enemy2, Enemy3];
Tile0 = {walk:true, frame:1};
Tile1 = {walk:false, frame:2};
Tile2 = {walk:false, frame:3};
TileP = 20;
indice = 0;
for (i = 0; i < arrayField[0].length; i++) {
  for (j = 0; j <  arrayField.length; j++) {
    indice += 1;
    newName =  "Tile_" + j + "_" + i;
    _root["Field"].attachMovie  ("Tile",newName,indice);
    _root["Field"][newName]._x = i * TileP;
    _root["Field"][newName]._y = j * TileP;
    _root["Field"][newName].walk = _root["Tile" + arrayField[j][i]].walk;
    _root["Field"][newName].gotoAndStop  (_root["Tile" + arrayField[j][i]].frame);
  }
}
for (i = 0; i < itens.length; i++) {
  var itemName =  "item_" + itens[i][1] + "_" + itens[i][0];
  _root["Field"].attachMovie  ("itens",itemName,i + 200);
  _root["Field"][itemName]._x  = itens[i][0] * TileP + 10;
  _root["Field"][itemName]._y  = itens[i][1] * TileP + 10;
}
_root["Field"].attachMovie  ("Player","Player",5000);
_root["Field"]["Player"]._x = char.xtile * TileP +  10;
_root["Field"]["Player"]._y = char.ytile * TileP +  10;
_root["Field"]["Player"].height = 7.5;
_root["Field"]["Player"].speed = char.speed;
_root["Field"]["Player"].enemy = char.enemy;
_root["Field"]["Player"].enemy = char.enemy;

for (i = 0; i < arrayEnemy.length; i++) {
  _root["Field"].attachMovie  ("Enemy","Enemy" + i,5001 + i);
  _root["Field"]["Enemy"  + i]._x = arrayEnemy[i].xtile * TileP + 10;
  _root["Field"]["Enemy"  + i]._y = arrayEnemy[i].ytile * TileP + 10;
  _root["Field"]["Enemy"  + i].height = 7.5;
  _root["Field"]["Enemy"  + i].speed = arrayEnemy[i].speed;
  _root["Field"]["Enemy"  + i].enemy = arrayEnemy[i].enemy;
  _root["Field"]["Enemy"  + i].dirx = arrayEnemy[i].dirx;
  _root["Field"]["Enemy"  + i].diry = arrayEnemy[i].diry;
  _root["Field"]["Enemy"  + i].Type = arrayEnemy[i].Type;
  arrayEnemy[i] =  _root["Field"]["Enemy" + i];
}

function loopFrame () {
  var Player =  _root["Field"]["Player"];
  if (Key.isDown  (Key.RIGHT)) {
    movePlayer  (Player,1,0);
  } else if  (Key.isDown (Key.LEFT)) {
    movePlayer  (Player,-1,0);
  } else if  (Key.isDown (Key.DOWN)) {
    movePlayer  (Player,0,1);
  } else if  (Key.isDown (Key.UP)) {
    movePlayer  (Player,0,-1);
  }
  for (i in itens)  {
    var  itemName = "item_" + itens[i][1] + "_" + itens[i][0];
    if  (_root["Field"][itemName].hitTest (Player)) {
      _root["Field"][itemName].removeMovieClip  ();
      pontos  += 100;
    }
  }
  for (i in  arrayEnemy) {
    movePlayer  (arrayEnemy[i],arrayEnemy[i].dirx,arrayEnemy[i].diry);
    if  (arrayEnemy[i].hitTest (Player)) {
      Player._alpha  = 50;
    }
  }
}
function movePlayer (ob, dx, dy) {
  var hitwall:Boolean  = false;
  ob.x = ob._x;
  ob.y = ob._y;
  ob.xtileIm =  Math.floor ((ob.x += ((ob.speed + ob.height) * dx)) / TileP);
  ob.ytileIm =  Math.floor ((ob.y += ((ob.speed + ob.height) * dy)) / TileP);
  var tileName:String  = "Tile_" + (ob.ytileIm) + "_" + (ob.xtileIm);
  if  (_root["Field"][tileName].walk) {
    if ((dx == 1) or  (dx == -1)) {
      ob._x  += ob.speed * dx;
    }
    if ((dy == 1) or  (dy == -1)) {
      ob._y  += ob.speed * dy;
    }
  } else {
    hitwall = true;
  }
  ob.xtile =  Math.floor (ob._x / TileP);
  ob.ytile =  Math.floor (ob._y / TileP);
  ob.xtileIm =  ob.xtile;
  ob.ytileIm =  ob.ytile;
  if (hitwall  && ob.enemy) {
    if (ob.Type ==  "Flip") {
      movePlayer  (ob,dx * -1,dy * -1);
      ob.dirx  *= -1;
      ob.diry  *= -1;
    } else if  (ob.Type == "Choose") {
      var  arraydir:Array = [[0, 1], [1, 0], [0, -1], [-1, 0]];
      var  rnddir = Math.round (Math.random () * 4);
      movePlayer  (ob,arraydir[rnddir][1],arraydir[rnddir][1]);
      ob.dirx  = arraydir[rnddir][0];
      ob.diry  = arraydir[rnddir][1];
    }
  }
}

Como vocês podem ver o código está bem rústico, quando eu tive a idéia de montar este tutorial era para seguir de maneira simples e pratica a criação de um jogo. Não me preocupei muito com modulação e estruturação. Por isso este será o tema do nosso próximo tutorial tile system. Vamos organizar este código e depois migrar para actionscript 3.0.até a próxima. Cya. また見てね.

PaperVision 3D

novembro 17, 2008

今日は皆-さん.Olá pessoal, Hoje estou aqui para lhes mostrar minha primeira aplicação utilizando a biblioteca papervision para o flash e actionscript 3.0. Eu fiz uma aplicação muito simples, criei um cubo 3d que fica rotacionando para todas as direções em um ponto fixo e personalizei todos os lados do cubo com imagens importadas da biblioteca via linkage.

Bem pessoal eu ainda sou muito iniciante nesse sistema para poder explicar com mais detalhes ou até mesmo montar um tutorial, mas meus estudos continuam e espero logo logo poder conversar melhor sobre o assunto. E pode ter certeza que este aprendizado será replicado para futuros jogos^^ vlw pessoal até a próxima, CYA. また見てね.

SNEAK (Serpente)

novembro 6, 2008

今日は皆-さん. Dessa vez até eu me surpreendi, estava eu humildemente vendo o singelo comentário do nosso grande amigo Ratysu pedindo para que eu fizesse o jogo do tetris, foi quando eu pensei, tetris é um pouco complexo para mim, mas eu poderia tentar fazer o jogo da serpente (cobrinha para os intimos). Apesar dos códigos serem complexos eu tive um tempo livre no trabalho e consegui fazer o game em 3 dias.

Remake do grande glassico dos minis games

Clique aqui para jogar

  • Nome: Sneak
  • Ultima Atualização: 6 de Novembro de 2008.
  • Design: Ronaldo Santiago
  • Codificação: Ronaldo Santiago
  • Criação: Remaker
  • Gênero: Puzzle
  • Descrição: Clássico jogo da serpente.
  • Exigências: Suport ao Flash 8 ou superior.
  • Click Aqui para poder jogar

Este game eu fiz para ficar bem simples mesmo, já estou preparando uma versão mais elaborada deste game. Aguardem ^^

Para os leitores os tutoriais de criação de jogos, eu já estou preparando o post da continuação do Tile System e também de efeitos em actionsctip. Vlw pessoal até a próxima CYA. また見てね.