찾다
웹 프론트엔드H5 튜토리얼html5游戏开发-零基础开发RPG游戏-开源讲座(二)-跑起来吧英雄

上一篇中,已经详细讲解了,如何添加地图,以及添加了一个游戏人物,现在我们来添加控制事件,让这个小英雄走动起来

了解上一篇内容请看这里

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

http://www.html5cn.org/article-1737-1.html

0_1323875534sUfb (1).gif



我们已经给游戏人物建立了一个Character类,

现在先来在类里加入
  1. Character.prototype.changeDir = function (dir){
  2. };
  3. /**
  4. * 设定人物坐标
  5. * @param x方向坐标,y方向坐标
  6. **/
  7. Character.prototype.setCoordinate = function (sx,sy){
  8. };
  9. /**
  10. * 获取人物坐标
  11. **/
  12. Character.prototype.getCoordinate = function (){
  13. };
复制代码

changeDir 这个方法用来从外部控制人物方向和移动

要控制游戏的人物,首先,我们要由控制事件,当触发这个事件的时候,就来调用相应的方法,做我们想要的做的处理setCoordinate和getCoordinate是设定和得到人物当前的坐标

首先,为了适应智能手机,我们暂时不用键盘事件,而是用点击事件,所以我们先来添加两个控制按钮,在Main.js的gameInit方法的最下方,添加如下代码
  1. //添加控制按钮
  2.         bitmapdata = new LBitmapData(imglist["e1"]);
  3.         bitmap = new LBitmap(bitmapdata);
  4.         bitmap.x = 0;
  5.         bitmap.y = 0;
  6.         ctrlLayer.addChild(bitmap);
  7.         bitmapdata = new LBitmapData(imglist["e2"]);
  8.         bitmap = new LBitmap(bitmapdata);
  9.         bitmap.x = 280;
  10.         bitmap.y = 30;
  11.         ctrlLayer.addChild(bitmap);
  12.         ctrlLayer.x = 40;
  13.         ctrlLayer.y = 180;
复制代码

运行代码,得到预览如下

0_1323996441iWWB.gif



在添加控制事件之前,为了实现控制方便,我们先来添加几个变量
  1. //方向变量
  2. var DOWN = 0;
  3. var LEFT = 1;
  4. var RIGHT = 2;
  5. var UP = 3;
  6. var STEP = 32;
  7. //点击状态
  8. var isKeyDown = false;
复制代码

STEP代表移动步长,因为地图是有32*32的小图片来组成的,所以我们设定人物移动的步长为32
方向变量的0,1,2,3分别对应下面图片中的第1,2,3,4行的方向

0_1323998361U1vb.gif



之所以添加点击状态,是因为,当我们按下移动按钮没有抬起的时候,人物应该始终处于移动状态,所以用这个变量来区分,我们是否按下或者抬起好了,做好了准备工作,现在就开始添加移动事件
  1. //添加点击控制事件
  2.         backLayer.addEventListener(LMouseEvent.MOUSE_DOWN,ondown);
  3.         backLayer.addEventListener(LMouseEvent.MOUSE_UP,onup);

  4. function ondown(event){
  5.         //根据点击位置,判断移动方向
  6.         if(event.offsetX >= ctrlLayer.x + 40 && event.offsetX
  7.                 if(event.offsetY >= ctrlLayer.y && event.offsetY
  8.                         player.changeDir(UP);
  9.                 }else if(event.offsetY >= ctrlLayer.y+80 && event.offsetY
  10.                         player.changeDir(DOWN);
  11.                 }
  12.         }else if(event.offsetX >= ctrlLayer.x && event.offsetX
  13.                 if(event.offsetY >= ctrlLayer.y +40 && event.offsetY
  14.                         player.changeDir(LEFT);
  15.                 }
  16.         }else if(event.offsetX >= ctrlLayer.x+80 && event.offsetX
  17.                 if(event.offsetY >= ctrlLayer.y +40 && event.offsetY
  18.                         player.changeDir(RIGHT);
  19.                 }
  20.         }
  21.         isKeyDown = true;
  22. }
  23. function onup(event){
  24.         isKeyDown = false;
  25. }
复制代码

这里需要知道的是,在智能手机里,其实点击事件是TOUCH_START,TOUCH_MOVE,TOUCH_END事件

使用legendForHtml5Programming库件的时候,只需要添加MOUSE_DOWN,MOUSE_MOVE,MOUSE_UP事件,然后库件会自动判断是加载TOUCH事件还是MOUSE事件

