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

Project1

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

[有事请教] 关于MZ Hue颜色的问题

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2585
在线时间
297 小时
注册时间
2021-5-4
帖子
101
跳转到指定楼层
1
发表于 2021-6-7 12:50:43 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
在MZ里面loadSvActor取消了hue
ImageManager.loadSvActor = function(filename) {
    return this.loadBitmap("img/sv_actors/", filename);
};

在MV里面loadSvActor是有hue改变颜色
ImageManager.loadSvActor = function(filename, hue) {
    return this.loadBitmap('img/sv_actors/', filename, hue, false);
};

如何在MZ里面可以做到MV loadSvActor 改变颜色, 在MZ setHue不能在bitmap下改只能在sprite里面改

Lv3.寻梦者

梦石
0
星屑
3118
在线时间
276 小时
注册时间
2019-4-23
帖子
202
2
发表于 2021-6-8 09:48:56 | 只看该作者
复制mv的到mz就好了~~~~~~~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2585
在线时间
297 小时
注册时间
2021-5-4
帖子
101
3
 楼主| 发表于 2021-6-8 21:58:18 | 只看该作者
本帖最后由 MH-Pride 于 2021-6-8 22:50 编辑
q3226257 发表于 2021-6-8 09:48
复制mv的到mz就好了~~~~~~~


我也想但是不行,bitmap无法用hub去赋予颜色。只能通过sprite改颜色。就算sprite设置颜色都没用。Hue还是改变不了bitmap的颜色。
例如 this._svActor.setHue(100) 但是在 this._svActor.bitmap 下的bitmap是无效的所以 this.contents.blt(this._svActor.bitmap, sx, sy, sw, sh, dx, dy, dw, dh) 或者 this._svActor.bitmap._hue=100 也是没用
如果通过child改还是可以的但是全部都会变颜色。有什么办法可以让图片做到blt的效果但是要在sprite阶段做到。

还有在blt下的blt (source, sx, sy, sw, sh, dx, dy, dw, dh) . dx和dy sprite阶段有吗

如果hue能改bitmap的颜色会方便很多,不需要准备相同动作不同颜色的图片

战斗什么都没问题就差显示了 如果不行也只能用静态图片了

Capture.PNG (517.18 KB, 下载次数: 0)

动态图片

动态图片

Capture2.PNG (944.67 KB, 下载次数: 1)

静态图片

静态图片

Capture3.PNG (679.62 KB, 下载次数: 3)

战斗

战斗
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3118
在线时间
276 小时
注册时间
2019-4-23
帖子
202
4
发表于 2021-6-9 10:18:39 | 只看该作者
  1. Bitmap.prototype.rotateHue = function(offset) {
  2.     function rgbToHsl(r, g, b) {
  3.         var cmin = Math.min(r, g, b);
  4.         var cmax = Math.max(r, g, b);
  5.         var h = 0;
  6.         var s = 0;
  7.         var l = (cmin + cmax) / 2;
  8.         var delta = cmax - cmin;

  9.         if (delta > 0) {
  10.             if (r === cmax) {
  11.                 h = 60 * (((g - b) / delta + 6) % 6);
  12.             } else if (g === cmax) {
  13.                 h = 60 * ((b - r) / delta + 2);
  14.             } else {
  15.                 h = 60 * ((r - g) / delta + 4);
  16.             }
  17.             s = delta / (255 - Math.abs(2 * l - 255));
  18.         }
  19.         return [h, s, l];
  20.     }

  21.     function hslToRgb(h, s, l) {
  22.         var c = (255 - Math.abs(2 * l - 255)) * s;
  23.         var x = c * (1 - Math.abs((h / 60) % 2 - 1));
  24.         var m = l - c / 2;
  25.         var cm = c + m;
  26.         var xm = x + m;

  27.         if (h < 60) {
  28.             return [cm, xm, m];
  29.         } else if (h < 120) {
  30.             return [xm, cm, m];
  31.         } else if (h < 180) {
  32.             return [m, cm, xm];
  33.         } else if (h < 240) {
  34.             return [m, xm, cm];
  35.         } else if (h < 300) {
  36.             return [xm, m, cm];
  37.         } else {
  38.             return [cm, m, xm];
  39.         }
  40.     }

  41.     if (offset && this.width > 0 && this.height > 0) {
  42.         offset = ((offset % 360) + 360) % 360;
  43.         var context = this._context;
  44.         var imageData = context.getImageData(0, 0, this.width, this.height);
  45.         var pixels = imageData.data;
  46.         for (var i = 0; i < pixels.length; i += 4) {
  47.             var hsl = rgbToHsl(pixels[i + 0], pixels[i + 1], pixels[i + 2]);
  48.             var h = (hsl[0] + offset) % 360;
  49.             var s = hsl[1];
  50.             var l = hsl[2];
  51.             var rgb = hslToRgb(h, s, l);
  52.             pixels[i + 0] = rgb[0];
  53.             pixels[i + 1] = rgb[1];
  54.             pixels[i + 2] = rgb[2];
  55.         }
  56.         context.putImageData(imageData, 0, 0);
  57.         this._setDirty();
  58.     }
  59. };
