2012-10-03 105 views
0

我试图在我的android whack-a-mole游戏中创建一个MVC模式。从模型传递数据通过控制器查看

我通过内部类的线程在模型中生成摩尔位置,并且最终要将它传递给视图,以便它会为它生成一个精灵。

如何为我的视图创建一种方式,以不断从我的模型中接收生成的痣位置?

我编辑了下面的代码来捕捉它们背后的要领。

MODEL:

public class GameModel{ 
    public GameModel(){ 
     spawner = new MoleSpawner(); 
     spawner.start(); 
    } 
. 
. 
. 
    private class MoleSpawner extends Thread{ 
     private int location; 
     public void run() { 
      location = new Random().nextInt(20); 
      try{ 
      sleep (1000); 
      } catch (InterruptedException ex){ 
      ex.printStackTrace(); 
      } 
     } 
    } 
} 

VIEW:

public GameView{ 
. 
. 
. 
    public void createMoleSprite(int newlocation){ 
    //create sprites here 
    //newlocation should come from the MODEL 
    //this method must be triggered everytime the MODEL creates a new location 
    } 
} 
+2

我会尽量诚实和乐于助人 - 第一次尝试MVC时,你将无法正确地遵循它。我知道我没有。所以,不要太在意MVC - 专注于使其工作。一旦你开始工作,你会注意到你怎么可能更多的MVC;但不要让“我不遵循MVC”的想法成为代码中的阻止块。 – Shark

+0

@鲨鱼,非常真实!我从MVC开始经历过很多次,将一些模型代码放在控制器中,一些放在模型中,一些放在视图中,一旦我把所有东西都移到正确的位置加工。 –

回答

1

一个可以实现这一点的办法是使用处理程序。

它可能更复杂,但我会给你一个关于如何实现这个的简单例子。

在你的游戏运行的活动,得到它的处理器采用

Handler mHandler = new Handler(); 

然后,当你实例化模型,通过它的mHandler对象以及对活动为您提供参考。在模型中,每当你需要生成一个新的痣,做

mHandler.post(new Runnable() { 

    gameActivity.spawnNewMoleAt(location); 


}); 

这可以成为复杂得多,expecially如果你控制在该摩尔的动态生成的速度,但你可以建立在此。

你可以在处理程序HERE上找到一个很好的教程。

+0

这是否意味着数据将直接从模型中查看,绕过控制器? – user571099

+0

不,处理程序用于发送消息活动 - 通常用于从非UI线程处理UI元素。这实际上是与Android有关的,与MVC范例无关。 仍然是一个很好的建议thouhg – Shark

+0

是的,但你也可以把处理程序传递给控制器​​,并从那里发布。 –

相关问题