2017-11-16 1 views
0

파이 게임에서 간단한 플랫폼 게임을 코딩하려고하는데, 카메라 기능을 게임에 추가하려고 할 때 충돌 문제가 있습니다.파이 게임에서 카메라가 충돌하고 충돌하는 문제가 발생했습니다.

내가 운동, 충돌 및 도면을 포함하는 코드의 부분을 잘라 것이다 문제는 너무 큰하지 않는하려면 :

여기 내 코드입니다.

Index.py

  • 초기화하기 및 setup_tiles 기능을 제거했다.

    import pygame 
    from settings import * 
    from tiles import * 
    from player import * 
    from camera import * 
    
    pygame.init() 
    
    
    class Window: 
    
        def game_loop(self): 
    
        while not self.crashed: 
    
         for event in pygame.event.get(): 
          if event.type == pygame.QUIT: 
           self.crashed = True 
    
         self.movement() 
    
         self.window.blit(self.background, (0, 0)) 
         self.all_sprites.clear(self.window, self.background) 
         self.player.update(self.all_sprites) 
         self.camera.update(self.player) 
         self.player.draw(self.window) 
         # self.all_sprites.draw(self.window) 
         for sprite in self.all_sprites: 
          self.window.blit(sprite.image, self.camera.apply(sprite)) 
    
         pygame.display.flip() 
    
         self.clock.tick(60) 
    
        quit() 
        pygame.quit() 
    
    def movement(self): 
        keys = pygame.key.get_pressed() 
    
        if keys[pygame.K_w]: 
         self.player.velocity_y = -3 
         self.player.rect.y += self.player.velocity_y 
         for sprite in self.all_sprites: 
          if self.player.collide_Y(sprite): 
           self.player.rect.y = self.player.rect.y - self.player.velocity_y 
    
        elif keys[pygame.K_s]: 
         self.player.velocity_y = 3 
         self.player.rect.y += self.player.velocity_y 
         for sprite in self.all_sprites: 
          if self.player.collide_Y(sprite): 
           self.player.rect.y = self.player.rect.y - self.player.velocity_y 
    
        if keys[pygame.K_a]: 
         self.player.velocity_x = -3 
         self.player.rect.x += self.player.velocity_x 
         for sprite in self.all_sprites: 
          if self.player.collide_X(sprite): 
           self.player.rect.x = self.player.rect.x - self.player.velocity_x 
    
        elif keys[pygame.K_d]: 
         self.player.velocity_x = 3 
         self.player.rect.x += self.player.velocity_x 
         for sprite in self.all_sprites: 
          if self.player.collide_X(sprite): 
           self.player.rect.x = self.player.rect.x - self.player.velocity_x 
    
    window = Window() 
    
    window.game_loop() 
    

는 Tiles.py

import pygame 
from settings import * 

class Tiles(pygame.sprite.Sprite): 

    def __init__(self, file, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.bitmap = pygame.image.load(file) 
     self.bitmap = pygame.transform.scale(self.bitmap, (TILE_SIZE, TILE_SIZE)) 
     self.image = pygame.Surface((TILE_SIZE, TILE_SIZE), pygame.HWSURFACE | pygame.SRCALPHA) 
     self.image.blit(self.bitmap, (0, 0)) 
     self.rect = self.image.get_rect() 
     self.rect.x, self.rect.y = pos 

Player.py

  • INIT 기능

    import pygame 
    from settings import * 
    
    
    class Player(pygame.sprite.Sprite): 
    
    def draw(self, window): 
        window.blit(self.image, (self.rect.x, self.rect.y)) 
    
    def collide_X(self, sprite): 
        if (self.rect.x + self.width >= sprite.rect.x >= self.rect.x and self.rect.y + self.height >= sprite.rect.y + TILE_SIZE >= 
         self.rect.y) or (self.rect.x + self.width >= sprite.rect.x + TILE_SIZE >= self.rect.x 
         and self.rect.y + self.height >= sprite.rect.y + TILE_SIZE >= self.rect.y) or (self.rect.x + self.width >= sprite.rect.x >= self.rect.x and 
         sprite.rect.y + TILE_SIZE >= self.rect.y + self.height >= sprite.rect.y >= self.rect.y): 
         print 'True' 
         return True 
        else: 
         return False 
    
    def collide_Y(self, sprite): 
        if (self.rect.y + self.height + self.velocity_y >= sprite.rect.y >= self.rect.y and self.rect.x + self.width >= 
         sprite.rect.x >= self.rect.x) or (self.rect.y + self.height >= sprite.rect.y + TILE_SIZE >= self.rect.y + self.velocity_y 
         and self.rect.x + self.width >= sprite.rect.x >= self.rect.x): 
         return True 
        else: 
         return False 
    
  • 01,235,164을 제거 당신이 그것을 볼 수

Camera.py

import pygame 
from settings import * 


class Camera: 
    def __init__(self, width, height): 
     self.camera = pygame.Rect(0, 0, width, height) 
     self.width = width 
     self.height = height 

    def apply(self, target): 
     return target.rect.move(self.camera.topleft) 

    def update(self, target): 
     x = - target.rect.x + int(WIDTH/2) 
     y = - target.rect.y + int(HEIGHT/2) 
     self.camera = pygame.Rect(x, y, self.width, self.height) 

Settings.py

WIDTH = 800 
HEIGHT = 600 

TILE_SIZE = 32 

LEVEL_1 = [ 
    'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'TTTTTTTTTB     V      V', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'B        V      V', 
    'B              V', 
    'B              V', 
    'B              V', 
    'B    VTTTTTTTTTTTTTTTTTTTTTTTTB    V', 
    'B        V      V', 
    'B        V      V', 
    'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT' 
] 

LEVEL_1_WIDTH = len(LEVEL_1[0])*TILE_SIZE 
LEVEL_1_HEIGHT = len(LEVEL_1)*TILE_SIZE 

충돌 카메라 않고는

enter image description here

이 카메라없이 충돌입니다 잘 작동합니다. 내가 카메라 기능을 추가 할 때 당신이이 game_loop에서 #을 제거하고 카메라를 적용하여 도면에 주석을 테스트하려면

를 발생하는 카메라와 함께

충돌은

enter image description here

입니다 .

# self.all_sprites.draw(self.window) 
    for sprite in self.all_sprites: 
     self.window.blit(sprite.image, self.camera.apply(sprite)) 

저는 Window 10 x64 시스템에서 Python 2.7을 사용하고 있습니다.

+0

당신은'player'가 아닌 모든 스프라이트와 함께'camera.apply()'를 사용합니다. 문제가 될 수 있습니다. – furas

+1

BTW : GitHub 또는 다른 포털에 이미지가있는 complet 코드를 넣으면 쉽게 실행할 수 있습니다. 실행하고 테스트 할 수 있습니다. – furas

+0

감사합니다. @furas. 나는이 문제를 일으키는 단순한 것을 믿을 수 없다. –

답변

1

카메라 변형을 player 인스턴스에 적용하지 않는 것입니다. 절대 좌표계로 그려지고 다른 모든 것은 카메라 좌표로 그려집니다.

한편 충돌 확인은 항상 게임 절대 좌표에서 수행됩니다.

카메라를 그리기 전에 플레이어에 카메라를 적용해야합니다. 코드가 그렇듯이 all_sprites 그룹에 플레이어를 추가하고 Player.draw 메서드를 모두 제거해야하는 것처럼 보입니다.그런 다음 원하는 경우 Camera.update 메서드에서 무언가를 수정하여지도 경계에있을 때 플레이어가 항상 화면의 가운데에 있지 않도록하십시오.

관련 문제