无法正确重新定位存储在列表中的图像
Cannot properly reposition images stored in a list
我正在制作一款基于气球的游戏,而一把枪就是用来射气球的。
7 个气球图像存储在一个名为 colors
的列表中,另一个名为 balloon_list
的列表包含用于放置气球的所有随机生成的 x 值。当你击中气球时应该发生的是它应该消失然后再次随机化气球的 x 位置。我的问题是,当我击中某个气球时,它并没有随机化 x 位置并将其 blit 到屏幕,而是不断地这样做,它显示气球同时在不同的地方弹出。我尝试的是打乱所有 x 值的列表 (balloon_list)。这是我的代码:
import random as r
import sys
pg.init()
radius = 30
diameter = 2 * radius
num_balloons = 7
iterator = -1
def create_balloons():
global balloon_list
global colors
for i in range(num_balloons):
while True:
candidate = r.randint(0, 500)
if all(abs(candidate-x) >= diameter for x in balloon_list):
break
balloon_list.append(candidate)
def draw_balloons(y):
for i in range(num_balloons):
screen.blit(colors[i], (balloon_list[i] , y-50))
def check_collisions(x, y):
global hit_var
global hit
global score
global scoretext
for i in range(num_balloons):
gun_rect = gun.get_rect(topleft = (x,y))
gun_mask = pg.mask.from_surface(gun)
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i], y-100))
balloon_mask = pg.mask.from_surface(colors[i])
offset = (balloon_rect.x - gun_rect.x), (balloon_rect.y - gun_rect.y)
if gun_mask.overlap(balloon_mask, offset):
hit = True
hit_var = i
print(f'hit balloon: {i}')
colors[i].fill((0,0,0))
screen.fill((0,0,0))
# Vars #
x = 0
y = 250
velocity = 5
score = 0
hit = False
testvar1 = True
clock = pg.time.Clock()
screen = pg.display.set_mode((688 ,387)) # Size of the screen #
screen.fill('#ffffff')
caption = pg.display.set_caption("Remember") # Title of the window #
balloon_list = []
b1 = pg.image.load('balloons/1.png').convert_alpha()
b1 = pg.transform.scale(b1, (63,131))
b2 = pg.image.load('balloons/2.png').convert_alpha()
b2 = pg.transform.scale(b2, (63,131))
b3 = pg.image.load('balloons/3.png').convert_alpha()
b3 = pg.transform.scale(b3, (63,131))
b4 = pg.image.load('balloons/4.png').convert_alpha()
b4 = pg.transform.scale(b4, (63,131))
b5 = pg.image.load('balloons/5.png').convert_alpha()
b5 = pg.transform.scale(b5, (63,131))
b6 = pg.image.load('balloons/6.png').convert_alpha()
b6 = pg.transform.scale( b6, (63,131))
b7 = pg.image.load('balloons/7.png').convert_alpha()
b7 = pg.transform.scale(b7, (63,131))
colors = [b1, b2, b3, b4, b5, b6, b7]
gun = pg.image.load('game-gun.png').convert_alpha()
gun = pg.transform.scale(gun, (150,150))
create_balloons()
pg.display.flip() # Updating #
running = True # Game loop bool #
while running: # Game loop #
clock.tick(60)
if hit == True:
r.shuffle(balloon_list)
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
pg.quit()
sys.exit()
draw_balloons(y)
keys = pg.key.get_pressed()
x += keys[pg.K_RIGHT] - keys[pg.K_LEFT] * velocity
x -= keys[pg.K_LEFT] - keys[pg.K_RIGHT] * velocity
if keys[pg.K_SPACE]:
check_collisions(x, y)
print(balloon_list)
screen.blit(gun, (x, y))
pg.display.update()
枪和气球图片可以在这里下载:Images posted on repl
我认为这个问题与在 while 循环中 blitting 图像有关,因此它会永远不断地改变 balloon_list 中的 x 位置,但我不确定如何解决它。
P.S:我的真实代码中有一个if hit = False
的子句,所以在shuffle代码后添加hit = False
是行不通的。
感谢任何帮助,
谢谢
使用 KEYDOW
事件而不是 pygame.key.get_pressed()
来检测何时按下 SPACE。 pygame.key.get_pressed()
导致在 SPACE 按下一次时发射多发子弹
pygame.key.get_pressed()
returns a list with the state of each key. If a key is held down, the state for the key is True
, otherwise False
. Use pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。将键盘事件用于单个操作。
调用 shuffle
后,必须设置变量 hit
False
。没有办法解决它:
while running: # Game loop #
clock.tick(60)
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
if event.key == pg.K_SPACE:
check_collisions(x, y)
print(balloon_list)
keys = pg.key.get_pressed()
x += keys[pg.K_RIGHT] - keys[pg.K_LEFT] * velocity
x -= keys[pg.K_LEFT] - keys[pg.K_RIGHT] * velocity
draw_balloons(y)
if hit == True:
r.shuffle(balloon_list)
hit = False
pg.quit()
sys.exit()
如果点击还导致出现特定背景,则您需要对其进行更改。设置不同的变量来改变背景。
我正在制作一款基于气球的游戏,而一把枪就是用来射气球的。
7 个气球图像存储在一个名为 colors
的列表中,另一个名为 balloon_list
的列表包含用于放置气球的所有随机生成的 x 值。当你击中气球时应该发生的是它应该消失然后再次随机化气球的 x 位置。我的问题是,当我击中某个气球时,它并没有随机化 x 位置并将其 blit 到屏幕,而是不断地这样做,它显示气球同时在不同的地方弹出。我尝试的是打乱所有 x 值的列表 (balloon_list)。这是我的代码:
import random as r
import sys
pg.init()
radius = 30
diameter = 2 * radius
num_balloons = 7
iterator = -1
def create_balloons():
global balloon_list
global colors
for i in range(num_balloons):
while True:
candidate = r.randint(0, 500)
if all(abs(candidate-x) >= diameter for x in balloon_list):
break
balloon_list.append(candidate)
def draw_balloons(y):
for i in range(num_balloons):
screen.blit(colors[i], (balloon_list[i] , y-50))
def check_collisions(x, y):
global hit_var
global hit
global score
global scoretext
for i in range(num_balloons):
gun_rect = gun.get_rect(topleft = (x,y))
gun_mask = pg.mask.from_surface(gun)
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i], y-100))
balloon_mask = pg.mask.from_surface(colors[i])
offset = (balloon_rect.x - gun_rect.x), (balloon_rect.y - gun_rect.y)
if gun_mask.overlap(balloon_mask, offset):
hit = True
hit_var = i
print(f'hit balloon: {i}')
colors[i].fill((0,0,0))
screen.fill((0,0,0))
# Vars #
x = 0
y = 250
velocity = 5
score = 0
hit = False
testvar1 = True
clock = pg.time.Clock()
screen = pg.display.set_mode((688 ,387)) # Size of the screen #
screen.fill('#ffffff')
caption = pg.display.set_caption("Remember") # Title of the window #
balloon_list = []
b1 = pg.image.load('balloons/1.png').convert_alpha()
b1 = pg.transform.scale(b1, (63,131))
b2 = pg.image.load('balloons/2.png').convert_alpha()
b2 = pg.transform.scale(b2, (63,131))
b3 = pg.image.load('balloons/3.png').convert_alpha()
b3 = pg.transform.scale(b3, (63,131))
b4 = pg.image.load('balloons/4.png').convert_alpha()
b4 = pg.transform.scale(b4, (63,131))
b5 = pg.image.load('balloons/5.png').convert_alpha()
b5 = pg.transform.scale(b5, (63,131))
b6 = pg.image.load('balloons/6.png').convert_alpha()
b6 = pg.transform.scale( b6, (63,131))
b7 = pg.image.load('balloons/7.png').convert_alpha()
b7 = pg.transform.scale(b7, (63,131))
colors = [b1, b2, b3, b4, b5, b6, b7]
gun = pg.image.load('game-gun.png').convert_alpha()
gun = pg.transform.scale(gun, (150,150))
create_balloons()
pg.display.flip() # Updating #
running = True # Game loop bool #
while running: # Game loop #
clock.tick(60)
if hit == True:
r.shuffle(balloon_list)
for event in pg.event.get():
if event.type == pg.QUIT:
pg.quit()
sys.exit()
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
pg.quit()
sys.exit()
draw_balloons(y)
keys = pg.key.get_pressed()
x += keys[pg.K_RIGHT] - keys[pg.K_LEFT] * velocity
x -= keys[pg.K_LEFT] - keys[pg.K_RIGHT] * velocity
if keys[pg.K_SPACE]:
check_collisions(x, y)
print(balloon_list)
screen.blit(gun, (x, y))
pg.display.update()
枪和气球图片可以在这里下载:Images posted on repl
我认为这个问题与在 while 循环中 blitting 图像有关,因此它会永远不断地改变 balloon_list 中的 x 位置,但我不确定如何解决它。
P.S:我的真实代码中有一个if hit = False
的子句,所以在shuffle代码后添加hit = False
是行不通的。
感谢任何帮助, 谢谢
使用 KEYDOW
事件而不是 pygame.key.get_pressed()
来检测何时按下 SPACE。 pygame.key.get_pressed()
导致在 SPACE 按下一次时发射多发子弹
pygame.key.get_pressed()
returns a list with the state of each key. If a key is held down, the state for the key is True
, otherwise False
. Use pygame.key.get_pressed()
评估按钮的当前状态并获得连续移动。
键盘事件(参见 pygame.event 模块)仅在键状态改变时发生一次。 KEYDOWN
事件在每次按下一个键时发生一次。 KEYUP
每松开一个键就会出现一次。将键盘事件用于单个操作。
调用 shuffle
后,必须设置变量 hit
False
。没有办法解决它:
while running: # Game loop #
clock.tick(60)
for event in pg.event.get():
if event.type == pg.QUIT:
running = False
if event.type == pg.KEYDOWN:
if event.key == pg.K_ESCAPE:
running = False
if event.key == pg.K_SPACE:
check_collisions(x, y)
print(balloon_list)
keys = pg.key.get_pressed()
x += keys[pg.K_RIGHT] - keys[pg.K_LEFT] * velocity
x -= keys[pg.K_LEFT] - keys[pg.K_RIGHT] * velocity
draw_balloons(y)
if hit == True:
r.shuffle(balloon_list)
hit = False
pg.quit()
sys.exit()
如果点击还导致出现特定背景,则您需要对其进行更改。设置不同的变量来改变背景。