鱼C论坛

 找回密码
 立即注册
查看: 1929|回复: 1

pygame,卡顿求优化

[复制链接]
发表于 2022-7-9 17:14:46 | 显示全部楼层 |阅读模式

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

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

x
我看完pygame的前几集后,尝试着写一个代码素材是《植物大战僵尸》里的小鬼僵尸,使其可以完成走和吃两个动作
但是在吃的时候并不会卡顿,在走路的时候如果把代码编为按一下按键一直走也不会卡顿,
但如果把代码编为只有按着按键才会走路就会卡顿
以下是代码以及注释
import pygame#引用模块
import sys
from pygame import *

class imp(pygame.sprite.Sprite):#定义一个小鬼僵尸的类
    def __init__ (self,imp_image,position,speed,bg_size):
        pygame.sprite.Sprite.__init__(self)
        
        self.image = imp_image
        self.position = position
        self.speed = speed
        self.width,self.height = bg_size[0],bg_size[1]
        
        self.eat = []
        for each in range(33,60):
            self.eat.append(self.image[each])
        self.walk = []
        for each in range(0,33):
            self.walk.append(self.image[each])
    def stand(self):
        self.rect = self.image[33].get_rect()
        self.rect.left = self.position[0]
        self.rect.top = self.position[1]

    def eat(self,i):
        pass

    def walkleft(self,i):#传入用于控制的参数i
        self.speed = -4
        
        self.position[0] =  self.position[0]+self.speed
        self.rect = self.walk[i].get_rect()
        self.rect.left = self.position[0]
        self.rect.top = self.position[1]
    def walkright(self,i):
        self.speed = 4
        
        self.position[0] =  self.position[0]+self.speed
        self.rect = self.walk[i].get_rect()
        self.rect.left = self.position[0]
        self.rect.top = self.position[1]

        
def main():

    pygame.init()#初始化

    bg_size = width,height = 800,600#屏幕大小
    bg_color = (255,255,255)#屏幕背景颜色
    running = True#在初始化完毕后如果running为真则程序继续运行
    screen = pygame.display.set_mode(bg_size)#设置窗口
    pygame.display.set_caption('imp - Star_with_Dream Demo')#窗口标题

    position = [width-100,height-100]#初始化速度位置
    speed = -4#小鬼僵尸左右行走速度

    imp_image = []#导入图片
    for each in range(1,34):#依次导入小鬼僵尸的每帧图片总共有83张图
        if each < 10:
            imp_image.append(\
                pygame.image.load('./image/Walk/imp000'+str(each)+'.png').convert_alpha())
        else:
            imp_image.append(\
                pygame.image.load('./image/Walk/imp00'+str(each)+'.png').convert_alpha())
    for each in range(34,61):
        imp_image.append(\
            pygame.image.load('./image/Eat/imp00'+str(each)+'.png').convert_alpha())
    for each in range(61,83):
        imp_image.append(\
            pygame.image.load('./image/Die/imp00'+str(each)+'.png').convert_alpha())

    clock = pygame.time.Clock()#帧率控制
    imp1 = imp(imp_image,position,speed,bg_size)#僵尸一号
    i=0#用于控制播放动画的帧的序号
    action = 'stand'#用于控制小鬼僵尸的行为
    Detect_key_release = False#用于判断按键的按下与松开也就是KEYDOWN和KEYUP,False为按键未按下
    j = True#用于判断小鬼僵尸是否处于吃这个状态False为处于
    while running:
        for event in pygame.event.get():#当用户退出
            if event.type == QUIT:
                sys.exit()
                  
            if event.type == KEYDOWN:
                k = event.key
                if k == K_a:#当按下A键
                    action = 'walkleft'
                    
                    Detect_key_release = True
                elif k == K_d:#当按下D键
                    action = 'walkright'
                    
                    Detect_key_release = True
                if not Detect_key_release:
                    if k == K_e and j:  #当按下E键且小鬼未处于吃时
                        j = not j
                        action = 'eat'
                        
                    elif k == K_e and not j:#当按下E键且小鬼处于吃时则停止吃
                        action = 'stand'
                        j = not j
            if event.type == KEYUP:#当松开A D键
                k = event.key
                if k == K_a:
                    action = 'stand'
                    
                    Detect_key_release = False
                elif k == K_d:
                    action = 'rstand'
                    
                    Detect_key_release = False
                    
        screen.fill(bg_color)#用白色填满背景
        if action == 'stand':#stand为默认状态,只放出一张图片
            imp1.stand()
            screen.blit(imp1.image[33],imp1.rect)
        elif action == 'rstand':
            imp1.stand()
            screen.blit(pygame.transform.flip(imp1.image[33],True,False),imp1.rect)
        elif action == 'eat':#eat状态是依次播放有关eat的图片序列
            if i < 27:#防止报错超出列表范围
                imp1.eat[i]
                screen.blit(imp1.eat[i],imp1.rect)
                i+=1
            else:#让图片序列循环播放
                i=3
                imp1.eat[i]
                screen.blit(imp1.eat[i],imp1.rect)
        elif action == 'walkleft':#和eat同理
            
            if i < 33:
                imp1.walkleft(i)
                imp1.walk[i]
                screen.blit(imp1.walk[i],imp1.rect)
                i+=1
            else:
                i=0
                imp1.walk[i]
                screen.blit(imp1.walk[i],imp1.rect)
        elif action == 'walkright':
            
            if i < 33:
                imp1.walkright(i)
                imp1.walk[i]
                screen.blit(pygame.transform.flip(imp1.walk[i],True,False),imp1.rect)
                i+=1
            else:
                i=0
                imp1.walk[i]
                screen.blit(pygame.transform.flip(imp1.walk[i],True,False),imp1.rect)
        
                
        pygame.display.flip()
        clock.tick(25)

            
if __name__ == '__main__':
    main()
由于新手上路,所以有写的不好的地方轻喷,我想知道如何既让他按下按键并不松开才走路,又不会卡顿
但我的等级上传不了附件,我只能上传到百度网盘
链接是:链接:https://pan.baidu.com/s/1LgyoMLQe6SuIILIT2WaPYw?pwd=00FC ,
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-7-10 00:28:59 | 显示全部楼层
审核通过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 15:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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