我正在开发一款游戏,这是我第一次添加多人游戏(使用kryonet),它被设计为单人游戏,然后我添加了多人游戏。我想到了一种优雅的方式来制作相同的代码双向工作。代码可以工作,除了我的解决方案附带的无限循环。
在我的游戏类中,我将foo变量实例化为Foo,当游戏是单人游戏时,将SubFoo实例化为多人游戏,如下例所示。基本上,SubFoo会覆盖负责世界变化事件的Foo方法,进行所需的多人游戏调用然后“继续”该方法。
问题是当客户端从服务器收到数据包时,它必须以某种方式调用foo,以便它跳过它的重写方法,因此它不会将更改发送回服务器等等。
我尝试在Foo类中添加一个根变量,希望如果我调用它,它将调用其类的方法,但没有成功。如果foo调用像foo.fooCaller().method();
这样的方法,我也可以使它工作。
我应该提一下我的服务器是主机。对于5个玩家,4个是客户端,1个是主机。如果有更好的方式来做这件事,比如模式,我会很高兴听到它。
Foo和SubFoo是我的World和WorldNetwork的简化版本的例子。
public class Foo { // as the main , singleplayer world
public Foo root;
public Foo() {
root = Foo.this;
}
public void method() {
System.out.println( "This is foo" );
}
}
// as the extension of the main world that manages the server/client calls
public class SubFoo extends Foo {
@Override
public void method() {
System.out.println( "this is super foo" );
super.method();
}
}
public static void main(String[] args) {
Foo foo = new SubFoo();
foo.root.method(); // make this skip the SubFoo method
foo.method(); // this should execut normally
}
答案 0 :(得分:0)
由于您要调用Foo
类的方法,因此不应实例化SubFoo
对象。您应该实例化Foo
对象。另一方面,如果您需要SubFoo
个对象上的特定函数,则应该继承特定函数而不覆盖它。
最后,您必须确定SubFoo
类的method
类的功能是什么。此功能不能随上下文而改变,因为编译器无法猜测您要执行哪些功能。
您可以根据函数参数使用polymorphism来完成此操作。例如:
class SubFoo{
//Inherit the method functionality from Foo
...
//Define new method with another signature to seperate its call
void method (Object arg);
}
最后,问题是您希望该方法做什么。
希望我帮忙!