Pygame:代码运行,但没有目标和十字准线的命中检测



我正在尝试用游戏中的目标创建命中检测。目前,我在屏幕上画了一个十字准线和敌人目标,但点击目标不会移动它们(它们不会被删除,它们应该在屏幕顶部重新出现(。抱歉,我是编码和stackoverflow的新手。我只包含了与该问题相关的代码。这是我的代码:

import pygame  
import random  
pygame.init()  
width, height = 800, 600  
screen = pygame.display.set_mode((width, height))  
pygame.display.set_caption('Shooter Game')  # caption not necessary  
pygame.mouse.set_visible(False)  
cross_hair = pygame.image.load('crosshair.png')
enemyImg = []  
enemyX = []  
enemyY = []  
enemyX_change = []  
enemyY_change = []  
numberOfEnemies = 6  
for i in range(numberOfEnemies):    
enemyImg.append(pygame.image.load('enemy.png'))  
enemyX.append(random.randint(0, 800))  
enemyY.append(random.randint(50, 80))  
enemyX_change.append(1)  
enemyY_change.append(40)  
def enemy(x, y, i):  
screen.blit(enemyImg[i], (x, y))
running = True  
while running:
screen.fill((128, 128, 128))  
screen.blit(background, (0, 0))  
for event in pygame.event.get():  
if event.type == pygame.QUIT:  
running = False  
if event.type == pygame.MOUSEMOTION:  
mouseX = event.pos[0]  
mouseY = event.pos[1]  
if event.type == pygame.MOUSEBUTTONDOWN:  
pygame.mixer.Channel(0).play(shootSound)  
for something in range(numberOfEnemies):  
theImg = enemyImg[something]  
rectangle = theImg.get_rect()  
pos = pygame.mouse.get_pos()  
if pos[0] > rectangle.topleft[0] and pos[0] < rectangle.bottomright[0]   
and pos[1] > rectangle.topleft[1] and pos[1] < rectangle.bottomright[1]:  
####THE ISSUE IS THE LINES ABOVE THIS ##### 
enemyX = random.randint(0, 800)  
enemyY = random.randint(50, 150)  
score_value += 1  
pygame.mixer.Channel(2).play(targetImpact)  
pos = pygame.mouse.get_pos()  
screen.blit(cross_hair, pos)  
show_score(textX, textY)  
pygame.display.flip()  

pygame.Surface没有位置。请注意,当blit曲面时,必须指定位置
get_rect()返回的pygame.Rect的位置为(0,0(。你必须设置一个位置,例如通过关键字参数:

theImg = enemyImg[something]  
rectangle = theImg.get_rect(topleft = (enemyX[something], enemyY[something]))

若你们想改变敌人的位置,你们必须设置(enemyX[something]enemyY[something](而不是(enemyX ,enemyY`(:

enemyX[something] = random.randint(0, 800)  
enemyY[something] = random.randint(50, 150)  

示例代码:

for something in range(numberOfEnemies):  
theImg = enemyImg[something]  
rectangle = theImg .get_rect(topleft = (enemyX[something], enemyY[something])) 

pos = pygame.mouse.get_pos()  
if rectangle.collidepoint(pos):  

enemyX[something] = random.randint(0, 800)  
enemyY[something] = random.randint(50, 150)  
score_value += 1  
pygame.mixer.Channel(2).play(targetImpact) 

Rabbid76已经回答了这个问题。我不是在处理这个问题。我只想添加一个建议来简化我注意到的其他内容,您可能需要在修复Rabbid76提供的内容后使用。

pygame-Rect类有一个方法来检测点是否与Rect碰撞。您可能希望使用collidepoint()方法,而不是当前使用的if pos[0] > rectangle.topleft[0] and ...方法:

if pos[0] > rectangle.topleft[0] and pos[0] < rectangle.bottomright[0]   
and pos[1] > rectangle.topleft[1] and pos[1] < rectangle.bottomright[1]:  

可以简化为:

if rectangle.collidepoint(pos):  

最新更新