简体   繁体   中英

Pygame pause key

I am making a game for android in pygame here is my code:

import pygame, sys
from pygame.locals import * 

try:
    import Android
except ImportError:
    Android = None

pygame.init()

if Android:
    android.init()
    android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE)

size = width, height = 1276,650
screen = pygame.display.set_mode(size)

r = 0
bif = pygame.image.load("map.png") 
pygame.display.set_caption("Pygame 2D RPG !")
x,y=0,0
movex, movey=0,0
character="boy.png"
player=pygame.image.load(character).convert_alpha()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type==KEYDOWN:
            if event.key==K_a:
                movex=-1
            elif event.key==K_d:
                movex=+1
            elif event.key==K_w:
                movey=-1
            elif event.key==K_s:
                movey=+1
        if event.type==KEYUP:
            if event.key==K_a:
                movex=0
            elif event.key==K_d:
                movex=0
            elif event.key==K_w:
                movey=0
            elif event.key==K_s:
                movey=0
            elif event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    pygame.quit()
                    sys.exit()
    x+=movex
    y+=movey
    screen.fill((r,0,0))
    screen.blit(bif,(0,0))
    screen.blit(player,(x,y)) 

    pygame.display.update() 
  1. Could any one give me a link to resources where I could learn pygame.

  2. Say in my game when I press "q" then it pauses the game and when I press it again it unfreezes could any one give me a advice as how to do this. I now this is a bit vague however so what is mean is whenever the "q" key is presses it stops the character from moving and everything stops.

Free ebooks (PDF)

Pause make more or less like this:

self.PAUSED = False

while True:
    for event in pygame.event.get():
        if event.type==KEYDOWN:
            if event.key==K_q:
                self.PAUSED = not self.PAUSED


    if not self.PAUSED:

        x+=movex
        y+=movey
        screen.fill((r,0,0))
        screen.blit(bif,(0,0))
        screen.blit(player,(x,y)) 

        pygame.display.update() 

EDIT:

You don't have code in classes so you have to use PAUSED without self.

Working code with paused screen and keyboard and with text "PAUSED"

import pygame, sys
from pygame.locals import * 

try:
    import Android
except ImportError:
    Android = None

pygame.init()

if Android:
    android.init()
    android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE)

size = width, height = 1276,650
screen = pygame.display.set_mode(size)

r = 0
bif = pygame.image.load("map.png") 
pygame.display.set_caption("Pygame 2D RPG !")
x,y=0,0
movex, movey=0,0
character="boy.png"
player=pygame.image.load(character).convert_alpha()

PAUSED = False
font = pygame.font.SysFont("serif", 72)
text_paused = font.render("PAUSED", True, (255, 0, 0))

while True:

    # --- events ---

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        if event.type==KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            elif event.key==K_q:
                PAUSED = not PAUSED

        if not PAUSED:
            if event.type==KEYDOWN:
                if event.key==K_a:
                    movex=-1
                elif event.key==K_d:
                    movex=+1
                elif event.key==K_w:
                    movey=-1
                elif event.key==K_s:
                    movey=+1
            if event.type==KEYUP:
                if event.key==K_a:
                    movex=0
                elif event.key==K_d:
                    movex=0
                elif event.key==K_w:
                    movey=0
                elif event.key==K_s:
                    movey=0

    # --- changing values ---

    if not PAUSED:
        x+=movex
        y+=movey

    # --- drawing ---

    screen.fill((r,0,0))
    screen.blit(bif,(0,0))
    screen.blit(player,(x,y)) 

    if PAUSED:
        screen.blit(text_paused, (100, 100))

    pygame.display.update() 

EDIT:

Version (more or less) with classes

import pygame, sys
from pygame.locals import * 

try:
    import Android
except ImportError:
    Android = None


#----------------------------------------------------------------------

class Background():

    def __init__(self, screen):

        self.screen = screen

        self.x = 0
        self.y = 0

        self.r = 0

        filename = "maps.png" # "start_screen.jpg" #

        self.image = pygame.image.load(filename).convert_alpha()

    def draw(self):
        self.screen.fill((self.r,0,0))
        self.screen.blit(self.image, (self.x, self.y))


#----------------------------------------------------------------------

class Player():

    def __init__(self, screen):

        self.screen = screen

        self.x = 0
        self.y = 0
        self.movex = 0
        self.movey = 0

        filename = "boy.png" # "jar.png" # 

        self.image = pygame.image.load(filename).convert_alpha()

    def move(self):
        self.x += self.movex
        self.y += self.movey        

    def draw(self):
        self.screen.blit(self.image, (self.x, self.y))

    def events(self, event):

        if event.type == KEYDOWN:
            if event.key == K_a:
                self.movex = -1
            elif event.key == K_d:
                self.movex = +1
            elif event.key == K_w:
                self.movey = -1
            elif event.key == K_s:
                self.movey = +1

        if event.type==KEYUP:
            if event.key == K_a:
                self.movex = 0
            elif event.key == K_d:
                self.movex = 0
            elif event.key == K_w:
                self.movey = 0
            elif event.key == K_s:
                self.movey = 0

#----------------------------------------------------------------------

class Game():

    def __init__(self):

        pygame.init()

        if Android:
            android.init()
            android.map_key(android.KEYCODE_BACK, pygame.K_ESCAPE)

        self.size = self.width, self.height = 1276, 650
        self.screen = pygame.display.set_mode(self.size)

        pygame.display.set_caption("Pygame 2D RPG !")

        self.background = Background(self.screen)
        self.player = Player(self.screen)

        font = pygame.font.SysFont("serif", 72)
        self.text_paused = font.render("PAUSED", True, (255, 0, 0))

    def run(self):

        PAUSED = False

        RUNNING = True

        while RUNNING:

            # --- events ---

            for event in pygame.event.get():

                if event.type == pygame.QUIT:
                    RUNNING = False

                if event.type==KEYDOWN:
                    if event.key == K_ESCAPE:
                        RUNNING = False
                    elif event.key==K_q:
                        PAUSED = not PAUSED

                if not PAUSED:
                    self.player.events(event)

            # --- changing values ---

            if not PAUSED:
                self.player.move()

            # --- drawing ---

            self.background.draw()
            self.player.draw()

            if PAUSED:
                self.screen.blit(self.text_paused, (100, 100))

            pygame.display.update() 

        pygame.quit()
        sys.exit()

#----------------------------------------------------------------------

if __name__ == '__main__':
    Game().run()

http://www.pygame.org/wiki/tutorials looks like a great place for some tutorials. I'm not sure how advanced your looking for, so they might be a bit basic. At a first glance this looks pretty good: http://programarcadegames.com/index.php?chapter=bitmapped_graphics_and_sound&lang=en#section_12

It's probably a very clunky way of doing it, but you could create an infinite loop that repeats until you press the q key again:

if <q key pressed>:
    while 1:
        sleep(1)
        if <q key pressed>:
             break

is a rather simplified version.

The default Punch the chimp tutorial is a pretty good place to start. Specifically, you should look at their usage of pygame.time.Clock.tick to limit framerate.

Once you have a game loop, the easiest way to pause is to use "event.wait()", which stops and waits until an event happens. You just use this to wait until the unpause is pressed, and continue the event loop.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM