AS3 ООП. Как заставить объект перемещаться по игровому полю в зависимости от значения костей? - PullRequest
2 голосов
/ 08 декабря 2011

Я создаю настольную игру и использую объектно-ориентированное программирование с AS3.Я создал клип с кружком, который перемещается по игровому полю.Есть 18 квадратов и 18 кадров.У меня есть кнопка, которая дает вам значение с кубиком с функцией случайного числа:

public function rollDie():void
    {_dieValue = Math.ceil(Math.random()*6)
        this.gotoAndStop(_dieValue);}

У меня есть класс для кнопки кубика, кубика, игровой доски и основной доски.Я пытаюсь заставить круг двигаться по доске (или перейти к кадру в mc) в зависимости от того, какое значение я получаю с кубиками.Вот мой код:

Основная плата:

package 
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;

public class DiceOut extends MovieClip
{
           public function DiceOut()
       {
                   trace("class diceout defined");
        createListeners();
    }

    public function createListeners():void
    {
        //trace("createListeners");
        rollButton.addEventListener(MouseEvent.CLICK, buttonClick);
    }

    public function buttonClick(e:MouseEvent):void
    {
        die1.rollDie();
        trace(die1.dieValue);
    }}}

Класс игры в кости:

package  {

import flash.display.MovieClip;

public class die extends MovieClip {

    private var _dieValue:uint;

    public function die() {
        trace("dice created");
        stop();
    }
    public function rollDie():void
    {
        _dieValue = Math.ceil(Math.random()*6)
        this.gotoAndStop(_dieValue);
    }
    public function get dieValue():uint
    {
        return _dieValue;
    }}}

Класс игры на доске:

package  {
import flash.display.MovieClip;
public class gameboard extends MovieClip {
    public function gameboard() {
        trace("Gameboard Created");
        stop();}}}

DiceButtonкласс:

package  {  
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class GameButton extends MovieClip {
    public function GameButton() {
        trace("Button created");
        stop(); 
        createListeners();
    }
    private function createListeners():void
    {
        this.addEventListener(MouseEvent.MOUSE_OVER, hoverOver);
        this.addEventListener(MouseEvent.MOUSE_OUT, hoverOff);
    }
    public function hoverOver(e:MouseEvent):void
    {
        this.gotoAndStop(2);
    }
    public function hoverOff(e:MouseEvent):void
    {
        this.gotoAndStop(1);
    }}}

Если кто-нибудь мог бы, пожалуйста, дать некоторое понимание, которое было бы очень полезно.Экземпляр mc для игровой доски - gameBoard.

Кроме того, если кто-нибудь знает, как вызвать рамку с меткой, в зависимости от того, на какой клетке находится круг, это будет плюсом.

Ответы [ 2 ]

0 голосов
/ 08 декабря 2011

Если вы хотите, чтобы действие происходило в зависимости от результата другого действия в другом объекте, вы можете сначала использовать диспетчеризацию событий для связи между объектами и отправки соответствующих значений от одного к другому.

//In the Die class
public function rollDie():void
{
    _dieValue = Math.ceil(Math.random()*6)
    this.gotoAndStop(_dieValue);

    //assuming that all your Objects have the same parent, 
    //namely the main stage
    //also, you would have to create a CustomEvent class...
    parent.dispatchEvent( new CustomEvent(_dieValue ) );
}

//In your Circle class you must listen to the CustomEvent
//you can do that after the Circle has been added to the stage
//check the Event.ADDED_TO_STAGE
private function addedToStage( event:Event ):void
{
     //remove the event listener
     //listen to your CustomEvent
     parent.addEventListener( CustomEvent.DICE_ROLLED , diceRolled );
}

private function diceRolled( event: CustomEvent ):void
{
     var dieValue:int = event.dieValue;

     // now that you have the value in the Circle class
     // you can react accordingly

     //here I use a switch statement but there are other
     //options of course...
     switch( dieValue )
     {
             case 1:
                //go to this square...
                break;

             case 2:
                //go to this other square...
                break;

             etc...
     }
}
0 голосов
/ 08 декабря 2011

Во-первых, что вы подразумеваете под кадром? реальный кадр анимации или рамка вокруг квадрата? Если я правильно понимаю ваш код, вы можете создать Array из Point объектов, и все они будут соответствовать позициям на доске. затем просто добавляйте значение die в индекс каждый раз.

Класс основной платы:

protected var playerIndex:Number = 0;

public function buttonClick(e:MouseEvent):void
{
    die1.rollDie();

    playerIndex += die1.dieValue;// This will move the player forward the number on the die
}

// add this to the createListeners method:
    playerCircle.addEventListener(Event.ENTER_FRAME, PlayerEnt);

public function PlayerEnt (e:Event) {
    // this retrieves the position of the square that the player is on
    playerCircle.x = gameBoard.boardPositions[playerIndex].x;
    playerCircle.y = gameBoard.boardPositions[playerIndex].y;
}

класс gameBoard:

private var boardPositions:Array;

public function gameboard() {
    trace("Gameboard Created");
    stop();

    boardPositions = new Array(//Insert positions here, there are lots of ways of making this information so I won't go into them
}

Извините, если это вам не поможет, но ваш вопрос немного неясен. Я предлагаю вам попытаться дать больше описания, например, что вы подразумеваете под кадрами? Используете ли вы анимацию для перемещения игрока?

...