2017-11-30 28 views
0

내 자신의 Pacman 버전에서 현재 wokring 중이며 현재 창 크기를 조정하려고합니다. 나는 대답을 여기에서 읽었다 : https://reformatcode.com/code/python/pygame-how-do-i-resize-a-surface-and-keep-all-objects-within-proportionate-to-the-new-window-size. 그러나 그것은 나의 경우에 나를 도왔다. 에서 나는 2 화면, 화면 및 가짜 화면이 있습니다. 만약 내가 가짜 화면에 blit하기 위해 모든 것을 설정하면 나타나지 만, themselces를 업데이트하지 않습니다 (팩맨은 움직이지 않을 것입니다). 화면에 표시하도록 설정하면 표시되고 업데이트되지만 크기가 조정되지 않습니다. 어떤 도움이나 제안이라도 대단히 감사하겠습니다. BTW 진행내 게임의 창 크기를 조정하려면 어떻게해야합니까?

import pygame 
from Variables import pelletspawns #imports pellet spwans list from different script 
from pygame.locals import * 


#Initialisation 
pygame.init() 
pygame.display.set_caption("Pacman") 
myfont = pygame.font.SysFont("monospace", 15) 
screen = pygame.display.set_mode((448, 576)) #Creates screen object 
fake_screen = screen.copy() 

pic = pygame.surface.Surface((50,50)) 
pic.fill((255,100,100)) 


clock = pygame.time.Clock()  #Creates clock object 
Fin = False 


#Declaring Variables 
FPS = 60 
MoveLeft = pygame.K_LEFT 
MoveRight = pygame.K_RIGHT 
MoveUp = pygame.K_UP 
MoveDown = pygame.K_DOWN 

#Load images 
PACMAN_MAP = pygame.image.load("images/pacman_map.png").convert_alpha() 
PACMANSPRITE = pygame.image.load("images/pacman.png").convert_alpha() 

#pacmans class 
class SpriteClass(pygame.sprite.Sprite): 
    def __init__(self, image, x, y): 
     self.image = image 
     self.y=y 
     self.x=x 
     self.rect = self.image.get_rect() 
     self.rect.left = self.x 
     self.rect.top = self.y 
     self.rect.width=16 
     self.rect.height=16 

    #draws Pacman 
    def draw(self, surface): 
     # blit yourself at your current position 

     surface.blit(self.image, (self.x, self.y)) 


    # move pacman 
    def movement(self): 
     pressed= pygame.key.get_pressed() 
     if pressed[MoveUp]: 
      self.y -= 2 
      print('key pressed') 
     if pressed[MoveDown]: 
      self.y += 2 
      print('key pressed') 
     if pressed[MoveLeft]: 
      self.x -= 2 
      print('key pressed') 
     if pressed[MoveRight]: 
      self.x += 2 
      print('key pressed') 
     self.rect.left = self.x 
     self.rect.top = self.y 
     print(self.x,self.y) 


#instances Pacman 
Pacman = SpriteClass(PACMANSPRITE, 216 ,416) 


#Function to spawn pellets 
def SpawnPellets(pelletspawns): 
    pelletx=0  #the temp x co-ordinate for the pellet to spawn 
    pellety= -8 #the temp y co-ordinate for the pellet to spawn (starts at -ve 0.5(gridscpare) for allignment 
    for row in pelletspawns: 
     #adds 1 grid space to correctly align spawns 
     pellety += 16 
     for pellet in row: 
      pelletx= 16*pellet 
      pelletx -=8 
      pygame.draw.circle(screen,(255, 204, 153), (pelletx, pellety) , 5) 


#main game loop 
while not Fin: 
    #For event is used to close the program 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.display.quit() 
     if event.type == VIDEORESIZE: 
      screen = pygame.display.set_mode(event.dict['size'],RESIZABLE) 
      screen.blit(pygame.transform.scale(fake_screen, event.dict['size']), (0, 0)) 
      pygame.display.flip() 
    #calls movement function 
    Pacman.movement() 

    #blits pacman map as background 
    screen.blit(PACMAN_MAP, (0, 0)) 

    #draws pacman 
    Pacman.draw(screen) 
    #Spawns pellets 
    SpawnPellets(pelletspawns) 

    #draws screen 
    pygame.display.flip() 
    clock.tick(FPS) 
+1

가짜 화면을 그릴 때 왜 움직이지 않는지 알아야합니다. – furas

+0

그걸 알아 냈고 당신이 코멘트 한 것처럼 대답을 올렸습니다. 도움을 주셔서 감사합니다 : D @furas – cdd

답변

1

에 미치는 아직도 작품은 내가 그것을 알아 냈 난 그냥 clock.tick 위의 핵심 게임 루프에 screen.blit(pygame.transform.scale(fake_screen, event.dict['size']), (0, 0)) 를 이동해야했습니다. 나는 전에 이것을 시도했으나 event.dict['size']에 대한 이벤트가 없었기 때문에 키 오류가 발생하여 for event in pygame.event.get(): 루프에서 변수를 만들었고 event.dict['size']을 요청한 변수를 전달했습니다. 다음은 변경된 코드 섹션입니다.

#main game loop 
while not Fin: 
    #For event is used to close the program 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      pygame.display.quit() 
     if event.type == VIDEORESIZE: 
      size = event.dict['size'] 
      screen = pygame.display.set_mode(size,RESIZABLE) 


    #calls movement function 
    Pacman.movement() 

    #blits pacman map as background 
    fake_screen.blit(PACMAN_MAP, (0, 0)) 

    #draws pacman 
    Pacman.draw(fake_screen) 
    #Spawns pellets 
    SpawnPellets(pelletspawns) 

    #draws screen 
    screen.blit(pygame.transform.scale(fake_screen, size), (0, 0)) 
    pygame.display.flip() 
    clock.tick(FPS)