func (cs *CollisionSystem) Update(entity *ecs.Entity, dt float32) { var ( space *SpaceComponent collision *CollisionComponent ok bool ) if space, ok = entity.ComponentFast(space).(*SpaceComponent); !ok { return } if collision, ok = entity.ComponentFast(collision).(*CollisionComponent); !ok { return } if !collision.Main { return } var ( otherSpace *SpaceComponent otherCollision *CollisionComponent ) for _, other := range cs.Entities() { if other.ID() != entity.ID() { if otherSpace, ok = other.ComponentFast(otherSpace).(*SpaceComponent); !ok { return } if otherCollision, ok = other.ComponentFast(otherCollision).(*CollisionComponent); !ok { return } entityAABB := space.AABB() offset := Point{collision.Extra.X / 2, collision.Extra.Y / 2} entityAABB.Min.X -= offset.X entityAABB.Min.Y -= offset.Y entityAABB.Max.X += offset.X entityAABB.Max.Y += offset.Y otherAABB := otherSpace.AABB() offset = Point{otherCollision.Extra.X / 2, otherCollision.Extra.Y / 2} otherAABB.Min.X -= offset.X otherAABB.Min.Y -= offset.Y otherAABB.Max.X += offset.X otherAABB.Max.Y += offset.Y if IsIntersecting(entityAABB, otherAABB) { if otherCollision.Solid && collision.Solid { mtd := MinimumTranslation(entityAABB, otherAABB) space.Position.X += mtd.X space.Position.Y += mtd.Y } Mailbox.Dispatch(CollisionMessage{Entity: entity, To: other}) } } } }