复制代码



很明显,mv的实现是更改了图像的数据来实现hue的,
但是mz是通过滤镜实现的,所以你要改成mv那样,需要把更改图像数据这部分代码复制过来的
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2585
在线时间
297 小时
注册时间
2021-5-4
帖子
101
5
 楼主| 发表于 2021-6-11 00:44:21 | 只看该作者
q3226257 发表于 2021-6-9 10:18
很明显,mv的实现是更改了图像的数据来实现hue的,
但是mz是通过滤镜实现的,所以你要改成mv那样,需要 ...

JS 代码复制
  1. Bitmap.prototype.rotateHue = function(offset,bitmap) {
  2.     function rgbToHsl(r, g, b) {
  3.         var cmin = Math.min(r, g, b);
  4.         var cmax = Math.max(r, g, b);
  5.         var h = 0;
  6.         var s = 0;
  7.         var l = (cmin + cmax) / 2;
  8.         var delta = cmax - cmin;
  9.  
  10.         if (delta > 0) {
  11.             if (r === cmax) {
  12.                 h = 60 * (((g - b) / delta + 6) % 6);
  13.             } else if (g === cmax) {
  14.                 h = 60 * ((b - r) / delta + 2);
  15.             } else {
  16.                 h = 60 * ((r - g) / delta + 4);
  17.             }
  18.             s = delta / (255 - Math.abs(2 * l - 255));
  19.         }
  20.  
  21.         return [h, s, l];
  22.     }
  23.  
  24.     function hslToRgb(h, s, l) {
  25.         var c = (255 - Math.abs(2 * l - 255)) * s;
  26.         var x = c * (1 - Math.abs((h / 60) % 2 - 1));
  27.         var m = l - c / 2;
  28.         var cm = c + m;
  29.         var xm = x + m;
  30.  
  31.         if (h < 60) {
  32.             return [cm, xm, m];
  33.         } else if (h < 120) {
  34.             return [xm, cm, m];
  35.         } else if (h < 180) {
  36.             return [m, cm, xm];
  37.         } else if (h < 240) {
  38.             return [m, xm, cm];
  39.         } else if (h < 300) {
  40.             return [xm, m, cm];
  41.         } else {
  42.             return [cm, m, xm];
  43.         }
  44.     }
  45.  
  46.     if (offset && this.width > 0 && this.height > 0) {
  47.         offset = ((offset % 360) + 360) % 360;
  48.                 console.log(offset);
  49.         var context = bitmap.context;
  50.         var imageData = context.getImageData(0, 0, this.width, this.height);
  51.         var pixels = imageData.data;
  52.                 console.log(imageData)
  53.         for (var i = 0; i < pixels.length; i += 4) {
  54.             var hsl = rgbToHsl(pixels[i + 0], pixels[i + 1], pixels[i + 2]);
  55.            var h = hsl[0] + (hsl[0] + offset) % 360;
  56.             var s = hsl[1];
  57.             var l = hsl[2];
  58.             var rgb = hslToRgb(h, s, l);
  59.  
  60.             pixels[i + 0] = rgb[0];
  61.             pixels[i + 1] = rgb[1];
  62.             pixels[i + 2] = rgb[2];
  63.  
  64.         }
  65.         context.putImageData(imageData, 0, 0);
  66.         //this._setDirty();
  67.     }
  68. };


