2014-12-24 4 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 (root) .variable – tziuka

ответ

2

Из класса вы можете получить доступ к переменной, как это: MovieClip(root).variable

+0

так, как мне получить доступ к объектам на сцене? У меня есть объекты world.wall01, world.wall02 и т. Д. (Имя экземпляра wall0number внутри объекта с именем мирового экземпляра) Когда я пытаюсь передать их добавление в список, как вы упомянули выше, я получаю эту странную ошибку 'TypeError: Error # 1123: Оператор фильтра не поддерживается в классе класса flash.display.MovieClip. \t at Player() \t at Maintest_fla :: MainTimeline/createPlayer() 'это то, как я передаю их' _solidObjects = [MovieClip. (Root) .world.wall01, MovieClip. (Root) .world.wall02, MovieClip. (Root) .world.wall03, MovieClip. (Root) .world.wall04]; ' – Trows

+1

@Altrows - вывести период после' MovieClip', это то, что бросает ошибку операции фильтра. Посмотрите внимательно на ответ @ tzuuka, после «MovieClip» нет периода. – BadFeelingAboutThis

+0

Мой бог, я идиот, иногда мне кажется, мне нужно больше поворота): спасибо. – Trows

Смежные вопросы