웹 프론트엔드 H5 튜토리얼 html5游戏开发-零基础开发RPG游戏-开源讲座(一)

html5游戏开发-零基础开发RPG游戏-开源讲座(一)

May 17, 2016 am 09:09 AM
admin h

本篇将以零基础的视点,来讲解如何开发一款RPG游戏。

在游戏的世界里,我们可以看到各种地图,各种游戏人物,看到人物在地图上行走,对话等,无论是地图还是人物,其实都是图片的处理与显示,把不同的图片显示到屏幕上,我们就看到不同的游戏界面,要想让这些图片同时显示到界面上,我们就需要处理好层次,让他们来分层显示,我们可以想象,如果游戏人物显示在地图的下层的话,显然会被地图遮挡住。
一款RPG游戏,我简单把它分为地图层,人物层,效果层(一些法术效果等),对话层,控制层(按钮菜单等)。

如下图





我们只要依次将图片画在屏幕上,游戏人物将站在地图上,如果有对话,对话将出现在人物和地图的上面,而按钮等控件会出现在游戏的最外层

下面,我们一步步来实现一个简单的RPG游戏的开发



准备工作

一,库件下载

本游戏开发,需要用到开源库件:LegendForHtml5Programming

请到这里下载最新版的LegendForHtml5Programming,本次开发需要1.2版以上

http://code.google.com/p/legendforhtml5programming/downloads/list

库件的开发过程请看这里


http://bbs.html5cn.org/thread-2712-1-1.html

二,库件配置

首先建立一个文件夹rpg(你也可以起其他的名字)


然后将下载的库件解压,解压后将legend文件夹放到与rpg文件夹同目录
然后,在rpg文件夹里建一个index.html文件和一个js文件夹,在js文件夹里建一个Main.js文件

最后,在index.html里加入下面的代码




  1. rpg


  2. loading……




复制代码

当然,你也可以将legend文件夹放到其他地方,但是你需要修改legend文件夹下的legend.js文件中的LEGEND_PATH的值,来配置库件的路径

游戏地图的实现

接下来,我们先来画最底层的地图层,

地图当然就是是由图片来组成的,如何在画面上显示一张图片,我之前已经写过专门的文章,代码如下
  1. var loader;  
  2. function main(){  
  3.     loader = new LLoader();  
  4.     loader.addEventListener(LEvent.COMPLETE,loadBitmapdata);  
  5.     loader.load("map.jpg","bitmapData");  
  6. }  
  7. function loadBitmapdata(event){  
  8.     var bitmapdata = new LBitmapData(loader.content);  
  9.     var bitmap = new LBitmap(bitmapdata);  
  10.     addChild(bitmap);  
  11. }  
复制代码

如果想更详细了解的话,看下面的帖子

用仿ActionScript的语法来编写html5——第一篇,显示一张图片

http://bbs.html5cn.org/thread-2700-1-1.html

游戏中的地图可以是一张比较大的图片,即整个图片就是游戏的地图,当人物或者地图移动的时候,改变图片显示的区域范围,从而实现地图的滚动和显示等,这样的话,必须为每个场景准备一张地图。

另外,地图也可以是由许多小的地图块儿来组成,比如,我们熟悉的《吞食天地》,《勇者斗恶龙》等经典小型rpg游戏,这样的地图,我们需要准备一张或几张地图块儿,把这些地图块组合成地图来显示,比如下图

0_13238754463fxE.gif


在地图显示的时候,首先把图片切割,然后在根据预先设定好的位置显示到地图层上,这样我们就看到了一张完整的地图了

接下来,打开Main.js

在里面加入
  1. init(50,"mylegend",480,320,main);
复制代码

在legendForHtml5Progarmming中,用init这个函数来初始化canvas,上面的代码表示,初始化一个速度为50,名字为mylegend,大小为480*320的游戏界面,初始化完成后调用main(),这个速度值是说每个多少毫秒游戏循环一次,所以这个值设定的越小,游戏运行的速度就越快

因为要调用main方法,所以我们要写一个main方法,main方法里做一些简单的准备工作。

虽说读取图片只需要一个
  1. loader.load("map.jpg","bitmapData");  
复制代码

但是游戏中往往用到很多张图片,你可以用到哪一张再加载哪一张,也可以一次性全部加载完,然后再开始显示游戏

