如何制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现

一,话说天下大事

前不久看到lufy的博客上,有一位朋友想要一个RPG游戏引擎,出于兴趣准备动手做一做。由于我研究lufylegend有一段时间了,对它有一定的依赖性,因此就准备将这个引擎基于lufylegend。暂时命名为lufylegendRPG。毕竟基于lufylegend,如果名称中不加上lufylegend这几个字的话,有点说不通啊。。。最近发布了0.1.0版,但是不理想,连一惯都是鼓励和赞赏我的lufy老先生都是出于真心的表示不满意。想了解0.1.0版的朋友可以看看这里(其实最好别看,因为1.0在用法上做了很大的调整):

http://blog.csdn.net/yorhomwang/article/details/8738733

于是我不得不重新来开发它。首先想到了地图类,今天就来实现一下。

我们的地图不应该是一张大地图,而是用小地图拼接而成,这样方便我们修改地图。

这样的话我们需要许多地图块的图片,通常我们把它们放在一张上。我们就用lufy老先生blog上一张图片作为例子,给大家看看这种装满小地图的大图是什么样的:

我们要完成的效果是什么样的呢?我把它放在这里,完成后看看实现度到底有多少:

二,如何实现

准备工作:

首先你需要下载lufylegend,最新版本是1.7.5,用1.7.3都行。

下载地址:http://lufylegend.com/lufylegend

上面有它的API和论坛,可以看看。

另外推荐一本相关图书,lufy写的,叫《HTML5 Canvas游戏开发实战》。用于学习基础和了解开发技巧还是不错的。其中还有一些很不错的js技术指导。值得一看。

书籍介绍:http://lufylegend.com/book/view/1

开始编写

由于lufylegend做的比较完美,那么我们封装起来就比较简单了。看看LTileMap完整构造器:

function LTileMap(data,img,width,height){
    var s = this;
    base(s,LSprite,[]);
    s.x = 0;
    s.y = 0;
    s.mapData = data;
    s.imgData = img;
    if(!width){
        var wbitmap = new LBitmapData(s.imgData);
        s.partWidth = wbitmap.image.width;
    }else{
        s.partWidth = width;
    }
    if(!height){
        var hbitmap = new LBitmapData(s.imgData);
        s.partHeight = hbitmap.image.height;
    }else{
        s.partHeight = height;
    }
    s.onshow();
}

首先为了减少引擎的大小,我们把变量s和this等起来,下面用到this的地方就都能用s来实现了。

※lufy大神最近提示我:“把变量s和this等起来是为了防止this的指向发生变化,并非单一减少引擎的大小。因为this的指向不一定一直指向当前函数的。”在此再次感谢lufy的支持。

首先我们让它继承LSprite,这样如果我们改变x和y属性后就可以直接变换位置了。再追加两个属性:mapData和imgData。

mapData是通过data参数赋值的,data的赋值应该是一个二维数组,格式如下:

[18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],
[18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],
[18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],
[18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],
[18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],
[18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],
[18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],
[18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],
[18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],
[18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]

它装载着地图块的样式,18对应的图块和55对应的图块是不一样的。后面我们会细讲。

imgData顾名思义,它是一个装图片的容器。

还有两个参数,它们是用来表示地图快的高度和宽度的。例如每张地图块是32*42的,那么就要将width设为32,height设为42。这样的话就会将装满地图块的图片分成小地图。例如我们把上面那张图片分成每个小地图块是32*32的,也就是说width设为32,height也设为32,那么就呈现现以下的形式:

(以上图片我直接用了lufy博客里的图片)这时你可以看看18和55所对应的是什么。18是一棵树,而55对应的是水,因此我们就做到了让每张地图块显示得不同。

接下来是onshow方法:

LTileMap.prototype.onshow = function(){
    var s = this;
    var mapdata = s.mapData;
    var partWidth = s.partWidth;
    var partHeight = s.partHeight;

    var i,j;
    var index,indexY,indexX;
    var bitmapdata,bitmap;

    for(i=0;i<mapdata.length;i++){
        for(j=0;j<mapdata[0].length;j++){
            index = mapdata[i][j];
            indexY = Math.floor(index/mapdata.length);
            indexX = index - indexY*mapdata.length;

            bitmapdata = new LBitmapData(s.imgData,indexX*partWidth,indexY*partHeight,partWidth,partHeight);
            bitmap = new LBitmap(bitmapdata);
            bitmap.x = j*partWidth + s.x;
            bitmap.y = i*partHeight + s.y;

            s.addChild(bitmap);
            }
    }
}

