2016-05-10 3 views
1

"スペースバー"を押したときに52ポーカーから5枚のカードをシャッフルして表示する簡単なゲームを書いています。Pygame一時停止中にテキストを表示

import pygame,sys 
from pygame.locals import * 

my_clock = pygame.time.Clock() 
pygame.init() 
color =(200,0,0) 
surface_sz = 480 
surface = pygame.display.set_mode((surface_sz, surface_sz)) 
card=pygame.image.load("sprite_sheet_playing_cards.png") 
card_width = 73 

all_cards=[] 
paused=False 
text=["Shuffling Cards","Result"] 
text_posn=0 
my_font = pygame.font.SysFont("Courier", 20) 

while True: 

    for event in pygame.event.get(): 

     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == KEYDOWN: 
      if event.key == K_SPACE: 

       #Shift the text_posn 
       text_posn+=1 
       text_posn= text_posn%2 

       paused = not paused 

    surface.fill(color) 

    #create 5 crad objects and store them in list 
    for card_no in range(5): 

     hand_card=cards(card,(50+card_no*card_width,240)) 
     all_cards.append(hand_card) 

    # Start the shuffling 
    hand_card.start_shuffle(all_cards,surface) 

    #draw the text to surface 
    the_text = my_font.render(text[text_posn],True, (0,0,0)) 
    surface.blit(the_text, (120, 90)) 

    if paused: 
     continue # skip this iteration if paused 

    #put everything on display 
    pygame.display.flip() 

    my_clock.tick(10) 

そして、ここに私のカードのクラス:

class cards(pygame.sprite.Sprite): 
    def __init__(self,img,tar_posn): 

     pygame.sprite.Sprite.__init__(self) 
     self.image = img 
     self.posn = tar_posn 
     self.x = 0 
     self.y= 0 

    def start_shuffle(self,all_cards,target_surface): 
     #shuffle the card and draw it on screen 
     for one_card in all_cards: 
      one_card.shuffle() 
      one_card.draw(target_surface) 

    def shuffle(self): 
     import random 
     self.x = random.randint(0,12) 
     self.y = random.randint(0,4) 


    def draw(self,target_surface): 

     patch_rect = (self.x * 73, self.y*98, 
        73, 98) 
     target_surface.blit(self.image, self.posn, patch_rect) 
すべてがここに...私はカードがシャッフルされているか、それが結果であるかを示す画面上のテキストをレンダリングする以外のコードをしている取り組んでいます

単語「シャッフルカードは、」私は宇宙を押すとtext_posnを変更しても立ち往生。(text_posnは、0と1の間でシフトしなかった押されたときにスペースバー)

私は一時停止したときに問題があることを知っています。pygame.display.flip()をスキップして、画面上の変更されたテキストを更新することはできませんでした。どのように私は画面を一時停止し、同時にテキストメッセージを更新することができます任意のアイデア?ありがとう。

sprite_sheet_playing_cards.pngは: sprite_sheet_playing_cards.png

答えて

3

あなたはpygame.display.flip()を呼び出す後if paused: continueを入れて試すことができます。

pygame.display.flip()の前に画面またはテキストを変更して、一時停止前に行った変更を更新します。


[OK]をクリックして問題を解決しました。私はいくつかのことを変更し、以下のコードを更新掲載します:

import pygame,sys 
from pygame.locals import * 

my_clock = pygame.time.Clock() 
pygame.init() 
color =(200,0,0) 
surface_sz = 480 
surface = pygame.display.set_mode((surface_sz, surface_sz)) 
pygame.display.set_caption("Cards") 
card=pygame.image.load("sprite_sheet_playing_cards.png") 
card_width = 73 

all_cards=[] 
paused=False 
text=["Shuffling Cards","Result"] 
text_posn=0 
my_font = pygame.font.SysFont("Courier", 20) 

while True: 

    for event in pygame.event.get(): 

     if event.type == QUIT: 
      pygame.quit() 
      sys.exit() 
     elif event.type == KEYDOWN: 
      if event.key == K_SPACE: 

       #Shift the text_posn 
       text_posn+=1 
       text_posn= text_posn%2 

       paused = not paused 

    surface.fill(color) 

    if not paused: 
     #create 5 card objects and store them in list 
     for card_no in range(5): 

      hand_card=cards(card,(50+card_no*card_width,240)) 
      all_cards.append(hand_card) 

     # Start the shuffling 
     hand_card.start_shuffle(all_cards,surface) 

     #draw the text to surface 
     the_text = my_font.render(text[text_posn],True, (0,0,0)) 
     surface.blit(the_text, (120, 90)) 

    for each_card in all_cards: 
     surface.blit(each_card.image, each_card.posn, each_card.patch_rect) 

    #put everything on display 
    pygame.display.flip() 
    my_clock.tick(10) 

と更新されたカードのクラスを:

class cards(pygame.sprite.Sprite): 
    def __init__(self,img,tar_posn): 

     pygame.sprite.Sprite.__init__(self) 
     self.image = img 
     self.posn = tar_posn 
     self.x = 0 
     self.y= 0 

    def start_shuffle(self,all_cards,target_surface): 
     #shuffle the card and draw it on screen 
     for one_card in all_cards: 
      one_card.shuffle() 
      one_card.update(target_surface) 

    def shuffle(self): 
     import random 
     self.x = random.randint(0,12) 
     self.y = random.randint(0,4) 

    def update(self,target_surface): 
     self.patch_rect = (self.x * 73, self.y*98,73, 98) 

ここで「修正」のメインは、if文の中にシャッフルコードのほとんどを置くことでしたゲームが一時停止されていないことを確認し、一時停止されていればカードを再シャッフルしてカードを描画し、画面を更新します。テキストを表示するコードはこのif文の内側にもあり、プログラムが一時停止していないときにのみ表示されます。また

:あなたが新しいforループからアクセスできるように

私はまだpatch_rectを割り出し更新()関数にあなたのドロー()関数を変更し、私はまたself.patch_rectにそれを変更しましたメインループ。 forループは、all_cardsで各カードを描画します。

これがあなたが後になった効果でないかどうか教えてください。

+0

'pygame.display.flip()'の後に 'if paused:continue'を入れようとしましたが、カードがシャッフルを止めないようにしました。 – Le0

+0

ありがとうございました!それは本当に私の問題を解決しました。私の意図は、カードがシャッフルしているときに「シャッフルカード」という単語を表示し、一時停止したときに「結果」を表示することでした。if文からテキストをレンダリングするコードを移動しました。そして、私の想像どおりに動作します。 – Le0

関連する問題