2014-12-24 3 views
0

내 프로그램의 프레임 중 하나에서 본질적으로 캐릭터를 따라 다니는 대포 인 "플레이어"에 대한 코드가 있습니다. 세부 사항은 중요하지 않습니다. 그래서 나는이 대포를 무비 클립으로 배치 할 수있는 무대로 만들고 유사한 기능을하는 대포를 만들고 싶습니다. 그래서 기본적으로 타임 라인 변수와 어떻게 든 상호 작용하는 클래스로 만들 필요가 있습니까?클래스에서 타임 라인 변수에 액세스 하시겠습니까?

지금 플레이어 클래스를 사용하면이 모든 것을 읽을 필요가 없습니다 덤프이

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)); 
} 
+0

을 내가 타임 라인에서 모든 코드가 아닌 당신을 추천합니다. 그러나 클래스에서이 MovieClip (루트)과 같은 변수에 액세스 할 수 있습니다. 변수가 – tziuka

답변

2

이 같은 변수에 액세스 할 수 있습니다 MovieClip(root).variable

+0

이므로 무대에서 객체에 액세스하려면 어떻게해야합니까? 나는 world.wall01, world.wall02 등의 객체를 가지고있다. (월드 인스턴스 이름을 가진 객체 내부의 wall0number 인스턴스 이름) 위에서 언급 한 것처럼 목록에 추가하려고하면이 이상한 오류가 발생한다. TypeError : Error # 1123 : 필터 연산자가 유형 클래스 flash.display.MovieClip에서 지원되지 않습니다. \t at Player() \t (Maintest_fla :: MainTimeline/createPlayer()'이걸 어떻게 지나가고있는가? _solidObjects = [MovieClip. (루트) .world.wall01, MovieClip. (루트) .world.wall02, MovieClip. (루트) .world.wall03, MovieClip. (루트) .world.wall04]; ' – Trows

+1

@Altrows -'MovieClip '이후의 기간을 가져 오면 필터 작업 오류가 발생합니다. @ tziuka의 답변을 자세히 살펴보면,'MovieClip '다음에 마침표가 없습니다. – BadFeelingAboutThis

+0

맙소사 나는 때때로 내가 바보라고 생각한다.) : 고마워. – Trows

관련 문제