ログイン | アカウントの作成
CONTACT | HOME | BBS | Wiki | Blog | Tools |


ブログトップページ

自分のブログページ

最近更新されたブログ
押し出しテキスト (d5)
Cube回転 (d5)
パッケージ配布サーバ (d5)
RTMP Client ビデオをアップロード (d5)
WOWEngine インストール (d5)
ビデオStreamの画像キャプチャ (d5)
2DオブジェクトをMatrix3Dで操作する (d5)
メモリを割り当てる (d5)
Eclipse 環境構築 (d5)
アプリケーション入門編 ① (d5)
インストール (d5)
DisplayObject3D の削除を考える (d5)
入門編⑨ Cube マテリアル MaterialList (d5)
メニュー画面の作成② (d5)
Painter初挑戦~ (d5)
川端康成の誕生日 2008/06/14 (d5)
欧州選手権2008 2008/06/07 (d5)
スペインの画家「Diego Velazquez」 2008/06/06 (d5)
世界初 熱気球 2008/06/04 (d5)
歴史上初のエベレスト登頂の日 2008/05/29 (d5)
レーザー光線の発明 2008/05/16 (d5)
メニュー画面の作成 (d5)
新しい家族 (d5)
かぎ編みハマりました。 (yucca)
産婦人科グッズと愛するポトスに・・・ (yucca)
カーレースゲームを作ってみる⑪ 微修正 (d5)
カーレースゲームを作ってみる⑩ いろいろ修正 (d5)
カーレースゲームを作ってみる⑨ ゴールを作成 (d5)
カーレースゲームを作ってみる⑧ カメラの切り替え (d5)
カーレースゲームを作ってみる④ マップの作成 (d5)
カーレースゲームを作ってみる⑦ テクスチャーリピート (d5)
カーレースゲームを作ってみる⑥ collision (壁) の作成 (d5)
カーレースゲームを作ってみる⑤ グリップの調整 (d5)
カーレースゲームを作ってみる④ マップの作成 ② (d5)
カーレースゲームを作ってみる③ (d5)
Supreme Commander リアルタイムストラテジー (d5)
カーレースゲームを作ってみる② (d5)
カーレースゲームを作ってみる① (d5)
入門編⑧ Collada + Phong Shader + テクスチャー (d5)
入門編⑦ テクスチャ付き Phong Shader (d5)
テキストエディタ ショートカット 語句ジャンプ (d5)
入門編⑤ ライトを作成してPhong Shader を使用する (d5)
入門編⑥ Phong Shader の種類 (d5)
入門編④ テクスチャー (d5)
入門編③ マテリアルの設定 (d5)
入門編② 板ポリを動かす (d5)
入門編① 3Dシーンの作成 (d5)
ダウンロードとインストール(クラスパスの設定) (d5)
インストールと準備 (d5)
インストーラーの入手とインストール (d5)
インストール後の確認 (d5)
トップページ / d5 / Papervision3D / カーレースゲームを作ってみる②

2008年 04月 22日

カーレースゲームを作ってみる②

今度はカメラが付いてくるようにします。




