raingame
Version:
2D game framework
123 lines (119 loc) • 4.99 kB
text/typescript
import EventData from '../interfaces/EventData';
import { Renderer, Scene } from '../../rain';
import Size from '../Size';
import { StandardObject } from '../StandardObject';
import SceneGroup from '../SceneGroup';
export function rageTouchDetermination(e: MouseEvent, renderer: Renderer, scene: Scene) {
let aimx = e.offsetX * renderer.devicePixelRatio;
let aimy = e.offsetY * renderer.devicePixelRatio;
let list = scene.children;
let ctx = renderer.ctx;
for (let i = list.length - 1; i >= 0; i--) {
let item = list[i].target;
if (item instanceof SceneGroup) {
for (let i = item.children.length - 1; i >= 0; i--) {
const child = item.children[i].target;
let { x, y } = child._position_;
let xg = item.position.x;
let yg = item.position.y;
x = x + xg;
y = y + yg;
let { width, height } = child;
let min_x = x;
let max_x = x + width;
let min_y = y;
let max_y = y + height;
if (aimx > min_x && aimx < max_x && aimy > min_y && aimy < max_y) {
let eventData: EventData = {
target: child,
rank: list[i].rank,
scene: scene,
sceneGroup: item,
point: { x: aimx, y: aimy },
ctx
}
return { res: true, eventData };
}
}
} else if (item instanceof StandardObject) {
let { x, y } = item._position_;
let { width, height } = item;
let min_x = x;
let max_x = x + width;
let min_y = y;
let max_y = y + height;
if (aimx > min_x && aimx < max_x && aimy > min_y && aimy < max_y) {
let eventData: EventData = {
target: item,
rank: list[i].rank,
scene: scene,
sceneGroup: null,
point: { x: aimx, y: aimy },
ctx
}
//debugger;
return { res: true, eventData };
}
}
}
//debugger;
return { res: false };
}
function createCav(size: Size) {
let { width, height } = size;
let canvas = document.createElement("canvas");
canvas.height = height;
canvas.width = width;
let ctx = canvas.getContext('2d')
return { canvas, ctx }
}
export function pixelTouchDetermination(e: MouseEvent, renderer: Renderer, scene: Scene) {
let backUp = createCav(renderer.getSize()); // a canvas to compare
let aimx = e.offsetX * renderer.devicePixelRatio;
let aimy = e.offsetY * renderer.devicePixelRatio;
let ctx = renderer.ctx;
let point = ctx.getImageData(aimx, aimy, 1, 1);
let children = scene.children;
if (point.data[3] !== 0 && backUp.ctx) {
for (let i = children.length - 1; i >= 0; i--) {
const item = children[i].target;
if (item instanceof SceneGroup) {
for (let i = item.children.length - 1; i >= 0; i--) {
const child = item.children[i].target;
child.render(backUp.ctx, item);
let comparePoint = backUp.ctx.getImageData(aimx, aimy, 1, 1)
backUp.ctx.clearRect(0, 0, window.innerWidth, window.innerHeight); //clean canvas
if (comparePoint.data[3] !== 0) {
let eventData: EventData = {
target: child,
rank: children[i].rank,
scene: scene,
sceneGroup: item,
point: { x: aimx, y: aimy },
ctx
}
return { res: true, eventData };
}
}
} else if (item instanceof StandardObject) {
item.render(backUp.ctx, item);
let comparePoint = backUp.ctx.getImageData(aimx, aimy, 1, 1)
backUp.ctx.clearRect(0, 0, window.innerWidth, window.innerHeight); //clean canvas
if (comparePoint.data[3] !== 0) {
let eventData: EventData = {
target: item,
rank: children[i].rank,
scene: scene,
sceneGroup: null,
point: { x: aimx, y: aimy },
ctx
}
return { res: true, eventData };
}
}
}
return { res: false }
} else {
return { res: false }
}
}