2017-06-12 5 views
1

私はPythonを学び、Pygameでコーディングを始めました。私の現在のプログラムは、キャラクターがハエであるゲームです。キャラクターは、ハエの飛散によって殺されるのを避けなければなりません。ゲームはまず、スクリーン上の任意の場所に半透明の黄色の正方形をランダムに表示する必要があります。このスクエアは、2秒後にスワッターがどこに当たるかを表し、プレイヤーがそのストライクエリアから飛び出す時間を与えます。スワタが打つと、私は薄い正方形の正確な場所にゲームに不透明な広場をblitしたい。このスクエアが表示されている場合、その中にいる場合、このスクエアはプレイヤーを殺します。私はメッセージを表示し、このような性質のものを追加することを計画していますが、不透明な四角形(またはスワッピングストライク)はゲームセッションを終了する必要があります。私は既に2つの正方形を作成していますが、半透明のものを後にして同じ場所に来るには、不透明なものが必要です。それぞれのストライキの後、私は四角形が消えて、プロセスを繰り返すことを望みます。誰かが私がどのようにして1)ランダムな場所に半透明の四角形を描き、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.5秒の場合、realswatterイメージに設定して、衝突検出を行います。タイマーが0未満の場合、タイマーとイメージをリセットし、なめらかな姿勢。 flyおよびswatterは、位置を格納するpygame.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

関連する問題