Flashで使える3Dゲームエンジン「yogurt3d」


20100329-01
yogurt3d」は3Dゲームの開発に使えるActionscript3.0ライブラリです。

Maya、 XSI Softimage、 3D Studio Maxなどの3D作成ソフトと連携が取れるようです。

詳しくは以下

IT/WEB業界への転職なら求人サイトGreen

デモ

サイト内にはタワーディフェンスや、キャラクターをキーボードで操作できるデモがあります。
以下はタワーディフェンスの様子。普通に遊べます。

20100329-02

単純な3Dの描画は以下のようなコードで実装できるようです。

package  
{  
    import com.yogurt3d.Yogurt3D;  
    import com.yogurt3d.core.materials.MaterialBitmap;  
    import com.yogurt3d.core.sceneobjects.SceneObjectRenderable;  
    import com.yogurt3d.presets.primitives.sceneobjects.BoxSceneObject;  
    import com.yogurt3d.presets.renderers.trianglesort.RendererTriangleSort;  
      
    import flash.display.GraphicsSolidFill;  
    import flash.display.Sprite;  
    import flash.events.KeyboardEvent;  
    import flash.events.MouseEvent;  
    import flash.geom.Vector3D;  
      
    import mx.core.BitmapAsset;  
      
    import utils.*;  
      
    [SWF(width='800',height='600',frameRate='60',backgroundColor='0x000000')]  
    public class Tutorial1 extends Sprite  
    {  
        [Embed(source="../resources/yogurt.png")]  
        private var m_embeddedTexture:Class;  
        private var m_texture:BitmapAsset = new m_embeddedTexture() as BitmapAsset;  
          
        public var ko:KeyObject;  
          
        private var m_mouseDown:Boolean = false;    
        private var mousePosX:Number=0,mousePosY:Number=0,mousePosX_prev:Number=0,mousePosY_prev:Number=0;  
          
        private var renderableObject:SceneObjectRenderable;  
          
        private var angleX:Number       = 0;  
        private var angleY:Number       = 0;  
        private var rot_speed:Number    = 0.5;  
          
        public function Tutorial1()  
        {  
            KeyObject.stage = this.stage;  
            ko = new KeyObject(this);  
              
            Yogurt3D.defaultSetup();  
            Yogurt3D.fps = stage.frameRate;  
  
            stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseUpDownEventListener);    
            stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveEventListener);    
            stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpDownEventListener);  
            stage.addEventListener(MouseEvent.MOUSE_WHEEL, mouseWheelEventListener);  
              
            Yogurt3D.defaultContext.renderer = new RendererTriangleSort();  
            Yogurt3D.defaultCamera.setProjectionPerspective(50.0, 800.0/600.0, 1, 400 );  
            Yogurt3D.defaultViewport.setViewport( 0.0, 0.0, 800.0, 600.0 );  
            Yogurt3D.defaultCamera.transformation.positionWrtParent = new Vector3D(0, 0, 20);  
              
            addChild(Yogurt3D.defaultViewport);  
  
            Yogurt3D.enginePreUpdateCallback = run;  
              
            renderableObject = new BoxSceneObject(5,5,8,2,3,4);  
              
            renderableObject.material = new MaterialBitmap(m_texture.bitmapData);  
              
            renderableObject.material.graphicsStroke.thickness = 1;  
            renderableObject.material.graphicsStroke.fill = new GraphicsSolidFill(0xFFFFFF);  
              
            Yogurt3D.defaultScene.addChild(renderableObject);  
              
            Yogurt3D.startAutoUpdate();  
        }  
          
      
        public function run():void  
        {  
            if(ko.keysDown[87])//W  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, -1);  
            }  
              
            if(ko.keysDown[65])//A  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.xAxisWrtParent, -1);  
            }  
              
            if(ko.keysDown[83])//S  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, 1);  
            }  
              
            if(ko.keysDown[68])//D  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.xAxisWrtParent, 1);  
            }  
              
            if(ko.keysDown[32])//SPACE  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.yAxisWrtParent, 1);  
            }  
              
            if(ko.keysDown[16])//SHIFT  
            {  
                Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.yAxisWrtParent, -1);  
            }  
        }  
          
        private function mouseUpDownEventListener(_e:MouseEvent):void  
        {    
            m_mouseDown = _e.buttonDown;    
        }  
          
        private function mouseMoveEventListener(_e:MouseEvent):void  
        {    
            mousePosX_prev = mousePosX;    
            mousePosY_prev = mousePosY;    
            mousePosX = Yogurt3D.defaultViewport.mouseX;  
            mousePosY = Yogurt3D.defaultViewport.mouseY;  
              
            if (m_mouseDown)  
            {    
                angleX += rot_speed*(mousePosY_prev-mousePosY);  
                angleY += rot_speed*(mousePosX_prev-mousePosX);  
                if(angleX > 90)  
                    angleX = 90;  
                if(angleX < -90)  
                    angleX = -90;  
  
                Yogurt3D.defaultCamera.transformation.resetRotation();  
                  
                Yogurt3D.defaultCamera.transformation.rotateYWrtWorld(angleY);  
                Yogurt3D.defaultCamera.transformation.rotateXWrtObject(angleX);  
            }  
        }  
          
        private function mouseWheelEventListener(_e:MouseEvent):void  
        {  
            Yogurt3D.defaultCamera.transformation.translateInDirectionWrtParent(Yogurt3D.defaultCamera.transformation.zAxisWrtParent, -_e.delta/5);  
        }  
          
        public function keyPressed(evt:KeyboardEvent):void  
        {  
            ko.keysDown[evt.keyCode] = true;  
        }  
          
        public function keyReleased(evt:KeyboardEvent):void  
        {  
            delete ko.keysDown[evt.keyCode];  
        }  
    }  
}  

3Dゲームにチャレンジしてみたい方はいかがでしょうか。

 

この記事が気に入ったら
いいね!しよう

最新情報をお届けします

follow us in feedly