2014-11-25 81 views
0

所以我正在學習如何使用類並讓它們在不同類之間工作。我試圖設計一個遊戲,用戶四處移動並拾取食物,並且每次用戶拿起一塊食物時,角色的大小都會增加。我之前做過類似的事情,但現在有了類,我似乎很難找到這個類應該成爲的一部分。我在精靈更新方法中添加了如果它與櫻桃碰撞,那麼播放器的大小應該每次增加5個像素。使用代碼:在碰撞後增加Pygame圖像大小?

self.Player.surface = pygame.transform.scale(self.Player.surface, (pwidth+5, pheight+5)) 
self.rect = self.Player.surface.get_rect() 

每個遊戲運行播放器的大小沒有變化,由於某種原因,遊戲不再結束球員已經吃一定量的櫻桃,所以我只是想知道,如果我的時間後使用改變球員大小的錯誤方法也許可能有一種更簡單的方法來做到這一點?下面的代碼說明了它的有用性。

import pygame, glob, random, time 
from pygame.locals import * 
from LabelClass import * 

# CONSTANTS 
WIDTH = 400 # Window width 
HEIGHT = 400 # Window height 
BLACK = (0,0,0) # Colors 
WHITE = (255,255,255) 
BACKGR = BLACK # Background Color 
FOREGR = WHITE # Foreground Color 
FPS = 40 # Frames per second 
pwidth = 40 
pheight = 40 

class Food: 
    def __init__(self,screen,centerx,centery): 
     self.screen = screen 
     self.surface = pygame.image.load('cherry.png') 
     self.rect = self.surface.get_rect() 
     self.rect.centerx = centerx 
     self.rect.centery = centery 

    def draw(self): 
     self.screen.blit(self.surface,self.rect) 
     #pygame.display.update([self.rect]) 


class Player: 

    def __init__(self, screen, centerx, 
     centery, speed, backcolor): 
     self.surface = pygame.image.load('player.png') 
     self.rect = self.surface.get_rect() 
     self.rect.centerx = centerx 
     self.rect.centery = centery 
     self.speed = speed 
     self.screen = screen 
     self.backcolor = backcolor 

     self.dir = '' 

    def draw(self): 
     self.screen.blit(self.surface,self.rect) 
     #pygame.display.update([self.rect]) 


    def move(self): 
     if self.dir != '': 
      if self.dir == 'd' and self.rect.bottom < HEIGHT: 
       self.rect.top += self.speed 
      if self.dir == 'u' and self.rect.top > 0: 
       self.rect.top -= self.speed 
      if self.dir == 'l' and self.rect.left > 0: 
       self.rect.left -= self.speed 
      if self.dir == 'r' and self.rect.right < WIDTH: 
       self.rect.right += self.speed 

    def jump(self,top,left): 
     self.rect.top = top 
     self.rect.left = left 

