2016-12-18 7 views
0

私はPygameでAsteroidzのゲームを作っています(これは初めてPygameを使用しています)。そしてこのイントロ画面を作ることを試みています。彼らはゲームに入っても動作しません。イメージファイルは、黒の背景にちょうど白い三角形である(それはプログラムと同じ場所にいた場合、私はディレクトリを指定する必要がありますか?)Pygame Asteroidzのプログラムの問題

ここでは、コードです:すべての

import pygame 
import sys 

class Player: 
    def __init__(self): 
     self.colour = (255, 255, 255) 
     self.x = 390 
     self.y = 290 
     self.shape = pygame.image.load('C:/Users/John Birch/Desktop/Python/playerimg.jpg') 

    def Input(self): 
     key = pygame.key.get_pressed() 
     dist = 3 
     if key[pygame.K_DOWN]: 
      self.y += dist 
     elif key[pygame.K_UP]: 
      self.y -= dist 
     elif key[pygame.K_LEFT]: 
      self.x -= dist 
     elif key[pygame.K_RIGHT]: 
      self.x += dist 


class Menu: 
    def __init__(self): 
     self.score = 0 
     self.level = 0 
     self.font = pygame.font.SysFont('freesansbold', 60) 

    def Start(self): 
     start = menu.font.render("Press space to begin!", 1, (255, 255, 255)) 
     return start 

pygame.init() 
screen = pygame.display.set_mode((800, 600)) 
clock = pygame.time.Clock() 
player = Player() 
menu = Menu() 
pygame.display.set_caption('Asteroidz') 

if __name__ == '__main__': 
    while True: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit(); sys.exit() 
      elif event.type == pygame.K_SPACE: 
       while True: 
        player.Input() 
        screen.blit(player.shape, (player.x, player.y)) 
        clock.tick(40) 
        pygame.display.update() 
     start = menu.Start() 
     screen.blit(start, (190, 280)) 
     pygame.display.update() 
+0

のみ使用してください'while'ループと' space'をクリックしたときにこのループを離れると、ゲームのためだけに第2の 'while'ループが作成されます。 http://imgur.com/MT7tZ4s – furas

+0

のテキストを '__init__'で1回だけレンダリングし、後で' while'ループでblitしてください。関数にはlower_case、クラス名には 'CamelCase'を使用してください。参照:[PythonコードのPEP 8スタイルガイド](https://www.python.org/dev/peps/pep-0008/) – furas

+0

'pygame.Rect()'について読む - オブジェクトを保持すると便利ですサイズと位置。また、他のオブジェクトやマウスとの衝突を確認することもできます。 – furas

答えて

1

ファースト、行elif event.type == pygame.K_SPACE:では、elifのかわりにifを使います。次に、次の行で、なぜwhile Trueを再度使用しますか?あなたはすでにループしています。また、clock.tickをメインループに移動します。そして、なぜあなたはpygame.display.updateを2度呼んでいますか?最初の通話を削除します。

def RenderText(Text, Font, Target, X, Y, R, G, B): 
""""Text , font, target surface, X, Y, 
and color (RGB).""" 
RenderedText = Font.render(Text, True, (R, G, B)) 
Target.blit(RenderedText, (X, Y)) 

次に、あなたのMenuクラスからStart方法をスクラップし、あなたのループからstart = menu.Start()screen.blit(start, (190, 280))を取り除く:あなたはテキストを描画する関数を作成し、if event.type == pygame.K_SPACE:

次の内側にあまりにも多くのものを置くことです。代わりに、テキストを描画するために、あなただけ定義した関数を使用します。あなたのループに

fontFreesandBold = pygame.font.SysFont('freesandbold', 35) # Size 

を:

RenderText('Press space to begin!', fontFreesandBold, screen, 190, 280, 255, 255, 255) 

私はあなたがif event.type == pygame.K_SPACE:内のコードのトンを置いなぜを理解しています。スペースを押した後で、そのコードが実行されるのはだと考えました。しかし、いいえ、それは実行されますスペースが押されたとき、ここで私はあなたのためのコード全体をリマスタリングしました。私がやったことすべてをコメントしました。 (今のところ、私はプレーヤーの画像の読み込み/描画を削除しました。コードを最初にテストしてコメントを外して追加してください)

import pygame 
import sys 

from pygame.locals import * 
# The above line imports all the local pygame variables 

def RenderText(Text, Font, Target, X, Y, R, G, B): 
    """Text , font, target surface, X, Y, 
    and color (RGB).""" 
    RenderedText = Font.render(Text, True, (R, G, B)) 
    Target.blit(RenderedText, (X, Y)) 




class Player: 
    def __init__(self): 
     self.colour = (255, 255, 255) 
     self.x = 390 
     self.y = 290 
     # self.surface = pygame.image.load('C:/Users/John Birch/Desktop/Python/playerimg.jpg') 
     # Surface is more concise than shape, which could mean other stuff 

    def Input(self): 
     key = pygame.key.get_pressed() 
     dist = 3 
     if key[K_DOWN]: 
      self.y += dist 
     if key[K_UP]: 
      self.y -= dist 
     if key[K_LEFT]: 
      self.x -= dist 
     if key[K_RIGHT]: 
      self.x += dist 

     print('Player X/Y ', self.x, self.y) # To show that it's working 


class Menu: 
    def __init__(self): 
     self.score = 0 
     self.level = 0 




pygame.init() 

screen = pygame.display.set_mode((800, 600)) 
screen.fill((255, 255, 255)) # Make the screen white 
pygame.display.set_caption('Asteroidz') 

clock = pygame.time.Clock() 
player = Player() 
# menu = Menu() # I commented this out because it's currently useless 


fontFreesandBold = pygame.font.SysFont('freesandbold', 35) # Size 


isGameStarted = False 

# You don't need if name == main 
# because your code is a single file 
while True: 
    clock.tick(40) 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit(); sys.exit() 

     if event.type == KEYDOWN: 
      if event.key == K_SPACE: 
       isGameStarted = True # Now the game has begun! 

    print('Game started : ', isGameStarted) 

    if not isGameStarted: # Will the game has not begun 
     RenderText('Press space to begin!', fontFreesandBold, screen, 190, 280, 
       255, 255, 255) 
     screen.fill((255, 255, 255)) # As an example, the screen will turn green when the game starts 

    if isGameStarted: # Now this code will run forever, once space has been pressed once 
     # Place all game code here 
     # PS try the arrow keys ! 
     screen.fill((15, 200, 20)) 
     player.Input() 
     # screen.blit(player.surface, (player.x, player.y)) 

    pygame.display.update() 
+0

この回答に時間と労力をいただき、ありがとうございます:)。本当にたくさんのことを意味します。ありがとうございます –

+0

イベントタイプをチェックするときに 'elif'を使います。これは、異なるタイプのうちの1つに過ぎないので、前のタイプがTrueと評価されていれば他の条件をチェックする必要はありません。また、変数/関数名には 'lowercase_and_underscore'を使い、クラスには' CamelCase'を使います。それはそれらを区別することを容易にする。そうでなければ、素晴らしい答えです! +1 –

+0

@S_Zizzle喜んで私は助けることができました:) –