当前位置: 首页 > 知识库问答 >
问题:

Pygame:屏幕上的游戏

邓开济
2023-03-14

您好,我正在pygame中制作一个游戏,我想知道如何以及最好的方式是在屏幕上添加游戏。以下是玩家健康状况小于或等于0的代码:

import pygame
import random
import pygame.mixer
import Funk
from player import *
from zombie import *
from level import *
from bullet import *
from constants import *
from time import *
import menu as dm

class Game():

    def __init__(self):
        pygame.init()
        pygame.mixer.init()

        #pygame.mixer.music.load('sounds/menugame.ogg')
        #pygame.mixer.music.play(-1)

        # A few variables
        self.gravity = .50
        self.ground = pygame.Rect(0, 640, 1280, 80)
        self.red = (255, 0, 0)
        self.darkred = (200, 0, 0)
        self.darkblue = (0, 0, 200)
        self.darkgreen = (0, 200, 0)
        self.clock = pygame.time.Clock() #to track FPS
        self.fps = 0

        # Bullets
        self.bullets = []

        # Screen
        size = (1280, 720)
        self.screen = pygame.display.set_mode(size)
        pygame.display.set_caption("Moon Survival")
        self.clock.tick(self.fps)

        # Moon / Background
        self.moon = Background()

        # Zombies
        self.zombies = []
        for i in range(10):
            self.zombies.append( Zombie(random.randint(0,1280), random.randint(0,720)) )

        # Player
        self.player = Player(25, 320, self.gravity)

        # Font for text
        self.font = pygame.font.SysFont(None, 72)

        # Pause - center on screen
        self.pause_text = self.font.render("PAUSE", -1, (255,0,0))
        self.pause_rect = self.pause_text.get_rect(center = self.screen.get_rect().center)

    def run(self):

        clock = pygame.time.Clock()

        # "state machine" 
        RUNNING   = True
        PAUSED    = False 
        GAME_OVER = False

        # Game loop
        while RUNNING:

            # (all) Events

            for event in pygame.event.get():

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

                elif event.type == pygame.KEYDOWN:

                    if event.key == pygame.K_s:
                        self.bullets.append(Bullet(self.player.rect.x + 30, self.player.rect.y + 30, self.player.direction))

                    if event.key == pygame.K_ESCAPE:
                        RUNNING = False

                    elif event.key == pygame.K_p:
                        choose = dm.dumbmenu(self.screen, [
                        'Resume Game',

                        'Menu',

                        'Quit Game'], 200, 200,'orecrusherexpanded',100,0.75,self.darkred,self.red)

                        if choose == 0:
                            print "You choose 'Start Game'."
                            break
                        elif choose == 1:
                            execfile('run_game.py')
                            print "You choose 'Controls'."
                        if choose == 2:
                            print "You choose 'Quit Game'."
                            pygame.quit()
                            sys.exit()

                # Player/Zomies events  

                if not PAUSED and not GAME_OVER:
                    self.player.handle_events(event)

            # (all) Movements / Updates

            if not PAUSED and not GAME_OVER:
                self.player_move()
                self.player.update()

                for z in self.zombies:
                    self.zombie_move(z)
                    z.update(self.screen.get_rect())

                for b in self.bullets:
                    b.update()
                    for tile in self.moon.get_surrounding_blocks(b):
                        if tile is not None:
                            if pygame.sprite.collide_rect(b, tile):
                                # Destroy block
                                x = tile.rect.x / tile.rect.width
                                y = tile.rect.y / tile.rect.height
                                self.moon.levelStructure[x][y] = None
                                try:
                                    self.bullets.remove(b)
                                except:
                                    continue

            # (all) Display updating

            self.moon.render(self.screen)

            for z in self.zombies:
                z.render(self.screen)

            for b in self.bullets:
                b.render(self.screen)

            self.player.render(self.screen)

            if PAUSED:
                self.screen.blit(self.pause_text, self.pause_rect)

            Funk.text_to_screen(self.screen, 'Level 1', 5, 675)
            Funk.text_to_screen(self.screen, 'Health: {0}'.format(self.player.health), 5, 0)
            Funk.text_to_screen(self.screen, 'Score: {0}'.format(self.player.score), 400, 0)
            Funk.text_to_screen(self.screen, 'Time: {0}'.format(self.player.alivetime), 750, 0)

            pygame.display.update()

            # FTP

            clock.tick(100)

        # --- the end ---
        pygame.quit()

    def player_move(self):
        # add gravity
        self.player.do_jump()

        # simulate gravity
        self.player.on_ground = False
        if not self.player.on_ground and not self.player.jumping:
            self.player.velY = 4

        # Health
        for zombie in self.zombies:
            if pygame.sprite.collide_rect(self.player, zombie):
                self.player.health -= 5
                if self.player.health <= 0:


        # move player and check for collision at the same time
        self.player.rect.x += self.player.velX
        self.check_collision(self.player, self.player.velX, 0)
        self.player.rect.y += self.player.velY
        self.check_collision(self.player, 0, self.player.velY)

    def zombie_move(self, zombie_sprite):
        # add gravity
        zombie_sprite.do_jump()

        # simualte gravity
        zombie_sprite.on_ground = False
        if not zombie_sprite.on_ground and not zombie_sprite.jumping:
            zombie_sprite.velY = 4

        # Zombie damage
        for zombie in self.zombies:
            for b in self.bullets:
                if pygame.sprite.collide_rect(b, zombie):
                    #The same bullet cannot be used to kill
                    #multiple zombies and as the bullet was 
                    #no longer in Bullet.List error was raised
                    zombie.health -= 10                
                    self.bullets.remove(b)
                    if zombie.health <= 0:
                        self.player.score += random.randint(10, 20)
                        self.zombies.remove(zombie)
                    break

        # move zombie and check for collision
        zombie_sprite.rect.x += zombie_sprite.velX
        self.check_collision(zombie_sprite, zombie_sprite.velX, 0)
        zombie_sprite.rect.y += zombie_sprite.velY
        self.check_collision(zombie_sprite, 0, zombie_sprite.velY)

    def check_collision(self, sprite, x_vel, y_vel):
        # for every tile in Background.levelStructure, check for collision
        for block in self.moon.get_surrounding_blocks(sprite):
            if block is not None:
                if pygame.sprite.collide_rect(sprite, block):
                    # we've collided! now we must move the collided sprite a step back
                    if x_vel < 0:
                        sprite.rect.x = block.rect.x + block.rect.w

                        if sprite is Zombie:
                            print "wohoo"

                    if type(sprite) is Zombie:
                            # the sprite is a zombie, let's make it jump
                            if not sprite.jumping:
                                sprite.jumping = True
                                sprite.on_ground = False

                    if x_vel > 0:
                        sprite.rect.x = block.rect.x - sprite.rect.w

                    if y_vel < 0:
                        sprite.rect.y = block.rect.y + block.rect.h

                    if y_vel > 0 and not sprite.on_ground:
                        sprite.on_ground = True
                        sprite.rect.y = block.rect.y - sprite.rect.h

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