为了一次性把图片加载完,我的做法是,将需要的图片放到一个数组里,然后设定一个索引,每加载一个图片,让这个索引加1,当这个索引小于数组的长度,则继续加载,直到将数组中的图片全部加载完,然后开始进行下一步的工作

具体实现看下面的代码
  1. //图片path数组
  2. var imgData = new Array();
  3. //读取完的图片数组
  4. var imglist = {};

  5. function main(){
  6.         //准备读取图片
  7.         imgData.push({name:"map",path:"./image/map.jpg"});
  8.         imgData.push({name:"mingren",path:"./image/mingren.png"});
  9.         imgData.push({name:"e1",path:"./image/e1.png"});
  10.         imgData.push({name:"e2",path:"./image/e2.png"});
  11.         //实例化进度条层
  12.         loadingLayer = new LSprite();
  13.         loadingLayer.graphics.drawRect(1,"black",[50, 200, 200, 20],true,"#ffffff");
  14.         addChild(loadingLayer);
  15.         //开始读取图片
  16.         loadImage();
  17. }
  18. function loadImage(){
  19.         //图片全部读取完成,开始初始化游戏
  20.         if(loadIndex >= imgData.length){
  21.                 removeChild(loadingLayer);
  22.                 legendLoadOver();
  23.                 gameInit();
  24.                 return;
  25.         }
  26.         //开始读取图片
  27.         loader = new LLoader();
  28.         loader.addEventListener(LEvent.COMPLETE,loadComplete);
  29.         loader.load(imgData[loadIndex].path,"bitmapData");
  30. }
  31. function loadComplete(event){
  32.         //进度条显示
  33.         loadingLayer.graphics.clear();
  34.         loadingLayer.graphics.drawRect(1,"black",[50, 200, 200, 20],true,"#ffffff");
  35.         loadingLayer.graphics.drawRect(1,"black",[50, 203, 200*(loadIndex/imgData.length), 14],true,"#000000");
  36.         //储存图片数据
  37.         imglist[imgData[loadIndex].name] = loader.content;
  38.         //读取下一张图片
  39.         loadIndex++;
  40.         loadImage();
  41. }
复制代码

上面的代码不难明白,当图片没有读取完之前,会不断循环loadImage和loadComplete两个方法,当读取完之后,移除进度条,用legendLoadOver告诉游戏已经读取完成,然后调用gameInit方法,进行游戏的初始化工作。

看gameInit方法
  1. function gameInit(event){
  2.         //游戏层显示初始化
  3.         layerInit();
  4.         //添加地图
  5.         addMap();
  6.         //添加人物
  7.         addChara();
  8. }
复制代码

在gameInit方法中,首先进行游戏层的初始化,然后添加游戏地图,然后添加人物

游戏层显示初始化,按照我们一开始所说,我们一次来初始化地图层,人物层,效果层,对话层,控制层
  1. //游戏层显示初始化
  2. function layerInit(){
  3.         //游戏底层添加
  4.         backLayer = new LSprite();
  5.         addChild(backLayer);
  6.         //地图层添加
  7.         mapLayer = new LSprite();
  8.         backLayer.addChild(mapLayer);
  9.         //人物层添加
  10.         charaLayer = new LSprite();
  11.         backLayer.addChild(charaLayer);
  12.         //效果层添加
  13.         effectLayer = new LSprite();
  14.         backLayer.addChild(effectLayer);
  15.         //对话层添加
  16.         talkLayer = new LSprite();
  17.         backLayer.addChild(talkLayer);
  18.         //控制层添加
  19.         ctrlLayer = new LSprite();
  20.         backLayer.addChild(ctrlLayer);
  21. }
复制代码

有了游戏层次的划分,我们在添加游戏对象的时候,将地图添加到地图层,人物添加到人物层,他们就会依次显示在游戏的界面

下面开始添加地图

首先我们需要准备好显示地图的数组
  1. //地图图片数组
  2. var map = [
  3. [18,18,18,18,18,18,18,18,18,18,18,18,55,55,18],
  4. [18,18,18,17,17,17,17,17,17,17,17,17,55,55,18],
  5. [18,18,17,17,17,17,18,18,17,17,17,17,55,55,18],
  6. [18,17,17,17,18,18,18,18,18,17,17,55,55,17,18],
  7. [18,17,17,18,22,23,23,23,24,18,17,55,55,17,18],
  8. [18,17,17,18,25,28,26,79,27,18,55,55,17,17,18],
  9. [18,17,17,17,17,10,11,12,18,18,55,55,17,17,18],
  10. [18,18,17,17,10,16,16,16,11,55,55,17,17,17,18],
  11. [18,18,17,17,77,16,16,16,16,21,21,17,17,17,18],
  12. [18,18,18,18,18,18,18,18,18,55,55,18,18,18,18]
  13. ];
