我正在尝试用游戏中的目标创建命中检测。目前,我在屏幕上画了一个十字准线和敌人目标,但点击目标不会移动它们(它们不会被删除,它们应该在屏幕顶部重新出现(。抱歉,我是编码和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):