Game().run()

我不确定该怎么做,因为我试图使用另一个py呼叫游戏,但玩家死亡的时间被重置为0并返回,所以玩家死亡的地方可能发生任何事情吗?

共有3个答案

易炳
2023-03-14

提出一个异常,并在你不在游戏运行范围内但有了处理游戏所需的数据时抓住它。

try:
    stuff()
except GameOver:
    game_over_screen()
梁新觉
2023-03-14

你应该像马库斯写的那样使用状态。我将对此稍作阐述。你应该有一个类,这将是你的游戏类。

这将包括所有的屏幕。草稿会是这样的:

class GameEngine:
    def __init__(self):
        #initialize pygame
        #load resources
        #etc...
        states = [PlayGameState(),OptionsState(),GameOverState()]
    def run(self):
        while(True):
            states[current_state].draw()
            states[current_state].update()
            for event in pygame.event.get():
                states[current_state].input(event)

然后,您可以将所有状态的逻辑分开,添加一个新屏幕只需添加到状态列表中即可。

在本例中暂停游戏非常简单,它只需查看event_键是否为ESC,state是否为PlayGame,就会将其更改为PauseState。

GameEngine还可以轮询状态,看看它是否结束,以便yu可以更改为GameOverState,然后返回Main State。

尉迟冯浩
2023-03-14

