我正在制作一个关于射击敌人和避开障碍物的简单游戏,但是我在检测碰撞方面存在问题,因为我为每种类型的游戏对象(玩家,敌人,障碍物,掉落,子弹等。)。
class Player { Vector3 pos; ... }
class Enemy { Vector3 pos; ... }
class Obstacle { Vector3 pos; ... }
...
boolean doCollide (Object a, Object b)
{
if ( a.pos.x + a.size.w >= b.pos.x ) { ... }
...
}
它不会起作用,因为没有“pos”等等,所以我怎么能这样做才能适用于每个班级呢?我已经阅读过有关界面但我真的不知道它对我有什么帮助。
答案 0 :(得分:3)
好吧,如果你想,你可以做这样的事情来获得对象的pos.x
((Player)a).pos.x
但是,虽然这可能满足您的需求,但我建议您创建一个界面,例如
public interface GameObject{
public Vector3 getPosition();
}
并使所有“游戏对象”实现它,然后执行
boolean doCollide (GameObject a, GameObject b)
不仅第一种方法是不好的做法,而且在编译时更难以进行扩展,这通常是一个不好的迹象。
答案 1 :(得分:3)
您可以将public interface IsomeName{
public Vector3 getPosition();
}
类型转换为您自己的类型,但考虑到有多种自定义对象类型,尝试采用该方法不有效,因此您可以使用接口。
接口声明:
class Player implements IsomeName{ @Override public Vector3 getPosition(){...}};
class Enemy implements IsomeName{ @Override public Vector3 getPosition(){...}}
class Obstacle implements IsomeName{ @Override public Vector3 getPosition(){...}}
你的课程:
doCollide
然后您的boolean doCollide (IsomeName a, IsomeName b)
{
...
...
...
}
将成为:
getPosition()
另一种选择是使用抽象# admin.py
# imports go here...
source = Source()
source.save()
excerpt1 = Excerpt(source=source)
book = Book()
book.save()
except2 = Excerpt(source=book.source) # source=book may also work; haven't checked...
book2 = excerpt2.source.book
if book is book2:
except2.save() # only save this if my code is correct...
方法创建一个抽象基类,并让每种类型提供它们自己的实现。