在ondown方法中,我们将isKeyDown的状态变为true,表示我们正处于按下状态

然后,根据我们点击的位置,来调用Character类的changeDir方法,并且传入点击的方向

有了控制事件,现在的关键就在于changeDir方法,只要根据传进来的值,来实现移动就可以了

我们试想,如果每次移动一个步长的话,那么人物就会由一个小方格跳到令一个方格,而我们需要的是,让它缓慢的移动到下一个方格,有一个移动的过程

为了实现这个过程,我们在移动的时候不是让人物的坐标马上就改变,而是改变人物的状态,由静止到移动,然后处于移动状态的时候,再让人物一小步一小步的移动到目标点

修改Character类的构造器,如下
  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.         self.anime.y -= 16;
  15.         //设定不移动
  16.         self.move = false;
  17.         //在一个移动步长中的移动次数设定
  18.         self.moveIndex = 0;
  19. };
复制代码

调整人物位置是因为,人物的图片分割后,每个动作的大小为32*48,而地图每个小格的大小是32*32,然后设定人物状态为不移动,然后修改changeDir 方法
  1. /**
  2. * 改变人物方向
  3. **/
  4. Character.prototype.changeDir = function (dir){
  5.         var self = this;
  6.         //如果正在移动,则无效
  7.         if(!self.move){
  8.                 //设定人物方向
  9.                 self.direction = dir;
  10.                 //设定图片动画
  11.                 self.anime.setAction(dir);
  12.                 //开始移动
  13.                 self.move = true;
  14.                 self.moveIndex = 0;
  15.         }
  16. };
复制代码

这里要简单说明一下LAnimation类的setAction方法,setAction(rowindex,colindex)方法有两个参数,LAnimation里传进来的图片数组是一个二维数组,这两个参数分别可以改变目前显示的图片的动作,当然,也可以只传其中一个参数

我这次是将4*4的人物动作图片分割为4*4的二维数组传给了LAnimation类,所以现在每一行图片代表一个方向

