I am writing a simple game that could shuffle and display 5 cards from 52 poker when I press "space bar". Everything is working except I want to render a text on screen indicating whether the cards are shuffling or it is the result... Here are the code:
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)
And here my cards class:
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)
The word " Shuffling Cards" stuck even I pressed space and changed
text_posn
.(text_posn
did shift between 0 and 1 when pressed space bar)
I know that the problem is when I paused, I skipped the pygame.display.flip()
so I could never update the changed text on screen. Any ideas how I could pause the screen and update the text msg at the same time? Thanks.
You can try putting if paused: continue
after you call pygame.display.flip()
.
Also make any changes to the screen or text before pygame.display.flip()
so that it will update the changes you have made to the screen before it pauses.
Ok, I think I've fixed your issue. I changed a few things and will post updated code below:
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)
And the updated cards class:
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)
The main "fix" here was to put most of the shuffling code into an if statement checking that the game was not paused, if it is paused it won't reshuffle the cards and will just draw them and update the screen. The code to display the text is also inside this if statement, causing it to only display when the program is not paused.
Also:
I changed your draw() function to an update() function which still figures out the patch_rect, I also changed it to self.patch_rect so that you can access it from the new for
loop in the main loop. The for
loop just draws each card in all_cards.
Let me know if this isn't the effect that you were after.