159662-会稽 发表于 2022-7-9 17:14:46

pygame,卡顿求优化

我看完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,bg_size
      
      self.eat = []
      for each in range(33,60):
            self.eat.append(self.image)
      self.walk = []
      for each in range(0,33):
            self.walk.append(self.image)
    def stand(self):
      self.rect = self.image.get_rect()
      self.rect.left = self.position
      self.rect.top = self.position

    def eat(self,i):
      pass

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

      
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 = #初始化速度位置
    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,imp1.rect)
      elif action == 'rstand':
            imp1.stand()
            screen.blit(pygame.transform.flip(imp1.image,True,False),imp1.rect)
      elif action == 'eat':#eat状态是依次播放有关eat的图片序列
            if i < 27:#防止报错超出列表范围
                imp1.eat
                screen.blit(imp1.eat,imp1.rect)
                i+=1
            else:#让图片序列循环播放
                i=3
                imp1.eat
                screen.blit(imp1.eat,imp1.rect)
      elif action == 'walkleft':#和eat同理
            
            if i < 33:
                imp1.walkleft(i)
                imp1.walk
                screen.blit(imp1.walk,imp1.rect)
                i+=1
            else:
                i=0
                imp1.walk
                screen.blit(imp1.walk,imp1.rect)
      elif action == 'walkright':
            
            if i < 33:
                imp1.walkright(i)
                imp1.walk
                screen.blit(pygame.transform.flip(imp1.walk,True,False),imp1.rect)
                i+=1
            else:
                i=0
                imp1.walk
                screen.blit(pygame.transform.flip(imp1.walk,True,False),imp1.rect)
      
               
      pygame.display.flip()
      clock.tick(25)

            
if __name__ == '__main__':
    main()

由于新手上路,所以有写的不好的地方轻喷,我想知道如何既让他按下按键并不松开才走路,又不会卡顿
但我的等级上传不了附件,我只能上传到百度网盘
链接是:链接:https://pan.baidu.com/s/1LgyoMLQe6SuIILIT2WaPYw?pwd=00FC ,
谢谢{:10_254:}

159662-会稽 发表于 2022-7-10 00:28:59

审核通过了{:10_277:}
页: [1]
查看完整版本: pygame,卡顿求优化