自绘状态栏预览

This commit is contained in:
ckcz123 2021-09-01 14:19:53 +08:00
parent 5b36213131
commit 0a49409863
10 changed files with 191 additions and 42 deletions

View File

@ -4026,8 +4026,8 @@ EquipValueType_List
/*EquipValueType_List ['value','percentage']*/;
Vibrate_List
: '左右'|'上下'|'左上-右下'|'左下-右上'
/*Vibrate_List ['horizontal','vertical','diagonal1','diagonal2']*/;
: '左右'|'上下'|'左上-右下'|'左下-右上'|'随机'
/*Vibrate_List ['horizontal','vertical','diagonal1','diagonal2','random']*/;
Colour
: 'sdeirughvuiyasdeb'+ //为了被识别为复杂词法规则
@ -4102,8 +4102,8 @@ Move_List
/*Move_List ['up','down','left','right','forward','backward','leftup','leftdown','rightup','rightdown','speed']*/;
MoveMode_List
: '匀速移动'|'缓入快出'|'快入缓出'|'缓入缓出'
/*MoveMode_List ['', 'easeIn', 'easeOut', 'easeInOut']*/;
: '匀速移动'|'缓入快出'|'快入缓出'|'缓入缓出'|'随机'
/*MoveMode_List ['', 'easeIn', 'easeOut', 'easeInOut', 'random']*/;
NameMap_List
: '确定'|'取消'|'操作失败'|'光标移动'|'打开界面'|'读档'|'存档'|'获得道具'|'回血'|'宝石'|'炸弹'|'飞行器'|'开关门'|'上下楼'|'跳跃'|'破墙镐'|'破冰镐'|'阻激夹域'|'穿脱装备'|'商店'

View File

