这段代码到底是怎么检查碰撞的
void Map::entities_collide(Pacman* pacman) {
list <Entity*> temp = entities;
for (Entity* entity : temp) {
if ((pacman->get_position()->GetX() == entity->get_position()->GetX()) && abs(pacman->get_position()->GetY() - entity->get_position()->GetY()) <= 2 ||
(pacman->get_position()->GetY() == entity->get_position()->GetY()) && abs(pacman->get_position()->GetX() - entity->get_position()->GetX()) <= 2) {
pacman->eat(*entity);
entities.remove(entity);
}
}
}
• • • • • • •
• • • E • • •
• • • E • • •
• E E P E E •
• • • E • • •
• • • E • • •
• • • • • • •
pacman是p,表达式测试该实体是否位于p或e中。如果是,pacman吃掉该实体。
当两个条件之一发生时,您的pacman
吃掉实体(因此在两个类似的子句之间有||):
- 如果
pacman
和entity
之间的X匹配,则为检查Y之间的差异是否在pacman's
内咬的范围,显然是2个正方形。 - 如果在
pacman
和entity
之间的Y是匹配的,那么它检查X之间的差异是否在pacman's
内咬的范围,显然是2个正方形。
这保留了pacman
只吃pacman
上方、下方、左侧或右侧的能力,但奇怪的是,它允许pacman
从它的位置上吃0、1或2个方块。
abs(pacman->get_position()->GetY() - entity->get_position()->GetY()) <= 2
找到沿Y轴的差值。如果差值的绝对值小于等于2,则pacman
按位。假设绝对值为2或更小,那么实际可能的值将是-2、-1、0、1或2。