在引擎中使用状态。

一些伪代码:

while game_running:
    if STATE == STATE_MENU:
        Menu_ProcessInput()
        Menu_Update()
        Menu_Draw()
    elif STATE == STATE_INGAME:
        INGAME_ProcessInput()
        INGAME_Update()
        INGAME_Draw()
    elif STATE == STATE_GAMEOVER:
        GAMEOVER_ProcessInput()
        GAMEOVER_Update()
        GAMEOVER_Draw()

这是一个简单的解决方案,不需要为菜单等处理多个循环。

 类似资料:
  • 你将如何能够使用Pyplay创建多个屏幕和用户执行的事件? 例如,如果我有一个带有两个按钮(“开始”和“退出”)的菜单屏幕,并且用户单击了“开始”,一个新的屏幕将与游戏中的下一个按钮出现在同一个窗口中。在该屏幕上,用户可以点击另一个按钮,然后移动到另一个屏幕/返回菜单等。

  • 我制作了一个类,在draw函数中,我画了一个文本区域,一些静态文本,并给屏幕上色。draw函数位于while循环中。我希望整个pygame屏幕除输入框外都清晰,并且我希望屏幕改变颜色。我该怎么做?我的代码如下: ######################################################################################### 皮加梅。

  • 我试图移动这个图像: 在我的PyGame屏幕上,从右到左再向后,但是随着图像的移动,每隔一秒左右我就会有一点屏幕撕裂,就像这样: 我使用的代码是类似于此的循环: 到目前为止,我已经尝试了以下方法来解决这个问题: 在创建屏幕时使用,,标志,这没有效果,我也调整了更新为(因为使用?)时建议使用此选项) 在GPU和CPU之间拆分内存(我在raspberry pi 2上运行此功能)我尝试过为这两个处理器提

  • 我以前也发布过同样的问题,但我现在再次发布,因为我在代码中发现了更多的错误并更正了它们。然而,我仍然面临着和以前一样的问题! 原始帖子:我几周前刚开始学习Python,我正在学习一个教程,用pygame构建一个数独解算器! 我现在面临的问题是,每当我尝试运行代码时,只会弹出一个黑色的空白窗口。我已经一遍又一遍地检查我的代码,但我似乎找不到问题。。。我不确定我的代码中到底是哪里出了问题,所以请原谅我

  • 我目前正在编写一个游戏,你必须避免小行星。我不得不处理一些混乱的坐标,我不得不猜测精灵的坐标。我现在有了描述我的世界的任意单位。不幸的是,我的游戏屏幕不能完全工作。当我想渲染我的小行星时,游戏屏幕会显示一个黑屏。 上面显示的代码工作正常,并向我展示了以下内容: 当我在GameScreen类中添加小行星的渲染方法时,GameScreen只是黑色的: 小行星等级: 小行星等级:

  • 每当我试图制作一个蛇游戏时,这仍然是不完整的,每当我的蛇与边界碰撞时,它就会进入下一个屏幕a 你真差劲再试试 但如果我双击pygame窗口的任何地方,它有时会崩溃。 左点击的次数不止2次,但最终点击一段时间后仍然会崩溃。 我必须做些什么来解决这个问题,因为在我玩蛇的初始屏幕上没有这个问题。 我使用的代码如下所示: