2017-10-21 2 views
1

파이 게임에서 레이싱 게임을 만들려고합니다. 차가 트랙을 벗어나면 속도가 느려지 길 바랍니다. 나는 트랙의 윤곽선 인 또 다른 스프라이트를 가지고 이것을하려고했는데, 자동차가 스프라이트에 닿으면 속도가 느려진다. 이것은 작동하지 않으며 이유를 모르겠습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?파이 게임에서 스프라이트 마스크 충돌 문제가 발생했습니다.

Traceback (most recent call last): File "C:\Users\Daniella\Desktop\Python\Games\game.py", line 75, in if pygame.sprite.collide_mask(Img, BackHit): File "C:\Users\Daniella\AppData\Roaming\Python\Python36\site-packages\pygame\sprite.py", line 1470, in collide_mask xoffset = right.rect[0] - left.rect[0] AttributeError: 'pygame.Surface' object has no attribute 'rect'

이 코드입니다 :

Img

내가이 오류 코드가 윤곽 경마장

BackHit 차 이미지

Back

import pygame 

Width = 800 
Height = 600 

Black = (0, 0, 0) 
White = (255, 255, 255) 
Red = (255, 0, 0) 
Green = (0, 255, 0) 
Blue = (0, 0, 255) 
Yellow = (255, 255, 0) 
BackColour = (198, 151, 107) 

pygame.init() 
GameDisplay = pygame.display.set_mode((Width, Height)) 
pygame.display.set_caption("A bit Racey") 
Clock = pygame.time.Clock() 

Img = pygame.image.load("download.png") 
ImgWidth = 46 
ImgHeight = 68 
Img = pygame.transform.scale(Img, (ImgWidth, ImgHeight)) 

Back = pygame.image.load("back1.png") 
BackWidth = Width*4 
BackHeight = Height*4 
Back = pygame.transform.scale(Back, (BackWidth, BackHeight)) 

BackHit = pygame.image.load("back1 hit1.png") 
BackHitWidth = Width*4 
BackHitHeight = Height*4 
BackHit = pygame.transform.scale(BackHit, (BackHitWidth, BackHitHeight)) 

def Car(): 
    GameDisplay.blit(Img, (400-ImgWidth/2, 300-ImgHeight/2)) 

def Background(X, Y): 
    GameDisplay.blit(Back, (X, Y)) 

def BackgroundHit(X, Y): 
    GameDisplay.blit(BackHit, (X, Y)) 

X = (Width*0.45) 
Y = (Height*0.5) 

XChange = 0 
YChange = 0 

Changer = 1 

Crashed = False 

while not Crashed: 
    for Event in pygame.event.get(): 
     if Event.type == pygame.QUIT: 
      Crashed = True 
     elif Event.type == pygame.KEYDOWN: 
      if Event.key == pygame.K_LEFT: 
       Img = pygame.transform.rotate(Img, -90) 
       XChange = 5/Changer 
      elif Event.key == pygame.K_RIGHT: 
       Img = pygame.transform.rotate(Img, 90) 
       XChange = -5/Changer 
      elif Event.key == pygame.K_UP: 
       Img = pygame.transform.rotate(Img, 0) 
       YChange = 5/Changer 
      elif Event.key == pygame.K_DOWN: 
       Img = pygame.transform.rotate(Img, 180) 
       YChange = -5/Changer 
     if Event.type == pygame.KEYUP: 
      if Event.key == pygame.K_LEFT or Event.key == pygame.K_RIGHT: 
       XChange = 0 
      elif Event.key == pygame.K_UP or Event.key == pygame.K_DOWN: 
       YChange = 0 
    if pygame.sprite.collide_mask(Img, BackHit): 
     Changer = 2 
    Y += YChange 
    X += XChange 
    GameDisplay.fill(White) 
    BackgroundHit(X, Y) 
    Background(X, Y) 
    Car() 
    pygame.display.update() 
    Clock.tick(200) 

pygame.quit() 
quit() 
+0

