鱼C论坛

 找回密码
 立即注册
查看: 1491|回复: 3

[已解决]用pygame写的一个小人走动,图片切换时会闪是怎么回事?

[复制链接]
发表于 2021-8-17 18:21:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小菜鸟FLY 于 2021-8-17 18:32 编辑

按住键盘上的A/D是左右移动,持续按住时会切换图片,以此来达到“走路”的动作,但是不管我怎么调帧数,还是会有闪烁,各位大神给支个招?
import pygame
from pygame.locals import *
import sys
import traceback

pygame.init()

bg_size = width,height = 1000,400
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption('2021.8.17')

background_photo = pygame.image.load('bg_1000×400.png').convert()  


class Man(pygame.sprite.Sprite):
    def __init__(self,bg_size):
        pygame.sprite.Sprite.__init__(self)

        self.image1 = pygame.image.load('stand_100×200 .png').convert_alpha()
        self.image2 = pygame.image.load('walk_1_100×200.png').convert_alpha()
        self.image3 = pygame.image.load('walk_2_100×200.png').convert_alpha()

        #获取插入图的限定矩形
        self.rect = self.image1.get_rect()
        #背景图的长和高
        self.width,self.height = bg_size[0],bg_size[1]
        #设置初始位置在左下角
        self.rect.left,self.rect.top = (0,self.height - self.rect.height)
        
        self.speed = 2

    def walk_left(self):
        if self.rect.left > 0:
            self.rect.left -= self.speed
        else:
            self.rect.left = 0

    def walk_right(self):
        if self.rect.right < 1000:
            self.rect.right += self.speed

def main():
    #设置帧数
    clock = pygame.time.Clock()
    
    man = Man(bg_size)

    delay = 100

    switch_image = 2

    r_head1 = man.image1
    r_head2 = man.image2
    r_head3 = man.image3
    l_head1 = pygame.transform.flip(man.image1,True,False)
    l_head2 = pygame.transform.flip(man.image2,True,False)
    l_head3 = pygame.transform.flip(man.image3,True,False)

    head1 = r_head1

    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        #绘制图片
        screen.blit(background_photo,(0,0))

        
        key_pressed = pygame.key.get_pressed()
        if not (key_pressed[K_a] or key_pressed[K_d]):
            screen.blit(head1,man.rect)
        
        if key_pressed[K_a]:
            man.walk_left()
            head1 = l_head1
            if switch_image == 2:
                screen.blit(l_head2,man.rect)
            elif switch_image == 1:
                screen.blit(l_head3,man.rect)
            else:
                switch_image = 2
        if key_pressed[K_d]:
            man.walk_right()
            head1 = r_head1
            
            if switch_image == 2:
                screen.blit(r_head2,man.rect)
            elif switch_image == 1:
                screen.blit(r_head3,man.rect)
            else:
                switch_image = 2

        
        

        #切换图片
        if not(delay % 5):
            switch_image -= 1
        delay -=1
        if not delay:
            delay = 20

        pygame.display.flip()
        clock.tick(60)

if __name__ == '__main__':
    try:
        main()
    except SystemExit:  #正常退出,抛出异常,然后跳过
        pass
    except:
        #在双击打开程序时,若有异常,打印异常,退出
        traceback.print_exc()  
        pygame.quit()
        input()    
哎呀,还没权限,怎么上传图片文件呀?好烦那
最佳答案
2021-8-18 08:20:02
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-17 18:22:54 | 显示全部楼层
咋上传文件,这个代码引用了四张图,上传不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-17 18:29:30 | 显示全部楼层
解决了,间隔的时间中没有图片,和背景之间有差异,导致闪动。
改进办法,让一张图片停留到下一张切换就不会有闪动了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-8-18 08:20:02 | 显示全部楼层    本楼为最佳答案   
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 15:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表