キャラクターを追尾
crossdomain.xmlを読みに行くのを忘れててハマった
/**
* Copyright 3f5 ( http://wonderfl.net/user/3f5 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/jBAO
*/
// forked from narutohyper's Alternativa3D 7.5 Template
package {
import flash.system.Security;
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.display.Loader;
import flash.net.URLRequest;
import flash.net.URLLoader;
import alternativ7.engine3d.controllers.SimpleObjectController;
import alternativ7.engine3d.materials.FillMaterial;
import alternativ7.engine3d.materials.TextureMaterial;
import alternativ7.engine3d.primitives.Box;
import alternativ7.engine3d.primitives.Plane;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Vector3D;
import flash.ui.Keyboard;
public class NewClass extends Sprite
{
private var loader:Loader;
public function NewClass():void {
if (stage) load();
else addEventListener(Event.ADDED_TO_STAGE, load);
}
private function load(e:Event = null):void {
Security.loadPolicyFile('http://assets.wonderfl.net/crossdomain.xml');
var urlReq:URLRequest = new URLRequest('http://assets.wonderfl.net/images/related_images/2/25/2550/2550ef21df943b0f9b07c16a4ffd50f20fe46511');
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, init);
loader.load(urlReq);
}
private function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
var bitmap:BitmapData = new BitmapData(loader.width,loader.height);
bitmap.draw(loader);
//AlternativaTemplateを使用
var scene:AlternativaTemplate = new AlternativaTemplate(this);
addChild(scene.camera.diagram);
//床
var material1:FillMaterial = new FillMaterial(0x0, 1, 0,0x666666);
var plane:Plane = new Plane(2000, 2000, 10, 10);
plane.setMaterialToAllFaces(material1);
scene.container.addChild(plane);
plane.z = 0;
//箱のテクスチャ
var material2:TextureMaterial = new TextureMaterial(bitmap);
//箱
var box:Box = new Box(100, 100, 100, 1, 1, 1);
box.setMaterialToAllFaces(material2);
scene.container.addChild(box);
box.z = 50;
box.y = 50;
scene.camera.z = 100;
scene.cameraController.mouseSensitivity = 0;
//追尾するオブジェクトを作成
var chara:Plane = new Plane(100, 100, 2, 2);
chara.setMaterialToAllFaces(material2);
scene.container.addChild(chara);
chara.z = 0;
chara.y = -950;
//コントローラー。矢印キーでオブジェクトが移動する
var objectController:YawController = new YawController(stage, chara, 500, 3, 0);
objectController.bindKey(Keyboard.RIGHT, SimpleObjectController.ACTION_YAW_LEFT);
objectController.bindKey(Keyboard.LEFT, SimpleObjectController.ACTION_YAW_RIGHT);
objectController.mouseSensitivity = 0;
// enterFrame時に呼び出される
scene.onPreRender = function():void {
objectController.update();
//追尾
scene.camera.rotationZ = chara.rotationZ;
scene.camera.x = chara.x - 300 * Math.sin(chara.rotationZ + 180 * Math.PI / 180);
scene.camera.y = chara.y + 300 * Math.cos(chara.rotationZ + 180 * Math.PI / 180);
scene.camera.z = 100;
}
//描画開始
scene.startRendering();
}
}
}
/**
* BasicTemplate for Alternativa3D 7.5
* Alternativa3D 7.5を扱いやすくするためのテンプレートです
* @author narutohyper & clockmaker
*
*/
import alternativ7.engine3d.containers.BSPContainer;
import alternativ7.engine3d.containers.ConflictContainer;
import alternativ7.engine3d.containers.DistanceSortContainer;
import alternativ7.engine3d.containers.KDContainer;
import alternativ7.engine3d.containers.LODContainer;
import alternativ7.engine3d.controllers.SimpleObjectController;
import alternativ7.engine3d.core.Camera3D;
import alternativ7.engine3d.core.Object3DContainer;
import alternativ7.engine3d.core.View;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageQuality;
import flash.display.StageScaleMode;
import flash.events.Event;
class AlternativaTemplate extends Sprite
{
/**
* 子オブジェクトを最適な方法でソートするコンテナ
* (ConflictContainer)
*/
public static const CONFLICT:String = 'conflict';
/**
* 子オブジェクトをBSP(バイナリ空間分割法)によってソートするコンテナ
* (BSPContainer)
*/
public static const BSP:String = 'bsp';
/**
* 子オブジェクトをカメラからのZ値でソートするコンテナ
* (DistanceSortContainer)
*/
public static const ZSORT:String = 'zsort';
/**
* KDツリー(http://ja.wikipedia.org/wiki/Kd%E6%9C%A8)によってソートするコンテナ
* (KDContainer)
*/
public static const KD:String = 'kd';
/**
* detalizationと子オブジェクトの距離でソートするコンテナ(詳細は調査中)
* (LODContainer)
*/
public static const LOD:String = 'lod';
/**
* 3dオブジェクト格納するコンテナインスタンス。
*/
public var container:Object3DContainer;
/**
* ビューインスタンスです。
*/
public var view:View;
/**
* カメラインスタンスです。
*/
public var camera:Camera3D;
/**
* カメラコントローラーです。
*/
public var cameraController:SimpleObjectController;
private var _mc:DisplayObjectContainer;
private var _viewWidth:int;
private var _viewHeight:int;
private var _scaleToStage:Boolean;
private var _containerType:String;
/**
* 新しい Alternativa3DTemplate インスタンスを作成します。
* @param mc
* @param containerType
* @param viewWidth
* @param viewHeight
* @param scaleToStage
*/
public function AlternativaTemplate(mc:DisplayObjectContainer,containerType:String=CONFLICT,viewWidth:int=640, viewHeight:int=480, scaleToStage:Boolean = true)
{
_mc = mc;
_mc.addChild(this);
_containerType = containerType;
_viewWidth = viewWidth;
_viewHeight = viewHeight;
_scaleToStage = scaleToStage;
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
/**
* 初期化されたときに実行されるイベントです。
* 初期化時に実行したい処理をオーバーライドして記述します。
*/
protected function atInit():void {}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング前に実行したい処理をオーバーライドして記述します。
*/
protected function atPreRender():void {}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング前に実行したい処理をオーバーライドして記述します。
*/
private var _onPreRender:Function = function():void{};
public function get onPreRender():Function { return _onPreRender; }
public function set onPreRender(value:Function):void
{
_onPreRender = value;
}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング後に実行したい処理をオーバーライドして記述します。
*/
protected function atPostRender():void {}
/**
* Event.ENTER_FRAME 時に実行されるレンダリングのイベントです。
* レンダリング後に実行したい処理を記述します。
*/
private var _onPostRender:Function = function():void{};
public function get onPostRender():Function { return _onPostRender; }
public function set onPostRender(value:Function):void
{
_onPostRender = value;
}
/**
* レンダリングを開始します。
*/
public function startRendering():void
{
addEventListener(Event.ENTER_FRAME, onRenderTick);
}
/**
* レンダリングを停止します。
*/
public function stopRendering():void
{
removeEventListener(Event.ENTER_FRAME, onRenderTick);
}
/**
* シングルレンダリング(レンダリングを一回だけ)を実行します。
*/
public function singleRender():void
{
onRenderTick();
}
/**
* @private
*/
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.HIGH;
//Root objectの作成
if (_containerType == CONFLICT) {
container = new ConflictContainer();
} else if (_containerType == BSP) {
container = new BSPContainer();
} else if (_containerType == ZSORT) {
container = new DistanceSortContainer();
} else if (_containerType == KD) {
container = new KDContainer();
} else if (_containerType == LOD) {
container = new LODContainer();
}
//Viewの作成
view = new View(stage.stageWidth, stage.stageHeight);
view.interactive=true;
_mc.addChild(view);
//cameraの作成
camera = new Camera3D();
camera.view = view;
camera.x = 0;
camera.y = -500;
camera.z = 0;
container.addChild(camera);
// Camera controller
cameraController = new SimpleObjectController(stage, camera, 10);
cameraController.mouseSensitivity = 0;
cameraController.unbindAll();
cameraController.lookAtXYZ(0, 0, 0);
onResize();
stage.addEventListener(Event.RESIZE, onResize);
atInit();
}
/**
* @private
*/
private function onResize(e:Event = null):void
{
if (_scaleToStage)
{
view.width = stage.stageWidth;
view.height = stage.stageHeight;
}
else
{
view.width = _viewWidth;
view.height = _viewHeight;
}
}
/**
* @private
*/
private function onRenderTick(e:Event = null):void
{
atPreRender();
_onPreRender();
//cameraController.update();
camera.render();
atPostRender();
_onPostRender();
}
}
import alternativ7.engine3d.controllers.SimpleObjectController;
import alternativ7.engine3d.core.Object3D;
import flash.display.InteractiveObject;
import flash.events.KeyboardEvent;
import flash.geom.Vector3D;
/**
* 上下左右回転を持ったコントローラー
* @author narutohyper
*/
class YawController extends SimpleObjectController
{
private var _yawSpeed:Number= 1.5;
private var _pitchSpeed:Number = 2;
private var _target:Object3D;
private var _pitchDown:Boolean;
private var _pitchUp:Boolean;
private var _yawLeft:Boolean;
private var _yawRight:Boolean;
public function YawController(eventSource:InteractiveObject, object:Object3D, speed:Number, speedMultiplier:Number = 3, mouseSensitivity:Number = 1)
{
_target=object;
super(eventSource, object, speed, speedMultiplier, mouseSensitivity);
}
override public function bindKey(keyCode:uint, action:String): void {
switch (action) {
case ACTION_YAW_LEFT:
keyBindings[keyCode]=yawLeft;
break;
case ACTION_YAW_RIGHT:
keyBindings[keyCode]=yawRight;
break;
case ACTION_PITCH_DOWN:
keyBindings[keyCode]=pitchDown;
break;
case ACTION_PITCH_UP:
keyBindings[keyCode]=pitchUp;
break;
}
super.bindKey(keyCode, action);
}
public function pitchDown(value:Boolean):void {
_pitchDown=value;
}
public function pitchUp(value:Boolean):void {
_pitchUp=value;
}
public function yawLeft(value:Boolean,near:Boolean=false):void {
_yawLeft = value;
}
public function yawRight(value:Boolean,near:Boolean=false):void {
_yawRight = value;
}
override public function update(): void {
//現在のVector3D
var nowVector:Vector3D=new Vector3D(_target.x,_target.y,_target.z);
if (_yawLeft) {
_target.rotationZ = (((_target.rotationZ / Math.PI * 180) - _yawSpeed) % 360) * Math.PI/180;
} else if (_yawRight) {
_target.rotationZ = (((_target.rotationZ / Math.PI * 180) + _yawSpeed) % 360) * Math.PI/180;
}
if (_pitchDown) {
_target.rotationX=(((_target.rotationX / Math.PI * 180) + _pitchSpeed) % 360) * Math.PI/180;
}
if (_pitchUp) {
_target.rotationX=(((_target.rotationX / Math.PI * 180) - _pitchSpeed) % 360) * Math.PI/180;
}
updateObjectTransform()
super.update();
}
public function set yawSpeed(value:Number):void {
_yawSpeed = value*Math.PI/180;
}
public function set pitchSpeed(value:Number):void
{
_pitchSpeed = value*Math.PI/180;
}
}