This commit is contained in:
oc 2018-07-28 16:13:21 +08:00
parent e5885a70b3
commit 70b8d927de
7 changed files with 106 additions and 29 deletions

View File

@ -278,8 +278,27 @@ HTML5 canvas制作的魔塔样板支持全平台游戏
## 联系我们
由 [`ckcz123`](https://github.com/ckcz123) 百度ID `艾之葵`)编写。
样板主要由 [`ckcz123`](https://github.com/ckcz123) 百度ID `艾之葵`)编写。
HTML5魔塔交流群群号 `539113091`
如有其它意见或建议,也可以通过发[issues](https://github.com/ckcz123/mota-js/issues)、或邮件至[ckcz123@126.com](mailto:ckcz123@126.com)联系我。
## 贡献者
感谢对本样板做出贡献的人员:
@ckcz123 本样板的的主要编写者。样板的运行时的核心代码所有常用小工具以及安卓APP等都是其所写。
@Vinlic 第一个HTML5魔塔[纪元魔塔前传](https://tieba.baidu.com/p/4545234500)[游戏地址](http://vinlic.gitee.io/mota/)[开发记录贴](https://tieba.baidu.com/p/4397526540)[源代码](https://gitee.com/Vinlic/Mota))的编写者。
该塔的[第三版内核](https://tieba.baidu.com/p/4738973089)是现在HTML5魔塔样板的前身现在样板的很多核心逻辑控制以及UI界面等相关代码都是继承于该塔。
@zhaouv V2.0的推动者可视化地图编辑器和事件编辑器的制作者手机端魔塔制作界面的编写者。现在我们能在V2.0用到方便快捷的可视化地图编辑器以及通过拖动图块来编写事件能在手机端造塔等都需要归功于zhaouv的贡献。
@iEcho V2.0的推动者可视化地图编辑器的制作者游戏界面自适应匹配的编写者。和zhaouv一起推动和开发了V2.0的制作。
@wadxm iOS平台的APP因为苹果政策无法上架和启动服务mac版的开发者。我们现在能在mac上制作魔塔得归功于他。
@fux4 打通了RM和H5之间的障壁从而使RM动画导出器和怪物数据导出器成为可能同时也是部分新功能如跳跃、跟随、画面震动等的编写者。
以及[百度贴吧魔塔吧](https://tieba.baidu.com/f?kw=%E9%AD%94%E5%A1%94)和H5魔塔交流群`539113091`内的诸位魔塔爱好者们对本样板的大力支持!

View File

@ -290,13 +290,15 @@ table.col td {
padding: 0;
border-bottom-width: 0px;
border-top-width: 0px;
border-left-width: 0.117307vw;
border-right-width: 0.117307vw;
}
#mapColMark td:hover .colBlock {
position: absolute;
top: 4vw;
height: 96vw;
width: 7.15vw;
width: 7.384615vw;
z-index: 100;
background-color: rgba(38, 166, 154, .5);
}
@ -333,12 +335,14 @@ table.row td {
padding: 0;
border-left-width: 0px;
border-right-width: 0px;
border-top-width: 0.117307vw;
border-bottom-width: 0.117397vw;
}
#mapRowMark td:hover .rowBlock {
position: absolute;
left: 4vw;
height: 7.15vw;
height: 7.384615vw;
width: 96vw;
z-index: 100;
background-color: rgba(76, 34, 27, .5);

View File

@ -201,21 +201,21 @@
}
```
我们可以给文字加上标题或图标,只要以`\t[...]`开头就可以,大致共有如下几种情况:
我们可以给文字加上标题或图标,只要以`\t[...]`开头就可以
- `\t[hero]` 显示勇士的图标和名字
- `\t[monster_id]`显示某个怪物的图标和名字。`monster_id`在`enemys`中有定义,请前往参照。
- 例如:`\t[blackMagician]` 将显示黑暗大法师的图标和名字。
- `\t[名字,npc_id]` 显示某个NPC的名字和图标。`npc_id`所对应的图标具体在`icons.js`中有定义,请前往参照。
- 例如:`\t[小妖精,fairy]` 将显示名字为"小妖精",且是仙子的图标。
- `\t[标题]` 直接显示标题。
- 如果该中括号内只有一项,且不为`hero`也不为某个怪物的ID则会直接显示。如 `\t[你死了]` 直接显示一个标题为"你死了"。
其一般写法是`\t[名字,ID]`其中名字为你要显示的标题ID为图块ID只能为`hero`或者NPC/怪物的图块ID。
如果不需要可以不写ID则只会显示标题。
对于hero和怪物也可以不写名字代表使用默认值。
``` js
"x,y": [ // 实际执行的事件列表
"一段普通文字",
"\t[hero]这是一段勇士说的话",
"\t[blackMagician]这是一段黑暗大法师说的话",
"\t[勇士,hero]这是一段勇士说的话",
"\t[hero]如果使用勇士默认名称也可以直接简写hero",
"\t[黑暗大法师,blackMagician]我是黑暗大法师",
"\t[blackMagician]如果使用怪物的默认名称也可以简写怪物id",
"\t[小妖精,fairy]这是一段小妖精说的话,使用仙子(fairy)的图标",
"\t[你赢了]直接显示标题为【你赢了】",
]

View File

@ -731,8 +731,19 @@ control.prototype.moveAction = function (callback) {
}
if (core.status.event.id!='ski')
core.status.route.push(direction);
core.trigger(core.getHeroLoc('x'), core.getHeroLoc('y'));
// 检查是不是无事件的道具
var nowx = core.getHeroLoc('x'), nowy = core.getHeroLoc('y');
var block = core.getBlock(nowx,nowy);
var hasTrigger = false;
if (block!=null && block.block.event.trigger=='getItem' &&
!core.isset(core.floors[core.status.floorId].afterGetItem[nowx+","+nowy])) {
hasTrigger = true;
core.trigger(nowx, nowy);
}
core.checkBlock();
if (!hasTrigger && !core.status.gameOver)
core.trigger(nowx, nowy);
if (core.isset(callback)) callback();
});
}

View File

@ -73,6 +73,7 @@ function core() {
}
this.initStatus = {
'played': false,
'gameOver': false,
// 勇士属性
'hero': {},
@ -144,6 +145,7 @@ function core() {
'curtainColor': null,
'usingCenterFly':false,
'openingDoor': null,
'isSkiing': false,
// 动画
'globalAnimateObjs': [],

View File

@ -30,6 +30,7 @@ events.prototype.init = function () {
heroLoc = {'x': data.event.data.loc[0], 'y': data.event.data.loc[1]};
if (core.isset(data.event.data.direction))
heroLoc.direction = data.event.data.direction;
if (core.status.event.id!='action') core.status.event.id=null;
core.changeFloor(data.event.data.floorId, data.event.data.stair,
heroLoc, data.event.data.time, function () {
if (core.isset(callback)) callback();
@ -116,11 +117,13 @@ events.prototype.setInitData = function (hard) {
////// 游戏获胜事件 //////
events.prototype.win = function (reason, norank) {
core.status.gameOver = true;
return this.eventdata.win(reason, norank);
}
////// 游戏失败事件 //////
events.prototype.lose = function (reason) {
core.status.gameOver = true;
return this.eventdata.lose(reason);
}
@ -868,7 +871,7 @@ events.prototype.doAction = function() {
////// 往当前事件列表之前添加一个或多个事件 //////
events.prototype.insertAction = function (action, x, y, callback) {
if (core.status.event.id == null) {
if (core.status.event.id != 'action') {
this.doEvents(action, x, y, callback);
}
else {
@ -1019,6 +1022,7 @@ events.prototype.battle = function (id, x, y, force, callback) {
////// 触发(x,y)点的事件 //////
events.prototype.trigger = function (x, y) {
core.status.isSkiing = false;
var mapBlocks = core.status.thisMap.blocks;
var noPass;
for (var b = 0; b < mapBlocks.length; b++) {
@ -1030,6 +1034,8 @@ events.prototype.trigger = function (x, y) {
if (core.isset(mapBlocks[b].event) && core.isset(mapBlocks[b].event.trigger)) {
var trigger = mapBlocks[b].event.trigger;
if (trigger == 'ski') core.status.isSkiing = true;
// 转换楼层能否穿透
if (trigger=='changeFloor' && !noPass) {
var canCross = core.flags.portalWithoutTrigger;
@ -1578,7 +1584,7 @@ events.prototype.ski = function (direction) {
}
else {
core.moveHero(direction, function () {
if (core.status.event.id=='ski') {
if (core.status.event.id=='ski' && !core.status.isSkiing) {
core.status.event.id=null;
core.unLockControl();
core.replay();

View File

@ -278,8 +278,10 @@ ui.prototype.drawTextBox = function(content) {
if (ss.length==1) {
// id
id=ss[0];
// monster
if (id!='hero') {
if (id=='hero') {
name = core.status.hero.name;
}
else {
if (core.isset(core.material.enemys[id])) {
name = core.material.enemys[id].name;
@ -305,20 +307,35 @@ ui.prototype.drawTextBox = function(content) {
}
}
else {
id='npc';
name=ss[0];
if (core.isset(core.material.icons.npc48[ss[1]])) {
id = 'npc';
if (ss[1]=='hero') {
id = 'hero';
}
else if (core.isset(core.material.icons.npc48[ss[1]])) {
image = core.material.images.npc48;
icon = core.material.icons.npc48[ss[1]];
iconHeight = 48;
animate=4;
}
else {
else if (core.isset(core.material.icons.npcs[ss[1]])){
image = core.material.images.npcs;
icon = core.material.icons.npcs[ss[1]];
iconHeight = 32;
animate=2;
}
else if (core.isset(core.material.icons.enemy48[ss[1]])) {
image = core.material.images.enemy48;
icon = core.material.icons.enemy48[ss[1]];
iconHeight = 48;
animate=4;
}
else if (core.isset(core.material.icons.enemys[ss[1]])) {
image = core.material.images.enemys;
icon = core.material.icons.enemys[ss[1]];
iconHeight = 32;
animate=2;
}
}
}
}
@ -459,7 +476,7 @@ ui.prototype.drawTextBox = function(content) {
if (id == 'hero') {
var heroHeight=core.material.icons.hero.height;
core.strokeRect('ui', left + 15 - 1, top + 40 - 1, 34, heroHeight+2, null, 2);
core.fillText('ui', core.status.hero.name, content_left, top + 30, null, 'bold 22px Verdana');
core.fillText('ui', name, content_left, top + 30, null, 'bold 22px Verdana');
core.clearMap('ui', left + 15, top + 40, 32, heroHeight);
core.fillRect('ui', left + 15, top + 40, 32, heroHeight, background);
var heroIcon = core.material.icons.hero['down'];
@ -542,17 +559,20 @@ ui.prototype.drawChoices = function(content, choices) {
if (core.isset(content)) {
// 获得name, image, icon
if (content.indexOf("\t[")==0) {
if (content.indexOf("\t[")==0 || content.indexOf("\\t[")==0) {
var index = content.indexOf("]");
if (index>=0) {
var str=content.substring(2, index);
if (content.indexOf("\\t[")==0) str=content.substring(3, index);
content=content.substring(index+1);
var ss=str.split(",");
if (ss.length==1) {
// id
id=ss[0];
// monster
if (id!='hero') {
if (id=='hero') {
name = core.status.hero.name;
}
else {
if (core.isset(core.material.enemys[id])) {
name = core.material.enemys[id].name;
@ -578,20 +598,35 @@ ui.prototype.drawChoices = function(content, choices) {
}
}
else {
id='npc';
name=ss[0];
if (core.isset(core.material.icons.npc48[ss[1]])) {
id = 'npc';
if (ss[1]=='hero') {
id = 'hero';
}
else if (core.isset(core.material.icons.npc48[ss[1]])) {
image = core.material.images.npc48;
icon = core.material.icons.npc48[ss[1]];
iconHeight = 48;
animate=4;
}
else {
else if (core.isset(core.material.icons.npcs[ss[1]])){
image = core.material.images.npcs;
icon = core.material.icons.npcs[ss[1]];
iconHeight = 32;
animate=2;
}
else if (core.isset(core.material.icons.enemy48[ss[1]])) {
image = core.material.images.enemy48;
icon = core.material.icons.enemy48[ss[1]];
iconHeight = 48;
animate=4;
}
else if (core.isset(core.material.icons.enemys[ss[1]])) {
image = core.material.images.enemys;
icon = core.material.icons.enemys[ss[1]];
iconHeight = 32;
animate=2;
}
}
}
}
@ -631,7 +666,7 @@ ui.prototype.drawChoices = function(content, choices) {
if (id == 'hero') {
var heroHeight = core.material.icons.hero.height;
core.strokeRect('ui', left + 15 - 1, top + 30 - 1, 34, heroHeight+2, '#DDDDDD', 2);
core.fillText('ui', core.status.hero.name, title_offset, top + 27, '#FFD700', 'bold 19px Verdana');
core.fillText('ui', name, title_offset, top + 27, '#FFD700', 'bold 19px Verdana');
core.clearMap('ui', left + 15, top + 30, 32, heroHeight);
core.fillRect('ui', left + 15, top + 30, 32, heroHeight, background);
var heroIcon = core.material.icons.hero['down'];