人物状态设置为移动后,就应该在循环事件里开始一步步的移动了
  1. /**
  2. * 循环事件
  3. **/
  4. Character.prototype.onframe = function (){
  5.         var self = this;
  6.         //人物动作速度控制
  7.         if(self.speedIndex++
  8.         self.speedIndex = 0;
  9.         //当人物可移动,则开始移动
  10.         if(self.move)self.onmove();
  11.         //人物动画播放
  12.         self.anime.onframe();
  13. };
  14. /**
  15. * 开始移动
  16. **/
  17. Character.prototype.onmove = function (){
  18.         var self = this;
  19.         //设定一个移动步长中的移动次数
  20.         var ml_cnt = 4;
  21.         //计算一次移动的长度
  22.         var ml = STEP/ml_cnt;
  23.         //根据移动方向,开始移动
  24.         switch (self.direction){
  25.                 case UP:
  26.                         self.y -= ml;
  27.                         break;
  28.                 case LEFT:
  29.                         self.x -= ml;
  30.                         break;
  31.                 case RIGHT:
  32.                         self.x += ml;
  33.                         break;
  34.                 case DOWN:
  35.                         self.y += ml;
  36.                         break;
  37.         }
  38.         self.moveIndex++;
  39.         //当移动次数等于设定的次数,开始判断是否继续移动
  40.         if(self.moveIndex >= ml_cnt){
  41.                 self.moveIndex = 0;
  42.                 //如果已经松开移动键,则停止移动,否则继续移动
  43.                 if(!isKeyDown){
  44.                         self.move = false;
  45.                         return;
  46.                 }
  47.         }
  48. };
复制代码

这里,我选择了让人物每个步长分四次进行移动,这样就实现了缓慢移动的效果,运行程序,点击画面中的方向键,看到了把,人物已经可以开始移动了,而且是缓慢的移动

1010.gif



但是,光这样还是不行,我们发现,人物是可以移动了,但是他现在是超人,飞檐走壁无所不入,移动的畅通无阻

这就需要我们在移动过程中,加入移动判断,看看是否可以移动,

为了实现这个判断,我们必须要知道地图什么地方可以移动,什么地方不可以移动
所以,我们需要一个地图的地形,如下
  1. //地图地形数组
  2. var mapdata = [
  3. [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
  4. [1,1,1,0,0,0,0,0,0,0,0,0,1,1,1],
  5. [1,1,0,0,0,0,1,1,0,0,0,0,1,1,1],
  6. [1,0,0,0,1,1,1,1,1,0,0,1,1,0,1],
  7. [1,0,0,1,1,1,1,1,1,1,0,1,1,0,1],
  8. [1,0,0,1,1,1,0,1,1,1,1,1,0,0,1],
  9. [1,0,0,0,0,0,0,0,1,1,1,1,0,0,1],
  10. [1,1,0,0,0,0,0,0,0,1,1,0,0,0,1],
  11. [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1],
  12. [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
  13. ];
复制代码

地形数组中,0代表可以移动,1代表障碍物,是不可移动的,接下来,给Character类添加判断方法
  1. /**
  2. * 障碍物判断
  3. * @param 判断方向
  4. **/
  5. Character.prototype.checkRoad = function (dir){
  6.         var self = this;
  7.         var tox,toy,myCoordinate;
  8.         //当判断方向为空的时候,默认当前方向
  9.         if(dir==null)dir=self.direction;
  10.         //获取人物坐标
  11.         myCoordinate = self.getCoordinate();
  12.         //开始计算移动目的地的坐标
  13.         switch (dir){
  14.                 case UP:
  15.                         tox = myCoordinate.x;
  16.                         toy = myCoordinate.y - 1;
  17.                         break;
  18.                 case LEFT:
  19.                         tox = myCoordinate.x - 1;
  20.                         toy = myCoordinate.y ;
  21.                         break;
  22.                 case RIGHT:
  23.                         tox = myCoordinate.x + 1;
  24.                         toy = myCoordinate.y;
  25.                         break;
  26.                 case DOWN:
  27.                         tox = myCoordinate.x;
  28.                         toy = myCoordinate.y + 1;
  29.                         break;
  30.         }
  31.         //如果移动的范围超过地图的范围,则不可移动
  32.         if(tox
  33.         if(toy >= mapdata.length || tox >= mapdata[0].length)return false;
  34.         //如果目的地为障碍,则不可移动
  35.         if(mapdata[toy][tox] == 1)return false;
  36.         return true;
  37. };
复制代码

然后,在changeDir方法,和onmove方法中,添加相应的判断,如下
  1. /**
  2. * 开始移动
  3. **/
  4. Character.prototype.onmove = function (){
  5.         var self = this;
  6.         //设定一个移动步长中的移动次数
  7.         var ml_cnt = 4;
  8.         //计算一次移动的长度
  9.         var ml = STEP/ml_cnt;
  10.         //根据移动方向,开始移动
  11.         switch (self.direction){
  12.                 case UP:
  13.                         self.y -= ml;
  14.                         break;
  15.                 case LEFT:
  16.                         self.x -= ml;
  17.                         break;
  18.                 case RIGHT:
  19.                         self.x += ml;
  20.                         break;
  21.                 case DOWN:
  22.                         self.y += ml;
  23.                         break;
  24.         }
  25.         self.moveIndex++;
  26.         //当移动次数等于设定的次数,开始判断是否继续移动
  27.         if(self.moveIndex >= ml_cnt){
  28.                 self.moveIndex = 0;
  29.                 //如果已经松开移动键,或者前方为障碍物,则停止移动,否则继续移动
  30.                 if(!isKeyDown || !self.checkRoad()){
  31.                         self.move = false;
  32.                         return;
  33.                 }
  34.         }
  35. };
  36. /**
  37. * 改变人物方向,并判断是否可移动
  38. **/
  39. Character.prototype.changeDir = function (dir){
  40.         var self = this;
  41.         //如果正在移动,则无效
  42.         if(!self.move){
  43.                 //设定人物方向
  44.                 self.direction = dir;
  45.                 //设定图片动画
  46.                 self.anime.setAction(dir);
  47.                 //判断是否可移动
  48.                 if(!self.checkRoad(dir))return;
  49.                 //如果可以移动,则开始移动
  50.                 self.move = true;
  51.                 self.moveIndex = 0;
  52.         }
  53. };
复制代码

好了,大功告成,开始运行吧


测试URL如下
http://fsanguo.comoj.com/html5/rpg/index.html

这次的源代码下载

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




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

html5hassignificallytransformedwebdevelopmentbyintranticalticlementements, 향상 Multimediasupport 및 Improvingperformance.1) itmadewebsitessmoreaccessibleadseo 친환경적 인 요소, 및 .2) Html5intagnatee

H5 코드 : 접근성 및 시맨틱 HTMLH5 코드 : 접근성 및 시맨틱 HTMLApr 09, 2025 am 12:05 AM

H5는 시맨틱 요소 및 ARIA 속성을 통해 웹 페이지 접근성 및 SEO 효과를 향상시킵니다. 1. 컨텐츠 구조를 구성하고 SEO를 개선하기 위해 사용합니다. 2. Aria-Label과 같은 ARIA 속성은 접근성을 향상시키고 보조 기술 사용자는 웹 페이지를 원활하게 사용할 수 있습니다.

H5는 html5와 동일합니까?H5는 html5와 동일합니까?Apr 08, 2025 am 12:16 AM

"H5"와 "HTML5"는 대부분의 경우 동일하지만 특정 시나리오에서는 다른 의미를 가질 수 있습니다. "HTML5"는 새로운 태그와 API를 포함하는 W3C 정의 표준입니다. "H5"는 일반적으로 HTML5의 약어이지만 모바일 개발에서는 HTML5를 기반으로 한 프레임 워크를 참조 할 수 있습니다. 이러한 차이를 이해하면 프로젝트 에서이 용어를 정확하게 사용하는 데 도움이됩니다.

H5의 기능은 무엇입니까?H5의 기능은 무엇입니까?Apr 07, 2025 am 12:10 AM

H5 또는 HTML5는 HTML의 다섯 번째 버전입니다. 개발자에게 더 강력한 도구 세트를 제공하여 복잡한 웹 애플리케이션을보다 쉽게 ​​만들 수 있습니다. H5의 핵심 기능에는 다음이 포함됩니다. 1) 웹 페이지에 그래픽 및 애니메이션을 그리는 요소; 2) 웹 페이지 구조를 SEO 최적화에 명확하고 도움이되는 시맨틱 태그 등; 3) GeolocationApi 지원 위치 기반 서비스와 같은 새로운 API; 4) 호환성 테스트 및 폴리 필 라이브러리를 통해 크로스 브라우저 호환성을 보장해야합니다.

