这主要是关于代码设计的问题。你在这里看到的是原始代码的一个非常简洁的版本。
代码的一个例子是:
player.rest();
这会让玩家入睡。
我有其他方法,例如步行,跑步,谈话等等都很有效。问题是多态。它将玩家从人类对象更改为另一个对象。我想出的解决方案就是:
class main
{
var human:Human = new Human;
var alien:Alien = new Alien;
var cow:Cow = new Cow;
var player = human;
enterframe loop{
//other code
if (player does something)
player.polymorph = "alien";
switch (player.polymorph)
{
case "alien":
player = alien;
break;
case "cow":
player = cow;
break;
//etc
}
player.update();
}
}
我想要一些看起来像这样的东西:
class main
{
var human:Human = new Human;
var alien:Alien = new Alien;
var player = human;
enterframe loop
{
player.polymorph(alien);
}
}
我知道我的原始解决方案是错误的方式,因为它鼓励意大利面条代码。我怎么能这样做呢?我不介意整个改写,但需要一个例子来帮助我朝着正确的方向前进。我希望这是有道理的,并感谢你的帮助。
如果第二个可以工作,那么多态函数会是什么样的?
我想过制作一个名为“玩家”的课程并改变那些扩展的课程,但据我所知,这是无法做到的?另外,我想将角色更改为游戏中已有的内容,而不是新对象。
答案 0 :(得分:0)
您的问题的一个解决方案是使用单个类,在本例中为您的Player类,以及finite state machine。你有一个Player类,可以设置为不同的状态,例如HUMAN,ALIEN,COW等。当发生多态事件时,你可以通过调用initState()方法来更新Player的状态,并处理逻辑作为一个人类,外星人,牛,因此无论以何种方式更新你的玩家。
假设玩家有update()方法,它可能包含以下内容:
switch (state) {
case ALIEN:
// do alien stuff
case COW:
// do cow stuff
case HUMAN:
// do human stuff
}
接下来,您的Player类可以使用一个以状态作为参数的polyMorph方法,而不是在switch语句中处理各种多态信号状态:
public function polymorph(newState:Int) {
state = newState;
initState(state); // You could even just call the initState method instead, and completely omit the polymorph method
}
在这里使用有限状态机将消除对大量对象的需求。