2014-04-05 149 views
1

我在Android應用程序中使用AndEngine和Box2d。
如何讓我的對象「玩家」拋出一個事件,並且「GameScene」訂閱它?Android自定義事件監聽器

public class Player { 

    @Override 
    public void Collision(GameObject object) { 
    if(object instanceof Coin) { 
     //throws an event here 
    } 
    } 
} 

public class GameScene { 
    private Player player = new Player(); 
    //catch the event here 

}

回答

7

您應該使用interface秒。

將界面類似:同樣的接口名稱

public interface Something 
{ 
    void doSomething(GameObject object); 
} 

哪裏doSomething是將被調用的方法(在這種情況下可能是objectCollision)(ObjectCollider()?)。

然後讓GameScene實現它

public class GameScene implements Something 

和實施方法。

在播放器類,偵聽器添加到此:

public class Player { 
private Something listener; 

並在構造函數問聽衆:

public Player(Something listener) { this.listener = listener; } 

然後調用它,只需要用

listener.doSomething(object); 

示例:

public void Collision(GameObject object) { 
    if(object instanceof Coin) { 
    //throws an event here 
    listener.doSomething(object); 
    } 
} 

要使用此構造函數,你只需要做創建Player對象:

Player player = new Player(this); // if you implement the method in the class 
0

您可以使用android life cycle了點。

創建一個信號

interface IGameSignal{ 
    void gameHandler(); 
} 

class GameSignal extends Signal<IGameSignal> implements IGameSignal{ 

    void gameHandler(){ 
     dispatch();  
    } 
} 

比註冊它GameCence或其他地方你想,可能有許多聽衆一樣Signal

class GameScene implements IGameSignal{ 
    GameSignal gameSignal = Factory.inject(GameSignal.class); 

    void init() { 
     newsUpdateSignal.addListener(this);   
    } 

    public void gameHandler(){ 

    } 
} 

並在需要時發送信號,無論您需要何處。

Class A{ 
    GameSignal gameSignal = Factory.inject(GameSignal.class); 

    void execute(){ 
     // dispatch the signal, the callback will be invoked on the same thread 
     gameSignal.gameHandler(); 
    }   
} 

聲明:我是android生命週期的作者。