我一直在尝试添加碰撞检测一段时间,似乎无法做到这一点..
要绘制我的地图,我只是使用x,y coords:
from setup import *
treeload = "Images/tree.jpg"
tree = pygame.image.load(treeload).convert_alpha()
class drawtree:
def __init__(self, x, width, step1, y, height, step2):
self.x = x
self.y = y
self.width = width
self.height = height
self.step1 = step1
self.step2 = step2
def draw(self):
for x in range(self.x, self.x+self.width, self.step1):
for y in range(self.y, self.y+self.height, self.step2):
window.blit(tree, (x,y))
t1 = drawtree(100, 100, 20, 0, 90, 30)
t2 = drawtree(400, 300, 20, 0, 90, 30)
t3 = drawtree(100, 270, 20, 450, 150, 30)
t4 = drawtree(400, 300, 20, 450, 150, 30)
trees = [t1, t2, t3 ,t4]
使用这种方法我想出了这个检测:
from setup import *
from drawtree import *
from player import *
def wall_detect(x1, y1, w1, h1, x2, y2, w2, h2):
if (x2+w2>=x1>=x2 and y2+h2>=y1>=y2):
return True
elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1>=y2):
return True
elif (x2+w2>=x1>=x2 and y2+h2>=y1+h1>=y2):
return True
elif (x2+w2>=x1+w1>=x2 and y2+h2>=y1+h1>=y2):
return True
else:
return False
我一直在尝试使用for循环来遍历树,以检测玩家(一个矩形)是否穿过树,但我无法想到任何事情。
我试过
for i in trees:
collision = wall_detect(player.x, player.y, player.width, player.height, i.x, i.y, i.width, i.height)
player.update(collision)
如果collision = true,player.update(collision)会将矩形更改为红色,如果为false,则将其变为黑色。
我尝试过使用,例如:
for i in trees:
if wall_detect(player.x, player.y, player.width, player.height, i.x, i.y, i.width, i.height) == wall_detect(player.x, player.y, player.width, player.height, t1.x, t1.y, t1.width, t1.height):
collision = wall_detect(player.x, player.y, player.width, player.height, t1.x, t1.y, t1.width, t1.height)
player.update(collision)
if wall_detect(player.x, player.y, player.width, player.height, i.x, i.y, i.width, i.height) == wall_detect(player.x, player.y, player.width, player.height, t2.x, t2.y, t2.width, t2.height):
collision = wall_detect(player.x, player.y, player.width, player.height, t2.x, t2.y, t2.width, t2.height)
player.update(collision)
等..但是这不起作用,它只适用于1 if语句,其余的注释掉。
答案 0 :(得分:2)
一个问题是这个循环的性质:
for i in trees:
collision = wall_detect(player.x, player.y, player.width, player.height, i.x, i.y, i.width, i.height)
player.update(collision)
假设玩家与trees
中的第一棵树发生碰撞。然后collision
将为True,但for
循环继续。因此,如果玩家与列表中的最后一棵树发生碰撞,collision
将只会变为True。有多种方法可以解决这个问题。
# Change the assignment to check if it is already true
collision = False
for i in trees:
collision = collision or wall_detect(...
或
# Exit the loop if it is true
for i in trees:
collision = wall_detect(...)
if collision:
break
或
# Turn it into a function that returns when it is true
def walls_detect(player, trees):
for tree in trees:
if wall_detect(...):
return True
return False
...
# Call it like this
player.update(walls_detect(player, trees))
碰撞发生时的逻辑对我来说是正确的,尽管它也可以简化:
def wall_detect(x1, y1, w1, h1, x2, y2, w2, h2):
return (x2+w2>=x1>=x2 or x2+w2>=x1+w1>=x2) and (y2+h2>=y1>=y2 or y2+h2>=y1+h1>=y2)