【发布时间】:2015-05-16 08:03:35
【问题描述】:
我想使用 Collidable 接口实现一个碰撞库
type Collidable interface{
BoundingBox() (float64,float64,float64,float64)
FastCollisionCheck(c2 Collidable) bool
DoesCollide(c2 Collidable) bool
Collide(c2 Collidable)
}
它具有预定义的形状,例如。
type Circle struct{
X,Y,Radius float64
}
我的想法是我可以做到
type Rock struct{
collision.Circle
....
}
然后实现接口 Collidable,所以我可以将它传递给 Spatial Hash Map(它需要一个可碰撞的)。唯一需要做的就是根据我的需要重写 Collide() 函数。
然而type circle中的函数不能处理type rock,即使它嵌入了一个圆。
func (c1 *Circle) DoesCollide(i Collidable) bool{
switch c2 := value.(type) {
case Circle:
//doesn't fire, as it is of type Rock (unknown in this package)
//Needed is something like
//if i_embeds_Circle then c2 := i_to_Circle
}
}
这可能吗? 有没有更好的办法?
【问题讨论】:
-
所以这个 (play.golang.org/p/J5bvaEtLbM) 可以说明您的问题?
-
有点。评论岩石的 Shape() 函数(它使用圆圈)。我的问题是不要进入选择的默认部分,但如果我将一块石头传递给 DoesShape()
-
所以play.golang.org/p/rg_plLZMSM:
default:部分用于说明Rock未被检测为CircleShaper即使Rock具有Circle作为匿名字段. -
是的,这就是问题所在。如何让它将岩石识别为一个圆圈。 (它嵌入)。