2017-06-12 43 views
1

我一直在學習Python,剛開始玩Pygame的編碼。我目前的程序是一個遊戲,角色是蒼蠅,必須避免被蒼蠅拍死亡。遊戲必須首先在屏幕上的任意位置隨機顯示半透明的黃色正方形。這個正方形表示蒼蠅在2秒內擊中的位置,讓玩家有時間飛出該擊球區域。當蒼蠅拍擊時,我想要在暗淡廣場的確切位置上向遊戲中投射一個不透明的廣場。這個正方形會在玩家出現時殺死玩家。儘管我計劃顯示消息並添加其他此類性質的東西,但不透明方塊(或蒼蠅拍)應終止遊戲會話。我已經創建了兩個正方形,但是我需要不透明的正方形來到半透明的正方形之後,並且位於相同的位置。每次罷工後,我希望廣場消失,重複這個過程。如果任何人有任何的洞察力,我可以去1)在任意位置blinking半透明的廣場和2)在2秒內有更黑暗的方塊「罷工」相同的位置,然後消失和重複,我會非常感激。我嘗試過使用time.sleep()函數,但它沒有奏效。 非常感謝!如何在pygame中使矩形出現在另一個矩形之後?

(請原諒我有點亂碼!)

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

pygame.init() 

display_width = 800 
display_height = 600 

gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('Fly Dodger') 

black = (0,0,0) 
white = (255,255,255) 
yellow = (255,255,0) 

fly_width = 70 

clock = pygame.time.Clock() 

crashed = False 

flyImg = pygame.image.load("Fly.png") 
flyImg = pygame.transform.scale(flyImg, (80, 80)) 

#THe faintswatter is the faint image/square I want to appear first. 
faintSwatter = pygame.image.load("faintswatter.png") 
faintSwatter = pygame.transform.scale(faintSwatter, (400, 510)) 

#The realswatter is the square that appears after the fainter one, in the same position. 
realswatter = pygame.image.load("swatter.png") 
realswatter = pygame.transform.scale(realswatter, (400, 510)) 

windowImg = pygame.image.load("window.jpg") 
windowImg = pygame.transform.scale(windowImg, (800,600)) 
pygame.display.update() 

def fly(x,y): 
    gameDisplay.blit(flyImg, (x,y)) 

def border(): 
    x_change = 0 
    y_change = 0 

def swatter_Function(swatterx, swattery, swaterw, swaterh, color): 
    pygame.draw.rect(gameDisplay, color, [swatterx, swattery, swaterw, swaterh]) 

def things_dodged(count): 
    font = pygame.font.SysFont(None, 25) 
    text = font.render("Dodged: "+str(count), True, green) 
    gameDisplay.blit(text, (0,0)) 

def message_display(text): 
    largeText = pygame.font.Font("freesansbold.ttf",115) 
    TextSurf, TextRect = text_objects(text, largeText) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 

def gameloop(): 
    x = (display_width * .45) 
    y = (display_height * .4) 
    x_change = 0 
    y_change = 0 

    gameExit = False 

    while not gameExit: 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       crashed = True 

      if event.type == pygame.KEYDOWN: 

       if event.key == pygame.K_LEFT: 
        x_change = -5 

       elif event.key == pygame.K_RIGHT: 
        x_change = 5 

       elif event.key == pygame.K_UP: 
        y_change = -5 

       elif event.key == pygame.K_DOWN: 
        y_change = 5 


     x += x_change 
     y += y_change 


      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 

      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
        y_change = 0 

     gameDisplay.blit(windowImg, (0,0)) 
     fly(x,y) 
     gameDisplay.blit(faintSwatter,(1,1)) 
     gameDisplay.blit(realswatter, (2,2)) 
     pygame.display.update() 

     if x > display_width - fly_width or x < 0: 
      gameExit = True 

     if y > display_height - fly_width or y < 0: 
      gameExit = True 



     pygame.display.update() 
     clock.tick(60) 
gameloop() 
pygame.quit() 
quit() 

回答

1

我已經取得了一些重大的變化..尋找#changes。

這些都是我所使用的圖像:http://imgur.com/a/0MOkP

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

