仅在特定点工作的两个图像之间使用遮罩的碰撞
Collisions using masks between two images working at a specific point only
我尝试创建一个函数来检查静态图像和动态图像之间的碰撞。在函数中,我尝试创建一个移动图像(枪)的遮罩,以及存储在列表中并迭代的气球(静态图像)的遮罩。接下来,我在两个图像周围制作了一个矩形并检查了它们重叠的位置。当它们重叠时,它会打印出 collision with balloon #
。问题是,它只适用于特定位置,并不适用于所有气球。这是代码:
import pygame as pg
import random as r
import sys
pg.init()
screen = pg.display.set_mode((688 ,387)) # Size of the screen #
screen.fill('#ffffff')
radius = 30
diameter = 2 * radius
num_balloons = 7
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] - 100, y-90))
def check_collisions(x, y):
gun_rect = gun.get_rect(center=(x,y))
gun_mask = pg.mask.from_surface(gun)
for i in range(num_balloons):
balloon_rect = colors[i].get_rect()
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):
print(f"collision with balloon {i}")
# Vars #
x = 0
y = 250
velocity = 5
clock = pg.time.Clock()
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, (444,250))
b2 = pg.image.load('balloons/2.png').convert_alpha()
b2 = pg.transform.scale(b2, (444,250))
b3 = pg.image.load('balloons/3.png').convert_alpha()
b3 = pg.transform.scale(b3, (444,250))
b4 = pg.image.load('balloons/4.png').convert_alpha()
b4 = pg.transform.scale(b4, (444,250))
b5 = pg.image.load('balloons/5.png').convert_alpha()
b5 = pg.transform.scale(b5, (444,250))
b6 = pg.image.load('balloons/6.png').convert_alpha()
b6 = pg.transform.scale(b6, (444,250))
b7 = pg.image.load('balloons/7.png').convert_alpha()
b7 = pg.transform.scale(b7, (444,250))
colors = [b1, b2, b3, b4, b5, b6, b7]
gun = pg.image.load('game-gun.png')
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)
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()
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
screen.fill('#ffffff')
draw_balloons(y)
check_collisions(x, y)
screen.blit(gun, (x, y))
pg.display.update()
由于您需要图像来 运行 代码,您可以 运行 代码 at this REPL.
感谢任何帮助,
谢谢。
您必须设置 balloon_rect
的位置。气球绘制在位置 (balloon_list[i] - 100, y-90)
:
def draw_balloons(y):
for i in range(num_balloons):
screen.blit(colors[i], (balloon_list[i] - 100, y-90))
因此 balloon_rect
是:
balloon_rect = colors[i].get_rect()
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i]-100, y-90))
函数check_collisions
:
def check_collisions(x, y):
gun_rect = gun.get_rect(center = (x,y))
gun_mask = pg.mask.from_surface(gun)
for i in range(num_balloons):
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i]-100, y-90))
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):
print(f"collision with balloon {i}")
我尝试创建一个函数来检查静态图像和动态图像之间的碰撞。在函数中,我尝试创建一个移动图像(枪)的遮罩,以及存储在列表中并迭代的气球(静态图像)的遮罩。接下来,我在两个图像周围制作了一个矩形并检查了它们重叠的位置。当它们重叠时,它会打印出 collision with balloon #
。问题是,它只适用于特定位置,并不适用于所有气球。这是代码:
import pygame as pg
import random as r
import sys
pg.init()
screen = pg.display.set_mode((688 ,387)) # Size of the screen #
screen.fill('#ffffff')
radius = 30
diameter = 2 * radius
num_balloons = 7
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] - 100, y-90))
def check_collisions(x, y):
gun_rect = gun.get_rect(center=(x,y))
gun_mask = pg.mask.from_surface(gun)
for i in range(num_balloons):
balloon_rect = colors[i].get_rect()
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):
print(f"collision with balloon {i}")
# Vars #
x = 0
y = 250
velocity = 5
clock = pg.time.Clock()
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, (444,250))
b2 = pg.image.load('balloons/2.png').convert_alpha()
b2 = pg.transform.scale(b2, (444,250))
b3 = pg.image.load('balloons/3.png').convert_alpha()
b3 = pg.transform.scale(b3, (444,250))
b4 = pg.image.load('balloons/4.png').convert_alpha()
b4 = pg.transform.scale(b4, (444,250))
b5 = pg.image.load('balloons/5.png').convert_alpha()
b5 = pg.transform.scale(b5, (444,250))
b6 = pg.image.load('balloons/6.png').convert_alpha()
b6 = pg.transform.scale(b6, (444,250))
b7 = pg.image.load('balloons/7.png').convert_alpha()
b7 = pg.transform.scale(b7, (444,250))
colors = [b1, b2, b3, b4, b5, b6, b7]
gun = pg.image.load('game-gun.png')
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)
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()
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
screen.fill('#ffffff')
draw_balloons(y)
check_collisions(x, y)
screen.blit(gun, (x, y))
pg.display.update()
由于您需要图像来 运行 代码,您可以 运行 代码 at this REPL.
感谢任何帮助, 谢谢。
您必须设置 balloon_rect
的位置。气球绘制在位置 (balloon_list[i] - 100, y-90)
:
def draw_balloons(y): for i in range(num_balloons): screen.blit(colors[i], (balloon_list[i] - 100, y-90))
因此 balloon_rect
是:
balloon_rect = colors[i].get_rect()
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i]-100, y-90))
函数check_collisions
:
def check_collisions(x, y):
gun_rect = gun.get_rect(center = (x,y))
gun_mask = pg.mask.from_surface(gun)
for i in range(num_balloons):
balloon_rect = colors[i].get_rect(topleft = (balloon_list[i]-100, y-90))
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):
print(f"collision with balloon {i}")