复制代码

这些数字分别对应着图中如下位置

0_13238754743Gp2.gif



然后看下面代码
  1. //添加地图
  2. function addMap(){
  3.         var i,j,index,indexX,indexY;
  4.         var bitmapdata,bitmap;
  5.         //地图图片数据
  6.         bitmapdata = new LBitmapData(imglist["map"]);
  7.         //将地图图片拆分,得到拆分后的各个小图片的坐标数组
  8.         imageArray = LGlobal.divideCoordinate(bitmapdata.image.width,bitmapdata.image.height,10,10);

  9.         //在地图层上,画出15*10的小图片
  10.         for(i=0;i
  11.                 for(j=0;j
  12.                         //从地图数组中得到相应位置的图片坐标
  13.                         index = map[i][j];
  14.                         //小图片的竖坐标
  15.                         indexY = Math.floor(index /10);
  16.                         //小图片的横坐标
  17.                         indexX = index - indexY*10;
  18.                         //得到小图片
  19.                         bitmapdata = new LBitmapData(imglist["map"],indexX*32,indexY*32,32,32);
  20.                         bitmap = new LBitmap(bitmapdata);
  21.                         //设置小图片的显示位置
  22.                         bitmap.x = j*32;
  23.                         bitmap.y = i*32;
  24.                         //将小图片显示到地图层
  25.                         mapLayer.addChild(bitmap);
  26.                 }
  27.         }
  28. }
复制代码

这样,我们就把预先设置好的图片显示到了游戏界面上,形成了地图

先把addChara方法加上
  1. //添加人物
  2. function addChara(){
  3. }
复制代码

然后运行游戏

可以得到下面画面

0_1323875497G8BG.gif



游戏人物的实现

为了更好的实现游戏人物的控制,我们新建一个游戏人物类Character.js

里面代码如下
  1. function Character(data,row,col,speed){
  2.         base(this,LSprite,[]);
  3.         var self = this;
  4.         //设定人物动作速度
  5.         self.speed = speed==null?3:speed;
  6.         self.speedIndex = 0;
  7.         //设定人物大小
  8.         data.setProperties(0,0,data.image.width/col,data.image.height/row);
  9.         //得到人物图片拆分数组
  10.         var list = LGlobal.divideCoordinate(data.image.width,data.image.height,row,col);
  11.         //设定人物动画
  12.         self.anime = new LAnimation(this,data,list);
  13. };
  14. Character.prototype.onframe = function (){
  15.         var self = this;
  16.         if(self.speedIndex++
  17.         self.speedIndex = 0;
  18.         self.anime.onframe();
  19. };
复制代码

在legendForHtml5Programming里,有一个LAnimation类,用来实现图片数组顺序播放,形成动画
使用LAnimation类需要三个参数,一个是显示动画的层,一个是图片,一个是图片的坐标数组

然后,调用LAnimation类的onframe方法,就可以实现动画的播放了

在index.html中引入Character类,然后修改addChara方法
  1. //添加人物
  2. function addChara(){
  3.         bitmapdata = new LBitmapData(imglist["mingren"]);
  4.         player = new Character(bitmapdata,4,4);
  5.         player.x = 32*5;
  6.         player.y = 32*6;
  7.         charaLayer.addChild(player);
  8.         
  9. }
复制代码

在gameInit的末尾添加循环事件
  1. //添加贞事件,开始游戏循环
  2.         backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);
复制代码

最后,添加onframe方法
  1. /**
  2. * 循环
  3. * */
  4. function onframe(){
  5.         player.onframe();
  6. }
复制代码

运行代码,看到了吗

一个会动的鸣人出现在游戏的地图上了

0_1323875534sUfb.gif





游戏演示

http://fsanguo.comoj.com/html5/rpg/index.html

最后,附上这次的游戏源代码

http://legend-demo.googlecode.com/files/rpg.zip



本文转自个人博客:http://blog.csdn.net/lufy_legend
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 uniapp이 미니 프로그램과 H5 간의 빠른 전환을 달성하는 방법 Oct 20, 2023 pm 02:12 PM

