2013-03-13 2 views
1

Итак, я создаю космическую шутерскую игру. Мой класс документ двигателя, и это выглядит следующим образом:AS3 - Проблемы с базовым классом игры

package Classes 
{ 

import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.Event; 
import flash.events.MouseEvent; 

public class Engine extends MovieClip 
{ 

    private var startMenu:StartMenu; 
    private var numberOfStars:int = 80; 
    public static var enemyList:Array = new Array(); 
    private var spaceShip:Ship; 
    private var hud:HUD; 

    public function Engine() 
    { 
     startMenu = new StartMenu(); 
     stage.addChild(startMenu); 
     startMenu.x = (stage.stageWidth/2); 
     startMenu.y = (stage.stageHeight/2); 
    } 

    private function startGame() 
    { 
     stage.removeChild(startMenu) 
     spaceShip = new Ship(stage); 
     stage.addChild(spaceShip); 
     spaceShip.x = (stage.stageWidth/2); 
     spaceShip.y = (stage.stageHeight/2); 

     spaceShip.addEventListener("hit", shipHit); 

     hud = new HUD(stage); //create the HUD 
     stage.addChild(hud); //and display it. 

     for (var i:int = 0; i < numberOfStars; i++) 
     { 
      stage.addChildAt(new Star(stage), 1); 
     } 

     addEventListener(Event.ENTER_FRAME, createFighter); 
    } 
} 

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

package Classes 
{ 
import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.Event; 
import flash.events.MouseEvent; 
import flash.events.*; 

public class StartMenu extends MovieClip 
{ 

    public function StartMenu() 
    { 
     button1.addEventListener(MouseEvent.CLICK, buttonClicked); 
    } 

    private function buttonClicked(e:MouseEvent) 
    { 

    } 



} 

} 

(Игнорировать ошибки отступов, это правильно в реальном коде) Хорошо так себе кнопку отображаются на экране , Эта кнопка является частью класса StartMenu и прослушивает MouseEvent.CLICK.

Как только кнопка нажата, мне нужно как-то вернуться к классу Engine и вызвать функцию startGame(), но я не могу просто сделать Engine.startGame(), я попытался установить функцию на публичную функцию , и я попытался установить функцию на публичную статическую функцию. не повезло. ПОМОГИ ПОЖАЛУЙСТА?? Любой метод будет в порядке, мне просто нужно, чтобы этот класс мог перейти к функции startGame после нажатия кнопки!

ответ

2

Возможно, самый быстрый способ сделать это - добавить переменную Engine в класс StartMenu и передать движок через конструктор меню «Пуск». Вот краткий пример кода:

StartMenu

public class StartMenu extends MovieClip 
{ 

    private var _engine:Engine // add a new variable to the start menu class 
    public function StartMenu(engine:Engine) // add a new parameter to the constructor 
    { 
     _engine = engine; // set the variable to the value passed through the constructor 
     button1.addEventListener(MouseEvent.CLICK, buttonClicked); 
    } 

    private function buttonClicked(e:MouseEvent) 
    { 
     _engine.startGame() 
    } 
} 

Двигатель

public function Engine() 
{ 
    startMenu = new StartMenu(this); 
    // pass through the current instance of engine using the this keyword 
    ... 
} 

public function startGame() // change private to public 
{ 
    ... 
} 

Я надеюсь, что помогает

0

В классе Engine.as, вы можете поставить:

public static var instance:Engine; 

public static function getInstance():Engine 
{ 
    return instance as Engine; 
} 

и в конструкторе o е класс двигатель положить:

instance = this; 

теперь вы можете использовать instace класса Engine и все общественные функции и переменные в любом месте в вашем проекте:

Engine.getInstance().startGame(); 

Это может помочь вам.

0

Существует два типа решения такого случая. Один использует родительскую ссылку или конкретную ссылку вызвать определенную функцию, а andwered Этан Уорли, другой использует настраиваемый общественный сеттер кликер как это:

public class StartMenu extends MovieClip 
{ 

    private var button1:MovieClip; // or whatever type your button is 
    private var startGameFunction:Function; 
    public function StartMenu() 
    { 
     // some initialization code if needed, including allocating button1 
     startGameFunction=null; 
     button1.addEventListener(MouseEvent.CLICK, buttonClicked); 
    } 

    public function set startGameClicked(value:Function):void { 
     if (value==startGameFunction) return; // nothing to set 
     startGameFunction=value; 
    } 
    private function buttonClicked(e:MouseEvent) 
    { 
     if (startGameFunction) startGameFunction(); // if there's a function assigned, call it 
    } 
} 

класс двигателя:

public function Engine() 
{ 
    startMenu = new StartMenu(); 
    startMenu.startGameFunction=this.startGame; 
    // no "()" here, as we are giving a function reference 
    ... 
} 

public function startGame() // change private to public 
{ 
    ... 
} 
0

Я немного удивил, что никто еще не упомянул подход, основанный на событиях. Это то, что я использовал бы для такого требования, поскольку я действительно не нахожу идею передачи всего экземпляра класса, поскольку просто вызов функции является привлекательным (это будет означать, что я могу быть немного предвзятым к этому подходу, поэтому не стесняйтесь указывать на недостатки, если они есть).

Внутри вашего класса двигателя:

public function Engine() 
{ 
    startMenu = new StartMenu(); 

    startMenu.addEventListner('StartGame', startGame); 
    stage.addChild(startMenu); 

    .. 

} 

private function startGame(e:Event) 
{ 

    startMenu.removeEventListner('StartGame', startGame); 

    .. 

} 

Внутри вашего класса StartMenu:

private function buttonClicked(e:MouseEvent) 
{ 

    this.dispatchEvent(new Event('StartGame')); 

    .. 

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