python - 当墙壁是一组并且我的精灵在另一组时如何实现墙壁碰撞
问题描述
我正在制作一个游戏,其中玩家通过关卡,目标随机通过关卡并且有守卫(还不是游戏的一部分)。我在实现墙壁碰撞时遇到了麻烦,因为我的精灵是圆形而我的墙壁是矩形,所以我也不知道如何做到这一点,墙壁和精灵在不同的类和组中。
我曾考虑为我的精灵使用蒙版,但我对如何做到这一点没有信心。我也不知道如何设计墙壁碰撞的方法,因为当前的玩家将我的玩家(我也没有让它为目标工作)到任何墙的底部。
class characters(pygame.sprite.Sprite):
def __init__(self, colour, width, height):
super().__init__()
self.colour = colour
self.width = width
self.height = height
self.image = pygame.Surface([self.width, self.height])
self.image.fill(white)
self.image.set_colorkey(white)
self.rect = self.image.get_rect()
pygame.draw.circle(self.image, self.colour, [int(self.width/2), int(self.height/2)], int(self.width/2))
def moveRight(self, pixels):
self.rect.x += pixels
def moveLeft(self, pixels):
self.rect.x -= pixels
def moveUp(self, pixels):
self.rect.y -= pixels
def moveDown(self, pixels):
self.rect.y += pixels
def moveRandom(self, pixels, clockrate, count, xdirection, ydirection):
self.rect.x += pixels * xdirection
self.rect.y += pixels * ydirection
#print(self.rect.x,self.rect.y)
def wallCollide(self):
x = self.rect.x
for xpos in [-5,5]:
self.rect.x += xpos
if pygame.sprite.spritecollide(self, wallSet, False, pygame.sprite.collide_rect):
self.rect.x -= xpos
else:
self.rect.x = x
y = self.rect.y
for ypos in [-5,5]:
self.rect.y += ypos
if pygame.sprite.spritecollide(self, wallSet, False, pygame.sprite.collide_rect):
self.rect.y -= ypos
else:
self.rect.y = y
我在下面的墙类中尝试了一个面具,不认为它有效。
class walls(pygame.sprite.Sprite):
def __init__(self, x, y, width, height):
super().__init__()
self.width = width
self.height = height
self.x = x
self.y = y
self.image = pygame.Surface([width,height])
self.image.fill(black)
#self.image.set_colorkey(black) Using this will make the walls invisible as I have textured walls drawn over
self.rect = self.image.get_rect(topleft=(self.x, self.y))
pygame.mask.from_surface(self.image)
我只给了一堵墙并降低了分辨率,因为在我编写代码时它更容易。分辨率应为 1920 x 1080。使用 600 x 650 查看两面墙。
characterSet = pygame.sprite.Group()
player = characters(black, 30, 30)
target = characters(green, 30, 30)
characterSet.add(player, target)
wallSet = pygame.sprite.Group()
Wall1 = walls(288,176, 200,142)
Wall2 = walls(286,427, 201,140)
wallSet.add(Wall1,Wall2)
主游戏循环
while not end:
for event in pygame.event.get():
if event.type == pygame.QUIT:
end = True
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player.moveLeft(5)
if keys[pygame.K_RIGHT]:
player.moveRight(5)
if keys[pygame.K_UP]:
player.moveUp(5)
if keys[pygame.K_DOWN]:
player.moveDown(5)
if count%clockrate == 0:
xdirection = random.choice(direction)
ydirection = random.choice(direction)
target.moveRandom(2, clockrate, count, xdirection, ydirection)
count += 1
if pygame.sprite.spritecollide(player, wallSet, False, pygame.sprite.collide_rect):
player.wallCollide()
gameDisplay.blit(level1,[0,0])
wallSet.draw(gameDisplay)
gameDisplay.blit(innerWalls,[0,0])
characterSet.draw(gameDisplay)
解决方案
如果我理解正确,您有一个墙壁对象列表和一个角色对象列表,并且您想检查所有对象之间的碰撞。这可以通过遍历两个列表来快速完成:
for wall in WallSet:
for character in CharacterSet:
character.checkCollision(wall)
该checkCollision()
方法可以非常简单,检查对象周围的矩形是否重叠只需几个 if 语句。如果您希望此checkCollisions()
方法适用于圆角字符,您需要编写一些更花哨的东西。我会建议:
编写一个函数,该函数将给出一个矩形内最接近另一个点的点(困难的部分!虽然我确信网上有关于如何做到这一点的教程)
取墙矩形内的那个点,检查它是否离角色的中间位置足够远,不会发生碰撞。
希望这会有所帮助!对于未来的问题,我建议尝试非常清楚地提出 1 个问题并减少您进一步发布的代码。对于您提出的问题,您发布的代码量太多,并且可能在过去 2 天内拒绝了潜在的回答者。
推荐阅读
- json - 在嵌套数组中查询具有重复 id 的对象的 mongodb 文档
- firefox - 如何解决这个firefox问题:没有连接?
- javascript - 从循环中设置状态
- reactjs - 在 Karma 测试中找不到函数组件中的 ReactJS 静态道具
- statistics - 在 python 中约束 VAR 模型
- python - 将字典列表的 Python 数据框列转换为具有单个元素的列
- docker - Docker compose:[Errno 111] 连接被拒绝 - 多容器应用程序中的网络失败
- intellij-idea - 如何禁用
测试? - javascript - 无法让节点快速服务器运行
- java - 我们如何仅通过实现 Comparable 接口对 Objects 的元素进行排序?