它的功能很简单,就是画出地图。其中的逻辑都很简单。主要是这里:

for(i=0;i<mapdata.length;i++){
    for(j=0;j<mapdata[0].length;j++){
        index = mapdata[i][j];
        indexY = Math.floor(index/mapdata.length);
        indexX = index - indexY*mapdata.length;

        bitmapdata = new LBitmapData(s.imgData,indexX*partWidth,indexY*partHeight,partWidth,partHeight);
        bitmap = new LBitmap(bitmapdata);
        bitmap.x = j*partWidth + s.x;
        bitmap.y = i*partHeight + s.y;

        s.addChild(bitmap);
    }
}

这一段代码是画出地图的核心,首先它遍历了地图数组,然后每遍历一个就画一张,然后加到自身中。由于自身是继承自LSprite,所当地图被加到自身中时,再将自身加到底层或者其他Sprite中时,整个截面就会显示。

over,很简单是不是?实现后我们怎么用它呢?看以下代码:

<!DOCTYPE html>
<html lang="en">
    <head>
    <meta charset="utf-8" />
    <title>LTileMap</title>
    <script type="text/javascript" src="../lufylegend-1.7.3.min.js"></script>
    <script type="text/javascript" src="../lufylegendrpg-1.0.0.min.js"></script>
    <script>
    init(30,"legend",480,320,main);
    LGlobal.setDebug(true);
    var backLayer,loadingLayer;
    var map;
    var loadData = [
        {name:"map",path:"./map.jpg"}
    ];
    var imglist = [];
    var mapData = [
        [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],
        [18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],
        [18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],
        [18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],
        [18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],
        [18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],
        [18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],
        [18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],
        [18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],
        [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]
    ];
    function main(){
        //加入进度条
        loadingLayer = new LoadingSample1();
        addChild(loadingLayer);
        //加载图片并显示进度
        LLoadManage.load(
            loadData,
            function(progress){
                loadingLayer.setProgress(progress);
            },
            gameInit
        );
    }
    function gameInit(result){
        removeChild(loadingLayer);
        imglist = result;
        //初始化层
        backLayer = new LSprite();
        addChild(backLayer);
        //加入地图
        addMap();
    }
    function addMap(){
        map = new LTileMap(mapData,imglist["map"],32,32);
        backLayer.addChild(map);
    }
    </script>
    </head>
    <body>
            <div id="legend"></div>
    </body>
</html>

运行代码得到如下效果:

为了防止大家以为我ps图片,那我就不仿把测试链接给出,大家自己看吧。

测试地址:http://www.cnblogs.com/yorhom/articles/3063759.html

代码很少,可以自己复制粘贴下来看看。哈!

时间: 2024-12-28 21:33:53

如何制作一款HTML5 RPG游戏引擎——第一篇,地图类的实现的相关文章

如何制作一款HTML5 RPG游戏引擎——第三篇,利用幕布切换场景

开言: 在RPG游戏中,如果有地图切换的地方,通常就会使用幕布效果.所谓的幕布其实就是将两个矩形合拢,直到把屏幕遮住,然后再展开直到两个矩形全部移出屏幕. 为了大家做游戏方便,于是我给这个引擎加了这么一个类. 本系列文章目录: 如何制作一款HTML5 RPG游戏引擎--第一篇,地图类的实现 http://blog.csdn.net/yorhomwang/article/details/8892305 如何制作一款HTML5 RPG游戏引擎--第二篇,烟雨+飞雪效果 http://blog.csd

如何制作一款HTML5 RPG游戏引擎——第四篇,情景对话

