Частичное столкновение между объектом - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сделать гоночную игру в пигмейки.Он включает в себя «автомобиль», который является просто четырехугольником и трассой в форме PNG.Прямо сейчас, игра очень проста, но я хочу, чтобы машина, даже на один пиксель, отклонялась от трассы - событие, которое должно быть запущено.Я сделал очень простую версию кода, приведенную ниже, которую я хотел бы исправить, а также изображение трека, пожалуйста, кто-нибудь может мне помочь с этим? enter image description here

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()  

1 Ответ

0 голосов
/ 14 декабря 2018

Во-первых, вы не хотите проверять, совпадает ли маска автомобиля с маской трека.Вы хотите проверить, перекрывается ли автомобильная маска маской дорожки , а не .

Кроме того, ваше смещение неверно.Вы должны проверить 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()  

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...