Python 使用状态机在pygame中获得连续运动
我在使用Metulburr的状态机代码时遇到了连续运动的问题 从现在起,按住键不会导致连续的流体运动。只注册每个按键 这是他的代码,添加了一个精灵Python 使用状态机在pygame中获得连续运动,python,pygame,state,Python,Pygame,State,我在使用Metulburr的状态机代码时遇到了连续运动的问题 从现在起,按住键不会导致连续的流体运动。只注册每个按键 这是他的代码,添加了一个精灵 import pygame as pg import sys from spritez import MainChar GREEN = (000,000,000) pg.init() main_char = MainChar(GREEN, 100, 100) sprite_list = pg.sprite.Group() sprite_l
import pygame as pg
import sys
from spritez import MainChar
GREEN = (000,000,000)
pg.init()
main_char = MainChar(GREEN, 100, 100)
sprite_list = pg.sprite.Group()
sprite_list.add(main_char)
sprite_list.update()
class States(object):
def __init__(self):
self.done = False
self.next = None
self.quit = False
self.previous = None
class Menu(States):
def __init__(self):
States.__init__(self)
self.next = 'game'
def cleanup(self):
print('cleaning up Menu state stuff')
def startup(self):
print('starting Menu state stuff')
def get_event(self, event):
if event.type == pg.KEYDOWN:
print('Menu State keydown')
elif event.type == pg.MOUSEBUTTONDOWN:
self.done = True
def update(self, screen, dt):
self.draw(screen)
def draw(self, screen):
screen.fill((255,0,0))
class Game(States):
def __init__(self):
States.__init__(self)
self.next = 'menu'
def cleanup(self):
print('cleaning up Game state stuff')
def startup(self):
print('starting Game state stuff')
def get_event(self, event):
if event.type == pg.KEYDOWN:
if event.key == pg.K_LEFT:
main_char.moveLeft(5)
elif event.key == pg.K_RIGHT:
main_char.moveRight(5)
elif event.type == pg.MOUSEBUTTONDOWN:
self.done = True
def update(self, screen, dt):
self.draw(screen)
def draw(self, screen):
screen.fill((0,0,255))
sprite_list.draw(screen)
pg.key.set_repeat(10)
class Control:
def __init__(self, **settings):
self.__dict__.update(settings)
self.done = False
self.screen = pg.display.set_mode(self.size)
self.clock = pg.time.Clock()
def setup_states(self, state_dict, start_state):
self.state_dict = state_dict
self.state_name = start_state
self.state = self.state_dict[self.state_name]
def flip_state(self):
self.state.done = False
previous,self.state_name = self.state_name, self.state.next
self.state.cleanup()
self.state = self.state_dict[self.state_name]
self.state.startup()
self.state.previous = previous
def update(self, dt):
if self.state.quit:
self.done = True
elif self.state.done:
self.flip_state()
self.state.update(self.screen, dt)
def event_loop(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.done = True
self.state.get_event(event)
def main_game_loop(self):
while not self.done:
delta_time = self.clock.tick(self.fps)/1000.0
self.event_loop()
self.update(delta_time)
pg.display.update()
settings = {
'size':(600,400),
'fps' :60
}
app = Control(**settings)
state_dict = {
'menu': Menu(),
'game': Game()
}
app.setup_states(state_dict, 'menu')
app.main_game_loop()
pg.quit()
sys.exit()
精灵移动方法:
def moveLeft(self, px):
self.rect.x -= px
def moveRight(self, px):
self.rect.x += px
我知道通常会使用布尔值,例如:
左=假
...
...
如果留下:
主字符左移(5)
然后,事件处理程序将是:
if event.key == pg.K_LEFT:
left = True
尽管我尝试了很多次并重新格式化了很多次,但我无法正确地实现它。有没有关于如何修复此问题并使其正常工作的想法?使用
pygame.key.get_pressed()
而不是键盘事件
键盘事件(请参阅模块)仅在按键状态更改时发生一次。每次按键时,KEYDOWN
事件发生一次KEYUP
在每次释放钥匙时发生一次。将键盘事件用于单个操作或逐步移动
返回包含每个键状态的列表。如果按下某个键,则该键的状态为True
,否则为False
。用于评估按钮的当前状态并获得连续移动
类状态(对象):
# [...]
def get_事件(自身、事件):
如果event.type==pg.MOUSEBUTTONDOWN:
self.done=True
def get_状态(自身):
keys=pygame.key.get_pressed()
如果键[pg.K_左]:
主字符左移(5)
如果键[pg.K_RIGHT]:
主字符移动右键(5)
类控制:
# [...]
def事件_循环(自):
对于pg.event.get()中的事件:
如果event.type==pg.QUIT:
self.done=True
self.state.get_事件(事件)
self.state.get_states()
使用pygame.key.get_pressed()
而不是键盘事件
键盘事件(请参阅模块)仅在按键状态更改时发生一次。每次按键时,KEYDOWN
事件发生一次KEYUP
在每次释放钥匙时发生一次。将键盘事件用于单个操作或逐步移动
返回包含每个键状态的列表。如果按下某个键,则该键的状态为True
,否则为False
。用于评估按钮的当前状态并获得连续移动
类状态(对象):
# [...]
def get_事件(自身、事件):
如果event.type==pg.MOUSEBUTTONDOWN:
self.done=True
def get_状态(自身):
keys=pygame.key.get_pressed()
如果键[pg.K_左]:
主字符左移(5)
如果键[pg.K_RIGHT]:
主字符移动右键(5)
类控制:
# [...]
def事件_循环(自):
对于pg.event.get()中的事件:
如果event.type==pg.QUIT:
self.done=True
self.state.get_事件(事件)
self.state.get_states()
如果您对pygame.event
有问题,那么您可能应该在每个循环中检查pygame.key.get_pressed()[pg.K_LEFT]
?它将在每个循环中给出True
,因此它将在每个循环中移动对象<代码>事件可以在不同的时刻使用-例如,当您想要捕捉鼠标单击按钮或屏幕上的其他元素时。然后连续单击(当您按住鼠标时)是没有用的。我将把它放在我的代码中的什么位置?如果您对pygame.event
有问题,那么您可能应该在每个循环中选中pygame.key.get_pressed()[pg.K_LEFT]
?它将在每个循环中给出True
,因此它将在每个循环中移动对象<代码>事件可以在不同的时刻使用-例如,当您想要捕捉鼠标单击按钮或屏幕上的其他元素时。然后连续的点击(当你们按住鼠标的时候)是没用的。我应该把它放在我的代码里的什么地方呢?非常感谢。我基本上误解了事件的运作方式。非常感谢。我从根本上误解了事件的运作方式。