python - 如何检测我的两个图像是否在 Pygame 中接触?
问题描述
我正在制作一款 ASL 手势掉落的游戏,您需要将它们接在桶中。当标志接触桶时,我希望它打印出他们正在接触。如果他们不是,我希望它打印出他们没有接触。如何检测图像是否接触?我已经有一些矩形碰撞代码,但它只是不断地打印出它们正在触摸其中一个标志,即使它们不是。提前感谢您能给我的任何帮助!PS 很抱歉输入了我所有的代码,但我不确定需要查看什么来帮助解决我的问题。
我查看了许多涉及图像碰撞的问题和答案,但我似乎无法让它在我的代码中工作。我“突出显示”了我认为导致问题的代码。
import random
import pygame
pygame.init()
pygame.mixer.init()
#define functions
def newPlacement():
screen.blit(choiceASL, (x,y))
screen.blit(choiceASL2, (x2,y2))
screen.blit(choiceASL3, (x3,y3))
def bucketStuff():
screen.blit(bucketPic, (bucketX, bucketY))
'''
def ifCollided():
if bucketRect.colliderect(choiceASLRect):
print("You collided with choice1!")
elif bucketRect.colliderect(choiceASL2Rect):
print("You collided with choice2!")
elif bucketRect.colliderect(choiceASL3Rect):
print("You collided with choice3!")
else:
print("Not touching.")
'''
#define stuff below: var, funct, def, etc.
aslABCSList = ("AslA.png", "AslB.png", "AslC.png", "AslD.png")
randHandsign = random.choice(aslABCSList)
randHandsign2 = random.choice(aslABCSList)
randHandsign3 = random.choice(aslABCSList)
choiceASL = pygame.image.load(randHandsign)
choiceASLRect = choiceASL.get_rect()
choiceASL2 = pygame.image.load(randHandsign2)
choiceASL2Rect = choiceASL2.get_rect()
choiceASL3 = pygame.image.load(randHandsign3)
choiceASL3Rect = choiceASL3.get_rect()
bucketPic = pygame.image.load("bucketPic.png")
bucketRect = bucketPic.get_rect()
screen = pygame.display.set_mode((700, 600))
Black = [0, 0, 0]
White = [255, 255, 255]
y = 0
y2 = 0
y3 = 0
x = int(random.randrange(1,650,25))
x2 = int(random.randrange(1,650,25))
x3 = int(random.randrange(1,650,50))
bucketX = 300
bucketY = 540
#to make the main work
done = False
#allows fps rate
clock = pygame.time.Clock()
#basically main, put anything that you want to run consistently until the user exits below.
while not done:
for event in pygame.event.get():
if event.type == pygame.QUIT:
done = True
#vvv Put all main code here! vvv
screen.fill(White)
bucketStuff()
newPlacement()
pressed = pygame.key.get_pressed()
if pressed[pygame.K_LEFT]: bucketX -= 3
if pressed[pygame.K_RIGHT]: bucketX += 3
ifCollided()
y+=1
y2+=2
y3+=3
#below is basically a refresh, so that everything is updated. Put code before this!
pygame.display.flip()
#60 fps
clock.tick(50)
解决方案
对象的返回.get_rect()
一个pygame.Surface
具有表面大小的矩形,但位于 (0, 0) 位置。
您必须设置图像的位置 ( pygame.Rect
):
例如:
choiceASL = pygame.image.load(randHandsign)
choiceASLRect = choiceASL.get_rect()
# [...]
bucketPic = pygame.image.load("bucketPic.png")
bucketRect = bucketPic.get_rect()
# [...]
while not done:
# [...]
if pressed[pygame.K_LEFT]: bucketX -= 3
if pressed[pygame.K_RIGHT]: bucketX += 3
bucketRect.topleft = (bucketX, bucketY)
choiceASLRect.topleft = (x, y)
# [...]
ifCollided()
一旦正确设置了矩形的位置,碰撞测试将按预期工作。
推荐阅读
- python-3.x - 如何解决virtualenv中的“没有名为'cPickle'的模块”异常
- python - Python Plotting API:如何通过烧瓶 API 公开您的科学 Python 图?
- swift - 如何根据用户给出的数量使用循环显示AZ字符?
- javascript - 将 pug 编译的内容附加到 pug 模板
- git - Visual Studio 2017 的多个 Git 存储库
- javascript - jsx 和 React 中的动态标签名称不传递道具
- php - 我无法在 wordpress 中使用 elementor 编辑我的主页
- gradle - gradle 中的自定义配置
- python - 在 Python 中使用带有 R 语法的 statsmodels.api 进行逻辑回归
- azure - Azure 应用程序网关中的失败请求列表