简单图片呼吸效果插件



//=============================================================================
// Simple_Breathing_Picture.js
//=============================================================================
/*:
* @plugindesc 简单图片呼吸效果插件
* @author 简化版修改者
*
* @help
* 使用方法:
* 1. 显示带有呼吸效果的图片
* SceneManager._scene.showBreathingPicture(imageName, x, y, breathSpeed);
* 参数说明:
* imageName: 图片文件名(无需后缀,需放在 img/pictures 文件夹下,以 ^ 开头)
* x: 图片在屏幕上的 x 坐标
* y: 图片在屏幕上的 y 坐标
* breathSpeed: 呼吸效果的速度,值越大呼吸效果越明显
*
* 2. 删除带有呼吸效果的图片
* SceneManager._scene.removeBreathingPicture(spriteId);
* 参数说明:
* spriteId: 图片文件名中 _ 后面的部分,例如 ^3_KYjoke 中的 KYjoke
*
* 3. 调节呼吸效果大小
* SceneManager._scene.adjustBreathSpeed(spriteId, newBreathSpeed);
* 参数说明:
* spriteId: 图片文件名中 _ 后面的部分,例如 ^3_KYjoke 中的 KYjoke
* newBreathSpeed: 新的呼吸效果速度,值越大呼吸效果越明显
*/
(function() {
const scenes = [Scene_Map];
const imageCache = {};
const spriteMap = new Map();
let lastTime = performance.now();

scenes.forEach(function(scene) {
const originalUpdate = scene.prototype.update;

scene.prototype.update = function() {
originalUpdate.call(this);
const currentTime = performance.now();
const deltaTime = (currentTime - lastTime) / 1000; // 转换为秒
lastTime = currentTime;
this.updateBreathingSprites(deltaTime);
};

scene.prototype.updateBreathingSprites = function(deltaTime) {
if (!this.sprites) return;
for (const sprite of this.sprites) {
if (sprite.breathing) {
sprite.breathTime = (sprite.breathTime || 0) + deltaTime;
const easeInOutSine = (time) => sprite.breathSpeed * Math.sin(Math.PI * time);
const breathEffectX = 0.005 * easeInOutSine(sprite.breathTime / 3) / (sprite.scale.x * sprite.scale.x);
const breathEffectY = 0.005 * easeInOutSine(sprite.breathTime / 1) / (sprite.scale.y * sprite.scale.y);
sprite.scale.x = 1 + breathEffectX;
sprite.scale.y = 1 + breathEffectY;
}
}
};

scene.prototype.showBreathingPicture = function(imageName, x, y, breathSpeed) {
if (!this.sprites) {
this.sprites = [];
}
const spriteId = imageName.split('^')[1].split('_')[1];
if (spriteMap.has(spriteId)) {
return; // 避免重复添加
}
const sprite = new Sprite();
sprite.spriteId = spriteId;
sprite.breathing = true;
sprite.breathSpeed = breathSpeed;
sprite.x = x;
sprite.y = y;
sprite.anchor.set(0.5, 0);

if (!imageCache[imageName]) {
imageCache[imageName] = ImageManager.loadBitmap('img/pictures/', imageName, 0, false);
}
sprite.bitmap = imageCache[imageName];

this.addChild(sprite);
this.sprites.push(sprite);
spriteMap.set(spriteId, sprite);

// 添加淡入效果
sprite.opacity = 0;
const fadeInDuration = 300; // 淡入时间(毫秒)
const fadeInStart = performance.now();
const fadeIn = () => {
const elapsed = performance.now() - fadeInStart;
if (elapsed < fadeInDuration) { sprite.opacity = (elapsed / fadeInDuration) * 255; requestAnimationFrame(fadeIn); } else { sprite.opacity = 255; } }; requestAnimationFrame(fadeIn); }; scene.prototype.removeBreathingPicture = function(spriteId) { if (!spriteMap.has(spriteId)) return; const sprite = spriteMap.get(spriteId); const spriteIndex = this.sprites.indexOf(sprite); // 添加淡出效果 const fadeOutDuration = 300; // 淡出时间(毫秒) const fadeOutStart = performance.now(); const fadeOut = () => {
const elapsed = performance.now() - fadeOutStart;
if (elapsed < fadeOutDuration) { sprite.opacity = 255 - (elapsed / fadeOutDuration) * 255; requestAnimationFrame(fadeOut); } else { sprite.opacity = 0; this.removeChild(sprite); this.sprites.splice(spriteIndex, 1); spriteMap.delete(spriteId); sprite.bitmap = null; // 释放位图资源 // 清理不再使用的图片缓存 const imageName = Object.keys(imageCache).find(key => key.includes(spriteId));
if (imageName) {
delete imageCache[imageName];
}
}
};
requestAnimationFrame(fadeOut);
};

scene.prototype.adjustBreathSpeed = function(spriteId, newBreathSpeed) {
const sprite = spriteMap.get(spriteId);
if (sprite) {
sprite.breathSpeed = newBreathSpeed;
}
};
});
})();

使用示例

// 显示立绘(带呼吸效果)
SceneManager._scene.showBreathingPicture("^3_KYjoke", 320, 240, 0.05);

// 3秒后删除立绘
setTimeout(() => {
SceneManager._scene.removeBreathingPicture("KYjoke");
}, 3000);

// 调节呼吸速度
SceneManager._scene.adjustBreathSpeed("KYjoke", 0.08);

参数说明:
spriteId:图片文件名中 _ 后面的部分,例如 ^3_KYjoke 中的 KYjoke。


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注