파이 게임에서 간단한 플랫폼 게임을 코딩하려고하는데, 카메라 기능을 게임에 추가하려고 할 때 충돌 문제가 있습니다.파이 게임에서 카메라가 충돌하고 충돌하는 문제가 발생했습니다.
내가 운동, 충돌 및 도면을 포함하는 코드의 부분을 잘라 것이다 문제는 너무 큰하지 않는하려면 :
여기 내 코드입니다.
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
충돌 카메라 않고는
이 카메라없이 충돌입니다 잘 작동합니다. 내가 카메라 기능을 추가 할 때 당신이이 game_loop에서 #을 제거하고 카메라를 적용하여 도면에 주석을 테스트하려면
를 발생하는 카메라와 함께
가충돌은
입니다 .
# 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을 사용하고 있습니다.
당신은'player'가 아닌 모든 스프라이트와 함께'camera.apply()'를 사용합니다. 문제가 될 수 있습니다. – furas
BTW : GitHub 또는 다른 포털에 이미지가있는 complet 코드를 넣으면 쉽게 실행할 수 있습니다. 실행하고 테스트 할 수 있습니다. – furas
감사합니다. @furas. 나는이 문제를 일으키는 단순한 것을 믿을 수 없다. –