@ -282,6 +282,18 @@ editor_multi = function () {
}).length > 0;
}
var _previewButton = document.getElementById('editor_multi_preview');
_previewButton.onclick = function () {
if (!editor_multi.preview) return;
_format();
if (editor_multi.hasError()) {
alert("当前好像存在严重的语法错误,请处理后再预览。");
return;
}
editor.uievent.previewEditorMulti(editor_multi.preview, codeEditor.getValue());
}
editor_multi.import = function (id_, args) {
var thisTr = document.getElementById(id_);
if (!thisTr) return false;
@ -292,6 +304,8 @@ editor_multi = function () {
editor_multi.id = id_;
editor_multi.isString = false;
editor_multi.lintAutocomplete = false;
editor_multi.preview = args.preview;
_previewButton.style.display = editor_multi.preview ? 'inline' : 'none';
if (args.lint === true) editor_multi.lintAutocomplete = true;
if ((!input.value || input.value == 'null') && args.template)
input.value = '"' + args.template + '"';
@ -318,7 +332,7 @@ editor_multi = function () {
_setValue(tstr || '');
}
editor_multi.show();
codeEditor.scrollTo(0, lastOffset[id_] || 0);
codeEditor.scrollTo(0, lastOffset[editor_multi.id] || 0);
return true;
}

View File

@ -419,7 +419,7 @@ editor_table_wrapper = function (editor) {
var cobj = JSON.parse(tr.children[1].getAttribute('cobj'));
var input = tr.children[2].children[0].children[0];
if (cobj._type === 'event') editor_blockly.import(guid, { type: cobj._event });
if (cobj._type === 'textarea') editor_multi.import(guid, { lint: cobj._lint, string: cobj._string, template: cobj._template });
if (cobj._type === 'textarea') editor_multi.import(guid, { lint: cobj._lint, string: cobj._string, template: cobj._template, preview: cobj._preview });
if (cobj._type === 'material') editor.table.selectMaterial(input, cobj);
if (cobj._type === 'color') editor.table.selectColor(input);
if (cobj._type === 'point') editor.table.selectPoint(input);
@ -451,7 +451,7 @@ editor_table_wrapper = function (editor) {
editor_table.prototype.dblclickfunc = function (guid, obj, commentObj, thisTr, input, field, cobj, modeNode) {
if (editor_mode.doubleClickMode === 'change') {
if (cobj._type === 'event') editor_blockly.import(guid, { type: cobj._event });
if (cobj._type === 'textarea') editor_multi.import(guid, { lint: cobj._lint, string: cobj._string, template: cobj._template });
if (cobj._type === 'textarea') editor_multi.import(guid, { lint: cobj._lint, string: cobj._string, template: cobj._template, preview: cobj._preview });
if (cobj._type === 'material') editor.table.selectMaterial(input, cobj);
if (cobj._type === 'color') editor.table.selectColor(input);
if (cobj._type === 'point') editor.table.selectPoint(input);

View File

@ -13,14 +13,13 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.title = document.getElementById('uieventTitle');
uievent.elements.yes = document.getElementById('uieventYes');
uievent.elements.no = document.getElementById('uieventNo');
uievent.elements.selectBackground = document.getElementById('uieventBackground');
uievent.elements.select = document.getElementById('uieventSelect');
uievent.elements.selectPoint = document.getElementById('selectPoint');
uievent.elements.selectFloor = document.getElementById('selectPointFloor');
uievent.elements.selectPointBox = document.getElementById('selectPointBox');
uievent.elements.body = document.getElementById('uieventBody');
uievent.elements.selectPointButtons = document.getElementById('selectPointButtons');
uievent.elements.canvas = document.getElementById('uievent');
uievent.elements.usedFlags = document.getElementById('uieventUsedFlags');
uievent.elements.extraBody = document.getElementById('uieventExtraBody');
uievent.close = function () {
@ -34,17 +33,13 @@ editor_uievent_wrapper = function (editor) {
}
uievent.elements.no.onclick = uievent.close;
uievent.elements.selectBackground.onchange = function () {
uievent.drawPreviewUI();
}
uievent.drawPreviewUI = function () {
core.setAlpha('uievent', 1);
core.clearMap('uievent');
core.setFilter('uievent', null);
// 绘制UI
var background = uievent.elements.selectBackground.value;
var background = uievent.elements.select.value;
if (background == 'thumbnail') {
core.drawThumbnail(editor.currentFloorId, null, {ctx: 'uievent'});
}
@ -92,15 +87,21 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'none';
uievent.elements.title.innerText = 'UI绘制预览';
uievent.elements.selectBackground.style.display = 'inline';
uievent.elements.selectBackground.value = 'thumbnail';
uievent.elements.select.style.display = 'inline';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'block';
uievent.elements.usedFlags.style.display = 'none';
uievent.elements.extraBody.style.display = 'none';
uievent.elements.body.style.overflow = "hidden";
uievent.elements.select.innerHTML =
'<option value="thumbnail" selected>缩略图</option>' +
'<option value="#000000">黑色</option>' +
'<option value="#FFFFFF">白色</option>';
uievent.elements.select.onchange = function () {
uievent.drawPreviewUI();
}
uievent.values.list = list;
uievent.drawPreviewUI();
}
@ -114,11 +115,10 @@ editor_uievent_wrapper = function (editor) {
uievent.mode = 'selectPoint';
uievent.elements.selectPoint.style.display = 'block';
uievent.elements.yes.style.display = 'inline';
uievent.elements.selectBackground.style.display = 'none';
uievent.elements.select.style.display = 'none';
uievent.elements.selectFloor.style.display = 'inline';
uievent.elements.selectPointBox.style.display = 'block';
uievent.elements.canvas.style.display = 'block';
uievent.elements.usedFlags.style.display = 'none';
uievent.elements.extraBody.style.display = 'none';
uievent.elements.body.style.overflow = "hidden";
uievent.elements.yes.onclick = function () {
@ -336,11 +336,10 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'none';
uievent.elements.title.innerText = '搜索变量';
uievent.elements.selectBackground.style.display = 'none';
uievent.elements.select.style.display = 'inline';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'none';
uievent.elements.usedFlags.style.display = 'inline';
uievent.elements.extraBody.style.display = 'block';
uievent.elements.body.style.overflow = "auto";
@ -350,13 +349,14 @@ editor_uievent_wrapper = function (editor) {
v = "flag:" + v;
html += "<option value='" + v + "'>" + v + "</option>";
});
uievent.elements.usedFlags.innerHTML = html;
uievent.elements.select.innerHTML = html;
uievent.elements.select.onchange = uievent.doSearchUsedFlags;
uievent.doSearchUsedFlags();
}
uievent.doSearchUsedFlags = function () {
var flag = uievent.elements.usedFlags.value;
var flag = uievent.elements.select.value;
var html = "<p style='margin-left: 10px'>该变量出现的所有位置如下:</p><ul>";
var list = uievent._searchUsedFlags(flag);
@ -457,11 +457,10 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'block';
uievent.elements.title.innerText = title;
uievent.elements.selectBackground.style.display = 'none';
uievent.elements.select.style.display = 'none';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'none';
uievent.elements.usedFlags.style.display = 'none';
uievent.elements.extraBody.style.display = 'block';
uievent.elements.body.style.overflow = "auto";
@ -559,11 +558,10 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'block';
uievent.elements.title.innerText = title;
uievent.elements.selectBackground.style.display = 'none';
uievent.elements.select.style.display = 'none';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'none';
uievent.elements.usedFlags.style.display = 'none';
uievent.elements.extraBody.style.display = 'block';
uievent.elements.body.style.overflow = "auto";
@ -884,11 +882,10 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'block';
uievent.elements.title.innerText = title;
uievent.elements.selectBackground.style.display = 'none';
uievent.elements.select.style.display = 'none';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'none';
uievent.elements.usedFlags.style.display = 'none';
uievent.elements.extraBody.style.display = 'block';
uievent.elements.body.style.overflow = "auto";
@ -930,5 +927,143 @@ editor_uievent_wrapper = function (editor) {
uievent.elements.extraBody.innerHTML = "<p>"+table+"</p>";
}
uievent.previewEditorMulti = function (mode, code) {
if (mode == 'statusBar') return uievent.previewStatusBar(code);
}
// ------ 状态栏预览 ------ //
uievent.previewStatusBar = function (code) {
if (!/^function\s*\(\)\s*{/.test(code)) return;
uievent.isOpen = true;
uievent.elements.div.style.display = 'block';
uievent.mode = 'previewStatusBar';
uievent.elements.selectPoint.style.display = 'none';
uievent.elements.yes.style.display = 'none';
uievent.elements.title.innerText = '状态栏自绘预览';
uievent.elements.select.style.display = 'inline';
uievent.elements.selectFloor.style.display = 'none';
uievent.elements.selectPointBox.style.display = 'none';
uievent.elements.canvas.style.display = 'none';
uievent.elements.extraBody.style.display = 'block';
uievent.elements.body.style.overflow = "auto";
uievent.elements.select.innerHTML = '<option value="horizontal" selected>横屏</option><option value="vertical">竖屏</option>'
uievent.elements.select.onchange = uievent._previewStatusBar;
// 计算在自绘状态栏中使用到的所有flag
var flags = {};
code.replace(/flag:([a-zA-Z0-9_\u4E00-\u9FCC\u3040-\u30FF\u2160-\u216B\u0391-\u03C9]+)/g, function (s0, s1) {
flags[s1] = 0; return s0;
});
code.replace(/(core\.)?flags.([a-zA-Z0-9_]+)/g, function (s0, s1, s2) {
if (!s1) flags[s2] = 0; return s0;
});
code.replace(/core\.(has|get|set|add|remove)Flag\('(.*?)'/g, function (s0, s1, s2) {
flags[s2] = 0; return s0;
});
code.replace(/core\.(has|get|set|add|remove)Flag\("(.*?)"/g, function (s0, s1, s2) {
flags[s2] = 0; return s0;
});
var html = '';
html += "<p style='margin-left: 10px; margin-right: 10px'><b>注:此处预览效果与实际游戏内效果会有所出入,仅供参考,请以游戏内实际效果为准。</b></p>";
html += "<p id='_previewStatusBarP' style='display:flex; flex-wrap: nowrap'><canvas id='_previewStatusBarCanvas' style='max-width: 100%'></canvas>";
html += "<span style='margin: 10px' id='_previewStatusBarValue'>";
html += "属性设置: <button onclick='editor.uievent._previewStatusBar()'>确定</button><br/>"
html += "名称:<input value='阳光'> 生命:<input value='1000'> 上限:<input value='9999'> 攻击:<input value='10'> 防御:<input value='10'> 护盾:<input value='0'> ";
html += "魔力:<input value='0'> 上限:<input value='-1'> 金币:<input value='0'> 经验:<input value='0'> 等级:<input value='1'> ";
html += "<br/>当前道具ID列表以逗号分隔)<br/><textarea style='width:230px;height:30px'>yellowKey,yellowKey,blueKey</textarea>";
html += "<br/>当前装备ID以逗号分隔)<br/><textarea style='width:230px;height:30px'>sword1,sheild1</textarea>";
html += "<br/>当前变量值JSON格式<br/><textarea style='width:230px;height:50px'>"+JSON.stringify(flags)+"</textarea>";
html += "</span></p>"
uievent.elements.extraBody.innerHTML = html;
var inputs = document.querySelectorAll('#_previewStatusBarP input');
for (var i = 0; i < inputs.length; ++i) inputs[i].style.width = '50px';
uievent.values.code = code;
uievent._previewStatusBar();
}
uievent._previewStatusBar = function () {
var domStyle = core.clone(core.domStyle);
var hero = core.clone(core.status.hero);
core.status.hero.flags.__statistics__ = true;
var statusCanvasCtx = core.dom.statusCanvasCtx;
var enable = core.flags.statusCanvas;
core.domStyle.showStatusBar = true;
core.flags.statusCanvas = true;
core.domStyle.isVertical = uievent.elements.select.value == 'vertical';
var canvas = document.getElementById('_previewStatusBarCanvas');
var canvas2 = document.createElement('canvas');
document.getElementById('_previewStatusBarP').style.flexWrap = core.domStyle.isVertical ? 'wrap' : 'nowrap';
var values = Array.from(document.getElementById('_previewStatusBarValue').children).filter(function (one) {
return one.tagName == 'INPUT' || one.tagName == 'TEXTAREA';
}).map(function (one) { return one.value; });
core.status.hero.name = values[0].value;
core.status.hero.hp = parseFloat(values[1]);
core.status.hero.hpmax = parseFloat(values[2]);
core.status.hero.atk = parseFloat(values[3]);
core.status.hero.def = parseFloat(values[4]);
core.status.hero.mdef = parseFloat(values[5]);
core.status.hero.mana = parseFloat(values[6]);
core.status.hero.manamax = parseFloat(values[7]);
core.status.hero.money = parseFloat(values[8]);
core.status.hero.exp = parseFloat(values[9]);
core.status.hero.lv = parseFloat(values[10]);
values[11].split(',').forEach(function (itemId) {
if (!core.material.items[itemId]) return;
var itemCls = core.material.items[itemId].cls;
if (itemCls == 'items') return;
core.status.hero.items[itemCls][itemId] = (core.status.hero.items[itemCls][itemId]||0) + 1;
});
core.status.hero.equipment = values[12].split(',');
try {
var flags = JSON.parse(values[13]);
for (var flag in flags) {
core.status.hero.flags[flag] = flags[flag];
}
} catch (e) {}
var ctx = canvas2.getContext('2d');
if (core.domStyle.isVertical) {
canvas.width = canvas2.width = core.__PIXELS__;
canvas.height = canvas2.height = 32*(core.values.statusCanvasRowsOnMobile||3)+9;
} else if (data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.flags.extendToolbar) {
canvas.width = canvas2.width = Math.round(core.__PIXELS__ * 0.31);
canvas.height = canvas2.height = core.__PIXELS__ + 3 + 38;
} else {
canvas.width = canvas2.width = Math.round(core.__PIXELS__ * 0.31);
canvas.height = canvas2.height = core.__PIXELS__;
}
core.dom.statusCanvasCtx = ctx;
try {
eval('(' + uievent.values.code + ')()');
} catch (e) {
console.error(e);
}
var toCtx = canvas.getContext('2d');
core.fillRect(toCtx, 0, 0, canvas.width, canvas.height, 'black');
core.drawImage(toCtx, canvas2, 0, 0);
core.dom.statusCanvasCtx = statusCanvasCtx;
core.domStyle = domStyle;
core.flags.statusCanvas = enable;
core.status.hero = hero;
window.hero = hero;
window.flags = core.status.hero.flags;
}
editor.constructor.prototype.uievent=uievent;
}

View File

@ -192,6 +192,7 @@ var functions_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
"_leaf": true,
"_type": "textarea",
"_lint": true,
"_preview": "statusBar",
"_data": "自绘状态栏"
},
"drawStatistics": {

View File

@ -244,6 +244,7 @@
<button onclick="editor_multi.confirm()">确认</button>
<button onclick="editor_multi.cancel()">取消</button>
<button onclick="editor_multi.format()">格式化</button>
<button id="editor_multi_preview" style="display: none;">预览</button>
<input type="checkbox" onclick="editor_multi.toggerLint()" id="lintCheckbox"
style="vertical-align: middle;margin-left:6px"/>
<span style="vertical-align: middle; margin-left: -3px">语法检查</span>
@ -406,12 +407,7 @@
<div id='uieventDialog'>
<div id="uieventHead">
<span id="uieventTitle"></span>
<select id="uieventBackground" style="margin-left: 20px">
<option value="thumbnail" selected>缩略图</option>
<option value="#000000">黑色</option>
<option value="#FFFFFF">白色</option>
</select>
<select id="uieventUsedFlags" style="margin-left: 10px; display: none" onchange="editor.uievent.doSearchUsedFlags()"></select>
<select id="uieventSelect" style="margin-left: 20px"></select>
<button id="uieventNo">关闭</button>
<button id="uieventYes">确定</button>
</div>

View File

@ -240,6 +240,7 @@
<button onclick="editor_multi.confirm()">确认</button>
<button onclick="editor_multi.cancel()">取消</button>
<button onclick="editor_multi.format()">格式化</button>
<button id="editor_multi_preview" style="display: none;">预览</button>
<input type="checkbox" onclick="editor_multi.toggerLint()" id="lintCheckbox"
style="vertical-align: middle;margin-left:6px"/>
<span style="vertical-align: middle; margin-left: -3px">语法检查</span>
@ -389,12 +390,7 @@
<div id='uieventDialog'>
<div id="uieventHead">
<span id="uieventTitle"></span>
<select id="uieventBackground" style="margin-left: 20px">
<option value="thumbnail" selected>缩略图</option>
<option value="#000000">黑色</option>
<option value="#FFFFFF">白色</option>
</select>
<select id="uieventUsedFlags" style="margin-left: 10px; display: none" onchange="editor.uievent.doSearchUsedFlags()"></select>
<select id="uieventSelect" style="margin-left: 20px"></select>
<button id="uieventNo">关闭</button>
<button id="uieventYes">确定</button>
</div>

View File

@ -2376,7 +2376,7 @@ control.prototype.getStatus = function (name) {
if (!core.status.hero) return null;
if (name == 'x' || name == 'y' || name == 'direction')
return this.getHeroLoc(name);
if (main.mode == 'editor') {
if (main.mode == 'editor' && !core.hasFlag('__statistics__')) {
return data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d.firstData.hero[name];
}
return core.status.hero[name];

View File

@ -3489,6 +3489,9 @@ events.prototype.vibrate = function (direction, time, speed, power, callback) {
speed = speed || 10;
power = power || 10;
var shakeInfo = {duration: parseInt(time / 10), speed: speed, power: power, direction: 1, shake: 0};
if (direction == 'random') {
direction = ['horizontal', 'vertical', 'diagonal1', 'diagonal2'][Math.floor(Math.random() * 4)];
}
var animate = setInterval(function () {
core.events._vibrate_update(shakeInfo);
switch (direction) {

View File

@ -558,6 +558,10 @@ utils.prototype.applyEasing = function(name) {
return t
}
}
if (name == 'random') {
var keys = Object.keys(list);
name = keys[Math.floor(Math.random() * keys.length)];
}
return list[name] || list.linear;
}