鱼C论坛

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

pygame,卡顿求优化

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

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

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

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

  4. class imp(pygame.sprite.Sprite):#定义一个小鬼僵尸的类
  5.     def __init__ (self,imp_image,position,speed,bg_size):
  6.         pygame.sprite.Sprite.__init__(self)
  7.         
  8.         self.image = imp_image
  9.         self.position = position
  10.         self.speed = speed
  11.         self.width,self.height = bg_size[0],bg_size[1]
  12.         
  13.         self.eat = []
  14.         for each in range(33,60):
  15.             self.eat.append(self.image[each])
  16.         self.walk = []
  17.         for each in range(0,33):
  18.             self.walk.append(self.image[each])
  19.     def stand(self):
  20.         self.rect = self.image[33].get_rect()
  21.         self.rect.left = self.position[0]
  22.         self.rect.top = self.position[1]

  23.     def eat(self,i):
  24.         pass

  25.     def walkleft(self,i):#传入用于控制的参数i
  26.         self.speed = -4
  27.         
  28.         self.position[0] =  self.position[0]+self.speed
  29.         self.rect = self.walk[i].get_rect()
  30.         self.rect.left = self.position[0]
  31.         self.rect.top = self.position[1]
  32.     def walkright(self,i):
  33.         self.speed = 4
  34.         
  35.         self.position[0] =  self.position[0]+self.speed
  36.         self.rect = self.walk[i].get_rect()
  37.         self.rect.left = self.position[0]
  38.         self.rect.top = self.position[1]

  39.         
  40. def main():

  41.     pygame.init()#初始化

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

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

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

  63.     clock = pygame.time.Clock()#帧率控制
  64.     imp1 = imp(imp_image,position,speed,bg_size)#僵尸一号
  65.     i=0#用于控制播放动画的帧的序号
  66.     action = 'stand'#用于控制小鬼僵尸的行为
  67.     Detect_key_release = False#用于判断按键的按下与松开也就是KEYDOWN和KEYUP,False为按键未按下
  68.     j = True#用于判断小鬼僵尸是否处于吃这个状态False为处于
  69.     while running:
  70.         for event in pygame.event.get():#当用户退出
  71.             if event.type == QUIT:
  72.                 sys.exit()
  73.                   
  74.             if event.type == KEYDOWN:
  75.                 k = event.key
  76.                 if k == K_a:#当按下A键
  77.                     action = 'walkleft'
  78.                     
  79.                     Detect_key_release = True
  80.                 elif k == K_d:#当按下D键
  81.                     action = 'walkright'
  82.                     
  83.                     Detect_key_release = True
  84.                 if not Detect_key_release:
  85.                     if k == K_e and j:  #当按下E键且小鬼未处于吃时
  86.                         j = not j
  87.                         action = 'eat'
  88.                         
  89.                     elif k == K_e and not j:#当按下E键且小鬼处于吃时则停止吃
  90.                         action = 'stand'
  91.                         j = not j
  92.             if event.type == KEYUP:#当松开A D键
  93.                 k = event.key
  94.                 if k == K_a:
  95.                     action = 'stand'
  96.                     
  97.                     Detect_key_release = False
  98.                 elif k == K_d:
  99.                     action = 'rstand'
  100.                     
  101.                     Detect_key_release = False
  102.                     
  103.         screen.fill(bg_color)#用白色填满背景
  104.         if action == 'stand':#stand为默认状态,只放出一张图片
  105.             imp1.stand()
  106.             screen.blit(imp1.image[33],imp1.rect)
  107.         elif action == 'rstand':
  108.             imp1.stand()
  109.             screen.blit(pygame.transform.flip(imp1.image[33],True,False),imp1.rect)
  110.         elif action == 'eat':#eat状态是依次播放有关eat的图片序列
  111.             if i < 27:#防止报错超出列表范围
  112.                 imp1.eat[i]
  113.                 screen.blit(imp1.eat[i],imp1.rect)
  114.                 i+=1
  115.             else:#让图片序列循环播放
  116.                 i=3
  117.                 imp1.eat[i]
  118.                 screen.blit(imp1.eat[i],imp1.rect)
  119.         elif action == 'walkleft':#和eat同理
  120.             
  121.             if i < 33:
  122.                 imp1.walkleft(i)
  123.                 imp1.walk[i]
  124.                 screen.blit(imp1.walk[i],imp1.rect)
  125.                 i+=1
  126.             else:
  127.                 i=0
  128.                 imp1.walk[i]
  129.                 screen.blit(imp1.walk[i],imp1.rect)
  130.         elif action == 'walkright':
  131.             
  132.             if i < 33:
  133.                 imp1.walkright(i)
  134.                 imp1.walk[i]
  135.                 screen.blit(pygame.transform.flip(imp1.walk[i],True,False),imp1.rect)
  136.                 i+=1
  137.             else:
  138.                 i=0
  139.                 imp1.walk[i]
  140.                 screen.blit(pygame.transform.flip(imp1.walk[i],True,False),imp1.rect)
  141.         
  142.                
  143.         pygame.display.flip()
  144.         clock.tick(25)

  145.             
  146. if __name__ == '__main__':
  147.     main()
复制代码

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

使用道具 举报

 楼主| 发表于 2022-7-10 00:28:59 | 显示全部楼层
审核通过了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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