一般2D的RPG人物移动有三种:

(一)背景固定,角色移动

(二)角色固定,背景移动

(三)角色移动,背景动态移动

第一种在移动端的游戏比较少见,但在PC端的模拟类游戏比较常见,因为屏幕较大,背景固定即可,角色在背景上移动;第二种在移动端比较多见,就是角色固定在屏幕中间,需要移动时只需要移动背景同时播放角色跑步的动画即可达到角色移动的效果;第三种是第一和第二种的结合,是如今最常见的方式,先是背景固定,角色自由移动,当移动到屏幕边缘时,背景移动来扩大角色的视野,或者,先是角色居中背景移动,当背景将要离开屏幕边缘时,角色再移动。

在这篇文章,我只说说第二种方式的实现思路,因为第一种十分简单没什么难度,而第三种又是第一第二种的结合,所以先掌握第二种,自然会了第一种,再两种结合即可写出。

假设有一个Bg类,这个类继承显示容器精灵egret.Sprite,这个类有一个公有成员stone石头,这个石头是阻碍物阻碍角色移动的。将这个Bg类实例化成一个bg变量。

假设有一个role显示对象,这个对象固定显示在屏幕中间。

因为我们是实现第二种移动方式,Bg这个背景需要移来移去,但是不是随便移的,需要点击背景某目标坐标时才移动,所以我们侦听一下点击事件,当点击背景某个坐标时,调用bgHandle函数。

<span style="font-size:18px;">    this.bg.addEventListener(egret.TouchEvent.TOUCH_TAP,  this.bgHandle,  this);</span>

bgHandle函数用来确定基于bg锚点的位置移动点坐标,定义bg_move_x为移动点横坐标,bg_move_y为移动点纵坐标,speed为背景速度速度,timeOnEnterFrame为移动过程的结束时间。

那么bg_move_x和bg_move_y怎么获取呢?首先获取点击背景的坐标evt.stageX和evt.stageY,然后计算横坐标evt.stageX、this.player.x和纵坐标evt.stageY、this.player.y的偏移值,通过这两个偏移值与当前背景位置this.bg.x和this.bg.y按相应移动方向计算出bg_move_x和bg_move_y即可。

获得bg移动点后,侦听帧事件,当背景未移动到移动点,不断调用bgMove函数。

    private bg_move_x:number = 0;   //背景移动位置private bg_move_y:number = 0;   //背景移动位置private speed:number = 0.3;    //角色移动速度private timeOnEnterFrame = 0;   //最后角色移动动画结束时间public bgHandle(evt:egret.TouchEvent):void{if(this.bg.hasEventListener(egret.Event.ENTER_FRAME) ){this.bg.removeEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);}this.timeOnEnterFrame = egret.getTimer();   //初始化最后角色移动动画结束时间if(evt.stageX > this.player.x){this.bg_move_x = this.bg.x - (evt.stageX - this.player.x);}else if(evt.stageX < this.player.x){this.bg_move_x = this.bg.x + (this.player.x - evt.stageX);}if(evt.stageY > this.player.y){this.bg_move_y = this.bg.y - (evt.stageY - this.player.y);}else if(evt.stageY < this.player.y){this.bg_move_y = this.bg.y + (this.player.y - evt.stageY);}this.bg.addEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);}

bgMove函数根据bg_move_x和bg_move_y的值作背景移动,每次背景只移动【speed * (每次帧事件的开始时间 - 结束时间)】像素,直到到达目的地才取消移动帧事件。当玩家突然点击背景另一个坐标时,bgHandle函数会取消帧事件,重新计算bg_move_x和bg_move_y然后再重新侦听移动帧事件来调用bgMove函数。

    private bgMove(evt:egret.Event):void{var now = egret.getTimer();var pass = this.timeOnEnterFrame;var time = now - pass;if(this.bg.x > this.bg_move_x){if((this.bg.x - this.speed * time) < this.bg_move_x ){this.bg.x = this.bg_move_x;}else{this.bg.x -= this.speed * time;if(this.isStopMove()){this.bg.x += this.speed * time;}}}else if(this.bg.x < this.bg_move_x){if((this.bg.x + this.speed * time) > this.bg_move_x ){this.bg.x = this.bg_move_x;}else{this.bg.x += this.speed * time;if(this.isStopMove()){this.bg.x -= this.speed * time;}}}if(this.bg.y > this.bg_move_y){if((this.bg.y - this.speed * time) < this.bg_move_y ){this.bg.y = this.bg_move_y;}else{this.bg.y -= this.speed * time;if(this.isStopMove()){this.bg.y += this.speed * time;}}}else if(this.bg.y < this.bg_move_y){if((this.bg.y + this.speed * time) >this.bg_move_y ){this.bg.y = this.bg_move_y;}else{this.bg.y += this.speed * time;if(this.isStopMove()){this.bg.y -= this.speed * time;}}}this.timeOnEnterFrame = egret.getTimer();if(this.bg.x == this.bg_move_x && this.bg.y == this.bg_move_y){this.bg.removeEventListener(egret.Event.ENTER_FRAME,this.bgMove,this);}}

