Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Pygame按键事件按下,不同事件暂停_Python 3.x_Animation_Pygame - Fatal编程技术网

Python 3.x Pygame按键事件按下,不同事件暂停

Python 3.x Pygame按键事件按下,不同事件暂停,python-3.x,animation,pygame,Python 3.x,Animation,Pygame,我要找的是平滑的精灵动画,它们之间有过渡动画。它不是让主角向左或向右眨眼然后做动作动画,而是在继续之前做另一个转身的动画 所以我想要一个pygame按键事件来执行一项任务,然后我想要动画过去(我认为它是270毫秒,或者以60帧/秒的速度16帧),然后我想要一个不同的动画重复播放,只要按下按钮,而不重复转换,这就是我目前得到的。 相关循环如下: while Playing: dt = Clock.tick()/1000 keys=pygame.key.get_pressed() for eve

我要找的是平滑的精灵动画,它们之间有过渡动画。它不是让主角向左或向右眨眼然后做动作动画,而是在继续之前做另一个转身的动画

所以我想要一个pygame按键事件来执行一项任务,然后我想要动画过去(我认为它是270毫秒,或者以60帧/秒的速度16帧),然后我想要一个不同的动画重复播放,只要按下按钮,而不重复转换,这就是我目前得到的。 相关循环如下:

while Playing:
dt = Clock.tick()/1000
keys=pygame.key.get_pressed()


for event in pygame.event.get():

    if event.type == QUIT:
        pygame.quit()

if event.type == KEYDOWN:


    if keys[K_RIGHT]:
        walkerspritesheet = WalkerStandToSlow_Right_List
        walkerxlocation += walkermovespeed
        if Walker_Counter == 16:
            walkerspritesheet = WalkerSlow_Right_List

    if keys[K_LEFT]:
        walkerspritesheet = WalkerStandToSlow_Left_List
        walkerxlocation -= walkermovespeed
        if Walker_Counter == 16:
            walkerspritesheet = WalkerSlow_Left_List
XXXXX_列表变量是精灵工作表切片的列表。在主while循环的下方,它使用WalkerPriteSheet中包含的图像播放步行者的动画。Walker_计数器是动画所处的60帧中的哪一帧


如果我缺少任何必要的信息,请告诉我,谢谢。

我已经尝试创建一个最小的示例。按向右或向左箭头键时,精灵将移动。最初,精灵将变为浅色,然后变为深色。松开钥匙后,它将恢复到原来的颜色

导入pygame
pygame.init()
宽度=320
高度=240
FPS=30
clock=pygame.time.clock()
screen=pygame.display.set_模式([宽度,高度])
职业玩家(pygame.sprite.sprite):
定义初始位置(自身,起始位置=(0,0)):
pygame.sprite.sprite.\uuuuu init\uuuuuuu(自我)
宽度,高度=10,20
self.color=pygame.color(“棕色”)
self.image=pygame.Surface([宽度,高度])
self.image.fill(self.color)
#获取具有图像尺寸的矩形对象
self.rect=self.image.get_rect()
#初始化位置
self.rect.center=起始位置
self.velx=0
self.counter=0
def动画(自):
如果self.velx==0:
self.image.fill(self.color)#重置为原始图像
其他:
self.counter+=1#递增计数器
如果self.velx>0:#向右移动
如果self.counter<20:
self.image.fill(pygame.Color(“浅绿色”))
其他:
self.image.fill(pygame.Color(“暗绿色”))
elif self.velx<0:#向左移动
如果self.counter<20:
self.image.fill(pygame.Color(“浅蓝色”))
其他:
self.image.fill(pygame.Color(“暗蓝色”))
def停止(自):
self.velx=0
self.counter=0
def向左移动(自身):
self.velx-=1
def向右移动(自身):
self.velx+=1
def更新(自我):
self.animate()
self.rect.x+=self.velx
#检查边界
如果不是0

如果您有任何问题,请告诉我。

您的按键事件处理程序设置您的精灵状态(例如向左行走)。如果在keyup事件处理程序中清除该状态,则可以更新主循环中的精灵,以便在按住关键帧的情况下重复动画。我不确定我是否理解。“关键点设置”部分处理从行走、过渡到空闲动画的切换。这是可行的,因为只接收帧的keyup,所以keydown是连续的。我在寻找更多的像,哎呀,立即进入岗位。我在寻找更多类似于,在键下:WalkerPriteSheet=WalkerStandToSLow\u Right\u List'的内容。一旦达到条件,如过渡长度计数为16帧,则WalkerPriteSheet=WalkerSlow\u Right\u List。我遇到的问题是如何让这种情况在循环外发生,这样它就不会每次都播放过渡而不是行走动画。是否有一个功能仅在按下从怠速到步行过渡的第一瞬间接收向下键?然后按住键将设置为行走动画。事件应更改游戏/精灵状态。游戏的状态应该在事件处理程序之外处理。有更多关于游戏循环概念的信息。通读了大部分,还是不太明白,这伤害了我的大脑。我所需要的只是计算从某个特定时间经过的时间,而不暂停程序的其余部分,因此time.wait没有帮助。我读过关于pygame.time.get_ticks的文章,但我看到的每一篇关于它的文章都让我更加困惑。。。我想我必须为基线设置一个变量,然后再设置另一个变量来获取刻度,并读取它们之间的差异。但当玩家按下一个键时,开始时间需要重新设置,这意味着每一帧都会再次读取,而我又回到了原点。。。
import pygame
pygame.init()

width = 320
height = 240
FPS = 30

clock = pygame.time.Clock()
screen = pygame.display.set_mode([width, height])

class Player(pygame.sprite.Sprite):
    def __init__(self, starting_position=(0,0)):
        pygame.sprite.Sprite.__init__(self)
        width, height = 10, 20
        self.color= pygame.Color("brown")
        self.image = pygame.Surface([width, height])
        self.image.fill(self.color)
        # Fetch the rectangle object that has the dimensions of the image
        self.rect = self.image.get_rect()
        #initialise position
        self.rect.center = starting_position
        self.velx = 0
        self.counter = 0

    def animate(self):
        if self.velx == 0:
            self.image.fill(self.color)  # reset to original image
        else:
            self.counter += 1  # increment counter
        if self.velx > 0:  # moving right
            if self.counter < 20:
                self.image.fill(pygame.Color("lightgreen"))
            else:
                self.image.fill(pygame.Color("darkgreen"))
        elif self.velx < 0:  # moving left
            if self.counter < 20:
                self.image.fill(pygame.Color("lightblue"))
            else:
                self.image.fill(pygame.Color("darkblue"))

    def stop(self):
        self.velx = 0
        self.counter = 0

    def move_left(self):
        self.velx -= 1

    def move_right(self):
        self.velx += 1        

    def update(self):
        self.animate()
        self.rect.x += self.velx
        # check bounds
        if not 0 < self.rect.x < (width - 20):
            self.rect.x -= self.velx  # out of bounds, undo movement

    def draw(self, screen):
        screen.blit(self.image, self.rect.center)

player = Player((50, 100))
done = False
# main loop
while not done:
    for event in pygame.event.get():            
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
            elif event.key == pygame.K_LEFT:
                player.move_left()
            elif event.key == pygame.K_RIGHT:
                player.move_right()
        elif event.type == pygame.KEYUP:
            if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                player.stop()

    # update sprite(s)
    player.update()
    #redraw screen
    screen.fill(pygame.Color("black")) # use black background
    # draw sprite
    player.draw(screen)
    # update screen
    pygame.display.update()
    clock.tick(FPS)
pygame.quit()
quit()