2013-04-12 123 views
1

我正在製作一些遊戲,但我遇到了兩個問題。Pygame雪碧不會重置

  1. 我的雪碧被限制在窗口中居中的一個小方框內。我如何做到這一點,以便他可以覆蓋整個窗口?

  2. 當我移動舊精靈不會被刪除。它看起來在精靈之後有一個尾巴。

幫助任一將不勝感激!

import random, sys, copy, os, pygame, time, math 
from pygame.locals import * 


TILESIZE = 20 
WINDOWWIDTH = 1280 
WINDOWHEIGHT = 720 
FPS = 30 
floorx = (WINDOWHEIGHT - (TILESIZE)) 
floory = (WINDOWWIDTH/TILESIZE) 
TileOffset = 20 
tilesNeeded = (WINDOWWIDTH/TILESIZE) 
floorSize = TILESIZE * 2 
OUTSIDE_DECORATION_PCT = 20 
HALF_WINDOWHEIGHT = (WINDOWHEIGHT/2) 
HALF_WINDOWWIDTH = (WINDOWWIDTH/2) 
CAMERASLACK = 25 
MOVERATE = 9 
BOUNCERATE = 6 
BOUNCEHEIGHT = 30 
INVULTIME = 2 
GAMEOVERTIME = 4 
MAXHEALTH = 3 
STARTSIZE = 30 

BLACK =   ( 0, 0, 0) 
WHITE =   (255, 255, 255) 
LIGHTGRAY =  (174, 174, 174) 
DARKGRAY =  (41, 41, 41) 
MEDGRAY =  (101, 101, 101) 
SKYBLUE =  (200, 210, 255) 
DARKTURQUOISE = ( 3, 54, 73) 
GREEN =   ( 0, 92, 7) 
LIGHTGREEN = ( 0, 135, 15) 
BGCOLOR = LIGHTGRAY 
TEXTCOLOR = BLACK 

UP = 'up' 
DOWN = 'down' 
LEFT = 'left' 
RIGHT = 'right' 

def main(): 
    global FPSCLOCK, DISPLAYSURF, BASICFONT, TILESIZE, floorx, floory, floorCovered, tilesNeeded, OUTSIDEDECOMAPPING, L_Monster, R_Monster, BGIMAGE 

    pygame.init() 
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT)) 
    FPSCLOCK = pygame.time.Clock() 

    pygame.display.set_caption('Alpha One') 
    # Set up the background image. 
    boardImage = pygame.image.load('bg.png') 
    # Use smoothscale() to stretch the board image to fit the entire board: 
    boardImageRect = boardImage.get_rect() 
    boardImageRect.topleft = (0, 0) 
    BGIMAGE = pygame.image.load('bg.png') 
    # Use smoothscale() to stretch the background image to fit the entire window: 
    BGIMAGE = pygame.transform.smoothscale(BGIMAGE, (WINDOWWIDTH, WINDOWHEIGHT)) 
    BGIMAGE.blit(boardImage, boardImageRect) 
    #Draw the background  
    DISPLAYSURF.blit(BGIMAGE, BGIMAGE.get_rect()) 
    #Draw the Floor 
    drawFloor() 

    L_Monster = pygame.image.load('monster.png') 
    L_Monster = pygame.transform.scale(L_Monster, (1000, 600)) 
    R_Monster = pygame.transform.flip(L_Monster, True, False) 


    pygame.display.flip() 




    #Main Game Loop 
    while True: 
     runGame() 


     #pygame.display.update() 


