背景
在我的应用程序(游戏)-我有一个现场经理处理不同的层次。所以我有:
接口码
//Interface to allow switching scenes (works in conjunction with SceneManager class)
//Handles rendering, logic updating (on the GL rendering thread) and user input (on the main UI thread)
public interface Scene {
void render();
void updateLogic();
boolean onTouchEvent(MotionEvent event);
}SceneManager类
//Scene Manager class used in conjunction with the Scene interface. This allows for querying of the current
//scene & changing the scene using the current instance of the manager.
public class SceneManager {
private static SceneManager Instance = new SceneManager();
private Scene currentScene;
public static SceneManager getInstance(){
return Instance;
}
public Scene getCurrentScene(){
return currentScene;
}
public void setCurrentScene(Scene scene){
currentScene = scene;
}
}所以,在我的游戏回路中,我可以做这样的事情:
SceneManager.getInstance().getCurrentScene().updateLogic();
SceneManager.getInstance().getCurrentScene().render();通过持有一个简单的int值并通过switch语句运行相应的代码,我可以轻松地更改我的级别。
switch (level){
case 1:{SceneManager.getInstance().setCurrentScene(r.level1);break
}问题
这很好,但是在我的几个级别(20中有2个)中,我需要运行一个特定的方法,但我不想在不需要它的18个级别(通过存根方法)来实现它。
另一个选项是在循环运行时调用级别值上的开关语句,所以.
伪码
If (level==5)
callCode(5,0);
else if (level==10)
{callCode (10,4);}(其中第5级和第10级是需要这段代码的级别)
....but我宁愿将所需的方法放在它对应的级别类中,只从当前场景调用该方法,因为在游戏循环本身运行平淡无奇的情况下,我不确定是否为此使用开关(或方法)- (IE,我的大部分切换语句都出现在某个级别末尾的裁剪场景中,而性能并不是问题)。就像这样:
我宁愿这样做:
SceneManager.getInstance().getCurrentScene().callCode();其中,callCode方法将特定于级别中所需的任何值(实际上,也可以简单地依次调用公共代码的主要方法,但值不同)。
希望我说得通。
如有任何指示,将不胜感激。
编辑
试图创建这样的第二个接口:
public interface Scene2 extends Scene {
void callCode();
}(场景保持如上)
然后,在我的课堂上(例如,level10)
public class Level10 implements Scene2 {
@Override
public void render(){
//Rendering code goes here
mainGame.Drawsprites(); //As an example. MainGame implements Scene and contains all my game code. I can simply call the various methods from any of my level classes therefore I don't duplicate tons of code
}
@Override
public void updateLogic(){
//Game updates goes here (Similar to above)
}
@Override
public void callCode(){
//Level specific code here
}来自我的mainGame课程:
public void doSomething(){
SceneManager.getInstance().getCurrentScene().callCode;
}
}发布于 2014-01-07 16:09:37
如果你有你的接口Scene
public interface Scene {
void render();
void updateLogic();
boolean onTouchEvent(MotionEvent event);
}您可以定义另一个接口,类似于:
public interface Scene2 extends Scene {
void callCode();
}然后,在您的mainGame类中,您可以:
public void doSomething(){
Object currentScene = SceneManager.getInstance().getCurrentScene();
if(currentScene instanceof Scene){
((Scene)currentScene).render();
((Scene)currentScene).updateLogic();
}
if(currentScene instanceof Scene2){
((Scene2)currentScene).allCode();
}
}发布于 2014-01-07 16:12:16
您应该定义一个扩展您的接口的额外层。然后,您的两个单独的场景可以实现这个接口,并且仍然可以使用更通用的接口进行调用。
这是一个示例实现:
public class Main {
public static void main(String[] args) {
SomeInterface obj1 = new SomeClass2();
obj1.method1();
obj1.method2();
SomeSubInterface obj2 = new SomeClass2();
obj2.method1();
obj2.method2();
obj2.method3();
}
}
interface SomeInterface {
void method1();
void method2();
}
interface SomeSubInterface extends SomeInterface {
void method3();
}
class SomeClass1 implements SomeInterface {
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
}
class SomeClass2 implements SomeSubInterface {
@Override
public void method1() {
// TODO Auto-generated method stub
}
@Override
public void method2() {
// TODO Auto-generated method stub
}
@Override
public void method3() {
// TODO Auto-generated method stub
}
}发布于 2014-01-07 16:22:45
只是一个例子,展示了我在上面的评论中提出的解决方案。正如这里所提到的,它实现了场景特定代码的本地化,并从一般的gameloop中消除了复杂性。
public class Main {
public static void main(String[] args) {
Scene scene1 = new NormalScene();
Scene scene2 = new SpecialScene();
scene1.initialize(); //Does nothing
scene2.initialize(); //Print hello world
}
}
abstract class Scene {
abstract void render();
abstract void updateLogic();
abstract boolean onTouchEvent();
void initialize() {
}
}
class NormalScene extends Scene {
@Override
void render() {
}
@Override
void updateLogic() {
}
@Override
boolean onTouchEvent() {
return true;
}
}
class SpecialScene extends Scene {
@Override
void render() {
}
@Override
void updateLogic() {
}
@Override
boolean onTouchEvent() {
return true;
}
@Override
void initialize() {
System.out.println("Hello world");
}
}https://stackoverflow.com/questions/20976025
复制相似问题