pygame.init() 

display_width = 800 
display_height = 600 

gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('Fly Dodger') 

black = (0,0,0) 
white = (255,255,255) 
yellow = (255,255,0) 

fly_width = 70 

clock = pygame.time.Clock() 

crashed = False 

flyImg = pygame.image.load("Fly.png").convert() #changes 
flyImg = pygame.transform.scale(flyImg, (80, 80)) 

#THe faintswatter is the faint image/square I want to appear first. 
faintSwatter = pygame.image.load("faintswatter.png").convert() #changes 
faintSwatter = pygame.transform.scale(faintSwatter, (400, 510)) 
faintSwatter.set_alpha(128) #changes 


#The realswatter is the square that appears after the fainter one, in the same position. 
realswatter = pygame.image.load("swatter.png").convert() #changes 
realswatter = pygame.transform.scale(realswatter, (400, 510)) 

windowImg = pygame.image.load("window.jpg") 
windowImg = pygame.transform.scale(windowImg, (800,600)) 
pygame.display.update() 

def fly(x,y): 
    gameDisplay.blit(flyImg, (x,y)) 

def border(): 
    x_change = 0 
    y_change = 0 

def swatter_Function(swatterx, swattery, swaterw, swaterh, color): 
    pygame.draw.rect(gameDisplay, color, [swatterx, swattery, swaterw, swaterh]) 

def things_dodged(count): 
    font = pygame.font.SysFont(None, 25) 
    text = font.render("Dodged: "+str(count), True, green) 
    gameDisplay.blit(text, (0,0)) 

def message_display(text): 
    largeText = pygame.font.Font("freesansbold.ttf",115) 
    TextSurf, TextRect = text_objects(text, largeText) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 

def gameloop(): 
    x = (display_width * .45) 
    y = (display_height * .4) 
    x_change = 0 
    y_change = 0 

    #changes 
    totalPlaytime = 0.0 
    faintDisplay = True 
    solidDisplay = False 
    choosenCoords = False 

    gameExit = False 

    while not gameExit: 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       #changes 
       gameExit = True 

      if event.type == pygame.KEYDOWN: 

       if event.key == pygame.K_LEFT: 
        x_change = -5 

       elif event.key == pygame.K_RIGHT: 
        x_change = 5 

       elif event.key == pygame.K_UP: 
        y_change = -5 

       elif event.key == pygame.K_DOWN: 
        y_change = 5 

      #changes - moved in the loop 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 

      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
        y_change = 0 

     #changes - moved out of the loop at the end 
     x += x_change 
     y += y_change 

     gameDisplay.blit(windowImg, (0,0)) 
     fly(x,y) 

     #changes 
     if faintDisplay and not choosenCoords: 
      xSwatter = random.randrange(0,display_width-400) 
      ySwatter = random.randrange(0,display_height-510) 
      choosenCoords = True 
      faintSwatterBeginTime = totalPlaytime 

     if faintDisplay: 
      if totalPlaytime - faintSwatterBeginTime < 2.0: 
       gameDisplay.blit(faintSwatter,(xSwatter,ySwatter)) 
      else: 
       faintDisplay = False 
       solidDisplay = True 
       solidSwatterBeginTime = totalPlaytime 

     if solidDisplay: 
      if totalPlaytime - solidSwatterBeginTime < 0.5: 
       gameDisplay.blit(realswatter, (xSwatter,ySwatter)) 
       if ((x+80 > xSwatter) and (x < xSwatter+400) and (y+80 > ySwatter) and (y < ySwatter+510)): 
        crashed = True 
        gameExit = True 
      else: 
       solidDisplay = False 
       faintDisplay = True 
       choosenCoords = False 
     #changes end 

     pygame.display.update() 

     if x > display_width - fly_width or x < 0: 
      gameExit = True 

     if y > display_height - fly_width or y < 0: 
      gameExit = True 

     #pygame.display.update() 

     #changes 
     milliseconds = clock.tick(60) 
     totalPlaytime += milliseconds/1000.0 


gameloop() 
pygame.quit() 
quit() 