'pygame.sprite.collide_mask'는'pygame.Surface's가 아닌'pygame.Sprite'와 함께 작동합니다. 'pygame.Sprite' 클래스 사용법을 알고 있습니까? 그렇지 않다면 [튜토리얼] (http://programarcadegames.com/index.php?chapter=introduction_to_sprites&lang=en#section_13)을 확인하십시오. 또는 [서페이스에서 마스크 만들기] (http://renesd.blogspot.com/2017/03/pixel-perfect-collision-detection-in.html) 만 만들면됩니다. – skrx

+0

나는'pygame.sprite.Sprite'가 아니라'pygame.sprite.Sprite'를 의미했습니다. – skrx

답변

0

다음은 픽셀 완전 충돌 감지에 pygame.mask.from_surfacepygame.Mask.overlap을 사용하는 방법을 보여주는 약간의 예입니다.

import pygame as pg 

# Transparent surfaces with a circle and a triangle. 
circle_surface = pg.Surface((60, 60), pg.SRCALPHA) 
pg.draw.circle(circle_surface, (30, 90, 200), (30, 30), 30) 
triangle_surface = pg.Surface((60, 60), pg.SRCALPHA) 
pg.draw.polygon(triangle_surface, (160, 250, 0), ((30, 0), (60, 60), (0, 60))) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    # Use `pygame.mask.from_surface` to get the masks. 
    circle_mask = pg.mask.from_surface(circle_surface) 
    triangle_mask = pg.mask.from_surface(triangle_surface) 

    # Also create rects for the two images/surfaces. 
    circle_rect = circle_surface.get_rect(center=(320, 240)) 
    triangle_rect = triangle_surface.get_rect(center=(0, 0)) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEMOTION: 
       triangle_rect.center = event.pos 

     # Now calculate the offset between the rects. 
     offset_x = triangle_rect.x - circle_rect.x 
     offset_y = triangle_rect.y - circle_rect.y 

     # And pass the offset to the `overlap` method of the mask. 
     overlap = circle_mask.overlap(triangle_mask, (offset_x, offset_y)) 
     if overlap: 
      print('The two masks overlap!', overlap) 

     screen.fill((30, 30, 30)) 
     screen.blit(circle_surface, circle_rect) 
     screen.blit(triangle_surface, triangle_rect) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 

는 배경 마스크를 생성하거나 자동차가 충돌 여부를 확인 후 별도의 이미지를 생성하고 중 차량이 감속해야한다 트랙 투명 또는 지역을 떠나 필요 추적하려면 트랙 또는 외부 영역. 여기에서 녹색 삼각형이 "트랙"(파란색 선)과 충돌하는지 확인하고 게임에서 충돌이 트랙과 충돌하지 않으면 차를 느리게 만듭니다.

import pygame as pg 


bg_surface = pg.Surface((640, 480), pg.SRCALPHA) 
pg.draw.lines(
    bg_surface, (30, 90, 200), True, 
    ((60, 130), (300, 50), (600, 200), (400, 400), (150, 300)), 
    12) 
triangle_surface = pg.Surface((60, 60), pg.SRCALPHA) 
pg.draw.polygon(triangle_surface, (160, 250, 0), ((30, 0), (60, 60), (0, 60))) 


def main(): 
    screen = pg.display.set_mode((640, 480)) 
    clock = pg.time.Clock() 

    bg_mask = pg.mask.from_surface(bg_surface) 
    triangle_mask = pg.mask.from_surface(triangle_surface) 

    bg_rect = bg_surface.get_rect(center=(320, 240)) 
    triangle_rect = triangle_surface.get_rect(center=(0, 0)) 

    done = False 

    while not done: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       done = True 
      elif event.type == pg.MOUSEMOTION: 
       triangle_rect.center = event.pos 

     offset_x = triangle_rect.x - bg_rect.x 
     offset_y = triangle_rect.y - bg_rect.y 

     overlap = bg_mask.overlap(triangle_mask, (offset_x, offset_y)) 
     if overlap: 
      print('The two masks overlap!', overlap) 

     screen.fill((30, 30, 30)) 
     screen.blit(bg_surface, bg_rect) 
     screen.blit(triangle_surface, triangle_rect) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    pg.init() 
    main() 
    pg.quit() 
+0

이 인스턴스의 문제점은 차가 내리는 속도가 떨어지는 배경 스프라이트가 단순한 모양이 아니며 경마장을 둘러 싸서 x 및 y 좌표를 사용할 수 없기 때문입니다. 도움을 주셔서 감사합니다 :) –

+0

나는 트랙을 나타내는 파란색 선들이 다른 예제를 추가했습니다. – skrx

관련 문제