gpt4 book ai didi

python - 为什么我的程序没有显示我告诉它的 Hitbox?

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:47 26 4
gpt4 key购买 nike

我试图为我的 pygame 游戏中的每个对象绘制一个碰撞框,但碰撞框不显示。

这是我定义碰撞箱和敌人其他方面的类。

class Enemy:
def __init__(self, y, width, height):
self.width = width
self.height = height
self.vel = 1.5
self.y = y
self.x = random.randrange(screen_width - 64 * 2)
self.index = random.choice(number)
self.hitboxes = [(self.x + 68, self.y + 68, self.width - 10, self.height - 14),
(self.x + 38, self.y + 47, self.width + 20, self.height - 5),
(self.x + 18, self.y + 12, self.width + 32, self.height + 30),
(self.x + 20, self.y + 32, self.width + 16, self.height + 5),
(self.x + 4, self.y + 7, self.width - 24, self.height - 31)] # hitbox list
self.hitbox = self.hitboxes[self.index] # selecting hitbox from list

def draw(self, win):
win.blit(asteroids[self.index], (self.x, self.y))
pygame.draw.rect(win, (255, 0, 0), self.hitbox, 2) # trying to draw the hitbox

这是re_draw函数

def re_draw():
win.fill((0, 0, 0))
[...]
for a in asteroids_on_screen:
a.draw(win) # this is where I draw the object
[...]
pygame.display.update()

这里是主循环和与我想要显示碰撞框的敌人/对象相关联的变量。

asteroids = [pygame.image.load('rock0.png'), pygame.image.load('rock1.png'), pygame.image.load('rock2.png'),
pygame.image.load('rock3.png'), pygame.image.load('rock4.png')]

number = [0, 1, 2, 3, 4]

asteroids_on_screen = []

rock = Enemy(-140, 64, 64)

[...]

run = True
while run:
last = pygame.time.get_ticks()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == my_event_id:
x = random.randrange(screen_width - 64 * 2)
index = random.choice(number)
asteroids_on_screen.append(Enemy(rock.y, rock.width, rock.height))

for a in asteroids_on_screen:
if -141 < a.y < 500:
a.y += a.vel
else:
asteroids_on_screen.pop(asteroids_on_screen.index(a))

[...]

最佳答案

碰撞箱不会随着小行星“移动”。如果你想让这种方法起作用,那么你必须在小行星的位置改变时改变碰撞框的 y 坐标。例如:

for a in asteroids_on_screen:
if -141 < a.y < 500:
a.y += a.vel
a.hitbox = (a.hitbox[0], a.hitbox[1]+a.vel, a.hitbox[2], a.hitbox[3])
else:
asteroids_on_screen.pop(asteroids_on_screen.index(a))

但我建议在draw 中计算hitbox。例如创建 property currenthitbox,返回当前的命中框:

class Enemy:
def __init__(self, y, width, height):
self.width = width
self.height = height
self.vel = 1.5
self.y = y
self.x = random.randrange(screen_width - 64 * 2)
self.index = random.choice(number)
self.hitboxes = [(68, 68, - 10, - 14),
(38, 47, + 20, - 5),
(18, 12, + 32, + 30),
(20, 32, + 16, + 5),
(4, 7, - 24, - 31)]
self.hitbox = self.hitboxes[self.index]

@property
def currenthitbox(self):
return (self.hitbox[0]+self.x, self.hitbox[1]+self.y, self.hitbox[2]+self.width, self.hitbox[3]+self.height)

def draw(self, win):
win.blit(asteroids[self.index], (self.x, self.y))
pygame.draw.rect(win, (255, 0, 0), self.currenthitbox, 2)

关于python - 为什么我的程序没有显示我告诉它的 Hitbox?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57857774/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com