设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 140|回复: 6
打印 上一主题 下一主题

[有事请教] 关于这代码为什么会bug...

[复制链接]

Lv2.观梦者

梦石
0
星屑
765
在线时间
111 小时
注册时间
2023-11-16
帖子
78
跳转到指定楼层
1
发表于 2024-5-12 13:19:35 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 kyjoke 于 2024-5-12 13:33 编辑

虽然我看着这正则表达式没错,但是我写^3_Constrain_%[1-60].png的时候,他录入的却是%[1-1],导致动画序列帧没办法正常播放,有大佬帮我看看哪里有问题吗?
下面是创建图层的脚本调用:
SceneManager._scene.SetLayer(0, "^3_Constrain_%[1-1].png", 255, 1.0, 1.0, 0, 0, 0, true, 0, [0, 0, 0, 0]);
JAVASCRIPT 代码复制
  1. (function() {
  2.         var fs = require('fs'); // 引入文件系统模块
  3.         var path = require('path'); // 引入路径模块
  4.         var directoryPath = path.join(process.cwd(), 'img/pictures'); // 获取当前工作目录下的图片文件夹路径
  5.         var KY_reg = /^\^.*$/; // 初步确认需要使用的文件,匹配以^开头的图片
  6.         var KY_imageNames = fs.readdirSync(directoryPath).filter(function(file) {
  7.                 return KY_reg.test(file);
  8.         }); // 初步筛选出^开头的文件名
  9.         var KY_scenes = [Scene_Title, Scene_Menu, Scene_Map, Scene_Battle]; // 定义需要添加立绘的场景
  10.  
  11.         KY_scenes.forEach(function(scene) { // 对每个场景进行处理
  12.                 var originalStart = scene.prototype.start; // 保存原始的start方法
  13.                 var originalUpdate = scene.prototype.update; // 保存原始的update方法       
  14.                 scene.prototype.sprites = {}; // 在场景的原型中定义sprites对象
  15.  
  16.                 scene.prototype.start = function() { // 重写start方法
  17.                         originalStart.call(this); // 调用原始的start方法
  18.                         this.createPortraitWindow(); // 创建立绘窗口
  19.                 };
  20.  
  21.                 scene.prototype.update = function() { // 重写update方法
  22.                         originalUpdate.call(this); // 调用原始的update方法
  23.                         this.updateSprite(); // 更新精灵
  24.                 };
  25.  
  26.                 scene.prototype.createPortraitWindow = function() { // 初始化创建立绘窗口的方法
  27.                         var windowX = 0; // 窗口的x坐标
  28.                         var windowY = 0; // 窗口的y坐标
  29.                         var windowWidth = 0; // 窗口的宽度
  30.                         var windowHeight = 0; // 窗口的高度
  31.                         this.KY_PortraitWindow = new Window_Base(windowX, windowY, windowWidth,
  32.                                 windowHeight); // 创建窗口
  33.                         this.addWindow(this.KY_PortraitWindow); // 将窗口添加到场景中
  34.                         this.KY_PortraitWindow.setBackgroundType(2); // 设置窗口的背景类型
  35.                 };
  36.  
  37.                 scene.prototype.updateSprite = function() {// 每帧更新精灵的方法
  38.                 if (Graphics.frameCount % 1 == 0) {//确保一帧只更新一次
  39.                         this.children.forEach(function(child) { // 遍历场景的所有子对象
  40.                                 if (child instanceof Sprite && child.bitmaps && child.bitmaps.length > 0) { // 如果子对象是精灵,并且有位图
  41.                                         if (child.isAnimation) { // 如果精灵是序列帧动画
  42.                                                 if (child.frameCount % child.playSpeed === 0) { // 如果当前帧计数器是播放速度的倍数
  43.                                                 if(child.frameCount >= child.MaxframeCount || !child.frameCount){ //如果当前帧大于最大帧
  44.                                                         child.frameCount = 1; // 重新开始循环
  45.                                                         console.log("重新开始动画");
  46.                                                 }
  47.                                                         child.frameCount++; // 帧序列号加一
  48.                                                 }
  49.                                                 child.bitmap = child.bitmaps[child.frameCount]; // 播放动画
  50.                                                 console.log("动画帧: " + child.frameCount);
  51.                                                 console.log("最大动画帧: " + child.MaxframeCount);
  52.                                         } else { // 如果精灵不是动画
  53.                                                 child.bitmap = child.bitmaps[0]; // 设置精灵的位图为第一帧
  54.                                         }
  55.                                 }
  56.                         }, this);
  57.                         }
  58.                 };
  59.  
  60.                 // 修改窗口的脚本调用
  61.                 scene.prototype.updatePortraitWindow = function(windowX, windowY, windowWidth, windowHeight) {
  62.                         if (this.KY_PortraitWindow) { // 如果窗口存在
  63.                                 this.KY_PortraitWindow.move(windowX, windowY, windowWidth,windowHeight); // 重新设置窗口的位置和大小
  64.                         }
  65.                 };
  66.                 // 删除窗口的脚本调用
  67.                 scene.prototype.deletePortraitWindow = function() {
  68.                         this.removeWindow(this.KY_PortraitWindow); // 从场景中删除窗口
  69.                         this.KY_PortraitWindow = null; // 清除窗口引用
  70.                 };
  71.  
  72.                 // 创建图层的脚本调用
  73.                 scene.prototype.SetLayer = function(layerId, imageName, opacity, scaleX, scaleY, x, y, rotation,visible, blendMode, blendColor) {
  74.  
  75.  
  76.                                 var sprite = new Sprite(); // 创建一个新的精灵
  77.                                 sprite.layerId = layerId; // 设置精灵的层级id
  78.                                 sprite.imageName = imageName; // 设置图片文件名
  79.                                 sprite.opacity = opacity; // 设置精灵的透明度,范围是0(完全透明)到255(完全不透明)
  80.                                 sprite.scale.x = scaleX; // 设置精灵的x缩放
  81.                                 sprite.scale.y = scaleY; // 设置精灵的y缩放
  82.                                 sprite.x = x; // 设置精灵的x位置,这将决定精灵在屏幕上的位置
  83.                                 sprite.y = y; // 设置精灵的y位置,这将决定精灵在屏幕上的位置
  84.                                 sprite.rotation = rotation; // 旋转角度
  85.                                 sprite.visible = visible; // 设置精灵的可见性,true表示可见,false表示不可见
  86.                                 sprite.blendMode = blendMode; // 设置精灵的混合模式,0: 普通, 1: 加法, 2: 乘法, 3: 屏幕
  87.                                 sprite.setBlendColor(blendColor); // 设置精灵的颜色混合
  88.                                 sprite.bitmaps = []; // 创建一个空数组用于存储位图
  89.                                 sprite.isAnimation = imageName.includes('%'); // 判断精灵是否为动画
  90.                                 var imageNameWithoutExtension = imageName.replace('.png', ''); // 去掉文件名的.png后缀,否则rm会判断为.png.png
  91.                                 var imageId = imageNameWithoutExtension.match(/\^(\d+)/)[1]; // 从文件名中提取图片id,每个id独立
  92.                                 var animationName = imageNameWithoutExtension.split('_')[1]; // 从文件名中提取动画名称,确认动画
  93.                                 var bitmap = ImageManager.loadBitmap('img/pictures/',imageNameWithoutExtension, 0, true); // 加载图片
  94.                                 if (!this.sprites[animationName]) { // 如果精灵对象中不存在该动画名称的精灵
  95.                                 this.sprites[animationName] = sprite; // 将动画精灵添加到精灵对象中
  96.                                 this.sprites[animationName].bitmaps.push(bitmap); // 将位图添加到精灵的位图数组中
  97.                                 }
  98.  
  99.                                 if (sprite.isAnimation) {//确认精灵为动画时解析动画参数
  100.                                         var frameInfo = imageNameWithoutExtension.match(/%\[(\d+)-(\d+)\]/);//解析%[]里的参数
  101.                                                 sprite.frameCount = parseInt(frameInfo[1]);//初始化帧序列号
  102.                                                 sprite.MaxframeCount = parseInt(frameInfo[2]);//初始化最大序列帧
  103.                                                 sprite.playSpeed = 1;//初始化播放速度
  104.                                 }
  105.  
  106.                                 this.addChild(sprite); // 将精灵添加到场景中
  107.                 };
  108.  
  109.                 // 删除图层的脚本调用
  110.                 scene.prototype.deleteLayer = function(layerId) {
  111.                         var sprite = this.sprites[layerId]; // 获取精灵
  112.                         if (sprite) { // 如果精灵存在
  113.                                 this.removeChild(sprite); // 从场景中删除精灵
  114.                                 delete this.sprites[layerId]; // 从精灵对象中删除精灵
  115.                         }
  116.                 };
  117.  
  118.                 // 修改序列帧动画的脚本调用
  119.                 scene.prototype.updateAnimationFrame = function(layerId, frameCount,playSpeed) {
  120.                         var sprite = this.sprites[layerId]; // 获取精灵
  121.                         if (sprite && sprite.isAnimation) { // 如果精灵存在,并且是动画
  122.                                 sprite.frameCount = frameCount; // 设置序列帧
  123.                                 sprite.playSpeed = playSpeed;// 设置播放速度
  124.                         }
  125.                 };
  126.         });
  127. })();

