为什么我的 pygame 碰撞检测不起作用?
Why does my pygame collision detections not work?
我对 Python 和 Pygame 比较陌生。我正在制作一个圆圈出现在 window 上随机位置的游戏,您必须触摸它才能获得分数。我已将其编程为在您触摸圆圈时传送到另一个随机位置。问题是当我尝试检测圆圈和玩家之间的碰撞时,它基本上会不停地传送圆圈。我还制作了一个打印功能,当它检测到碰撞时打印 hi 并且它还不停地打印。我通常会尝试找出问题所在,但我真的看不出我做错了什么,我将不胜感激所有给予的帮助。
enter code here
import pygame
import random
vel = 2
pygame.init()
pygame.font.init()
fps = 60
win = pygame.display.set_mode((900, 500), pygame.RESIZABLE)
pygame.display.set_caption("Test")
#icon = pygame.image.load('icon.png')
#pygame.display.set_icon(icon)
background = pygame.image.load('Background.png')
ghost = pygame.image.load("ghost.png")
ghostrect = ghost.get_rect()
circle = pygame.image.load("circle.png")
circlerect = circle.get_rect()
def main():
a = random.randint(0, 900)
b = random.randint(0, 500)
clock = pygame.time.Clock()
run = True
while run:
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_d] and ghostrect.x + 55 <= 900:
ghostrect.x += vel
if keys_pressed[pygame.K_a] and ghostrect.x + 5 >= 0:
ghostrect.x -= vel
if keys_pressed[pygame.K_s] and ghostrect.y + 63 <= 500:
ghostrect.y += vel
if keys_pressed[pygame.K_w] and ghostrect.y >= 0:
ghostrect.y -= vel
if circlerect.colliderect(ghostrect):
a = random.randint(0, 900)
b = random.randint(0, 500)
win.blit(background, (0, 0))
win.blit(circle, (a, b))
win.blit(ghost, (ghostrect.x + 500, ghostrect.y + 210))
pygame.display.update()
clock.tick(fps)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if __name__ == "__main__":
main()
您还没有设置 ghostrect
的值。默认情况下,pygame.Rect
对象的位置值为0。你也没有设置circlerect
的值,所以它的位置也是在(0, 0)。
因此,现在 if circlerect.colliderect(ghostrect):
将永远 return 为真。
您需要做的就是给他们位置值来解决问题。
给ghostrect
一些位置。我选择了 (100, 100),完全由你决定。
ghostrect = ghost.get_rect()
#give the rect some position value
ghostrect.x = 100
ghostrect.y = 100
给 circlerect
随机位置而不是分配给 a
和 b
.
def main():
#remove them
#a = random.randint(0, 900) #this
#b = random.randint(0, 500) #and this
circlerect.x = random.randint(0, 900)#add this
circlerect.y = random.randint(0, 500)#and add this
#...
while run:
#...
if circlerect.colliderect(ghostrect):
#remove this
#a = random.randint(0, 900) #this
#b = random.randint(0, 500) #and this
circlerect.x = random.randint(0, 900)#add this
circlerect.y = random.randint(0, 500)#and add this
然后在这个位置画圆而不是a
和b
。
win.blit(circle, (circlerect.x, circlerect.y))
我对 Python 和 Pygame 比较陌生。我正在制作一个圆圈出现在 window 上随机位置的游戏,您必须触摸它才能获得分数。我已将其编程为在您触摸圆圈时传送到另一个随机位置。问题是当我尝试检测圆圈和玩家之间的碰撞时,它基本上会不停地传送圆圈。我还制作了一个打印功能,当它检测到碰撞时打印 hi 并且它还不停地打印。我通常会尝试找出问题所在,但我真的看不出我做错了什么,我将不胜感激所有给予的帮助。
enter code here
import pygame
import random
vel = 2
pygame.init()
pygame.font.init()
fps = 60
win = pygame.display.set_mode((900, 500), pygame.RESIZABLE)
pygame.display.set_caption("Test")
#icon = pygame.image.load('icon.png')
#pygame.display.set_icon(icon)
background = pygame.image.load('Background.png')
ghost = pygame.image.load("ghost.png")
ghostrect = ghost.get_rect()
circle = pygame.image.load("circle.png")
circlerect = circle.get_rect()
def main():
a = random.randint(0, 900)
b = random.randint(0, 500)
clock = pygame.time.Clock()
run = True
while run:
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_d] and ghostrect.x + 55 <= 900:
ghostrect.x += vel
if keys_pressed[pygame.K_a] and ghostrect.x + 5 >= 0:
ghostrect.x -= vel
if keys_pressed[pygame.K_s] and ghostrect.y + 63 <= 500:
ghostrect.y += vel
if keys_pressed[pygame.K_w] and ghostrect.y >= 0:
ghostrect.y -= vel
if circlerect.colliderect(ghostrect):
a = random.randint(0, 900)
b = random.randint(0, 500)
win.blit(background, (0, 0))
win.blit(circle, (a, b))
win.blit(ghost, (ghostrect.x + 500, ghostrect.y + 210))
pygame.display.update()
clock.tick(fps)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
if __name__ == "__main__":
main()
您还没有设置 ghostrect
的值。默认情况下,pygame.Rect
对象的位置值为0。你也没有设置circlerect
的值,所以它的位置也是在(0, 0)。
因此,现在 if circlerect.colliderect(ghostrect):
将永远 return 为真。
您需要做的就是给他们位置值来解决问题。
给ghostrect
一些位置。我选择了 (100, 100),完全由你决定。
ghostrect = ghost.get_rect()
#give the rect some position value
ghostrect.x = 100
ghostrect.y = 100
给 circlerect
随机位置而不是分配给 a
和 b
.
def main():
#remove them
#a = random.randint(0, 900) #this
#b = random.randint(0, 500) #and this
circlerect.x = random.randint(0, 900)#add this
circlerect.y = random.randint(0, 500)#and add this
#...
while run:
#...
if circlerect.colliderect(ghostrect):
#remove this
#a = random.randint(0, 900) #this
#b = random.randint(0, 500) #and this
circlerect.x = random.randint(0, 900)#add this
circlerect.y = random.randint(0, 500)#and add this
然后在这个位置画圆而不是a
和b
。
win.blit(circle, (circlerect.x, circlerect.y))