对于练习,我们必须制作俄罗斯方块,我们获得了一个模板项目,可以在Visual Studio中使用(使用XNA)。现在我们得到了它的要点,我正试图引入声音。但是,soundengine
声明在GameWorld
类中,但实际游戏事件在TetrisGrid
中触发,同样是一个单独的类。
现在一个解决方案是将它的整个初始化移动到TetrisGrid
对象,但我们有时也希望在GameWorld
中播放声音,例如在菜单屏幕中。同时拥有音乐控件也会更加实用,因为TetrisGrid
可能会在失去/赢得比赛后重置。
soundengine
从这里产生:
namespace tetrisXNA
{
class SfxHelper
{
private SoundEffect[] sfxLibrary;
public SfxHelper(ContentManager Content)
{
this.sfxLibrary = new SoundEffect[2];
this.sfxLibrary[0] = Content.Load<SoundEffect>("pop");
this.sfxLibrary[1] = Content.Load<SoundEffect>("latch");
}
public void popRow()
{
this.sfxLibrary[0].Play();
}
public void latchBlock()
{
this.sfxLibrary[1].Play();
}
}
}
在初始化它的对象中使用它时可以正常工作,但是尝试将它传递给tetrisgrid
对象(使用ref和normal)。所有类都在同一名称空间内。
public GameWorld(int width, int height, ContentManager Content)
{
[...]
this.soundengine = new SfxHelper(Content);
}
分配了soundengine的构造函数(在gameworld
中)。
tetrisGrid对象构造函数:
public TetrisGrid(Texture2D texture, SfxHelper soundEngine)
{
...
this.random = new Random(System.DateTime.Now.Millisecond);
this.soundengine = soundEngine;
...
}
soundengine在上面声明为public SfxHelper soundengine;
。那么如何让不同对象/层可以访问它的相同实例,如何正确传递它?我已经尝试过调查静态修改器,但我还没有正确实现,因为它确实适合这项工作,因为实际上只需要一个声音引擎。