DelayNoMore/frontend/assets/plugin_scripts/auxiliaries.js
2022-09-20 23:52:55 +08:00

201 lines
7.4 KiB
JavaScript

"use strict";
window.getQueryParamDict = function() {
// Kindly note that only the first occurrence of duplicated keys will be picked up.
var query = cc.sys.platform == cc.sys.WECHAT_GAME ? '' : window.location.search.substring(1);
var kvPairs = query.split('&');
var toRet = {};
for (var i = 0; i < kvPairs.length; ++i) {
var kAndV = kvPairs[i].split('=');
if (undefined === kAndV || null === kAndV || 2 != kAndV.length) return;
var k = kAndV[0];
var v = decodeURIComponent(kAndV[1]);
toRet[k] = v;
}
return toRet;
}
let IS_USING_WKWECHAT_KERNEL = null;
window.isUsingWebkitWechatKernel = function() {
if (null == IS_USING_WKWECHAT_KERNEL) {
// The extraction of `browserType` might take a considerable amount of time in mobile browser kernels.
IS_USING_WKWECHAT_KERNEL = (cc.sys.BROWSER_TYPE_WECHAT == cc.sys.browserType);
}
return IS_USING_WKWECHAT_KERNEL;
};
let IS_USING_X5_BLINK_KERNEL = null;
window.isUsingX5BlinkKernel = function() {
if (null == IS_USING_X5_BLINK_KERNEL) {
// The extraction of `browserType` might take a considerable amount of time in mobile browser kernels.
IS_USING_X5_BLINK_KERNEL = (cc.sys.BROWSER_TYPE_MOBILE_QQ == cc.sys.browserType);
}
return IS_USING_X5_BLINK_KERNEL;
};
let IS_USING_X5_BLINK_KERNEL_OR_WKWECHAT_KERNEL = null;
window.isUsingX5BlinkKernelOrWebkitWeChatKernel = function() {
if (null == IS_USING_X5_BLINK_KERNEL_OR_WKWECHAT_KERNEL) {
// The extraction of `browserType` might take a considerable amount of time in mobile browser kernels.
IS_USING_X5_BLINK_KERNEL_OR_WKWECHAT_KERNEL = (cc.sys.BROWSER_TYPE_MOBILE_QQ == cc.sys.browserType || cc.sys.BROWSER_TYPE_WECHAT == cc.sys.browserType);
}
return IS_USING_X5_BLINK_KERNEL_OR_WKWECHAT_KERNEL;
};
window.getRandomInt = function(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min)) + min;
}
window.safelyAssignParent = function(proposedChild, proposedParent) {
if (proposedChild.parent == proposedParent) return false;
proposedChild.parent = proposedParent;
return true;
};
window.get2dRotation = function(aCCNode) {
// return aCCNode.rotation; // For cc2.0+
return aCCNode.angle; // For cc2.1+
};
window.set2dRotation = function(aCCNode, clockwiseAngle) {
// aCCNode.rotation = angle; // For cc2.0+
aCCNode.angle = -clockwiseAngle; // For cc2.1+
};
window.setLocalZOrder = function(aCCNode, zIndex) {
aCCNode.zIndex = zIndex; // For cc2.0+
};
window.getLocalZOrder = function(aCCNode) {
return aCCNode.zIndex; // For cc2.0+
};
window.safelyAddChild = function(proposedParent, proposedChild) {
if (proposedChild.parent == proposedParent) return false;
setLocalZOrder(proposedChild, getLocalZOrder(proposedParent) + 1);
proposedParent.addChild(proposedChild);
return true;
};
window.setVisible = function(aCCNode) {
aCCNode.opacity = 255;
};
window.setInvisible = function(aCCNode) {
aCCNode.opacity = 0;
};
window.randomProperty = function (obj) {
var keys = Object.keys(obj)
return obj[keys[ keys.length * Math.random() << 0]];
};
window.gidSpriteFrameMap = {};
window.getOrCreateSpriteFrameForGid = function(gid, tiledMapInfo, tilesElListUnderTilesets) {
if (null != gidSpriteFrameMap[gid]) return gidSpriteFrameMap[gid];
if (false == gidSpriteFrameMap[gid]) return null;
var tilesets = tiledMapInfo.getTilesets();
var targetTileset = null;
for (var i = 0; i < tilesets.length; ++i) {
// TODO: Optimize by binary search.
if (gid < tilesets[i].firstGid) continue;
if (i < tilesets.length - 1) {
if (gid >= tilesets[i + 1].firstGid) continue;
}
targetTileset = tilesets[i];
break;
}
if (!targetTileset) return null;
var tileIdWithinTileset = (gid - targetTileset.firstGid);
var tilesElListUnderCurrentTileset = tilesElListUnderTilesets[targetTileset.name + ".tsx"];
var targetTileEl = null;
for (var tileIdx = 0; tileIdx < tilesElListUnderCurrentTileset.length; ++tileIdx) {
var tmpTileEl = tilesElListUnderCurrentTileset[tileIdx];
if (tileIdWithinTileset != parseInt(tmpTileEl.id)) continue;
targetTileEl = tmpTileEl;
break;
}
var tileId = tileIdWithinTileset;
var tilesPerRow = (targetTileset.sourceImage.width / targetTileset._tileSize.width);
var row = parseInt(tileId / tilesPerRow);
var col = (tileId % tilesPerRow);
var offset = cc.v2(targetTileset._tileSize.width * col, targetTileset._tileSize.height * row);
var origSize = targetTileset._tileSize;
var rect = cc.rect(offset.x, offset.y, origSize.width, origSize.height);
var sf = new cc.SpriteFrame(targetTileset.sourceImage, rect, false /* rotated */ , cc.v2() /* DON'T use `offset` here or you will have an offsetted image from the `cc.Sprite.node.anchor`. */, origSize);
const data = {
origSize: targetTileset._tileSize,
spriteFrame: sf,
}
window.gidSpriteFrameMap[gid] = data;
return data;
}
window.gidAnimationClipMap = {};
window.getOrCreateAnimationClipForGid = function(gid, tiledMapInfo, tilesElListUnderTilesets) {
if (null != gidAnimationClipMap[gid]) return gidAnimationClipMap[gid];
if (false == gidAnimationClipMap[gid]) return null;
var tilesets = tiledMapInfo.getTilesets();
var targetTileset = null;
for (var i = 0; i < tilesets.length; ++i) {
// TODO: Optimize by binary search.
if (gid < tilesets[i].firstGid) continue;
if (i < tilesets.length - 1) {
if (gid >= tilesets[i + 1].firstGid) continue;
}
targetTileset = tilesets[i];
break;
}
if (!targetTileset) return null;
var tileIdWithinTileset = (gid - targetTileset.firstGid);
var tilesElListUnderCurrentTileset = tilesElListUnderTilesets[targetTileset.name + ".tsx"];
var targetTileEl = null;
for (var tileIdx = 0; tileIdx < tilesElListUnderCurrentTileset.length; ++tileIdx) {
var tmpTileEl = tilesElListUnderCurrentTileset[tileIdx];
if (tileIdWithinTileset != parseInt(tmpTileEl.id)) continue;
targetTileEl = tmpTileEl;
break;
}
if (!targetTileEl) return null;
var animElList = targetTileEl.getElementsByTagName("animation");
if (!animElList || 0 >= animElList.length) return null;
var animEl = animElList[0];
var uniformDurationSecondsPerFrame = null;
var totDurationSeconds = 0;
var sfList = [];
var frameElListUnderAnim = animEl.getElementsByTagName("frame");
var tilesPerRow = (targetTileset.sourceImage.width/targetTileset._tileSize.width);
for (var k = 0; k < frameElListUnderAnim.length; ++k) {
var frameEl = frameElListUnderAnim[k];
var tileId = parseInt(frameEl.attributes.tileid.value);
var durationSeconds = frameEl.attributes.duration.value/1000;
if (null == uniformDurationSecondsPerFrame) uniformDurationSecondsPerFrame = durationSeconds;
totDurationSeconds += durationSeconds;
var row = parseInt(tileId / tilesPerRow);
var col = (tileId % tilesPerRow);
var offset = cc.v2(targetTileset._tileSize.width*col, targetTileset._tileSize.height*row);
var origSize = targetTileset._tileSize;
var rect = cc.rect(offset.x, offset.y, origSize.width, origSize.height);
var sf = new cc.SpriteFrame(targetTileset.sourceImage, rect, false /* rotated */, cc.v2(), origSize);
sfList.push(sf);
}
var sampleRate = 1/uniformDurationSecondsPerFrame; // A.k.a. fps.
var animClip = cc.AnimationClip.createWithSpriteFrames(sfList, sampleRate);
// http://docs.cocos.com/creator/api/en/enums/WrapMode.html.
animClip.wrapMode = cc.WrapMode.Loop;
return {
origSize: targetTileset._tileSize,
animationClip: animClip,
};
};