单击按钮将对象附加到游戏循环中?

Append an object into the game loop on button-click?

我正在尝试在我正在制作的游戏中制作一把枪,但遇到了麻烦。当我单击 space 栏之类的东西时,我无法弄清楚如何将一个矩形附加到 while 循环中。它在 javascript 中有效,但 body.append() 函数在 python 中不存在,所以我应该怎么做?

提前致谢

编辑:

我想通了。

import pygame
import sys


class Application(object):

    def __init__(self,screen=None):
        self.screen = screen

        self.fps = 30
        self.clock = pygame.time.Clock()

        self.buffer()


    def buffer(self):
        self.char = Character(self.screen)
        self.gun = Gun(self.screen)

        while 1:

            self.key = pygame.key.get_pressed()

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    return 0

                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:

                        if len(self.gun.ammo) <= 10 and self.gun.magazine_count > 0:
                            self.gun.ammo.append(self.gun.bullet_position(self.char.x+20,self.char.y+10))

                        elif len(self.gun.ammo) > 10:

                            self.gun.magazine_count -= 1

                            if self.gun.magazine_count > 0:
                                print("reloading")

                                self.gun.ammo = []

                            else:
                                print("out of magazines < press UP arrow to restock >")


                    if event.key == pygame.K_UP:
                        if self.gun.magazine_count == 0:
                            self.gun.magazine_count = 4


            self.screen.fill((0,0,0))

            self.char.draw_char()

            for x in range(len(self.gun.ammo)):
                self.gun.bullet_create(self.gun.ammo[x],5)

                self.gun.ammo[x][0] += 25

            pygame.display.update()
            self.clock.tick(self.fps)

        pygame.quit()
        sys.exit()
        quit()

class Character(object):

    def __init__(self,screen):

        self.screen = screen

        self.w, self.h = 20, 20
        self.x, self.y = 0, int(self.screen.get_height()/2-self.h)

    def draw_char(self):
        player = pygame.draw.rect(self.screen,(255,0,0),[self.x,self.y,self.w,self.h])

class Gun(object):

    def __init__(self,screen):
        self.screen = screen

        self.magazine_count = 4
        self.ammo = []

    def bullet_position(self,x,y):
        return [x,y]

    def bullet_create(self,dimensions,radius):

        pygame.draw.circle(self.screen,(255,255,255),(dimensions),radius)


def Main():
    pygame.init()
    screen = pygame.display.set_mode((500,400))
    app = Application(screen)


if __name__ == "__main__":
    Main()

您应该使用渲染对象列表。每次渲染时,您都会浏览该列表并调用对象渲染方法。为此,您可以使用一个接口,每个可渲染对象都必须扩展提供渲染方法。

至于你的问题,你只需将要绘制的新对象添加到列表中,它会在下一次循环迭代时自动呈现它。

请确保在多线程处理时,您永远不会在列表中添加任何内容!

*编辑: 根据要求 - 示例代码:

class IRenderable:
    def render(self, <other parameters>): raise NotImplementedError

这里当然可以添加渲染需要的参数。我不知道这在 Pyhton 中是如何处理的,但是在 Java 中你会传递一个包含所有渲染方法的 Graphics 对象。每个可渲染的 class 现在都应该扩展这个接口。

class Gun(IRenderable):
    def render(self):
        # enter your rendercode here

在您的主体中,您只需要拥有一个称为可渲染对象的对象列表,并遍历它们以使用以下方法进行渲染:

def render(self):
    for renderable in self.renderables:
        renderable.render()

当然你会在这里传递你的参数。每当您想要渲染时,您都可以调用此方法。 (例如,在您的问题中所述的主循环中。)