今天我们来实现情景对话.这是一个重要的功能,没有它,游戏将变得索然无味.所以我们不得不来完成它. 但是要知道,使用对话可不是一件简单的事,因为它内部的东西很多,比如说人物头像,人物名称,对话内容... 因此我们只能通过数组+JSON来将对话信息装起来,然后根据信息作出不同的显示.接下来我便要向大家展示实现方法. 先看本系列文章目录: 如何制作一款HTML5 RPG游戏引擎--第一篇,地图类的实现 http://blog.csdn.net/yorhomwang/article/details/88

如何制作一款HTML5 RPG游戏引擎——第五篇,人物&amp;人物特效

上一次,我们实现了对话类,今天就来做一个游戏中必不可少的--人物类. 当然,你完全是可以自己写一个人物类,但是为了方便起见,还是决定把人物类封装到这个引擎里. 为了使这个类更有意义,我还给人物类加了几个特效,在以下讲解中会提到. 以下是本系列文章的目录: 如何制作一款HTML5 RPG游戏引擎--第一篇,地图类的实现 http://blog.csdn.net/yorhomwang/article/details/8892305 如何制作一款HTML5 RPG游戏引擎--第二篇,烟雨+飞雪效果 h

25 个超棒的 HTML5 &amp; JavaScript 游戏引擎开发库

25 个超棒的 HTML5 & JavaScript 游戏引擎开发库 就像在汽车中,引擎完成主要的工作,使汽车看起来不可思议.游戏引擎同理,游戏开发者完成细节的工作,使游戏看起来真实.吸引人眼球.游戏引擎负责其余的事情.早期,游戏开发者通常从草图做起,花费高昂,且不容易获利.为了让游戏开发更加简单容易,主要的开发者开始授权他们的基本游戏引擎,如 Unreal.而且,随着手机和平板游戏的出现,所需预算比以前更少,对 JAVASCRIPT 和HTML5 游戏引擎的需求大增. 如果你是一个游戏开发者,

Android 八款开源 Android 游戏引擎

原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了,学不学是其次,主要是要有这方面的知识--技多不压身嘛~ 下面罗列出八款常见的 Android 游戏引擎,以供参考.收费.下载量过小.不公开源码,以及鄙人不知道(-_-)的引擎不在此列. Angle Angle 是一款专为 Android 平台设计的,适合快速开发的 2D 游戏引擎,基于 OpenGL

[Android游戏开发]八款开源 Android 游戏引擎 (巨好的资源)

初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于 iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游 戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情. 事实上,这种想法完全是没有必要且不符合实际的,作为能和苹果iOS分庭抗礼的Android(各种意义上),当然也会有相当数量的游戏引擎存

HTML5开源RPG游戏引擎lufylegendRPG 1.0.0发布

经历了几个月的改进,终于发布1.0.0版了.虽然引擎依然存在漏洞,但是比起上次更新还是要好多了.在这里不得不感谢各位网友的大力支持. 首先为引擎做一个开场白吧,也好让大家了解一下它: lufylegendRPG是基于lufylegend的HTML5游戏引擎.使用它时,需要引入lufylegend.js. 包含了LTileMap,LCharacter,LTalk,LEffect等多个实用的类. 由于是基于lufylegend,所以你需要了解一下lufylegend的用法,这样才能更合理,更快捷地运

HTML5 JavaScript3D游戏引擎和框架

由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.Android.Windows或其他任何平台上运行. 有很多的JavaScript能够用于创建基于浏览器.使用HTML5和WebGL的3D游戏.然后,选择一个合适的游戏引擎是一个不小的挑战,它有时能帮你完成项目或突破项目瓶颈. 为了让你的选择变的容易,我们已经通过分析大多数JavaScript 3D游

制作一款3D炸弹超人游戏

说起炸弹超人,相信很多朋友都玩过类似的游戏,其中最为人熟知的莫过于<泡泡堂>.该类型游戏需要玩家在地图中一边跑动一边放置炸弹,同时还要躲避敌方炸弹保护自己.最初的炸弹超人游戏都是2D的,今天这篇文章将教大家在Unity中实现一款3D的炸弹超人游戏. 准备工作 将项目初始资源导入Unity项目,资源目录如下: 其中分别包含要用于游戏的动画.材质.模型.背景音乐.物理材质.预制件.场景.脚本.音效及图片资源. 放置炸弹 打开项目中的Game场景并运行. 可以通过WASD键或方向键来操作所有角色进行