Pygame 碰撞点功能未按预期工作
Pygame Collidepoint Function Not Working As Desired
我正在与 Python 的 PyGame 一起编写一款双人坦克游戏,并且已经完成了大部分内容。为我的工作提供一些背景知识,该游戏涉及两辆可以相互发射炮弹的坦克,一旦其中一辆被击中,另一名玩家就会获得一分。该过程一直持续到一名玩家达到 10 分,此时他们被宣布为获胜者,游戏和计时器将重置。
我在屏幕上画了一个迷宫来补充游戏并增加一些创造性,现在我的问题出现了。我 运行 遇到了一个基本问题。 Pygame .collidepoint
未按预期运行。我打算让它每次从任一坦克发射的子弹击中迷宫墙时,它应该消失,因为墙壁是坚不可摧的。然而,该功能是任意选择子弹是否在接触时消失 - 正如我希望的那样 - 或继续通过 - 我不希望它消失。有谁知道为什么会这样?我开始假设它与 .collidepoint
对坐标的解释有关,我已经对此进行了测试,但没有成功。有没有更好的方法或功能来解决这个问题?如果有人能告诉我问题是否出在我认为的地方,并告诉我 how/give 一小段调整后的代码来解决它,我们将不胜感激。我的整个代码很长,所以我只包含了我认为必要的代码,以提供有关我正在做的事情的足够信息。
但是,我仍然会清楚地强调我遇到的问题的部分,这些部分是由围绕代码部分的注释组成的大型显式块。如果上下文需要更多代码,请告诉我,我可以提供。
import pygame
import random
import time
pygame.init()
screenWidth = 700
screenHeight = 700
screen = pygame.display.set_mode((screenWidth,screenHeight))
#---------------------------------------------------------#
#Very important function, moves tanks/bullets appropriately, keeps time and score.
def redraw():
screen.blit(background, (0,0))
#DRAW SPRITES TO SCREEN
tank.draw(screen)
tank2.draw(screen)
global barrier
barrier = pygame.draw.rect(screen,WHITE, pygame.Rect((100,0),(5,150)))
global barrier2
barrier2 = pygame.draw.rect(screen,WHITE, pygame.Rect((0,40), (50, 5)))
global barrier3
barrier3 = pygame.draw.rect(screen,WHITE, pygame.Rect((50, 120), (50, 5)))
global barrier4
barrier4 = pygame.draw.rect(screen, WHITE, pygame.Rect((100, 150), (100,5)))
global barrier5
barrier5 = pygame.draw.rect(screen,WHITE, pygame.Rect((0,175),(50,5)))
global barrier6
barrier6 = pygame.draw.rect(screen,WHITE, pygame.Rect((150, 100),(5, 50)))
global barrier7
barrier7 = pygame.draw.rect(screen,WHITE, pygame.Rect((150, 50), (550,5)))
global barrier8
barrier8 = pygame.draw.rect(screen, WHITE, pygame.Rect((50,175),(5,50)))
global barrier9
barrier9 = pygame.draw.rect(screen, WHITE, pygame.Rect((50,225),(100,5)))
global barrier10
barrier10 = pygame.draw.rect(screen,WHITE, pygame.Rect((200,50),(5,50)))
global barrier11
barrier11 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,100),(50,5)))
global barrier12
barrier12 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,150),(50,5)))
global barrier13
barrier13 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,100),(5,50)))
global barrier14
barrier14 = pygame.draw.rect(screen,WHITE, pygame.Rect((75, 500),(350,5)))
global barrier15
barrier15 = pygame.draw.rect(screen,WHITE,pygame.Rect((250, 225),(5,200)))
global barrier16
barrier16 = pygame.draw.rect(screen,WHITE,pygame.Rect((150,225),(5,200)))
global barrier17
barrier17 = pygame.draw.rect(screen,WHITE,pygame.Rect((350,225),(5,200)))
global barrier18
barrier18 = pygame.draw.rect(screen,WHITE,pygame.Rect((350,425),(200,5)))
global barrier19
barrier19 = pygame.draw.rect(screen,WHITE,pygame.Rect((550,425),(5,75)))
global barrier20
barrier20 = pygame.draw.rect(screen,WHITE,pygame.Rect((625,225),(5,325)))
global barrier21
barrier21 = pygame.draw.rect(screen,WHITE,pygame.Rect((380,550),(250,5)))
global barrier22
barrier22 = pygame.draw.rect(screen,WHITE,pygame.Rect((305,625),(325,5)))
global barrier23
barrier23 = pygame.draw.rect(screen,WHITE,pygame.Rect((305,550),(5,75)))
global barrier24
barrier24 = pygame.draw.rect(screen,WHITE,pygame.Rect((230, 550),(75,5)))
global barrier25
barrier25 = pygame.draw.rect(screen,WHITE,pygame.Rect((230,550),(5,75)))
global barrier26
barrier26 = pygame.draw.rect(screen,WHITE,pygame.Rect((160,625),(75,5)))
global barrier27
barrier27 = pygame.draw.rect(screen,WHITE,pygame.Rect((160,625),(5,75)))
global barrier28
barrier28 = pygame.draw.rect(screen,WHITE,pygame.Rect((50,575),(5,50)))
global barrier29
barrier29 = pygame.draw.rect(screen,WHITE,pygame.Rect((50,575),(65,5)))
global barrier30
barrier30 = pygame.draw.rect(screen,WHITE,pygame.Rect((70,420),(5,155)))
global barrier31
barrier31 = pygame.draw.rect(screen,WHITE,pygame.Rect((0,500),(30,5)))
global barrier32
barrier32 = pygame.draw.rect(screen,WHITE,pygame.Rect((45,420),(30,5)))
global barrier33
barrier33 = pygame.draw.rect(screen,WHITE,pygame.Rect((430,225), (200,5)))
global barrier34
barrier34 = pygame.draw.rect(screen,WHITE,pygame.Rect((530,125),(5,100)))
global barrier35
barrier35 = pygame.draw.rect(screen,WHITE,pygame.Rect((625,175),(75,5)))
global barrier36
barrier36 = pygame.draw.rect(screen,WHITE, pygame.Rect((650,200),(50,5)))
#Draw bullets to screen
for bullet in bullets:
bullet.draw(screen)
for bullet in bullets2:
bullet.draw(screen)
pygame.display.update()
while run:
if hCounter1 < 10 and hCounter2 < 10:
clock.tick(30)
previous = passedTime
passedTime = round(time.time() - begin,2)
timer = timer + passedTime - previous
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_m: #to shoot projectiles
px, py = round(tank.x + tank.width // 2), round(tank.y + tank.height // 2)
if len(bullets) < 1:
bullets.append(projectile(px, py, 4, (255,255,255), direction))
if event.key == pygame.K_q:
px2, py2 = round(tank2.x + tank2.width // 1.7), round(tank2.y + tank2.height // 2)
if len(bullets2) < 1:
bullets2.append(projectile2(px2, py2, 4, (255,255,255), direction2))
for bullet in bullets[:]:
bullet.move()
window_rect = pygame.Rect(0, 0, screenWidth, screenHeight)
if not window_rect.collidepoint((bullet.x, bullet.y)):
bullets.pop(bullets.index(bullet)) #if off the screen, delete bullet
#------------------------FOR THE FIRST TANK -- THE CONDITIONS OF THIS IF STATEMENTS IS WHERE I BELIEVE THE BUG IS OCCURRING AND WHERE IT MUST BE RESOLVED----------#
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if barrier.collidepoint((bullet.x + 3, bullet.y + 3)) or barrier2.collidepoint((bullet.x, bullet.y)) or barrier3.collidepoint((bullet.x, bullet.y)) or barrier4.collidepoint((bullet.x, bullet.y)) or barrier5.collidepoint((bullet.x, bullet.y)) or barrier6.collidepoint((bullet.x, bullet.y)) or barrier7.collidepoint((bullet.x, bullet.y)) or barrier8.collidepoint((bullet.x, bullet.y)) or barrier9.collidepoint((bullet.x, bullet.y)) or barrier10.collidepoint((bullet.x, bullet.y)) or barrier11.collidepoint((bullet.x, bullet.y)) or barrier12.collidepoint((bullet.x, bullet.y)) or barrier13.collidepoint((bullet.x, bullet.y)) or barrier14.collidepoint((bullet.x, bullet.y)) or barrier15.collidepoint((bullet.x, bullet.y)) or barrier16.collidepoint((bullet.x, bullet.y)) or barrier17.collidepoint((bullet.x, bullet.y)) or barrier18.collidepoint((bullet.x, bullet.y)) or barrier19.collidepoint((bullet.x, bullet.y)) or barrier20.collidepoint((bullet.x, bullet.y)) or barrier21.collidepoint((bullet.x, bullet.y)) or barrier22.collidepoint((bullet.x, bullet.y)) or barrier23.collidepoint((bullet.x, bullet.y)) or barrier24.collidepoint((bullet.x, bullet.y)) or barrier25.collidepoint((bullet.x, bullet.y)) or barrier26.collidepoint((bullet.x, bullet.y)) or barrier27.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier29.collidepoint((bullet.x, bullet.y)) or barrier30.collidepoint((bullet.x, bullet.y)) or barrier31.collidepoint((bullet.x, bullet.y)) or barrier32.collidepoint((bullet.x, bullet.y)) or barrier33.collidepoint((bullet.x, bullet.y)) or barrier34.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x,bullet.y)):
bullets.pop(bullets.index(bullet)) #if it touches a wall, delete bullet
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if bullet.y - bullet.radius < tank2.hitbox[1] + tank2.hitbox[3] and bullet.y + bullet.radius > tank2.hitbox[1]:
if bullet.x + bullet.radius > tank2.hitbox[0] and bullet.x - bullet.radius < tank2.hitbox[0] + tank2.hitbox[2]:
hCounter1 += 1
tank2.x, tank2.y = random.randint(1,475), random.randint(20,475)
tank.x, tank.y = random.randint(1,475), random.randint(20,475)
tank2.hit(screen)
bullets.pop(bullets.index(bullet))
for bullet in bullets2[:]:
bullet.move()
window_rect2 = pygame.Rect(0,0, screenWidth, screenHeight)
if not window_rect2.collidepoint((bullet.x, bullet.y)):
bullets2.pop(bullets2.index(bullet))
if bullet.y - bullet.radius < tank.hitbox[1] + tank.hitbox[3] and bullet.y + bullet.radius > tank.hitbox[1]:
if bullet.x + bullet.radius > tank.hitbox[0] and bullet.x - bullet.radius < tank.hitbox[0] + tank.hitbox[2]:
hCounter2 += 1
tank2.x, tank2.y = random.randint(1,475), random.randint(20,475)
tank.x, tank.y = random.randint(1,475), random.randint(20,475)
tank.hit()
bullets2.pop(bullets2.index(bullet))
#------------------------FOR THE SECOND TANK -- THE CONDITIONS OF THIS IF STATEMENTS IS WHERE I BELIEVE THE BUG IS OCCURRING AND WHERE IT MUST BE RESOLVED----------#
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if barrier.collidepoint((bullet.x + 3, bullet.y + 3)) or barrier2.collidepoint((bullet.x, bullet.y)) or barrier3.collidepoint((bullet.x, bullet.y)) or barrier4.collidepoint((bullet.x, bullet.y)) or barrier5.collidepoint((bullet.x, bullet.y)) or barrier6.collidepoint((bullet.x, bullet.y)) or barrier7.collidepoint((bullet.x, bullet.y)) or barrier8.collidepoint((bullet.x, bullet.y)) or barrier9.collidepoint((bullet.x, bullet.y)) or barrier10.collidepoint((bullet.x, bullet.y)) or barrier11.collidepoint((bullet.x, bullet.y)) or barrier12.collidepoint((bullet.x, bullet.y)) or barrier13.collidepoint((bullet.x, bullet.y)) or barrier14.collidepoint((bullet.x, bullet.y)) or barrier15.collidepoint((bullet.x, bullet.y)) or barrier16.collidepoint((bullet.x, bullet.y)) or barrier17.collidepoint((bullet.x, bullet.y)) or barrier18.collidepoint((bullet.x, bullet.y)) or barrier19.collidepoint((bullet.x, bullet.y)) or barrier20.collidepoint((bullet.x, bullet.y)) or barrier21.collidepoint((bullet.x, bullet.y)) or barrier22.collidepoint((bullet.x, bullet.y)) or barrier23.collidepoint((bullet.x, bullet.y)) or barrier24.collidepoint((bullet.x, bullet.y)) or barrier25.collidepoint((bullet.x, bullet.y)) or barrier26.collidepoint((bullet.x, bullet.y)) or barrier27.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier29.collidepoint((bullet.x, bullet.y)) or barrier30.collidepoint((bullet.x, bullet.y)) or barrier31.collidepoint((bullet.x, bullet.y)) or barrier32.collidepoint((bullet.x, bullet.y)) or barrier33.collidepoint((bullet.x, bullet.y)) or barrier34.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x, bullet.y)) or barrier36.collidepoint((bullet.x, bullet.y)):
bullets.pop(bullets.index(bullet))
答案在于子弹的速度,因为它的速度太快以至于程序无法捕捉到它的滴答声,这实际上允许子弹穿过迷宫的墙壁。
可以把时钟调整到每秒60帧,这样:
clock.tick(60)
然后在射弹 class 中,或者任何确定子弹速度的地方 - 必须将其调整为时钟速率。
如果您的速度是 8,显示的时钟速率为 30,则将时钟速率调整为 60,该速度的一半或大约与速度与您想要的速度之比相等。就我而言:
def __init__(self,x, y, radius, color, direction):
#ESTABLISH ALL DIMENSIONS
self.x = x
self.y = y
self.radius = radius
self.color = color
self.direction = direction
self.vel = 5 #if it was previously 8 with a clock tick of 30.
程序应该能够在滴答声中抓住子弹并在它穿过墙壁之前将其停止。并且子弹在屏幕上移动的相对速度应该保持不变——记住也要相应地调整其他移动物体的速度,比如精灵。
我正在与 Python 的 PyGame 一起编写一款双人坦克游戏,并且已经完成了大部分内容。为我的工作提供一些背景知识,该游戏涉及两辆可以相互发射炮弹的坦克,一旦其中一辆被击中,另一名玩家就会获得一分。该过程一直持续到一名玩家达到 10 分,此时他们被宣布为获胜者,游戏和计时器将重置。
我在屏幕上画了一个迷宫来补充游戏并增加一些创造性,现在我的问题出现了。我 运行 遇到了一个基本问题。 Pygame .collidepoint
未按预期运行。我打算让它每次从任一坦克发射的子弹击中迷宫墙时,它应该消失,因为墙壁是坚不可摧的。然而,该功能是任意选择子弹是否在接触时消失 - 正如我希望的那样 - 或继续通过 - 我不希望它消失。有谁知道为什么会这样?我开始假设它与 .collidepoint
对坐标的解释有关,我已经对此进行了测试,但没有成功。有没有更好的方法或功能来解决这个问题?如果有人能告诉我问题是否出在我认为的地方,并告诉我 how/give 一小段调整后的代码来解决它,我们将不胜感激。我的整个代码很长,所以我只包含了我认为必要的代码,以提供有关我正在做的事情的足够信息。
但是,我仍然会清楚地强调我遇到的问题的部分,这些部分是由围绕代码部分的注释组成的大型显式块。如果上下文需要更多代码,请告诉我,我可以提供。
import pygame
import random
import time
pygame.init()
screenWidth = 700
screenHeight = 700
screen = pygame.display.set_mode((screenWidth,screenHeight))
#---------------------------------------------------------#
#Very important function, moves tanks/bullets appropriately, keeps time and score.
def redraw():
screen.blit(background, (0,0))
#DRAW SPRITES TO SCREEN
tank.draw(screen)
tank2.draw(screen)
global barrier
barrier = pygame.draw.rect(screen,WHITE, pygame.Rect((100,0),(5,150)))
global barrier2
barrier2 = pygame.draw.rect(screen,WHITE, pygame.Rect((0,40), (50, 5)))
global barrier3
barrier3 = pygame.draw.rect(screen,WHITE, pygame.Rect((50, 120), (50, 5)))
global barrier4
barrier4 = pygame.draw.rect(screen, WHITE, pygame.Rect((100, 150), (100,5)))
global barrier5
barrier5 = pygame.draw.rect(screen,WHITE, pygame.Rect((0,175),(50,5)))
global barrier6
barrier6 = pygame.draw.rect(screen,WHITE, pygame.Rect((150, 100),(5, 50)))
global barrier7
barrier7 = pygame.draw.rect(screen,WHITE, pygame.Rect((150, 50), (550,5)))
global barrier8
barrier8 = pygame.draw.rect(screen, WHITE, pygame.Rect((50,175),(5,50)))
global barrier9
barrier9 = pygame.draw.rect(screen, WHITE, pygame.Rect((50,225),(100,5)))
global barrier10
barrier10 = pygame.draw.rect(screen,WHITE, pygame.Rect((200,50),(5,50)))
global barrier11
barrier11 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,100),(50,5)))
global barrier12
barrier12 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,150),(50,5)))
global barrier13
barrier13 = pygame.draw.rect(screen,WHITE, pygame.Rect((375,100),(5,50)))
global barrier14
barrier14 = pygame.draw.rect(screen,WHITE, pygame.Rect((75, 500),(350,5)))
global barrier15
barrier15 = pygame.draw.rect(screen,WHITE,pygame.Rect((250, 225),(5,200)))
global barrier16
barrier16 = pygame.draw.rect(screen,WHITE,pygame.Rect((150,225),(5,200)))
global barrier17
barrier17 = pygame.draw.rect(screen,WHITE,pygame.Rect((350,225),(5,200)))
global barrier18
barrier18 = pygame.draw.rect(screen,WHITE,pygame.Rect((350,425),(200,5)))
global barrier19
barrier19 = pygame.draw.rect(screen,WHITE,pygame.Rect((550,425),(5,75)))
global barrier20
barrier20 = pygame.draw.rect(screen,WHITE,pygame.Rect((625,225),(5,325)))
global barrier21
barrier21 = pygame.draw.rect(screen,WHITE,pygame.Rect((380,550),(250,5)))
global barrier22
barrier22 = pygame.draw.rect(screen,WHITE,pygame.Rect((305,625),(325,5)))
global barrier23
barrier23 = pygame.draw.rect(screen,WHITE,pygame.Rect((305,550),(5,75)))
global barrier24
barrier24 = pygame.draw.rect(screen,WHITE,pygame.Rect((230, 550),(75,5)))
global barrier25
barrier25 = pygame.draw.rect(screen,WHITE,pygame.Rect((230,550),(5,75)))
global barrier26
barrier26 = pygame.draw.rect(screen,WHITE,pygame.Rect((160,625),(75,5)))
global barrier27
barrier27 = pygame.draw.rect(screen,WHITE,pygame.Rect((160,625),(5,75)))
global barrier28
barrier28 = pygame.draw.rect(screen,WHITE,pygame.Rect((50,575),(5,50)))
global barrier29
barrier29 = pygame.draw.rect(screen,WHITE,pygame.Rect((50,575),(65,5)))
global barrier30
barrier30 = pygame.draw.rect(screen,WHITE,pygame.Rect((70,420),(5,155)))
global barrier31
barrier31 = pygame.draw.rect(screen,WHITE,pygame.Rect((0,500),(30,5)))
global barrier32
barrier32 = pygame.draw.rect(screen,WHITE,pygame.Rect((45,420),(30,5)))
global barrier33
barrier33 = pygame.draw.rect(screen,WHITE,pygame.Rect((430,225), (200,5)))
global barrier34
barrier34 = pygame.draw.rect(screen,WHITE,pygame.Rect((530,125),(5,100)))
global barrier35
barrier35 = pygame.draw.rect(screen,WHITE,pygame.Rect((625,175),(75,5)))
global barrier36
barrier36 = pygame.draw.rect(screen,WHITE, pygame.Rect((650,200),(50,5)))
#Draw bullets to screen
for bullet in bullets:
bullet.draw(screen)
for bullet in bullets2:
bullet.draw(screen)
pygame.display.update()
while run:
if hCounter1 < 10 and hCounter2 < 10:
clock.tick(30)
previous = passedTime
passedTime = round(time.time() - begin,2)
timer = timer + passedTime - previous
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_m: #to shoot projectiles
px, py = round(tank.x + tank.width // 2), round(tank.y + tank.height // 2)
if len(bullets) < 1:
bullets.append(projectile(px, py, 4, (255,255,255), direction))
if event.key == pygame.K_q:
px2, py2 = round(tank2.x + tank2.width // 1.7), round(tank2.y + tank2.height // 2)
if len(bullets2) < 1:
bullets2.append(projectile2(px2, py2, 4, (255,255,255), direction2))
for bullet in bullets[:]:
bullet.move()
window_rect = pygame.Rect(0, 0, screenWidth, screenHeight)
if not window_rect.collidepoint((bullet.x, bullet.y)):
bullets.pop(bullets.index(bullet)) #if off the screen, delete bullet
#------------------------FOR THE FIRST TANK -- THE CONDITIONS OF THIS IF STATEMENTS IS WHERE I BELIEVE THE BUG IS OCCURRING AND WHERE IT MUST BE RESOLVED----------#
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if barrier.collidepoint((bullet.x + 3, bullet.y + 3)) or barrier2.collidepoint((bullet.x, bullet.y)) or barrier3.collidepoint((bullet.x, bullet.y)) or barrier4.collidepoint((bullet.x, bullet.y)) or barrier5.collidepoint((bullet.x, bullet.y)) or barrier6.collidepoint((bullet.x, bullet.y)) or barrier7.collidepoint((bullet.x, bullet.y)) or barrier8.collidepoint((bullet.x, bullet.y)) or barrier9.collidepoint((bullet.x, bullet.y)) or barrier10.collidepoint((bullet.x, bullet.y)) or barrier11.collidepoint((bullet.x, bullet.y)) or barrier12.collidepoint((bullet.x, bullet.y)) or barrier13.collidepoint((bullet.x, bullet.y)) or barrier14.collidepoint((bullet.x, bullet.y)) or barrier15.collidepoint((bullet.x, bullet.y)) or barrier16.collidepoint((bullet.x, bullet.y)) or barrier17.collidepoint((bullet.x, bullet.y)) or barrier18.collidepoint((bullet.x, bullet.y)) or barrier19.collidepoint((bullet.x, bullet.y)) or barrier20.collidepoint((bullet.x, bullet.y)) or barrier21.collidepoint((bullet.x, bullet.y)) or barrier22.collidepoint((bullet.x, bullet.y)) or barrier23.collidepoint((bullet.x, bullet.y)) or barrier24.collidepoint((bullet.x, bullet.y)) or barrier25.collidepoint((bullet.x, bullet.y)) or barrier26.collidepoint((bullet.x, bullet.y)) or barrier27.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier29.collidepoint((bullet.x, bullet.y)) or barrier30.collidepoint((bullet.x, bullet.y)) or barrier31.collidepoint((bullet.x, bullet.y)) or barrier32.collidepoint((bullet.x, bullet.y)) or barrier33.collidepoint((bullet.x, bullet.y)) or barrier34.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x,bullet.y)):
bullets.pop(bullets.index(bullet)) #if it touches a wall, delete bullet
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if bullet.y - bullet.radius < tank2.hitbox[1] + tank2.hitbox[3] and bullet.y + bullet.radius > tank2.hitbox[1]:
if bullet.x + bullet.radius > tank2.hitbox[0] and bullet.x - bullet.radius < tank2.hitbox[0] + tank2.hitbox[2]:
hCounter1 += 1
tank2.x, tank2.y = random.randint(1,475), random.randint(20,475)
tank.x, tank.y = random.randint(1,475), random.randint(20,475)
tank2.hit(screen)
bullets.pop(bullets.index(bullet))
for bullet in bullets2[:]:
bullet.move()
window_rect2 = pygame.Rect(0,0, screenWidth, screenHeight)
if not window_rect2.collidepoint((bullet.x, bullet.y)):
bullets2.pop(bullets2.index(bullet))
if bullet.y - bullet.radius < tank.hitbox[1] + tank.hitbox[3] and bullet.y + bullet.radius > tank.hitbox[1]:
if bullet.x + bullet.radius > tank.hitbox[0] and bullet.x - bullet.radius < tank.hitbox[0] + tank.hitbox[2]:
hCounter2 += 1
tank2.x, tank2.y = random.randint(1,475), random.randint(20,475)
tank.x, tank.y = random.randint(1,475), random.randint(20,475)
tank.hit()
bullets2.pop(bullets2.index(bullet))
#------------------------FOR THE SECOND TANK -- THE CONDITIONS OF THIS IF STATEMENTS IS WHERE I BELIEVE THE BUG IS OCCURRING AND WHERE IT MUST BE RESOLVED----------#
#######################################################################################################################################
#######################################################################################################################################
##################################################################################################################################################
if barrier.collidepoint((bullet.x + 3, bullet.y + 3)) or barrier2.collidepoint((bullet.x, bullet.y)) or barrier3.collidepoint((bullet.x, bullet.y)) or barrier4.collidepoint((bullet.x, bullet.y)) or barrier5.collidepoint((bullet.x, bullet.y)) or barrier6.collidepoint((bullet.x, bullet.y)) or barrier7.collidepoint((bullet.x, bullet.y)) or barrier8.collidepoint((bullet.x, bullet.y)) or barrier9.collidepoint((bullet.x, bullet.y)) or barrier10.collidepoint((bullet.x, bullet.y)) or barrier11.collidepoint((bullet.x, bullet.y)) or barrier12.collidepoint((bullet.x, bullet.y)) or barrier13.collidepoint((bullet.x, bullet.y)) or barrier14.collidepoint((bullet.x, bullet.y)) or barrier15.collidepoint((bullet.x, bullet.y)) or barrier16.collidepoint((bullet.x, bullet.y)) or barrier17.collidepoint((bullet.x, bullet.y)) or barrier18.collidepoint((bullet.x, bullet.y)) or barrier19.collidepoint((bullet.x, bullet.y)) or barrier20.collidepoint((bullet.x, bullet.y)) or barrier21.collidepoint((bullet.x, bullet.y)) or barrier22.collidepoint((bullet.x, bullet.y)) or barrier23.collidepoint((bullet.x, bullet.y)) or barrier24.collidepoint((bullet.x, bullet.y)) or barrier25.collidepoint((bullet.x, bullet.y)) or barrier26.collidepoint((bullet.x, bullet.y)) or barrier27.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier28.collidepoint((bullet.x, bullet.y)) or barrier29.collidepoint((bullet.x, bullet.y)) or barrier30.collidepoint((bullet.x, bullet.y)) or barrier31.collidepoint((bullet.x, bullet.y)) or barrier32.collidepoint((bullet.x, bullet.y)) or barrier33.collidepoint((bullet.x, bullet.y)) or barrier34.collidepoint((bullet.x, bullet.y)) or barrier35.collidepoint((bullet.x, bullet.y)) or barrier36.collidepoint((bullet.x, bullet.y)):
bullets.pop(bullets.index(bullet))
答案在于子弹的速度,因为它的速度太快以至于程序无法捕捉到它的滴答声,这实际上允许子弹穿过迷宫的墙壁。
可以把时钟调整到每秒60帧,这样:
clock.tick(60)
然后在射弹 class 中,或者任何确定子弹速度的地方 - 必须将其调整为时钟速率。
如果您的速度是 8,显示的时钟速率为 30,则将时钟速率调整为 60,该速度的一半或大约与速度与您想要的速度之比相等。就我而言:
def __init__(self,x, y, radius, color, direction):
#ESTABLISH ALL DIMENSIONS
self.x = x
self.y = y
self.radius = radius
self.color = color
self.direction = direction
self.vel = 5 #if it was previously 8 with a clock tick of 30.
程序应该能够在滴答声中抓住子弹并在它穿过墙壁之前将其停止。并且子弹在屏幕上移动的相对速度应该保持不变——记住也要相应地调整其他移动物体的速度,比如精灵。