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