def runGame(): 
    invulnerableMode = False 
    invulnerableStartTime = 0 
    gameOverMode = False 
    gameOverStartTime = 0 
    winMode = False 

    camerax = 0 
    cameray = 0 



    playerObj = {'surface': pygame.transform.scale(L_Monster,(STARTSIZE, STARTSIZE)), 
       'facing': LEFT, 
       'size': STARTSIZE, 
       'x': HALF_WINDOWWIDTH, 
       'y': HALF_WINDOWHEIGHT, 
       'bounce':0, 
       'health': MAXHEALTH} 

    moveLeft = False 
    moveRight = False 
    moveUp = False 
    moveDown = False 

    while True: 
     DISPLAYSURF.blit(BGIMAGE, BGIMAGE.get_rect()) 
     drawFloor() 
     #DISPLAYSURF.fill(WHITE) 
     if invulnerableMode and time.time() - invulnerableStartTime > INVULNTIME: 
      invulnerableMode = False 


     playerCenterx = playerObj['x'] + int(playerObj['size']/2) 
     playerCentery = playerObj['y'] + int(playerObj['size']/2) 
     if (camerax + HALF_WINDOWWIDTH) - playerCenterx > CAMERASLACK: 
      camerax = playerCenterx + CAMERASLACK - HALF_WINDOWWIDTH 
     elif playerCenterx - (camerax +HALF_WINDOWWIDTH) > CAMERASLACK: 
      camerax = playerCenterx - CAMERASLACK - HALF_WINDOWWIDTH 
     if (cameray + HALF_WINDOWHEIGHT) - playerCentery > CAMERASLACK: 
      cameray = playerCentery + CAMERASLACK - HALF_WINDOWHEIGHT 
     elif playerCentery - (cameray +HALF_WINDOWHEIGHT) > CAMERASLACK: 
      cameray = playerCentery - CAMERASLACK - HALF_WINDOWHEIGHT 


     flashIsOn = round(time.time(), 1) * 10 % 2 == 1 
     if not gameOverMode and not (invulnerableMode and flashIsOn): 
      playerObj['rect'] = pygame.Rect((playerObj['x'] - camerax, 
              playerObj['y'] - cameray - getBounceAmount(playerObj['bounce'], BOUNCERATE, BOUNCEHEIGHT), 
              playerObj['size'], 
              playerObj['size'])) 
      DISPLAYSURF.blit(playerObj['surface'], playerObj['rect']) 

     for event in pygame.event.get(): 
      if event.type == QUIT: 
       terminate() 

      elif event.type == KEYDOWN: 
       if event.key in (K_UP, K_w): 
        moveDown = False 
        moveUp = True 
       elif event.key in (K_DOWN, K_s): 
        moveUp = False 
        moveDown = True 
       elif event.key in (K_LEFT, K_a): 
        moveRight = False 
        moveLeft = True 
        if playerObj['facing'] == RIGHT: 
         playerObj['surface'] = pygame.transform.scale(L_Monster, (playerObj['size'], playerObj['size'])) 
        playerObj['facing'] == LEFT 
       elif event.key in (K_RIGHT, K_d): 
        moveLeft = False 
        moveRight = True 
        if playerObj['facing'] == LEFT: 
         playerObj['surface'] = pygame.transform.scale(R_Monster, (playerObj['size'], playerObj['size'])) 
        playerObj['facing'] = RIGHT 
       elif winMode and event.key == K_r: 
        return 
      elif event.type == KEYUP: 
       if event.key in (K_LEFT, K_a): 
        moveLeft = False 
       elif event.key in (K_RIGHT, K_d): 
        moveRight = False 
       elif event.key in (K_UP, K_w): 
        moveUp = False 
       elif event.key in (K_DOWN, K_s): 
        moveDown = False 

       elif event.key == K_ESCAPE: 
        terminate() 

     if not gameOverMode: 
      if moveLeft: 
       playerObj['x'] -= MOVERATE 
      if moveRight: 
       playerObj['x'] += MOVERATE 
      if moveUp: 
       playerObj['y'] -= MOVERATE 
      if moveDown: 
       playerObj['y'] += MOVERATE 
      if (moveLeft or moveRight or moveUp or moveDown) or playerObj['bounce'] != 0: 
       playerObj['bounce'] += 1 

      if playerObj['bounce'] > BOUNCERATE: 
       playerObj['bounce'] = 0 

     else: 
      # game is over, show "game over" text 
      DISPLAYSURF.blit(gameOverSurf, gameOverRect) 
      if time.time() - gameOverStartTime > GAMEOVERTIME: 
       return 

     if winMode: 
      DISPLAYSURF.blit(winSurf, winRect) 
      DISPLAYSURF.blit(winSurf2, winRect2) 

     pygame.display.update() 
     FPSCLOCK.tick(FPS) 


