Mandala/library/imports/1c/1c26d552-a24e-44ee-8d8f-c03dac18125a.js
2024-10-30 15:19:32 +08:00

298 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
cc._RF.push(module, '1c26dVSok5E7o2PwD2sGBJa', 'Game');
// Script/Game.ts
"use strict";
// Learn TypeScript:
// - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
// - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
// - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
var DrawingBoard_1 = require("./DrawingBoard");
var _a = cc._decorator, ccclass = _a.ccclass, property = _a.property;
var GameState;
(function (GameState) {
GameState[GameState["drawing"] = 1] = "drawing";
GameState[GameState["erasing"] = 2] = "erasing";
})(GameState || (GameState = {}));
var Game = /** @class */ (function (_super) {
__extends(Game, _super);
function Game() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.drawNode = null;
_this.captureCamera = null;
_this.mainCamera = null;
_this.db = null;
_this.gameState = GameState.drawing;
_this.texture = null;
_this.prePos = cc.Vec2.ZERO;
_this.startPos = cc.Vec2.ZERO;
_this.lastColor = cc.Color.BLUE;
_this.errColor = cc.Color.RED;
_this.lastLineWidth = 1;
_this.history = [];
_this.touchId = -1;
_this.touchScale = false;
return _this;
}
Game.prototype.start = function () {
var _this = this;
this.initDb();
this.initTexture();
this.initRead();
setTimeout(function () {
_this.drawNode.on("touchstart", _this.onTouchStart, _this);
_this.drawNode.on("touchmove", _this.onTouchMove, _this);
_this.drawNode.on("touchend", _this.onTouchEnd, _this);
_this.drawNode.on("touchcancel", _this.onTouchEnd, _this);
}, 2000);
};
Game.prototype.initDb = function () {
//创建一个画板(需传入画板尺寸,将自动初始化)
this.db = new DrawingBoard_1.default(this.drawNode.width, this.drawNode.height);
//设置画板的绘图颜色(每次绘制前都可以重新设置)
this.lastLineWidth = 15;
this.db.setLineWidth(this.lastLineWidth);
// this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
//线条端点以圆角结尾
this.db.setLineCircleEnd(true);
};
Game.prototype.initTexture = function () {
this.texture = new cc.RenderTexture();
this.texture.initWithSize(this.drawNode.width, this.drawNode.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
var spf = new cc.SpriteFrame(this.texture);
this.drawNode.getComponent(cc.Sprite).spriteFrame = spf;
};
Game.prototype.initRead = function () {
this.targetCamera = this.node.getChildByName("tagCamera").getComponent(cc.Camera);
var rander = new cc.RenderTexture();
rander.initWithSize(this.node.width, this.node.height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
this.targetCamera.targetTexture = rander;
this.targetCamera.render();
console.log("完成");
};
Game.prototype.onTouchStart = function (e) {
//将触摸位置作为线条的起点
//画板中使用的坐标系与图片坐标系一样原点在左上角X轴向右为正Y轴向下为正
//所以Y轴坐标应反过来, 这里用getLocationInView而不是getLocation
this.touchId = e.getID();
if (this.touchId == 1) {
this.touchScale = true;
return;
}
var pos = e.getLocation();
this.prePos = this.convertToDrawNodePos(pos);
this.startPos = this.convertToDrawNodePos(pos);
this.db.moveTo(this.prePos.x, this.prePos.y);
};
Game.prototype.onTouchMove = function (e) {
var touches = e.getTouches();
var touch1 = touches[0];
var delta1 = touch1.getDelta();
var pos = e.getLocation();
var pos1 = this.convertToDrawNodePos(touch1.getLocation());
var dst = this.startPos.sub(pos1).mag();
// this.label.string = touches.length + "";
if (touches.length == 1 && this.touchId < 1 && !this.touchScale && dst > 7) {
// alert("不该进来");
this.prePos = this.convertToDrawNodePos(pos);
var jg = this.pd(e);
this.changeColor(jg);
if (this.gameState == GameState.drawing) {
//从上一次绘制线条后的终点开始向鼠标当前位置绘制线条
this.db.lineTo(this.prePos.x, this.prePos.y);
}
else if (this.gameState == GameState.erasing) {
// 橡皮擦
this.db.circle(this.prePos.x, this.prePos.y, 10);
}
//每次画板中的数据有变化后,及时将数据应用到贴图上,在屏幕上显示出来
this.drawToImg();
}
else if (touches.length == 2) {
var touch1 = touches[0], touch2 = touches[1];
var delta1 = touch1.getDelta(), delta2 = touch2.getDelta();
var touchPoint1 = this.node.parent.convertToNodeSpaceAR(touch1.getLocation());
var touchPoint2 = this.node.parent.convertToNodeSpaceAR(touch2.getLocation());
var distance = touchPoint1.sub(touchPoint2);
var delta = delta1.sub(delta2);
var scale = 1;
if (Math.abs(distance.x) > Math.abs(distance.y)) {
scale = (distance.x + delta.x) / distance.x * this.node.scale;
}
else {
scale = (distance.y + delta.y) / distance.y * this.node.scale;
}
if (scale > 2)
scale = 2;
this.node.scale = scale <= 0.1 ? 0.1 : scale;
}
};
Game.prototype.onTouchEnd = function (e) {
this.touchId = e.getID();
if (this.touchId == 1)
this.touchScale = false;
this.addHistory();
};
Game.prototype.pd = function (event) {
var cha = 2;
var pos = event.getLocation();
var jg = false;
for (var i = -cha; i < cha; i++) {
var postion = cc.v2();
postion.x = pos.x + i;
for (var j = -cha; j < cha; j++) {
postion.y = pos.y + j;
// console.log("检测点:",postion.x,postion.y);
var img = this.getGraphisData(postion);
if ((img[0] != 255 && img[1] != 255 && img[2] != 255)) {
jg = true;
j = 10000;
i = 10000;
}
}
}
//
return jg;
};
Game.prototype.convertToDrawNodePos = function (worldPos) {
var pos = this.drawNode.convertToNodeSpaceAR(worldPos);
pos.x += this.drawNode.width * this.drawNode.anchorX;
pos.y += this.drawNode.height * this.drawNode.anchorY;
pos.y = this.drawNode.height - pos.y;
return pos;
};
Game.prototype.addHistory = function () {
var copy = this.db.copyData();
var ucopy = new Uint8Array(copy);
this.history.push({ data: ucopy });
// cc.log('历史步骤: ', this.history.length);
};
Game.prototype.drawToImg = function () {
//获取画板中绘制的图案数据
var data = this.db.getData();
//将数据传递给贴图对象
this.texture.initWithData(data, cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height);
};
Game.prototype.changeColor = function (red) {
if (!red)
this.db.setColor(this.errColor.r, this.errColor.g, this.errColor.b, this.errColor.a);
else
this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
};
Game.prototype.getGraphisData = function (point) {
var Uint8 = new Uint8Array(4);
Uint8 = this.targetCamera.targetTexture.readPixels(Uint8, point.x, point.y, 1, 1);
return Uint8;
};
Game.prototype.onBtnDraw = function () {
this.db.setLineWidth(this.lastLineWidth);
this.db.setColor(this.lastColor.r, this.lastColor.g, this.lastColor.b, this.lastColor.a);
this.gameState = GameState.drawing;
};
Game.prototype.onBtnErase = function () {
this.db.setLineWidth(this.lastLineWidth * 3);
// 橡皮擦的颜色不能是(0,0,0,0),因为这样会和DrawingBoard里的默认颜色相同导致绘制跳过
this.db.setColor(255, 255, 255, 0);
this.gameState = GameState.erasing;
};
Game.prototype.onBtnClear = function () {
this.db.reset();
this.drawToImg();
this.history.splice(0, this.history.length);
};
Game.prototype.onBtnRevoke = function () {
this.history.pop();
if (this.history.length) {
var data = this.history[this.history.length - 1].data;
this.db.setData(data.buffer);
this.texture.initWithData(this.db.getData(), cc.Texture2D.PixelFormat.RGBA8888, this.db.width, this.db.height);
}
else {
this.onBtnClear();
}
cc.log('历史记录剩余: ', this.history.length);
};
Game.prototype.onBtnSave = function () {
var _this = this;
if (cc.sys.isBrowser) {
var width = this.drawNode.width;
var height = this.drawNode.height;
this.captureCamera.enabled = true;
var texture = new cc.RenderTexture();
texture.initWithSize(width, height, cc.RenderTexture.DepthStencilFormat.RB_FMT_S8);
this.captureCamera.targetTexture = texture;
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
this.captureCamera.render();
var data = texture.readPixels();
// write the render data
var rowBytes = width * 4;
for (var row = 0; row < height; row++) {
var srow = height - 1 - row;
var imageData = ctx.createImageData(width, 1);
var start = srow * width * 4;
for (var i = 0; i < rowBytes; i++) {
imageData.data[i] = data[start + i];
}
ctx.putImageData(imageData, 0, row);
}
//
var dataUrl = canvas.toDataURL('image/png');
// cc.log('iamge-base64:', dataUrl);
var saveLink = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
saveLink.href = dataUrl;
saveLink.download = String(Date.now()) + '.png';
var event = document.createEvent('MouseEvents');
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
saveLink.dispatchEvent(event);
this.scheduleOnce(function (t) {
_this.captureCamera.enabled = false;
}, 0.1);
}
else {
cc.warn('暂时只支持web端保存图片');
}
};
Game.prototype.update = function (dt) {
};
__decorate([
property(cc.Node)
], Game.prototype, "drawNode", void 0);
__decorate([
property(cc.Camera)
], Game.prototype, "captureCamera", void 0);
__decorate([
property(cc.Camera)
], Game.prototype, "mainCamera", void 0);
Game = __decorate([
ccclass
], Game);
return Game;
}(cc.Component));
exports.default = Game;
cc._RF.pop();