单击按钮将对象附加到游戏循环中?
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()
当然你会在这里传递你的参数。每当您想要渲染时,您都可以调用此方法。 (例如,在您的问题中所述的主循环中。)
我正在尝试在我正在制作的游戏中制作一把枪,但遇到了麻烦。当我单击 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()
当然你会在这里传递你的参数。每当您想要渲染时,您都可以调用此方法。 (例如,在您的问题中所述的主循环中。)