class SpritesGame: 

    def __init__(self,screen): 

     self.screen = screen 
     screen.fill(BLACK) 
     pygame.display.update() 
     music_file = getRandomMusic() 
     pygame.mixer.music.load(music_file) 
     pygame.mixer.music.play(-1,0.0) 
     self.music = True 
     self.Foods = [ ] 
     self.Eaten = 0 



     for i in range(20): 
      self.Foods.append(
       Food(self.screen, 
       WIDTH*random.randint(1,9)//10, 
       HEIGHT*random.randint(1,9)//10)) 
     for f in self.Foods: 
      f.draw() 
     self.Player = Player(screen,WIDTH//2,HEIGHT//2,6,BLACK) 
     self.PickUpSound = pygame.mixer.Sound('pickup.wav') 
     self.PlaySound = True 
     self.startTime = time.clock() 
     self.endTime = -1 
     self.Won = False 

    def update(self): 
     self.screen.fill(BLACK) 
     pickedUp = False 
     for f in self.Foods[:]: 

      if self.Player.rect.colliderect(f.rect): 
       self.Foods.remove(f) 
       self.Foods.append(Food(self.screen,WIDTH*random.randint(1,9)//10,HEIGHT*random.randint(1,9)//10)) 
       pickedUp = True 
       self.Eaten += 1 

       self.Player.surface = pygame.transform.scale(self.Player.surface, (pwidth+5, pheight+5)) 
       self.rect = self.Player.surface.get_rect() 
       #self.rect.center = center 



       print self.Eaten 





     if pickedUp and self.PlaySound: 
      self.PickUpSound.play() 
     for f in self.Foods: 
      f.draw() 
     if self.Eaten == 40: 
      self.Won = True 
      self.endTime = time.clock() 
     self.Player.move() 
     self.Player.draw() 
     pygame.display.update() 

    def toggleMusic(self): 
     self.music = not self.music 
     if self.music: 
      pygame.mixer.music.play(-1,0.0) 
     else: 
      pygame.mixer.music.stop() 


    def run(self): 
     stop = False 
     while not stop: 
      for event in pygame.event.get(): 
       if event.type == QUIT: 
        stop = True 
       if event.type == KEYDOWN: # Keeps moving as long as key down 
        if event.key == K_LEFT or event.key == ord('a'): 
         self.Player.dir = 'l' 
        if event.key == K_RIGHT or event.key == ord('d'): 
         self.Player.dir = 'r' 
        if event.key == K_UP or event.key == ord('w'): 
         self.Player.dir = 'u' 
        if event.key == K_DOWN or event.key == ord('s'):      
         self.Player.dir = 'd' 
       if event.type == KEYUP: 
        if event.key == ord('q'): 
         stop = True 
        if event.key == K_ESCAPE: 
         stop = True 
        if event.key == K_LEFT or event.key == ord('a'): # End repetition. 
         self.Player.dir = '' 
        if event.key == K_RIGHT or event.key == ord('d'): 
         self.Player.dir = '' 
        if event.key == K_UP or event.key == ord('w'): 
         self.Player.dir = '' 
        if event.key == K_DOWN or event.key == ord('s'): 
         self.Player.dir = '' 
        if event.key == ord('x'): 
         top = random.randint(0, 
          HEIGHT - self.Player.rect.height) 
         left = random.randint(0, 
          WIDTH - self.Player.rect.width) 
         self.Player.jump(top,left) 
        if event.key == ord('m'): 
         self.toggleMusic() 
        if event.key == ord('p'): 
         self.PlaySound = not self.PlaySound 
      mainClock.tick(FPS) 
      self.update() 
      if self.Won: 
       stop = True # END OF WHILE 
     if self.Won: 
      self.screen.fill(BLACK) 
      pygame.display.update() 
      msg = (str((int(self.endTime) 
         -int(self.startTime))) 
        +" seconds to finish. Hit Q.") 
      L2 = Label(display,WIDTH//2,HEIGHT*7//8,26,msg,WHITE,BLACK) 
      L2.draw() 
      stop = False 
      while not stop: 
       for event in pygame.event.get(): 
        if event.type == KEYUP: 
         if event.key == ord('q'): 
          stop = True 
     pygame.event.get() 
     pygame.mixer.music.stop() 

def getRandomMusic(): 
    mfiles = glob.glob("*.wav") 
    mfiles.append(glob.glob("*.mid")) 
    r = random.randint(0,len(mfiles)-1) 
    return mfiles[r] 

def OpeningScreen(screen): 
    screen.fill(BLACK) 
    pygame.display.update() 
    L1 = Label(display,WIDTH//2,HEIGHT*7//8,26,"Hit Q to Quit, P to Play.",WHITE, BLACK) 
    L1.draw() 

# Properly initiate pygame 
pygame.init() 
# pygame.key.set_repeat(INT,INT) 
# Set the clock up 
mainClock = pygame.time.Clock() 

# Initialize Display 
display = pygame.display.set_mode((WIDTH,HEIGHT)) 
pygame.display.set_caption('Sprites and Sounds V06') 

OpeningScreen(display) 

stop = False 
while not stop: 
    for event in pygame.event.get(): 
     if event.type == QUIT: 
      stop = True 
     if event.type == KEYUP: 
      if event.key == ord('p'): 
       game = SpritesGame(display) 
       game.run() 
       OpeningScreen(display) 
      if event.key == ord('q'): 
       stop = True 


pygame.quit() 

回答

1

Surface.get_rect()總是返回開始(0,0)一個矩形,你也正在修改SpritesGame.rect。我想你應該改變

self.rect = self.Player.surface.get_rect()

self.Player.rect.inflate_ip(5, 5)

+0

我一直努力到現在,而不是用這個,但由於某種原因,它仍然心不是增長。我試過'self.Player.rect.inflate_ip()'或'self.Player.rect = self.Player.rect.inflate()'self.Player.rect.inflate(1,1) – user3188803 2014-11-26 00:18:43

+0

@ user3188803 – KSab 2014-11-26 14:06:14