我是初學者太..所以請原諒我這樣冗長的代碼。我所做的改變是:增加了時間計算,在一定程度上做出了更平坦的透明度,增加了碰撞功能(你也可以使用碰撞),添加了讓淡淡的蒼蠅保持2秒和固體持續0.5秒的算法。

+0

非常感謝!它非常棒,這是完成這個遊戲目標的好方法。特別是如果你是一個初學者,工作出色! – Chris

1

我會使用一個timer變量,並從中減去dt(增量時間 - 自上次clock.tick調用以來的時間)以進行倒計時。在下面的示例中,我使用當前選定圖像的變量(swatterImg)。這swatterImg先設置爲模糊,然後如果定時器在0和1.5s之間,我將它設置爲realswatter圖像,並執行衝突檢測,如果定時器低於0秒我重置計時器和圖像,並生成一個新的蒼蠅拍的位置。 flyswatterpygame.Rect,其存儲位置並且也用於碰撞檢測。在繪圖階段,您可以將蒼蠅圖像和當前的蒼蠅拍圖像分別放在各自的反射片上。 (我已經刪除了自動退出遊戲的代碼,因爲這個例子沒有必要,而且對用戶來說很煩。)

import sys 
import random 
import pygame as pg 


pg.init() 

displayrect = pg.Rect(0, 0, 800, 600) 
gameDisplay = pg.display.set_mode(displayrect.size) 
pg.display.set_caption('Fly Dodger') 
clock = pg.time.Clock() 

flyImg = pg.Surface((80, 80)) 
flyImg.fill((220, 120, 20)) 
faintSwatter = pg.Surface((400, 510)) 
faintSwatter.fill((220, 250, 120)) 
faintSwatter.set_alpha(128) 
realswatter = pg.Surface((400, 510)) 
realswatter.fill((220, 250, 120)) 


def gameloop(): 
    fly = pg.Rect(100, 150, 70, 70) 
    x_change = 0 
    y_change = 0 

    swatter = pg.Rect(90, 50, 400, 510) 
    swatter_timer = 3 
    swatterImg = faintSwatter # Current swatter image. 

    dt = 0 
    gameExit = False 

    while not gameExit: 
     for event in pg.event.get(): 
      if event.type == pg.QUIT: 
       gameExit = True 
      if event.type == pg.KEYDOWN: 
       if event.key == pg.K_LEFT: 
        x_change = -5 
       elif event.key == pg.K_RIGHT: 
        x_change = 5 
       elif event.key == pg.K_UP: 
        y_change = -5 
       elif event.key == pg.K_DOWN: 
        y_change = 5 
      if event.type == pg.KEYUP: 
       if event.key == pg.K_LEFT or event.key == pg.K_RIGHT: 
        x_change = 0 
       elif event.key == pg.K_UP or event.key == pg.K_DOWN: 
        y_change = 0 

     fly.x += x_change 
     fly.y += y_change 

     swatter_timer -= dt 
     # If the timer is below 1.5s and above 0s, change the current 
     # image and check for collisions with the swatter rect. 
     if 0 < swatter_timer < 1.5: 
      swatterImg = realswatter # Change current image. 
      if fly.colliderect(swatter): 
       print('Collision!') 
     # If timer is below 0s, reset timer and image and get a new pos. 
     elif swatter_timer <= 0: 
      swatterImg = faintSwatter # Reset current image. 
      swatter_timer = 3 
      swatter.topleft = (random.randrange(displayrect.w-400), 
           random.randrange(displayrect.h-510)) 

     # Draw everything. 
     gameDisplay.fill((30, 30, 30)) 
     gameDisplay.blit(flyImg, fly) 
     gameDisplay.blit(swatterImg, swatter) 

     pg.display.update() 
     dt = clock.tick(60)/1000 

if __name__ == '__main__': 
    gameloop() 
    pg.quit() 
    sys.exit() 
+1

非常感謝skrx!代碼運行得非常好,我將在遊戲中實施您的更改/建議!我打算另外製作一個啓動畫面並刪除自動退出功能。擁有一個不斷退出的遊戲是非常不切實際的!再次感謝我的朋友! – Chris

相關問題