Lv2.观梦者

梦石
0
星屑
806
在线时间
392 小时
注册时间
2012-4-8
帖子
237
2
发表于 2024-5-12 14:21:32 | 只看该作者
没问题呀?

第一个参数 "^3_Constrain_%[1-1].png".match(/%\[(\d+)-(\d+)\]/)[1]
第二个参数 "^3_Constrain_%[1-1].png".match(/%\[(\d+)-(\d+)\]/)[2]

pokemon 和 digimon 正在路上
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
765
在线时间
111 小时
注册时间
2023-11-16
帖子
78
3
 楼主| 发表于 2024-5-12 14:30:25 | 只看该作者
505681468 发表于 2024-5-12 14:21
没问题呀?

第一个参数 "^3_Constrain_%[1-1].png".match(/%\[(\d+)-(\d+)\]/)[1]

我解决了,我得遍历场景的所有子对象才能获得所有最大的序列帧。接着还会跳帧,我现在计算(Graphics.frameCount / child.playSpeed) % child.bitmaps.length也解决了,可以正常运行了。

评分

参与人数 1+1 收起 理由
505681468 + 1 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
765
在线时间
111 小时
注册时间
2023-11-16
帖子
78
4
 楼主| 发表于 2024-5-12 14:31:42 | 只看该作者
