【问题标题】:How to blit sprites to screen on timed increments in PyGame如何在 PyGame 中按时间增量将精灵 blit 到屏幕上
【发布时间】:2014-02-23 19:03:50
【问题描述】:

我正在 Pygame 中制作一个游戏,其中一些角色出现在屏幕的一侧并移动到另一侧,在那里他们传送到他们开始的地方并再次执行此操作。我希望精灵一次出现一个,在它们的生成之间有一个随机的时间增量。我为精灵创建了一个类,并将它们放在一个名为“怪物”的组中。我的 blitting 他们看起来像这样:

for monster in monsters:
            monster.render(screen)
            time.sleep(0.5)

这样做是让屏幕变黑,直到所有怪物都生成。我希望它们一次生成一个,并且让玩家能够看到它。这是上面代码所在的整个类:

import pygame, sys, random, time
from monster import *

pygame.init()

class Main:
    clock = pygame.time.Clock()

    screenSize = (500,500)
    background = pygame.image.load("C:/Users/Nathan/PycharmProjects/Monsters II A Dark Descent/images/background.jpg")

    screen = pygame.display.set_mode(screenSize)
    pygame.display.set_caption("MONSTERS!")

    monsters = pygame.sprite.Group()

    counter = 0

    x = 450
    while counter < 5:
            y = random.randint(50,450)
            monster = Monster(x,y)
            monsters.add(monster)
            counter = counter + 1

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

        screen.blit(background,(0,0))

        for monster in monsters:
            monster.render(screen)
            time.sleep(0.5)


        x=x-1

        clock.tick(60)

        pygame.display.flip()


Main()

我还有第二个问题。我希望精灵在它们生成后移动随机速度(它们的当前位置(x)加上随机数)。我还希望他们传送他们开始的地方,并在他们到达屏幕末尾时再次执行此操作。这是精灵运动类:

def move(self):
        if(self.x > 500):
            self.x = 450
        self.x -= random.randint(1,5)

目前它们以不同的速度移动,只是离开屏幕边缘。这是整个精灵类:

import random, pygame

class Monster(pygame.sprite.Sprite):

    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.x = x
        self.y = y
        self.image = pygame.image.load("C:\Users\Nathan\PycharmProjects\Monsters II A Dark Descent\images\monster.png")

    def move(self):
        if(self.x > 500):
            self.x = 450
        self.x -= random.randint(1,5)

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

感谢您的宝贵时间。如果您需要更多详细信息,请告诉我。

【问题讨论】:

    标签: python pygame


    【解决方案1】:

    期间不会发生任何事情
    time.sleep(...)
    

    所以整个游戏在您等待每个 monster 变为 blitted 时停止。

    您需要允许while True 循环继续运行,但要控制正在显示的monsters。例如,您可以保留 visible_monsters 的计数,该计数会在适当的时间间隔后添加:

    elapsed, visible_monsters = 0, 0
    
    while True:
    
        elapsed += clock.tick(60)
    
        for event in pygame.event.get():
            ...
    
        screen.blit(background,(0,0))
    
        if elapsed >= 500:
            elapsed = 0
            visible_monsters += 1
    
        for monster in monsters[:visible_monsters]:
            monster.render(screen)
    

    对于您的第二个问题,保留monsterinit_xinit_y,以便您以后可以重复使用它们,并在您render 时检查它们是否在screen 内(例如0 &lt;= self.x &lt;= screenSize[0]) .

    【讨论】:

    • 感谢您的回复。当你说“elapsed, visible_monsters = 0,0”时,那是什么 Python 方法?例如,我知道“apple = [1,2,3]”是一个列表,而“def function(variables):”是一个函数。我只是问,因为我想了解更多关于 python 的信息。谢谢!
    • 如果您提供的细节比“它不起作用”更详细,我可以尝试进一步提供帮助!
    【解决方案2】:

    要让不同的精灵在不同的时间出现,你应该像约翰所说的那样使用计时器循环。他给出的代码是正确的。这是您在不减慢整个游戏循环的情况下做到这一点的唯一方法。

    经过,visible_monsters = 0,0

    表示他在一行中分配了两个变量。也可以写成

    经过 = visible_monsters = 0

    【讨论】:

      【解决方案3】:

      time.sleep() 显然只会暂停你的程序,而在不同时间生成怪物的唯一方法是使用 Clock.tick 函数,因为你必须已经调用了 pygame.time.Clock()一个变量。我在我的蛇游戏中也使用了很多次。您也可以使用 Pygame USEREVENT 可能您应该阅读 pygame 文档并了解如何使用 pygame 时间模块做一些很酷的事情。并且您有两个 while 循环而无法结束它们的事实可能会在运行游戏时使您的游戏表面变黑,我觉得 jonrsharpe ans 是一个不错的选择,再次检查您的代码并解决问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        相关资源
        最近更新 更多