在bgMove函数中,有一个函数isStopMove(),这个函数用来判断角色是否碰撞到背景里的石头障碍物,如果碰到返回true,bgMove()根据返回值来判断背景是否移动。

    private isStopMove():boolean{if( this.bg.stone.hitTestPoint( this.player.x, this.player.y, true ) ){return true;}else{return false;}}

这几段代码就是基于egret游戏引擎的RPG背景移动模拟角色移动的思路,其实代码还能做优化得更加精简,但是精简也会变得难以看懂,所以这长长的代码耐心看还是没什么难度的(前提是学过egret引擎)。

2D的RPG游戏人物角色移动代码(以egret游戏引擎、TypeScript语言为例)相关推荐

  1. 猜牌游戏的python代码_python打牌游戏的发牌程序

    定义牌的类 class Card(): """ A Playing Card """ ranks=["A"," ...

  2. 简单的hangman游戏,完全代码

    简单的hangman游戏,完全代码 其实这个游戏还是学堂在线的一个作业,花了两个小时干掉了它,也不算太有技术含量的问题 # -*- coding: utf-8 -*- ""&quo ...

  3. 【猜数字】游戏(C代码)

    [猜数字]游戏的设计与实现 一.前言 二.游戏的设计思路 三.游戏的具体实现步骤 1.游戏框架的具体实现 游戏框架的代码实现 2.游戏接口的具体实现 game()函数的代码实现 四.原码 五.恶搞版猜 ...

  4. vivo 游戏中心低代码平台的提效秘诀

    作者:vivo 互联网服务器团队- Chen Wenyang 本文根据陈文洋老师在"2022 vivo开发者大会"现场演讲内容整理而成.公众号回复[2022 VDC]获取互联网技术 ...

  5. RPG单机游戏,C++代码制作圣剑英雄传!「源程序+开发文档」

    模仿圣剑英雄传制作一个完全一模一样的 RPG 游戏,之所以是完全模仿,那是因为楼主对游戏编程不太熟悉,在项目的最开始,与其什么东西都自己去摸索,不如直接模仿别人的思路,然后自己照着实现一遍,哪怕照抄也 ...

  6. 适用于Apple Watch的Game Boy模拟器,RPG Maker进入Linux,以及更多游戏新闻

    在这个为期两周的开放游戏综述中,我们了解了适用于Apple Watch的Game Boy模拟器,适用于Linux的RPG Maker,切换到Vulkan的Star Citizen,以及更多开放游戏新闻 ...

  7. 2d手机游戏开发_我的手机游戏如何在2周内获得365K应用商店下载(以及为什么我退出独立游戏开发公司…...

    2d手机游戏开发 by William Kwan 关冠伟 我的手机游戏如何在2周内获得365K应用商店下载(以及为什么以后我退出独立游戏开发者) (How My Mobile Game Got 365 ...

  8. Cocos creator实现《滑雪趣挑战》滑雪小游戏资源及代码

    Cocos creator实现<滑雪趣挑战>滑雪小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,上线了两个微信小游戏,刚刚入门,这 ...

  9. Cocos creator实现飞机大战空中大战《战击长空》小游戏资源及代码

    Cocos creator实现飞机大战空中大战小游戏资源及代码 最近在学习Cocos Creator,作为新手,刚刚开始学习Cocos Creator,刚刚入门,这里记录一下飞机大战小游戏实现.搜索微 ...

最新文章

  1. LinkQueue的基本创建
  2. CSS元素的基本应用(附加京东面试题)
  3. DevOps 的发展史
  4. 16进制颜色识别和搭配规律
  5. 圣诞节海报设计需要的手写字体素材
  6. 虚拟桌面之往事如风 --读书篇
  7. hdu 2222 Keywords Search ac自己主动机
  8. post url 后面跟参数_都2019年了,还问GET和POST的区别
  9. 安全测试工具之-Burpsuite
  10. Raki的读paper小记:Model Zoo: A Growing “Brain” That Learns Continually
  11. 【项目介绍】单发动机驱动的多旋翼飞行器及其控制系统
  12. html多重阴影,求问:CSS3多重阴影效果实现的问题。为什么没有任何的效果,怎么改颜色都没用。...
  13. BCH5月硬分叉,如果做成了支付,会超越BTC吗?
  14. 微信支付整理 (微信公众号支付)
  15. NANK南卡降噪耳机和OPPO蓝牙耳机哪个更好呢?哪款更能打?
  16. 详解UniSwap、无聊猿、PlatoFarm空投的逻辑
  17. 十二生肖出生时间看你一生荣辱
  18. 关于新浪微信瘦身的问题
  19. vue2和vue3 面试题
  20. 抖音测试像哪个明星的软件,抖音中的测测你像哪位明星特效如何拍摄

热门文章

  1. 小型bbs论坛系统开发2 模板页首页制作
  2. [荐]日本官方公布听力网址大全
  3. socket5代理 客户端代码
  4. Python实现XSS扫描
  5. UNI-APP开发之HbuilderX连接到夜神模拟机运行
  6. python pip安装失败红字_Perl入门(一)Perl的基本类型及运算符
  7. OpenStack详解(T版)
  8. web开发工具(ColorPic,HttpWatch,IEDevToolBar)
  9. SAP-MM-收发货与移动类型(个人笔记)
  10. C++挑苹果,PTA7-1