유니앱이 미니 프로그램과 H5 사이를 빠르게 전환하려면 구체적인 코드 예제가 필요합니다. 최근 모바일 인터넷의 발전과 스마트폰의 대중화로 인해 미니 프로그램과 H5는 필수 애플리케이션 형태가 되었습니다. 크로스 플랫폼 개발 프레임워크인 uniapp은 코드 세트를 기반으로 작은 프로그램과 H5 간의 변환을 신속하게 실현하여 개발 효율성을 크게 향상시킬 수 있습니다. 이 기사에서는 uniapp이 미니 프로그램과 H5 간의 신속한 변환을 달성하는 방법을 소개하고 구체적인 코드 예제를 제공합니다. 1. 유니앱 유니아 소개

win1121h2 또는 22h2 중 어느 버전이 더 안정적입니까? win1121h2 또는 22h2 중 어느 버전이 더 안정적입니까? Jan 04, 2024 am 08:53 AM

win1121h2와 22h2의 두 버전을 비교해 보면 후자의 22h2가 더 안정적이고, 이전 21h2에 비해 기능이 더 많이 개선된 점을 살펴보겠습니다. win1121h2와 22h2 중 어느 것이 더 안정적입니까? 답변: win1121h2와 22h2를 비교하면 22h2가 더 안정적입니다. 22h2에는 많은 기능이 추가되었고, 21h2의 문제점도 22h2에서는 개선되었습니다. 22h2 업데이트 기능: 시작 메뉴의 응용 프로그램 폴더. 시작 메뉴에서 조정 가능한 고정 영역. 작업 표시줄에 끌어다 놓습니다. Focus Assist는 알림 센터와 통합되어 있습니다. 새로운 "스포트라이트" 배경화면 기능. 새로운

win101909와 21h2 중 어느 것이 더 좋나요? win101909와 21h2 중 어느 것이 더 좋나요? Dec 26, 2023 pm 02:01 PM

Windows 101909는 현재 가장 안정적이고 신뢰할 수 있는 버전 중 하나로 간주됩니다. 그러나 안타깝게도 이 버전에 대한 서비스 지원이 최근 종료되었습니다. 21H2는 비교적 안정적인 버전입니다. 사실 실제 상황에서 보면 둘 다 매우 좋은 선택입니다. win101909와 21h2 중 어느 것이 더 낫습니까? 답변: 1909가 더 안정적이고 21h2가 더 안전합니다. 현재 환경에서 1909는 여전히 일반적으로 가장 안정적이고 신뢰할 수 있는 버전 중 하나로 간주됩니다. 그러나 Win101909 버전은 2021년 5월 11일부로 공식적으로 서비스가 중단되었습니다. WindowsServer21h2는 대다수의 사용자에게 보다 전문적인 IT 기능 지원을 제공하기 위해 최선을 다하고 있습니다. 1. 많은 사용자들의 실제 테스트를 거쳐,

springboot 관리자 모니터링의 역할과 사용법은 무엇입니까 springboot 관리자 모니터링의 역할과 사용법은 무엇입니까 May 25, 2023 pm 06:52 PM

적용 가능한 시나리오: 1. 프로젝트 규모가 크지 않습니다. 2. 사용자 수가 그리 많지 않으며 동시성 요구 사항이 강력하지 않습니다. 3. 전담 운영 및 유지 관리 인력이 없습니다. 정규 프로젝트 또는 책임 분배가 명확하지 않은 단위. 종종 시스템은 요구 사항부터 설계, 개발, 테스트, 최종 출시, 운영 및 유지 관리까지 진행됩니다. 개발팀이 작업의 80%를 완료하는 경우가 많습니다. 따라서 개발자는 시스템 기능을 구현하는 것 외에도 고객에게 상담을 제공하고 질문에 답변하며 생산 문제를 해결해야 합니다. 애플리케이션이 시작된 후에는 모니터링 조치가 없다고 상상해 보십시오. 대시보드 없이 자동차를 운전하는 것과 마찬가지로 도로에서 이렇게 안전하다고 느끼는 사람은 아무도 없습니다. 단순성과 효율성의 균형을 맞추는 방법은 생각해 볼 가치가 있는 문제입니다. 1. 스프링브

win1123h2 또는 22h2 중 어느 것이 더 나은 선택입니까? win1123h2 또는 22h2 중 어느 것이 더 나은 선택입니까? Dec 28, 2023 pm 03:09 PM

