<div id="taro-pet" class="taro-pet">
<canvas id="taro-canvas"></canvas>
</div>
<div id="taro-pet" class="taro-pet">
<canvas id="taro-canvas"></canvas>
<canvas id="shadow-canvas"></canvas>
</div>
#shadow-canvas {
position: absolute;
z-index: -1;
opacity: 0;
}
// 虚拟的canvas
let shadow_canvas = null;
shadow_canvas = document.getElementById("shadow-canvas");
shadow_canvas.width = bower_width;
shadow_canvas.height = bower_height;
// 鼠标移动事件
anim.on("mousemove", (event) => {
const global_position = event.data.global;
const local_position = anim.toLocal(global_position);
// 当前这一帧的动画贴图
const anim_img = anim.texture.baseTexture.resource.source;
console.log('anim.texture.baseTexture.resource', anim.texture.baseTexture.resource)
});
// 给canvas一个原型方法,构建虚拟canvas用来获取canvas上某个点的颜色
export const get_pixel_color_func = (x, y, img) => {
// 虚拟canvas
const shadow_canvas = document.getElementById("shadow-canvas");
// 通过canvas自带的方法获取上下文
const context = shadow_canvas.getContext("2d");
// 先清除画布
context.clearRect(0, 0, shadow_canvas.width, shadow_canvas.height);
// 绘制传入的图片,这个图片就是动画的某一帧
context.drawImage(img, 0, 0);
// 获取该点像素数据
const image_pixel_data = context.getImageData(x, y, 1, 1);
let pixel = image_pixel_data.data;
// 返回rgba颜色值
let r = pixel[0];
let g = pixel[1];
let b = pixel[2];
let a = pixel[3] / 255;
a = Math.round(a * 100) / 100;
let rHex = r.toString(16);
r < 16 && (rHex = "0" + rHex);
let gHex = g.toString(16);
g < 16 && (gHex = "0" + gHex);
let bHex = b.toString(16);
b < 16 && (bHex = "0" + bHex);
const rgbaColor = "rgba(" + r + "," + g + "," + b + "," + a + ")";
const rgbColor = "rgb(" + r + "," + g + "," + b + ")";
const hexColor = "#" + rHex + gHex + bHex;
return {
rgba: rgbaColor,
rgb: rgbColor,
hex: hexColor,
r: r,
g: g,
b: b,
a: a,
};
};
// 导入方法
import { get_pixel_color_func } from "../utils/anim.js";
// 鼠标移动事件
anim.on("mousemove", (event) => {
const global_position = event.data.global;
const local_position = anim.toLocal(global_position);
// 当前这一帧的动画贴图
const anim_img = anim.texture.baseTexture.resource.source;
const color = get_pixel_color_func(local_position.x, local_position.y, anim_img)
console.log('color', color.rgba)
});
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TaroPet</title>
<link rel="stylesheet" href="./public/css/index.css" />
</head>
<body>
<div id="taro-pet" class="taro-pet">
<canvas id="taro-canvas"></canvas>
<canvas id="shadow-canvas"></canvas>
</div>
<script src="./public/js/pixi.min.js"></script>
<script src="./_renderer/renderer.js" type="module"></script>
</body>
</html>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
html,
body {
width: 100vw;
height: 100vh;
overflow: hidden;
}
.taro-pet {
width: 100vw;
height: 100vh;
transform: scaleX(-1);
}
#shadow-canvas {
position: absolute;
z-index: -1;
opacity: 0;
}
// 给canvas一个原型方法,构建虚拟canvas用来获取canvas上某个点的颜色
// 传入三个参数,点击的x坐标和y坐标,img对象
export const get_pixel_color_func = (x, y, img) => {
// 虚拟canvas
const shadow_canvas = document.getElementById("shadow-canvas");
// 通过canvas自带的方法获取上下文
const context = shadow_canvas.getContext("2d");
// 先清除画布
context.clearRect(0, 0, shadow_canvas.width, shadow_canvas.height);
// 绘制传入的图片,这个图片就是动画的某一帧
context.drawImage(img, 0, 0);
// 获取该点像素数据
const image_pixel_data = context.getImageData(x, y, 1, 1);
let pixel = image_pixel_data.data;
// 返回rgba颜色值
let r = pixel[0];
let g = pixel[1];
let b = pixel[2];
let a = pixel[3] / 255;
a = Math.round(a * 100) / 100;
let rHex = r.toString(16);
r < 16 && (rHex = "0" + rHex);
let gHex = g.toString(16);
g < 16 && (gHex = "0" + gHex);
let bHex = b.toString(16);
b < 16 && (bHex = "0" + bHex);
const rgbaColor = "rgba(" + r + "," + g + "," + b + "," + a + ")";
const rgbColor = "rgb(" + r + "," + g + "," + b + ")";
const hexColor = "#" + rHex + gHex + bHex;
return {
rgba: rgbaColor,
rgb: rgbColor,
hex: hexColor,
r: r,
g: g,
b: b,
a: a,
};
};
// 导入方法
import { get_pixel_color_func } from "../utils/anim.js";
// 当前使用的模型
let current_module = "kkr";
// 初始配置和动作配置
let init_config = null;
// 初始动画
let anim_normal = null;
// 动画的舞台
let app = null;
// 动画的canvas
let anim_canvas = null;
// 虚拟的canvas
let shadow_canvas = null;
// 获取窗口的大小
const bower_width = window.innerWidth;
const bower_height = window.innerHeight;
// 页面加载完成执行
window.addEventListener("load", async (event) => {
// 获取配置
const module = await import(`../modules/${current_module}/${current_module}.js`);
init_config = module.init_config;
// 赋值canvas
anim_canvas = document.getElementById("taro-canvas");
shadow_canvas = document.getElementById("shadow-canvas");
shadow_canvas.width = bower_width;
shadow_canvas.height = bower_height;
// 动画舞台配置
app = new PIXI.Application({
view: anim_canvas,
width: bower_width,
height: bower_height,
backgroundAlpha: 0,
resolution: 1,
});
// 添加给div-taropet元素
document.getElementById("taro-pet").appendChild(app.view);
// 先把初始的动画加载完成
anim_normal = await create_anim_func(init_config[0]);
anim_normal.play();
app.stage.addChild(anim_normal);
});
// 创建动画的方法
const create_anim_func = async (obj) => {
// 存放文件前缀, 文件格式(png,jpg)
const file_prefix = "./modules";
const file_format = ".png";
const { name, frames, object } = obj;
const texture_array = [];
// 通过帧数循环获取贴图
for (let i = 0; i < frames; i++) {
const num = `000${i}`.slice(-3);
// texture_name ./modules/kkr/normal/001.png
const texture_name = `${file_prefix}/${current_module}/${name}/${num}${file_format}`;
const texture = await PIXI.Texture.from(texture_name);
texture_array.push(texture);
}
// 生成动画,配置动画属性
const anim = new PIXI.AnimatedSprite(texture_array);
anim.name = name;
anim.animationSpeed = 0.5;
anim.loop = object.loop;
// 设置交互模式
anim.eventMode = "dynamic";
// 鼠标移动事件
anim.on("mousemove", (event) => {
const global_position = event.data.global;
const local_position = anim.toLocal(global_position);
// 当前这一帧的动画贴图
const anim_img = anim.texture.baseTexture.resource.source;
const color = get_pixel_color_func(local_position.x, local_position.y, anim_img)
console.log('color', color.rgba)
});
// 鼠标左键点击事件
anim.on("click", (event) => {
const global_position = event.data.global;
const local_position = anim.toLocal(global_position);
console.log('鼠标左键点击:', local_position)
});
// 鼠标点击右键事件
anim.on("rightclick", (event) => {
const global_position = event.data.global;
const local_position = anim.toLocal(global_position);
console.log('鼠标右键点击:', local_position)
});
return anim;
};
此页面不支持夜间模式!
已进入夜间模式!
已进入普通模式!
搜索框不允许为空
签到成功!经验+5!芋圆币+2!
签到失败!今日已签到!
需要登录社区账号才可以进入!