JS 代码复制
  1. var bitmap=ImageManager.loadSvActor("actor");
  2.                 bitmap.rotateHue(by,bitmap);


Bitmap.prototype.rotateHue = function(offset) 只能传一个参数所以我加了参数bitmap 如果没加  var context = this._context;是没data.
虽然可以改变颜色但是颜色怪怪的只能显示粉红色或者不断变换颜色直到粉红色 还有this._setDirty();是什么东西我在MV里面找不到Dirty()是有什么作用的
在MV里面loadBitmap 经过很多function才能到达bitmap.rotateHue.
ImageManager.loadSvActor = function(filename, hue) {
    return this.loadBitmap('img/sv_actors/', filename, hue, false);
};

滤镜能单独用在bitmap里面吗 在文档里面没有写滤镜可以在什么下作用 请问下ColorFilter怎么用啊
https://developer.rpgmakerweb.com/rpg-maker-mz/ColorFilter.html#setHue

我是刚接触rpg maker 所以很多东西不太明白 谢谢了

Capturex.PNG (36.92 KB, 下载次数: 2)

Capturex.PNG
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
5060
在线时间
705 小时
注册时间
2018-12-11
帖子
241
6
发表于 2021-6-11 09:23:34 | 只看该作者
mz的核心脚本里有个ColorFilter,用来实现hue的,这东西比mv的要高效许多,不建议降级把mv的搬过来。不过我有点奇怪pixi已经自带了一个ColorMatrixFilter,已经完全实现了那个ColorFilter的功能了,再不济也可以直接改矩阵,为啥还要自己实现一个?

点评

只是封装了一下  发表于 2021-6-11 10:00
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3118
在线时间
276 小时
注册时间
2019-4-23
帖子
202
7
发表于 2021-6-11 10:05:26 | 只看该作者
MH-Pride 发表于 2021-6-11 00:44
Bitmap.prototype.rotateHue = function(offset,bitmap) {
    function rgbToHsl(r, g, b) {
        va ...

你抄代码要抄完啊,不知道就点进去看一下呗。。。
参数bitmap其实也没必要,你本来就是用bitmap.rotateHue,this就是指代bitmap了
滤镜是pixi的功能,在显示的时候会有一层滤镜,
mv的实现其实是修改了图片信息,渲染的时候就达到改变颜色,

点评

Bitmap.prototype.checkDirty = function() { if (this._dirty) { this._baseTexture.update();//就是调用了这个 this._dirty = false; } };  发表于 2021-6-11 10:08
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2585
在线时间
297 小时
注册时间
2021-5-4
帖子
101
8
 楼主| 发表于 2021-6-11 23:09:46 | 只看该作者
lisliz 发表于 2021-6-11 09:23
mz的核心脚本里有个ColorFilter,用来实现hue的,这东西比mv的要高效许多,不建议降级把mv的搬过来。不过我 ...

我也想用hue 但是 blt (source, sx, sy, sw, sh, dx, dy, dw, dh) 不知道怎么用colorfilter
所以q3226257提出的改变bitmap的颜色是能行的
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2585
在线时间
297 小时
注册时间
2021-5-4
帖子
101
9
 楼主| 发表于 2021-6-11 23:13:34 | 只看该作者
q3226257 发表于 2021-6-11 10:05
你抄代码要抄完啊,不知道就点进去看一下呗。。。
参数bitmap其实也没必要,你本来就是用bitmap.rotateHu ...

谢谢了我在研究下
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-26 07:55

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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