Windows 11 시스템의 23h2 버전과 22h2 버전은 각각 2023년과 2022년에 출시될 예정입니다. 일반적으로 시스템 업데이트가 점점 좋아지고 있습니다. 편집자 역시 22h2 버전보다 23h2 버전이 더 좋다고 생각합니다. win1123h2와 22h2 중 어느 것이 더 낫습니까? 답변: win1123h2가 더 낫습니다. 보도에 따르면 win1123h2는 22h2에서 다음 버전까지의 누적 버전 업데이트이며, 모두 동일한 플랫폼이라고 합니다. 이는 두 버전 간에 호환성 문제가 없다는 것을 의미하며, 제때에 업데이트하는 것이 좋습니다. win1123h2 버전은 작업 표시줄 창 응용 프로그램의 병합 안 함 모드와 같은 많은 실용적인 기능을 제공합니다. 더있다

Win11 23H2 업데이트가 되지 않는 문제 해결 Win11 23H2 업데이트가 되지 않는 문제 해결 Jan 14, 2024 pm 09:24 PM

최근 Win11 23H2 버전을 모두 업데이트하고 싶어하지만 아직 업데이트 푸시 메시지를 받지 못한 사용자가 일부 있습니다. 백그라운드 업데이트 진행 중 프로세스가 멈춘 것일 수 있으며 잠시 후에는 괜찮을 것입니다. Win11 업데이트가 23H2를 가져오지 못한 경우 수행할 작업 방법 1: 인내심을 갖고 기다리십시오. 사용자가 컴퓨터의 업데이트 상태를 확인하고 중단된 것을 발견하면 잠시 기다리면 시스템이 계속 업데이트됩니다. 방법 2: 업데이트된 캐시를 삭제합니다. 사용자가 이전에 시스템을 업데이트하고 더 자세한 캐시를 삭제하지 않은 경우 23h2의 일반 업데이트에 영향을 미치게 됩니다. 수동으로 삭제할 수 있습니다. 방법 3: 이미지 설치 사용 Microsoft 공식 웹사이트로 이동하여 win1123h2 이미지 파일을 다운로드한 후 파일을 업데이트하는 것이 좋습니다.

이 파일을 변경하려면 관리자가 제공한 권한이 필요합니다. 이 문제를 해결하는 방법은 무엇입니까? 이 파일을 변경하려면 관리자가 제공한 권한이 필요합니다. 이 문제를 해결하는 방법은 무엇입니까? Jul 26, 2023 am 10:56 AM

이 파일을 변경하려면 관리자가 제공한 권한이 필요합니다. 해결 방법: 1. 로그인 인터페이스에서 관리자 계정을 선택하고 비밀번호를 입력한 후 파일을 원활하게 수정할 수 있습니다. 2. 파일을 마우스 오른쪽 버튼으로 클릭하고 선택할 수 있습니다. "관리자 권한으로" "다음 계정으로 실행" 방법; 3. 파일 권한을 수정하고, 파일을 마우스 오른쪽 버튼으로 클릭하고, "속성"을 선택하고, "보안" 탭을 클릭한 다음, "편집" 버튼을 클릭하고, 사용자 이름을 선택한 다음, "모든 권한" 옵션 4. 명령 프롬프트를 사용하여 문제를 해결합니다. 5. UA 권한을 설정합니다.

Flask-Admin을 사용하여 백그라운드 관리 인터페이스를 구현하는 방법 Flask-Admin을 사용하여 백그라운드 관리 인터페이스를 구현하는 방법 Aug 03, 2023 pm 11:30 PM

Flask-Admin을 사용하여 백엔드 관리 인터페이스를 구현하는 방법 배경 소개: 웹 사이트와 애플리케이션이 개발되면서 백엔드 관리 인터페이스가 점점 더 중요해지고 있습니다. 개발 과정에서 데이터, 사용자 및 기타 중요한 정보를 관리하기 위해 편리하고 빠른 백엔드 관리 인터페이스가 필요한 경우가 많습니다. Flask-Admin은 백그라운드 관리 인터페이스를 빠르게 구현하는 데 도움이 되는 강력하고 사용하기 쉬운 Flask 확장입니다. Flask-Admin은 Flask 및 SQLAlchemy를 기반으로 하는 오픈 소스 프로젝트입니다.

See all articles