前々回のエントリでBox2DとPapervision3dを連携させてみて、
前のフリースローも似たようなことできるんじゃないかと思ってやってみた。
ボールを投げたところからだけ3Dでシミュレーションします。
環境によってはすごい重いと思います。
縦長w 長すぎましたねw 下だけ表示でもなんとなく操作できます。
今回は「←」「→」キーで前後に移動できるようにしました。
「クリック」、「s」キーで方向、パワー決定してシュート!
基本的には前のエントリとやってることは同じです。
Box2dな方のソースは整理中・・・。
シーンをENTER_FRAMEイベントで書き出し続けつつ、
Box2DのほうからupDatePositionsを呼んで、カメラ、ボールの位置を変更しています。
ACTIONSCRIPT:
- private function onEnterHandler(event:Event):void {
- ball.rotationY += 5;
- renderer.renderScene(scene, camera, viewPort);
- }
- public function upDatePositions( boy_pos, ball_x, ball_y,ball_angle) {
- camera.z = -100 + boy_pos/1.5;
- ball.z = -100 + ball_x * 90;
- ball.y = 925 - ball_y * 90;
- }
↓Papervision3Dのほうのソース全部
ちょっと強引な部分もありますw
ACTIONSCRIPT:
- package{
- import caurina.transitions.Tweener;
- import flash.display.Sprite;
- import flash.events.Event;
- import org.papervision3d.cameras.Camera3D;
- import org.papervision3d.lights.PointLight3D;
- import org.papervision3d.materials.ColorMaterial;
- import org.papervision3d.materials.WireframeMaterial;
- import org.papervision3d.materials.shadematerials.PhongMaterial;
- import org.papervision3d.materials.special.CompositeMaterial;
- import org.papervision3d.materials.utils.MaterialsList;
- import org.papervision3d.objects.DisplayObject3D;
- import org.papervision3d.objects.primitives.Cube;
- import org.papervision3d.objects.primitives.Plane;
- import org.papervision3d.objects.primitives.Sphere;
- import org.papervision3d.render.BasicRenderEngine;
- import org.papervision3d.scenes.Scene3D;
- import org.papervision3d.view.Viewport3D;
- /**
- * @author Default
- */
- public class Basket3D extends Sprite{
- private var scene:Scene3D;
- private var camera:Camera3D;
- private var viewPort:Viewport3D;
- private var renderer:BasicRenderEngine;
- private var rootNode:DisplayObject3D;
- private var floor:Cube;
- private var wall:Cube;
- private var whiteBoard:Plane;
- private var ball:Sphere;
- private var _light:PointLight3D;
- private var cameraView_y:Number = 50;
- private var cameraView_z:Number = -400;
- private var cameraView_angle:Number = 0;
- public function Basket3D() {
- init3D();
- }
- private function init3D():void{
- // create renderer
- renderer = new BasicRenderEngine();
- // create scene
- scene = new Scene3D();
- // create viewport
- viewPort = new Viewport3D(0, 0, true, false);
- addChild(viewPort);
- // create camera
- camera = new Camera3D;
- camera.y = 500;
- camera.z = -100;
- camera.x = 600;
- camera.rotationX = 15;
- camera.rotationY = -45;
- // create root node
- rootNode = scene.addChild( new DisplayObject3D("rootNode") );
- _light = new PointLight3D;
- _light.x = -100;
- _light.y = 100;
- _light.z = 40;
- var colorMaterial:ColorMaterial = new ColorMaterial(0xFFCCCC, 1);
- var wireMaterial:WireframeMaterial = new WireframeMaterial(0xFFCCCC, 1);
- var phongMaterial:PhongMaterial = new PhongMaterial(_light, 0xF7D49E, 0xFFEEEE, 1);
- var compMaterial:CompositeMaterial = new CompositeMaterial;
- var materialsList:MaterialsList = new MaterialsList;
- compMaterial.addMaterial(phongMaterial);
- compMaterial.addMaterial(wireMaterial);
- materialsList.addMaterial(compMaterial, "all");
- floor = new Cube(materialsList, 700, 1080, 20);
- floor.z = 540;
- rootNode.addChild(floor);
- wall = new Cube(materialsList, 700, 20, 1600);
- wall.y = 800;
- wall.z = 1120;
- rootNode.addChild(wall);
- var whiteMateril:ColorMaterial = new ColorMaterial(0xFFFFFF);
- var balckWireMaterial:WireframeMaterial = new WireframeMaterial(0x000000);
- var boardCompMaterial:CompositeMaterial = new CompositeMaterial;
- boardCompMaterial.addMaterial(whiteMateril);
- boardCompMaterial.addMaterial(balckWireMaterial);
- whiteBoard = new Plane(boardCompMaterial, 350, 200);
- whiteBoard.z = 980;
- whiteBoard.y = 550;
- rootNode.addChild(whiteBoard);
- var ballPhongMaterial:PhongMaterial = new PhongMaterial(_light, 0xFD783D, 0xFBBA49, 1);
- var ballWireMaterial:WireframeMaterial = new WireframeMaterial(0xFD783D);
- var ballCompMaterial:CompositeMaterial = new CompositeMaterial;
- ballCompMaterial.addMaterial(ballPhongMaterial);
- ballCompMaterial.addMaterial(ballWireMaterial);
- ball = new Sphere(ballCompMaterial, 25);
- ball.z = 200;
- ball.y = 100;
- rootNode.addChild(ball);
- renderer.renderScene(scene, camera, viewPort);
- this.addEventListener(Event.ENTER_FRAME, onEnterHandler);
- Tweener.addTween(camera, { x:0, y:this.cameraView_y, z:this.cameraView_z,rotationY:0,rotationX:this.cameraView_angle,time:3, transition:"liner" } );
- }
- private function onEnterHandler(event:Event):void {
- ball.rotationY += 5;
- renderer.renderScene(scene, camera, viewPort);
- }
- public function upDatePositions( boy_pos, ball_x, ball_y,ball_angle) {
- camera.z = -100 + boy_pos/1.5;
- ball.z = -100 + ball_x * 90;
- ball.y = 925 - ball_y * 90;
- }
- }
- }
- Newer: 物理エンジンを使ったパズルゲームのサイト
- Older: ベジェ曲線、オートトレス等使って、イベント告知ページ作ってみた
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://parpue.net/web/157/trackback
- Listed below are links to weblogs that reference
- Box2D,Papervision3Dでフリースローゲームを3D表示 from parpue.net


