2017-06-12 41 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

相关问题