H5 링크를 수행하는 방법H5 링크를 수행하는 방법Apr 06, 2025 pm 12:39 PM

H5 링크를 만드는 방법? 링크 대상 결정 : H5 페이지 또는 응용 프로그램의 URL을 가져옵니다. HTML 앵커 작성 : & lt; a & gt; 태그 앵커를 만들고 링크 대상 URL을 지정합니다. 링크 속성 설정 (선택 사항) : 필요에 따라 대상, 제목 및 on 클릭 속성을 설정하십시오. 웹 페이지에 추가 : 링크가 나타나려는 웹 페이지에 HTML 앵커 코드를 추가하십시오.

H5 호환성 문제를 해결하는 방법H5 호환성 문제를 해결하는 방법Apr 06, 2025 pm 12:36 PM

H5 호환성 문제에 대한 솔루션에는 다음이 포함됩니다. 웹 페이지가 화면 크기에 따라 레이아웃을 조정할 수있는 반응 형 디자인을 사용합니다. 릴리스 전에 호환성을 테스트하기 위해 브라우저 크로스 브라우저 테스트 도구를 사용하십시오. PolyFill을 사용하여 이전 브라우저의 새로운 API를 지원합니다. 웹 표준을 따르고 효과적인 코드 및 모범 사례를 사용하십시오. CSS 프리 프로세서를 사용하여 CSS 코드를 단순화하고 가독성을 향상시킵니다. 이미지를 최적화하고 웹 페이지 크기를 줄이며로드 속도를 높이십시오. HTTPS를 통해 웹 사이트의 보안을 보장하십시오.

H5와 링크를 생성하는 방법H5와 링크를 생성하는 방법Apr 06, 2025 pm 12:33 PM

H5 페이지는 링크를 수동으로 만들거나 짧은 링크 서비스를 사용하는 두 가지 방식으로 링크를 생성 할 수 있습니다. 수동으로 생성하면 H5 페이지의 URL을 복사하면됩니다. 짧은 링크 서비스를 통해 URL을 서비스에 붙여 넣은 다음 단축 된 URL을 가져와야합니다.

H5 공유 페이지를 수행하는 방법H5 공유 페이지를 수행하는 방법Apr 06, 2025 pm 12:30 PM

참여를 높이고 리드를 생성하며 브랜드 인지도를 높이기 위해 매력적인 H5 공유 페이지를 만드는 것이 중요합니다. 단계에는 대상 고객 식별, 매력적인 비주얼 설계, 매력적인 컨텐츠 작성, 대화 형 요소 추가, 소셜 미디어 공유 최적화, 테스트 및 개선이 포함됩니다.

See all articles

핫 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 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

PhpStorm 맥 버전

PhpStorm 맥 버전

최신(2018.2.1) 전문 PHP 통합 개발 도구

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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