package {
	import flash.display.Sprite;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.materials.ColorMaterial;
	import org.papervision3d.objects.primitives.Plane;
	import flash.events.Event;
	import org.papervision3d.view.Viewport3D;
	import org.papervision3d.scenes.Scene3D;
	import org.papervision3d.cameras.Camera3D;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.render.BasicRenderEngine;
	import org.papervision3d.core.utils.Mouse3D;
	import flash.display.BitmapData;
	import flash.utils.getDefinitionByName;
	import org.papervision3d.core.proto.MaterialObject3D;
	import org.papervision3d.materials.BitmapMaterial;
	import org.papervision3d.lights.PointLight3D;
	import org.papervision3d.materials.shadematerials.PhongMaterial;
	import org.papervision3d.materials.shadematerials.GouraudMaterial;
	import org.papervision3d.materials.shadematerials.CellMaterial;
	import org.papervision3d.materials.shadematerials.EnvMapMaterial;
	import org.papervision3d.materials.shadematerials.FlatShadeMaterial;
	import org.papervision3d.objects.parsers.Collada;
	import org.papervision3d.objects.DisplayObject3D;
	import flash.display.Bitmap;
	import org.papervision3d.events.InteractiveScene3DEvent;
	import org.papervision3d.events.RendererEvent;
	import org.papervision3d.events.AnimationEvent;
	import org.papervision3d.events.FileLoadEvent;
	import org.papervision3d.materials.shaders.PhongShader;
	import org.papervision3d.materials.shaders.ShadedMaterial;
	import org.papervision3d.materials.WireframeMaterial;
	import flash.display.StageQuality;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import org.papervision3d.objects.primitives.Cone;
	
	[SWF(width="600",height="400",frameRate="30",backgroundColor="#CCCCCC")]
	public class game_car_2 extends Sprite
	{
		
		public var viewport	:Viewport3D;
		public var scene		:Scene3D;
		public var camera		:Camera3D;
		public var renderer	:BasicRenderEngine;
		public var model		:DisplayObject3D;
		
		public var Steer_FL	:DisplayObject3D;
		public var Steer_FR	:DisplayObject3D;
		public var Wheel_FR	:DisplayObject3D;
		public var Wheel_FL	:DisplayObject3D;
		public var Wheel_RR	:DisplayObject3D;
		public var Wheel_RL	:DisplayObject3D;
		
		public var test_model	:DisplayObject3D;
		
		/*----------------------------------------
		コントローラー用メンバ変数
		----------------------------------------*/
		public var keyForward:Boolean;		//アクセルフラグ
		public var keyReverse:Boolean;		//バックフラグ
		public var keyLeft:Boolean;		//ハンドル左フラグ
		public var keyRight:Boolean;		//ハンドル右フラグ
		
		public var speed:Number	= 0;	//現在の速度
		public var topSpeed:Number	= 0;	//指定する速度
		
		public var steer:Number	= 0;	//現在のハンドル角度
		public var topSteer:Number	= 0;	//指定するハンドル角度
		
		
		/*----------------------------------------
		ソースを組み込む
		----------------------------------------*/
		[Embed(source="./data/Focus.dae", mimeType="application/octet-stream")]
		private var collada_car:Class;
		
		[Embed(source="./data/image/body.jpg")]
		private var body_texture:Class;
		
		[Embed(source="./data/image/wheel.jpg")]
		private var wheel_texture:Class;
		
		
		/**----------------------------------------------------------------------
		 * コンストラクタ
		-----------------------------------------------------------------------*/
		public function game_car_2() {
			
			//画質を低に
			this.stage.quality = StageQuality.LOW;
			
			//初期化
			init();
		}
		
		/**----------------------------------------------------------------------
		 * init
		 * 初期化
		-----------------------------------------------------------------------*/
		public function init():void {
			
			//このムービーのスケールモードを設定
			this.stage.scaleMode = "noScale"
			this.stage.align = "left";
			
			//3Dの初期設定
			this.init3D();
			
			//キーボードをセットアップ
			this.stage.addEventListener( KeyboardEvent.KEY_DOWN, this.keyDownHandler );
			this.stage.addEventListener( KeyboardEvent.KEY_UP, this.keyUpHandler );
			
			
			//毎フレーム呼び出されるイベントを追加
			this.addEventListener( Event.ENTER_FRAME, this.loop_Proc );
			
		}
		
		/**----------------------------------------------------------------------
		 * init3D
		 * 3Dの初期設定
		-----------------------------------------------------------------------*/
		public function init3D():void {
			
			// ビューポートの作成
			this.viewport = new Viewport3D(0, 0, true, true);
			this.addChild( viewport );
			
			//レンダラーの設定
			this.renderer = new BasicRenderEngine();
			
			//シーン作成
			this.scene = new Scene3D();
			
			//ライトの作成
			var light:PointLight3D = new PointLight3D();
            light.x = 100;
            light.y = 10000;
            light.z = -1000;
            
            //ライトを追加
            this.scene.addChild(light);
            
            //テクスチャー
			var body_tex:Bitmap = new body_texture() as Bitmap;
			var body_bit_mat:BitmapMaterial = new BitmapMaterial(body_tex.bitmapData);
			
            var phong_shader:PhongShader = new PhongShader(light ,0xFFFFFF , 0x444444,1);
			
			
			//マテリアルリスト
            var body_mat_list:MaterialsList = new MaterialsList(
            	{all:new ShadedMaterial(body_bit_mat,phong_shader)}
            );
			
			
			
			//collada から モデルを作成
			this.model = new Collada(XML(new collada_car()),body_mat_list).getChildByName("Focus");
			
			
			//モデルをシーンに追加
			this.scene.addChild(this.model);
			
			
			//ホイルのマテリアルを作成
			var wheel_tex:Bitmap = new wheel_texture() as Bitmap;
			var wheel_mat:BitmapMaterial = new BitmapMaterial(wheel_tex.bitmapData);
			var wheel_sh_mat:ShadedMaterial = new ShadedMaterial(wheel_mat,phong_shader);
			
			//パーツを取得
			this.Steer_FL = this.model.getChildByName("Steer_FL");
			this.Steer_FR = this.model.getChildByName("Steer_FR");
			this.Wheel_FL = this.Steer_FL.getChildByName("Wheel_FL");
			this.Wheel_FR = this.Steer_FR.getChildByName("Wheel_FR");
			this.Wheel_RL = this.model.getChildByName("Wheel_RL");
			this.Wheel_RR = this.model.getChildByName("Wheel_RR");
			
			//ホイルのマテリアル設定
			this.Wheel_RL.material = wheel_sh_mat;
			this.Wheel_RR.material = wheel_sh_mat;
			this.Wheel_FL.material = wheel_sh_mat;
			this.Wheel_FR.material = wheel_sh_mat;
			
			
			//地面を作成
			var plane:Plane = new Plane(new WireframeMaterial(0x000000),100000,100000,20,20);
			plane.rotationX = -90;
			plane.y = -70;
			
			this.scene.addChild(plane);
			
			
			// カメラの作成
			this.camera = new Camera3D();
			this.camera.z = -4000;
			this.camera.zoom = 5;
			this.camera.y = 2000;
			
			this.camera.target = this.model;
			
			//this.camera.lookAt(this.model);
			
			this.test_model = new Cone(null,100,500);
			this.scene.addChild(this.test_model);
		}
		/**----------------------------------------------------------------------
		 * keyDownHandler
		-----------------------------------------------------------------------*/
		private function keyDownHandler( event :KeyboardEvent ):void
		{
			switch( event.keyCode )
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					this.keyForward = true;
					this.keyReverse = false;
					break;
	
				case "S".charCodeAt():
				case Keyboard.DOWN:
					this.keyReverse = true;
					this.keyForward = false;
					break;
	
				case "A".charCodeAt():
				case Keyboard.LEFT:
					this.keyLeft = true;
					this.keyRight = false;
					break;
	
				case "D".charCodeAt():
				case Keyboard.RIGHT:
					this.keyRight = true;
					this.keyLeft = false;
					break;
			}
			//trace("keyDownHandler: " + event.keyCode);
		}
		
		/**----------------------------------------------------------------------
		 * keyUpHandler
		-----------------------------------------------------------------------*/
		private function keyUpHandler( event :KeyboardEvent ):void
		{
			switch( event.keyCode )
			{
				case "W".charCodeAt():
				case Keyboard.UP:
					this.keyForward = false;
					break;
	
				case "S".charCodeAt():
				case Keyboard.DOWN:
					this.keyReverse = false;
					break;
	
				case "A".charCodeAt():
				case Keyboard.LEFT:
					this.keyLeft = false;
					break;
	
				case "D".charCodeAt():
				case Keyboard.RIGHT:
					this.keyRight = false;
					break;
			}
			//trace("keyUpHandler: " + event.keyCode);
		}

		/**----------------------------------------------------------------------
		 * driveCar
		-----------------------------------------------------------------------*/
		private function driveCar():void
		{
			/* ---- アクセルの処理 ---- */
			
			//前進
			if( this.keyForward )
			{
				this.topSpeed = 600;
			}
			//バック
			else if( this.keyReverse )
			{
				this.topSpeed = -50;
			}
			else
			{
				//何もしないときはアクセルをゼロに
				this.topSpeed = 0;
			}
			
			//現在のスピードをトップスピードに徐々に近づける
			this.speed -= ( this.speed - this.topSpeed ) / 100;
			
			
			/* ---- ハンドルを切る処理 ---- */
			
			//右に曲がる
			if( this.keyRight )
			{
				//20度まで曲がる
				if( this.topSteer < 20 )
				{
					this.topSteer += 5;
				}
				
				this.speed += ( 0 - this.speed ) * 0.01;
			}
			//左に曲がる
			else if( this.keyLeft )
			{
				//-20度までに曲がる
				if( this.topSteer > -20 )
				{
					this.topSteer -= 5;
				}
				
				this.speed += ( 0 - this.speed ) * 0.01;
			}
			else
			{
				//何もしない時はゼロに近づいていく
				this.topSteer -= this.topSteer / 5;
			}
			
			//指定の角度まで徐々に近づく
			this.steer -= ( this.steer - this.topSteer ) / 2;
			
			
			
			/* ---- 車のアニメーション ---- */
			
			//前タイヤを回転(ハンドルを切る)
			this.Steer_FR.rotationY = this.steer;
			this.Steer_FL.rotationY = this.steer;
			
			//タイヤの回転
			var roll :Number = speed/2;
			this.Wheel_FR.roll(  roll );
			this.Wheel_RR.roll(  roll );
			this.Wheel_FL.roll( -roll );
			this.Wheel_RL.roll( -roll );
	
			// 車を回転させる
			this.model.yaw( this.speed * this.steer / 1000 );
	
			// 車を前方、後方にすすませる
			this.model.moveForward( this.speed );
			
			
		}

		
		/**----------------------------------------------------------------------
		 * loop_Proc
		 * 毎フレーム呼び出される 関数
		-----------------------------------------------------------------------*/
		public function loop_Proc(event:Event):void 
		{
			
			
			//車のコントローラーの処理
			this.driveCar();

			
			//カメラの位置
			
			var add_speed:Number = 0.2;
			var tRot:Number = this.model.rotationY - 90;
			var vec_x:Number = Math.cos(tRot* Math.PI / 180);
    		var vec_z:Number = Math.sin(tRot * Math.PI / 180);
			
			this.camera.x += ((vec_x*2000 + this.model.x) - this.camera.x) * add_speed;
			this.camera.y += (1000 - this.camera.y) * add_speed;
			this.camera.z += ((vec_z*2000 + this.model.z) - this.camera.z) * add_speed;
			
			
			
			
			//レンダリング
			this.renderer.renderScene(scene, camera, viewport);
		}
		

	}
}







  • アクセル [W] or [↑]
  • バック [S] or [↓]
  • 右 [D] or [→]
  • 左 [A] or [左]

なんだかヌラヌラしてるなー


投稿者: d5      23 : 04
更新日:2008-04-22 23:57:30
  



「Papervision3D」のアーカイブ




CgInstitute のホーム   -    コンタクト   -    CgInstitute について   -    アカウントの作成