自动生成scratch2或scratch3作品核心代码

scratch2或scratch3的作品能通过Python编程自动生成吗?答案是肯定的,因为它的作品文件是一个压缩包,你把它解压后,分析它解压后的文件就能得出结论。对于一些简单的作品,如只是切换造型的,那可以通过Python编程读取gif文件,拆帧等操作,形成json文件,最后用zip打包,再改名或者连名都不要改,scratch2或scratch3就能自动加载。以下是一个函数,它能形成.sprite2角色文件!展示的是核心代码,基本原理都清楚了,其它的就要靠你自己了!

def make_scratch2_sprite(path,size):
   """生成scrach2.0角色,它的脚本只是不断地换造型"""
 
   sprite = {}            # 代表一个角色,这个角色有名称,声音列表,造型列表
   sprite['objName'] = "sprite1"
   sprite['scripts'] = [[131, 202, [["whenGreenFlag"], ["gotoX:y:", 0, 0],["doForever", [["wait:elapsed:from:", 0.2], ["nextCostume"]]]]]]
    
   costumes_list = []     # 造型列表
   md5_file_list = []     # md5值 图形文件列表
   # 形成每个png文件的由md5值文件名
   for filename in os.listdir(path):
        md5 = GetFileMd5(path + os.sep + filename)         
        md5_file_list.append(md5 + ".png")
   amounts = len(md5_file_list)
   
   # 下面的代码是形成角色的造型列表
   for index in range(1,amounts+1):      
      costume = {}           # 一个造型
      costume['costumeName'] = "shape" + str(index)   # 造型名称       
      costume['baseLayerID'] = index-1                # 造型编号
      costume['baseLayerMD5'] = md5_file_list[index-1]# MD5值文件名
      costume['bitmapResolution'] = 2                 # 位图  2
      costume['rotationCenterX'] = size[0]//2         # x旋转中心 
      costume['rotationCenterY'] = size[1]//2         # y旋转中心
      costumes_list.append(costume)                   # 添加一个造型到列表
   sprite['costumes'] = costumes_list
   sprite['currentCostumeIndex'] = 0
   sprite['scratchX'] = 0
   sprite['scratchY'] = 0
   sprite['scale'] = 2
   sprite['direction'] = 90
   sprite['rotationStyle'] = "normal"
   sprite['isDraggable'] = False
   sprite['indexInLibrary'] = 100000
   sprite['visible'] = True
   sprite['spriteInfo'] = {"url":"www.scratch8.net"}

   # 把sprite字典转换成json格式,写入文件
   json_string = json.dumps(sprite)
   f = open(path + os.sep + "sprite.json",mode='w')
   f.write(json_string)
   f.close()

   os.chdir(path)
   # 下面开始压缩图片和json档
   with zipfile.ZipFile( 'sprite.sprite2', mode='w') as zipf:
      for filename in os.listdir():
         ext = os.path.splitext(filename)[-1]
         if ext != ".sprite2":
            zipf.write(filename)
   zipf.close()