505681468 发表于 2024-5-12 14:21
没问题呀?

第一个参数 "^3_Constrain_%[1-1].png".match(/%\[(\d+)-(\d+)\]/)[1]

显然是我脑抽写错了脚本调用,正确的文件名应该是^3_Constrain_%[1-60]。。。。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
765
在线时间
111 小时
注册时间
2023-11-16
帖子
78
5
 楼主| 发表于 2024-5-12 14:59:46 | 只看该作者
505681468 发表于 2024-5-12 14:21
没问题呀?

第一个参数 "^3_Constrain_%[1-1].png".match(/%\[(\d+)-(\d+)\]/)[1]

好吧我又遇到了新的问题,虽然这段脚本可以正常运作,但是他在不调用脚本的时候也会把所有图片挪到屏幕上。因为脚本中包涵了序列帧动画和静态帧两种模式,如果不使用循环遍历KY_imageNames 中的每一个元素,序列帧动画就无法正常运行。我人实在是麻了,不知道如何解决这个问题。
JAVASCRIPT 代码复制
  1. // 设置图层的脚本调用
  2.                 scene.prototype.SetLayer = function(layer, imageName, opacity, scaleX, scaleY, x, y, rotation,visible, blendMode, blendColor) {
  3.                         KY_imageNames.forEach(function(imageName) { // 遍历场景的所有子对象
  4.                                 var imageNameWithoutExtension = imageName.replace('.png', ''); // 去掉文件名的.png后缀,否则rm会判断为.png.png
  5.                                 var imageId = imageNameWithoutExtension.match(/\^(\d+)/)[1]; // 从文件名中提取图片id,每个id独立
  6.                                 var animationName = imageNameWithoutExtension.split('_')[1]; // 从文件名中提取动画名称,确认动画
  7.                                 var bitmap = ImageManager.loadBitmap('img/pictures/',imageNameWithoutExtension, 0, true); // 加载图片
  8.                                 var sprite = new Sprite(); // 创建一个新的精灵
  9.                                 sprite.z = layer; // 设置精灵的层级
  10.                                 sprite.layerId = imageId; // 设置精灵的图层ID
  11.                                 sprite.imageName = imageName; // 设置精灵的层级id
  12.                                 sprite.opacity = opacity; // 设置精灵的透明度,范围是0(完全透明)到255(完全不透明)
  13.                                 sprite.scale.x = scaleX; // 设置精灵的x缩放
  14.                                 sprite.scale.y = scaleY; // 设置精灵的y缩放
  15.                                 sprite.x = x; // 设置精灵的x位置,这将决定精灵在屏幕上的位置
  16.                                 sprite.y = y; // 设置精灵的y位置,这将决定精灵在屏幕上的位置
  17.                                 sprite.rotation = rotation; // 旋转角度
  18.                                 sprite.visible = visible; // 设置精灵的可见性,true表示可见,false表示不可见
  19.                                 sprite.blendMode = blendMode; // 设置精灵的混合模式,0: 普通, 1: 加法, 2: 乘法, 3: 屏幕
  20.                                 sprite.setBlendColor(blendColor); // 设置精灵的颜色混合
  21.                                 sprite.bitmaps = []; // 创建一个空数组用于存储位图
  22.                                 sprite.isAnimation = imageName.includes('%'); // 判断精灵是否为动画
  23.                                 if (sprite.isAnimation == true) {//确认精灵为动画时解析动画参数
  24.                                         var frameInfo = imageNameWithoutExtension.match(/%\[(\d+)-(\d+)\]/);//解析%[]里的参数
  25.                                         if(!sprite.frameCount && !sprite.MaxframeCount && !sprite.playSpeed){
  26.                                         sprite.frameCount = parseInt(frameInfo[1]);//初始化帧序列号
  27.                                         sprite.MaxframeCount = parseInt(frameInfo[2]);//初始化最大序列帧
  28.                                         sprite.playSpeed = 1;//初始化播放速度
  29.                                         }
  30.                                 }
  31.                                 if (!this.sprites[animationName]) { // 如果精灵对象中不存在该动画名称的精灵
  32.                                         this.sprites[animationName] = sprite; // 将动画精灵添加到精灵对象中
  33.                                 }
  34.                                 this.addChild(sprite); // 将精灵添加到场景中
  35.                                 this.sprites[animationName].bitmaps.push(bitmap); // 将位图添加到精灵的位图数组中
  36.                         }, this);
  37.                 };
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
806
在线时间
392 小时
注册时间
2012-4-8
帖子
237
6
发表于 2024-5-12 19:43:02 | 只看该作者
kyjoke 发表于 2024-5-12 14:59
好吧我又遇到了新的问题,虽然这段脚本可以正常运作,但是他在不调用脚本的时候也会把所有图片挪到屏幕上 ...

没太看明白,SetLayer  其实是显示指定 name 的立绘?
但是又遍历 KY_imageNames 创建所有立绘
pokemon 和 digimon 正在路上
回复 支持 0 反对 1

使用道具 举报

Lv2.观梦者

梦石
0
星屑
765
在线时间
111 小时
注册时间
2023-11-16
帖子
78
7
 楼主| 发表于 2024-5-12 21:42:56 | 只看该作者
505681468 发表于 2024-5-12 19:43
没太看明白,SetLayer  其实是显示指定 name 的立绘?
但是又遍历 KY_imageNames 创建所有立绘 ...

我现在改好了,只有是动画的的时候才循环,然后把所有序列帧读取进bitmaps里。不过又开始疯狂的跳帧,我严重怀疑我改不好了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-6-3 15:49

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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