<p>所以我正在尝试创建一个刮刮卡游戏,用户需要刮开卡片来揭示下面的内容。我想要检查用户是否刮开了画布的70%来全部揭示。我正在尝试使用phaser来实现这个功能,但是它不起作用。</p>
<p>我尝试计算imagedata以获取像素数组,但是它返回一个全为零的数组。我在下面的代码中使用了calculateScratchRatio函数。</p>
从“./BaseScene”导入BaseScene;
const SKY_IMAGE = "天空";
const SKY_IMAGE_BLACK = "天黑";
const BOARD =“板”;
const HEADER_ACT = "header_act";
const KEY_BRUSH = "画笔";
const BGGAME = "bg 游戏";
导出默认类 Scratch 扩展 BaseScene {
构造函数(配置){
超级(“划痕”,{...配置});
this.config = 配置;
this.isDown = false;
this.renderTexture = null;
this.brush = null;
this.erasedPixels = 0;
this.screenCenter = [config.width / 2, config.height / 2];
}
创造() {
超级.create();
this.cover = this.make.image({
键:SKY_IMAGE_BLACK,
添加:假,
});
this.board = this.make.image({
键盘,
添加:假,
});
this.ScratchOff();
this.add.image(...this.screenCenter, BOARD).setScale(0.7);
console.log(this.board.getBounds());
const headerinfo = this.add
.image(this.screenCenter[0] - 160, 130, "header_act")
.setScale(0.7);
让 helloWorld = this.add
.text(0, 0, "你好世界")
.setFont("20px 宋体")
.setColor("#ffffff");
const 容器 = this.add.container(headerinfo.x, headerinfo.y);
容器.add(helloWorld);
}
刮掉(){
这个.add
.image(this.screenCenter[0] - 160, this.screenCenter[1], SKY_IMAGE)
.setScale(0.7);
this.cover.setOrigin(0, 0);
const 宽度 = this.cover.width;
const height = this.cover.height;
控制台.log(宽度,高度);
const rt = this.add.renderTexture(
this.screenCenter[0] - 160,
这个.screenCenter[1],
宽度*0.7,
高度*0.71
);
this.isRenderTextureErased = false;
this.erasureThreshold = 0.99;
rt.setOrigin(0.5, 0.5);
rt.draw(this.cover); //,宽度*0.5,高度*0.5)
rt.setInteractive();
rt.on(Phaser.Input.Events.POINTER_DOWN, this.handlePointerDown, this);
rt.on(Phaser.Input.Events.POINTER_MOVE, this.handlePointerMove, this);
rt.on(Phaser.Input.Events.POINTER_UP, () => (this.isDown = false));
this.brush = this.make.image({
键:KEY_BRUSH,
添加:假,
});
this.renderTexture = rt;
}
处理指针向下(指针){
this.isDown = true;
this.handlePointerMove(指针);
}
处理指针移动(指针){
if (!this.isDown) {
返回;
}
const x = 指针.x - this.renderTexture.x + this.renderTexture.width * 0.5;
常量 y =
指针.y - this.renderTexture.y + this.renderTexture.height * 0.5;
this.renderTexture.erase(this.brush, x, y);
const 结果 = this.calculateScratchRatio(x, y);
console.log(“结果”, 结果);
}计算划痕比(x,y){
const 纹理 = this.textures.get(SKY_IMAGE_BLACK);
控制台.log(纹理);
如果(!纹理){
console.error(`未找到带有键“${SKY_IMAGE_BLACK}”的纹理。`);
返回0;
}
控制台.log(纹理);
const canvas = document.createElement("canvas");
canvas.width =texture.source[0].width;
console.log("canvas.width", canvas.width);
canvas.height =texture.source[0].height;
const context = canvas.getContext("2d");
context.drawImage(texture.source[0].image, 0, 0);
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
常量像素 = imageData.data;
console.log(imageData, 像素);
让擦除计数 = 0;
for (令 i = 3; i ></p>
你的代码中有很多内容,很难让它正常工作。
最好的做法是发布一个迷你可运行代码,就像这里提到的这里。
不过,一个简单快速的解决方案是使用
canvasTexture
来创建封面纹理,这样你就可以直接从这个对象访问上下文。这是一个我会这样做的简短演示:
(基于这个答案的概念)