我正在尝试制作一个pygame赛车游戏。它涉及一个“汽车”,它只是一个四边形和一个PNG形式的轨道。现在,游戏是非常基本的,但是我想要做的是,当汽车偏离单个像素甚至偏离轨道时,就会触发一个事件。我已经制作了一个非常简单的代码版本,下面是我要修复的代码以及曲目的图片,请有人帮我解决这个问题吗?
import pygame
from pygame.math import Vector2
pygame.init()
clock = pygame.time.Clock()
WIDTH = 900
HEIGHT = 550
screen = pygame.display.set_mode((WIDTH, HEIGHT))
abc = pygame.image.load("trackimagelinkinthepost")
track = pygame.transform.scale(abc, (100,75))
thetrack = track
REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
redangle = 180
redspeed = 3
x = 800
y = 500
pos_red = Vector2(x,y)
vel_red = Vector2(-redspeed,0)
redcar = REDCAR_ORIGINAL
pygame.draw.polygon(
REDCAR_ORIGINAL, (255, 0, 0), [(0, 30), (50, 20), (50, 10), (0, 0)])
redrect = redcar.get_rect(center=pos_red)
trackrect = thetrack.get_rect(topleft=(0,0))
mask_red = pygame.mask.from_surface(redcar)
track_mask = pygame.mask.from_surface(thetrack)
myevent = True
while myevent:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
redangle += 3
vel_red.rotate_ip(-3)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
# We need a new mask after the rotation.
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
redangle -= 3
vel_red.rotate_ip(3)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
redrect = redcar.get_rect(center=redrect.center)
mask_red = pygame.mask.from_surface(redcar)
pos_red += vel_red
redrect.center = pos_red
offset = redrect[0] - trackrect[0], redrect[1] - trackrect[1]
offtrack = mask_red.overlap(track_mask, offset)
if not offtrack:
print("HI")
screen.fill((100,255,100))
screen.blit(abc,(0,-50))
screen.blit(redcar, redrect)
pygame.display.flip()
clock.tick(120)
pygame.quit()
答案 0 :(得分:1)
首先,您不想检查汽车遮罩是否与轨道遮罩重叠。您要检查汽车遮罩是否与 not 轨道遮罩重叠。
此外,您的偏移量是错误的。您必须检查not-track-mask.overlap(car-mask, car-position)
而不是car-mask.overlap(track-mask, car-position)
。
这是一个解决方法的示例(我也简化了一些事情):
import pygame
import pygame.freetype
from pygame.math import Vector2
pygame.init()
clock = pygame.time.Clock()
WIDTH = 900
HEIGHT = 550
screen = pygame.display.set_mode((WIDTH, HEIGHT))
track_image = pygame.image.load("trackimagelinkinthepost.png").convert_alpha()
REDCAR_ORIGINAL = pygame.Surface((50, 30), pygame.SRCALPHA)
redangle = 0
redspeed = 2
pos_red = Vector2(200, 200)
vel_red = Vector2(redspeed, 0)
redcar = REDCAR_ORIGINAL
pygame.draw.polygon(REDCAR_ORIGINAL, pygame.Color('dodgerblue'), [(0, 30), (50, 20), (50, 10), (0, 0)])
mask_red = pygame.mask.from_surface(redcar)
off_mask = pygame.mask.from_surface(track_image)
off_mask.invert()
font = pygame.freetype.SysFont(None, 42, True, True)
s=False
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
redangle += 3
vel_red.rotate_ip(-3)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
mask_red = pygame.mask.from_surface(redcar)
elif keys[pygame.K_RIGHT]:
redangle -= 3
vel_red.rotate_ip(3)
redcar = pygame.transform.rotate(REDCAR_ORIGINAL, redangle)
mask_red = pygame.mask.from_surface(redcar)
pos_red += vel_red
redcar_pos = list(int(v) for v in pos_red)
offtrack = off_mask.overlap(mask_red, redcar_pos)
screen.fill(pygame.Color('grey12'))
screen.blit(track_image, (0, 0))
if offtrack:
font.render_to(screen, (250, 20), '!!! OFFTRACK !!!', pygame.Color('orange'))
screen.blit(redcar, redcar_pos)
pygame.display.flip()
clock.tick(60)
pygame.quit()