我正试着制作一款游戏。它涉及一个“汽车”,这只是一个四边形和一个轨道的巴布亚新几内亚形式。现在,游戏是非常基本的,但我想要做的是,当汽车甚至偏离一个像素的轨道,一个事件被触发。我已经做了一个非常简单的版本,下面是我想要修复的代码,以及轨道的图片,请有人帮我这个?

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() 发布于 2018-12-14 08:02:36
首先,你不想检查汽车面罩是否与追踪面罩重叠。您需要检查汽车掩码是否与非跟踪掩码重叠。
另外,你的偏移量是错的。您必须检查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()

https://stackoverflow.com/questions/53770053
复制相似问题