Actionscript 3 从类访问时间轴变量?
在我程序的一个框架中,我有一个“玩家”的代码,它本质上是一门跟随角色的大炮,细节并不重要。所以我想把这门大炮做成一个类,然后我可以把它作为电影剪辑,放在舞台上,有类似的大炮,起着类似的作用。所以基本上我需要把它变成一个类,以某种方式与时间轴变量交互 现在,Player类看起来是这样的Actionscript 3 从类访问时间轴变量?,actionscript-3,flash,actionscript,flash-cs6,Actionscript 3,Flash,Actionscript,Flash Cs6,在我程序的一个框架中,我有一个“玩家”的代码,它本质上是一门跟随角色的大炮,细节并不重要。所以我想把这门大炮做成一个类,然后我可以把它作为电影剪辑,放在舞台上,有类似的大炮,起着类似的作用。所以基本上我需要把它变成一个类,以某种方式与时间轴变量交互 现在,Player类看起来是这样的 package { import flash.display.*; import flash.events.*; import flash.ui.*; public class
package
{
import flash.display.*;
import flash.events.*;
import flash.ui.*;
public class Player extends MovieClip
{
public function Player() {
}
}
}
警告代码转储你不必阅读所有这些,这是我需要制作成一个类的玩家代码,这样我就可以制作更多具有不同参数的玩家,而不是全部跟随角色等等。。。那我该怎么做呢?这段代码目前正在与舞台上的对象和时间线中的其他变量交互
// player settings
var _rotateSpeedMax:Number = 20;
var _gravity:Number = .10;
// projectile gun settings
var _bulletSpeed:Number = 4;
var _maxDistance:Number = 200;
var _reloadSpeed:Number = 250;//milliseconds
var _barrelLength:Number = 20;
var _bulletSpread:Number = 5;
// gun stuff
var _isLoaded:Boolean = true;
var _isFiring:Boolean = false;
var _endX:Number;
var _endY:Number;
var _startX:Number;
var _startY:Number;
var _reloadTimer:Timer;
var _bullets:Array = [];
// array that holds walls
var _solidObjects:Array = [];
// global vars
var _player:MovieClip;
var _dx:Number;
var _dy:Number;
var _pcos:Number;
var _psin:Number;
var _trueRotation:Number;
/**
* Constructor
*/
_solidObjects = [world.wall01,world.wall02,world.wall03,world.wall04];
stage.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUpHandler);
//character.addEventListener(Event.ENTER_FRAME, moveDude);
//////////////////////////////////////;
// Player & Weapon Methods
//////////////////////////////////////
/**
* Creates player
* Uses "Player" movieclip linked in library
*/
createPlayer();
function createPlayer():void
{
// attach player movieclip from library
// position player in center
if (character!=null&&_player!=null)
{
_player.x = character.x +5;
_player.y = character.y +5;
}
else if (_player ==null)
{
_player = new Player();
// add to display list
stage.addChild(_player);
}
}
/**
* Fire weapon
*/
function fire():void
{
// check if firing
if (! _isFiring)
{
return;
}
// check if reloaded
if (! _isLoaded)
{
return;
}
// create bullet
createBullet();
// start reload timer
_reloadTimer = new Timer(_reloadSpeed);
_reloadTimer.addEventListener(TimerEvent.TIMER, reloadTimerHandler);
_reloadTimer.start();
// set reload flag to false;
_isLoaded = false;
}
/**
* Creates a bullet movieclip and sets it's properties
*/
function createBullet():void
{
// precalculate the cos & sine
_pcos = Math.cos(_player.rotation * Math.PI / 180);
_psin = Math.sin(_player.rotation * Math.PI / 180);
// start X & Y
// calculate the tip of the barrel
_startX = _player.x - _barrelLength * _pcos;
_startY = _player.y - _barrelLength * _psin;
// end X & Y
// calculate where the bullet needs to go
// aim 50 pixels in front of the gun
_endX = _player.x - 50 * _pcos + Math.random() * _bulletSpread - _bulletSpread * .5;
_endY = _player.y - 50 * _psin + Math.random() * _bulletSpread - _bulletSpread * .5;
// attach bullet from library
var tempBullet:MovieClip = new Bullet();
// calculate velocity
tempBullet.vx = (_endX - _startX) / _bulletSpeed;
tempBullet.vy = (_endY - _startY) / _bulletSpeed;
// set position
tempBullet.x = _startX;
tempBullet.y = _startY;
// save starting location
tempBullet.startX = _startX;
tempBullet.startY = _startY;
// set maximum allowed travel distance
tempBullet.maxDistance = stage.stageHeight;//_maxDistance;
// add bullet to bullets array
_bullets.push(tempBullet);
// add to display list;
stage.addChild(tempBullet);
}
/**
* Updates bullets
*/
function updateBullets():void
{
var i:int;
var tempBullet:MovieClip;
// loop thru _bullets array
for (i = 0; i < _bullets.length; i++)
{
// save a reference to current bullet
tempBullet = _bullets[i];
// check if gravity is enabled
if (gravityCheckbox.selected)
{
// add gravity to Y velocity
tempBullet.vy += _gravity;
}
// update bullet position
tempBullet.x += tempBullet.vx;
tempBullet.y += tempBullet.vy;
// check if bullet went too far
if (getDistance(tempBullet.startX - tempBullet.x, tempBullet.startY - tempBullet.y) > tempBullet.maxDistance + _barrelLength)
{
destroyBullet(tempBullet);
}
// check for collision with walls
if (checkCollisions(tempBullet.x,tempBullet.y))
{
destroyBullet(tempBullet);
}
}
}
/**
* Destroys bullet
* @parambulletTakes bullet movieclip
*/
function destroyBullet(bullet:MovieClip):void
{
var i:int;
var tempBullet:MovieClip;
// loop thru _bullets array
for (i = 0; i < _bullets.length; i++)
{
// save a reference to current bullet
tempBullet = _bullets[i];
// if found bullet in array
if (tempBullet == bullet)
{
// remove from array
_bullets.splice(i, 1);
// remove from display list;
bullet.parent.removeChild(bullet);
// stop loop;
return;
}
}
}
/**
* Reload weapon
*/
function reloadWeapon():void
{
_isLoaded = true;
}
/**
* Checks for collisions between points and objects in _solidObjects
* @returnCollision boolean
*/
function checkCollisions(testX:Number, testY:Number):Boolean
{
var i:int;
var tempWall:MovieClip;
// loop thru _solidObjects array
for (i = 0; i < _solidObjects.length; i++)
{
// save a reference to current object
tempWall = _solidObjects[i];
// do a hit test
if (tempWall.hitTestPoint(testX,testY,true))
{
return true;
// stop loop
break;
}
}
return false;
}
/**
* Calculate player rotation
*/
function updateRotation():void
{
// calculate rotation based on mouse X & Y
_dx = _player.x - stage.mouseX;
_dy = _player.y - stage.mouseY;
// which way to rotate
var rotateTo:Number = getDegrees(getRadians(_dx,_dy));
// keep rotation positive, between 0 and 360 degrees
if (rotateTo > _player.rotation + 180)
{
rotateTo -= 360;
}
if (rotateTo < _player.rotation - 180)
{
rotateTo += 360;
}
// ease rotation
_trueRotation = (rotateTo - _player.rotation) / _rotateSpeedMax;
// update rotation
_player.rotation += _trueRotation;
}
//////////////////////////////////////
// Event Handlers
//////////////////////////////////////
/**
* Enter Frame handler
* @parameventUses Event
*/
function enterFrameHandler(event:Event):void
{
createPlayer();
updateRotation();
updateBullets();
fire();
}
/**
* Mouse Up handler
* @parameUses MouseEvent
*/
function onMouseUpHandler(event:MouseEvent):void
{
_isFiring = false;
}
/**
* Mouse Down handler
* @parameUses MouseEvent
*/
function onMouseDownHandler(event:MouseEvent):void
{
_isFiring = true;
}
/**
* Reload timer
* @parameTakes TimerEvent
*/
function reloadTimerHandler(e:TimerEvent):void
{
// stop timer
e.target.stop();
// clear timer var;
_reloadTimer = null;
reloadWeapon();
}
//////////////////////////////////////
// Utilities
//////////////////////////////////////
/**
* Get distance
* @paramdelta_x
* @paramdelta_y
* @return
*/
function getDistance(delta_x:Number, delta_y:Number):Number
{
return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
}
/**
* Get radians
* @paramdelta_x
* @paramdelta_y
* @return
*/
function getRadians(delta_x:Number, delta_y:Number):Number
{
var r:Number = Math.atan2(delta_y,delta_x);
if (delta_y < 0)
{
r += (2 * Math.PI);
}
return r;
}
/**
* Get degrees
* @paramradiansTakes radians
* @returnReturns degrees
*/
function getDegrees(radians:Number):Number
{
return Math.floor(radians/(Math.PI/180));
}
//播放器设置
var _rotateSpeedMax:Number=20;
重力变量:数值=0.10;
//射弹炮设置
var _BullettSpeed:数字=4;
var _maxDistance:数字=200;
var _重新加载速度:数字=250//毫秒
var _barrelLength:Number=20;
var _bulletSpread:数字=5;
//枪械
var_isLoaded:Boolean=true;
变量_isFiring:布尔值=false;
var_endX:数字;
var_endY:数字;
var_startX:编号;
变量开始:数字;
var _reloadTimer:定时器;
变量_项目符号:数组=[];
//容纳墙壁的阵列
var_solidObjects:Array=[];
//全局变量
玩家:MovieClip;
var_dx:数字;
变量:数字;
pcos变量:数量;
变量:数字;
变量_:数字;
/**
*建造师
*/
_solidObjects=[world.wall01,world.wall02,world.wall03,world.wall04];
stage.addEventListener(Event.ENTER\u FRAME,enterFrameHandler);
stage.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDownHandler);
stage.addEventListener(MouseEvent.MOUSE\u UP,onMouseUpHandler);
//character.addEventListener(Event.ENTER_FRAME,moveDude);
//////////////////////////////////////;
//玩家与武器方法
//////////////////////////////////////
/**
*创造玩家
*使用库中链接的“播放器”movieclip
*/
createPlayer();
函数createPlayer():void
{
//从库中附加播放器movieclip
//把运动员放在中间位置
如果(字符!=null&&u玩家!=null)
{
_player.x=character.x+5;
_player.y=character.y+5;
}
else如果(_player==null)
{
_player=新玩家();
//添加到显示列表
stage.addChild(_player);
}
}
/**
*火力武器
*/
函数fire():void
{
//检查是否点火
如果(!\u正在点火)
{
返回;
}
//检查是否重新加载
如果(!\u已加载)
{
返回;
}
//创建项目符号
createBullet();
//启动重新加载计时器
_reloadTimer=新计时器(_reloadSpeed);
_reloadTimer.addEventListener(TimerEvent.TIMER,reloadTimerHandler);
_reloadTimer.start();
//将重新加载标志设置为false;
_isLoaded=false;
}
/**
*创建项目符号movieclip并设置其属性
*/
函数createBullet():void
{
//预先计算余弦和正弦
_pcos=Math.cos(_player.rotation*Math.PI/180);
_psin=Math.sin(_player.rotation*Math.PI/180);
//开始X&Y
//计算桶的顶部
_startX=_player.x-_barrelLength*_pcos;
_startY=_player.y-_barrelLength*_psin;
//结束X&Y
//计算子弹需要去哪里
//瞄准枪前50个像素
_endX=\u player.x-50*\u pcos+Math.random()*\u bulletSpread-\u bulletSpread*.5;
_endY=\u player.y-50*\u psin+Math.random()*\u bulletSpread-\u bulletSpread*.5;
//从库中附加项目符号
var tempbill:MovieClip=new Bullet();
//计算速度
tempbill.vx=(_endX-_startX)/_bulletSpeed;
tempbill.vy=(\u endY-\u startY)/\u bulletSpeed;
//设定位置
tempbill.x=_startX;
tempbill.y=_startY;
//保存起始位置
tempbill.startX=_startX;
tempbill.startY=\u startY;
//设置允许的最大行驶距离
tempBullet.maxDistance=stage.stageHeight;//\u maxDistance;
//将项目符号添加到项目符号数组
_子弹。推(子弹);
//添加到显示列表;
stage.addChild(tempbill);
}
/**
*更新项目符号
*/
函数updateBullets():void
{
变量i:int;
var tempBullet:MovieClip;
//环通子弹阵列
对于(i=0;i<\u.length;i++)
{
//保存对当前项目符号的引用
tempbill=_子弹[i];
//检查重力是否启用
如果(选中重力复选框)
{
//将重力添加到Y速度
tempbill.vy+=\u重力;
}
//更新子弹位置
tempbill.x+=tempbill.vx;
tempbill.y+=tempbill.vy;
//检查子弹是否飞得太远
if(getDistance(tempbill.startX-tempbill.x,tempbill.startY-tempbill.y)>tempbill.maxDistance+\u barrelLength)
{
销毁子弹(tempBullet);
}
//检查是否与墙壁发生碰撞
if(检查碰撞(tempbill.x,tempbill.y))
{
销毁子弹(tempBullet);
}
}
}
/**
*摧毁子弹
*@ParamBullettle电影
*/
功能销毁项目符号(项目符号:MovieClip):无效
{
变量i:int;
var tempBullet:MovieClip;
//环通子弹阵列
对于(i=0;i<\u.length;i++)
{
//保存对当前项目符号的引用
tempbill=_子弹[i];
//如果在阵列中找到子弹
如果(临时项目符号==项目符号)
{
//从阵列中删除
_项目符号.拼接(i,1);
//从显示列表中删除;
bullet.parent.removeChild(bullet);
//停止回路;
返回;
}
}
}
/**
*重新装填武器
*/
函数重载武器():void
{
_isLoaded=true;
}
/**
*检查_solidObjects中的点和对象之间的碰撞
*@return冲突布尔值
*/
函数checkCollisions(testX:Number,testY:Number):布尔值
{
VarI:i