def getBounceAmount(currentBounce, bounceRate, bounceHeight): 

    return int(math.sin((math.pi/float(bounceRate)) * currentBounce) * bounceHeight) 

def getRandomOffCameraPos(camerax, cameray, objWidth, objHeight): 
    # create a Rect of the camera view 
    cameraRect = pygame.Rect(camerax, cameray, WINDOWWIDTH, WINDOWHEIGHT) 
    while True: 
     x = random.randint(camerax - WINDOWWIDTH, camerax + (2 * WINDOWWIDTH)) 
     y = random.randint(cameray - WINDOWHEIGHT, cameray + (2 * WINDOWHEIGHT)) 
     # create a Rect object with the random coordinates and use colliderect() 
     # to make sure the right edge isn't in the camera view. 
     objRect = pygame.Rect(x, y, objWidth, objHeight) 
     if not objRect.colliderect(cameraRect): 
      return x, y 

def isOutsideActiveArea(camerax, cameray, obj): 

    boundsLeftEdge = camerax - WINDOWWIDTH 
    boundsTopEdge = cameray - WINDOWHEIGHT 
    boundsRect = pygame.Rect(boundsLeftEdge, boundsTopEdge, WINDOWWIDTH * 3, WINDOWHEIGHT * 3) 
    objRect = pygame.Rect(obj['x'], obj['y'], obj['width'], obj['height']) 
    return not boundsRect.colliderect(objRect)   

def checkForQuit(): 
    for event in pygame.event.get(QUIT): # get all the QUIT events 
     terminate() # terminate if any QUIT events are present 
    for event in pygame.event.get(KEYUP): # get all the KEYUP events 
     if event.key == K_ESCAPE: 
      terminate() # terminate if the KEYUP event was for the Esc key 
     pygame.event.post(event) 



def drawFloor(): 
    #Open the image used for tiles and initialize N 
    floorTile = pygame.image.load('tile.png') 
    N = 0 

    while (N < tilesNeeded): 
     DISPLAYSURF.blit(floorTile,((20 * N, (floorx + (TILESIZE/4)) - TILESIZE)),) 
     DISPLAYSURF.blit(floorTile,(20 * N, (floorx + (TILESIZE/4)))) 
     N = N + 1 

    #Updates the display 
    pygame.display.flip() 

def checkCollide(): 
    FLOOR_SURF = pygame.Rect(0, (WINDOWHEIGHT - (TILESIZE * 2)), WINDOWWIDTH, WINDOWHEIGHT) 

def terminate(): 
    pygame.quit() 
    sys.exit() 

if __name__ == '__main__': 
    main() 
+0

爲什麼你縮放L_Monster表面向左或向右用戶按下時? – Haz

+0

它應該調用它們,具體取決於它面對的方式。 – ddaniels

+0

我認爲你應該翻轉它們,而不是縮放它們。 – Haz

回答

3

你得到精靈「尾巴」的原因是因爲在開始繪製新的框架之前你沒有清理屏幕。處理這一種方法是在runGame()的開始進入像下面這樣:

DISPLAYSURF.fill(white) 

這將「清除」了在白色覆蓋了表面。當您開始爲該框架繪製圖像時,它們將被繪製在空白的白色表面上。需要注意的是,您需要重新繪製屏幕上的每個精靈,而不僅僅是在最後一幀中移動的精靈。

對於第一個問題,如果你問如何縮放圖像的大小,你可以使用尺度函數從pygame.transform

L_monster = pygame.transform.scale(L_monster, (500, 500)) 

這通過變換給定的表面創建一個新的表面到由元組給出的新大小。

http://www.pygame.org/docs/ref/transform.html#pygame.transform.scale

+0

不幸你的建議都沒有幫助。第一個讓我的整個窗口變成白色,但它仍然有一個尾巴。我也有一個背景,所以它也清楚這是另一個問題。第二個建議沒有發生任何變化,精靈仍然侷限在他的盒子裏。 – ddaniels

+0

我是這樣做的,它是用我的地板和背景圖像取代白色,但怪物仍然卡在隱形盒的範圍內。 – ddaniels

+0

你是什麼意思由一個隱形的盒子?精靈根本不是渲染,或者你無法將其繪製到更大的區域? – Haz