Python 使用状态机在pygame中获得连续运动

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

我在使用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_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
,因此它将在每个循环中移动对象<代码>事件可以在不同的时刻使用-例如,当您想要捕捉鼠标单击按钮或屏幕上的其他元素时。然后连续的点击(当你们按住鼠标的时候)是没用的。我应该把它放在我的代码里的什么地方呢?非常感谢。我基本上误解了事件的运作方式。非常感谢。我从根本上误解了事件的运作方式。