一起来学习用nodejs和CocosCreator开发网络游戏吧(四)--- 可操纵的游戏角色(上)

游戏不可或缺的一个内容就是操作,尤其是对于RPG类型的游戏来讲。所以,对于websocket来说,能够实时体现数据交互的一个重要方法就是可操纵游戏角色在场景中的状态变化,能够让所有连接到服务器的客户端都能够看得到。

这次就先做一个能操作角色的场景吧。

首先,给聊天窗口加一个按钮,可以用来隐藏聊天界面(调整了一下大小,所以加个按钮控制界面以免影响操作)。

加一个UILayout,用来承载所有UI界面上的内容,然后把ChatLayout放到UILayout上,接下来把ChatLayout移出到界面外面,默认一开始为隐藏状态。然后在左下角添加一个button。

然后在代码脚本处,创建一个UIComponent,用来存放所有的UI相关的组件,并创建一个UIController,用来处理对UI层的操作。

在UIController中挂载聊天窗和按钮:

properties: {        isShowChatLayout: false,        chatLayout: {
            type: cc.Node,
            default: null
        },
        chatLayoutControlBtnLabel: {
            type: cc.Label,
            default: null
        }
    },

添加按钮的事件函数:

    chatLayoutControlBtn() {
        if(this.isShowChatLayout) {
            let move = cc.moveBy(0.5, cc.v2(-this.chatLayout.width, 0));
            this.chatLayout.runAction(move);
            this.chatLayoutControlBtnLabel.string = "显";
        }else {
            let move = cc.moveBy(0.5, cc.v2(this.chatLayout.width, 0));
            this.chatLayout.runAction(move);
            this.chatLayoutControlBtnLabel.string = "隐";
        }
        this.isShowChatLayout = !this.isShowChatLayout;
    }

在这里,用一个moveBy函数来驱动聊天窗口的隐藏和显示动画。

好了,UI层就处理完了。接下来,创建一个游戏场景。

这里我所使用的素材来源于《东方绯想天》的来自东方系列的格斗同人作品(没错我也算是半个东方厨)。

具体的拼场景就是一个体力活了,大家喜欢什么就按照自己手头的素材来整,毕竟为爱做游戏嘛。

在Canvas中新建一个Background的节点,用来布局背景。

运行一下看一眼

看起来还不错的样子,嗯!

然后创建一个游戏角色层RolePlayer,放一个角色进去。(这里使用的人物动作文件,是用龙骨编辑器制作的,有兴趣的话可以自己去研究一下,这里就不多做介绍了)

龙骨动画一共有三个文件,一个是骨骼动画数据 name_ske.json,一个是切图数据 name_tex.json,一个是贴图 name_tex.png。

将name_ske当做节点拖入到场景中,然后把贴图数据拖入到组件栏里,还需要选中默认骨骼和默认动作。

运行一下, 就有了女仆长站在场景中的画面了。

接下来制作一个虚拟摇杆,用来以后控制女仆长在场景中行走。

首先创建一个游戏控制层,ControllerLayer,尺寸填满Canvas。然后在其内部创建一个JoyStick。我的设计时摇杆在手机左边屏幕指定区域内,当手指触碰到屏幕,就在触碰点显示摇杆并操作。所以这个JoyStick给他一个尺寸960 * 800,并左下角对齐到Controller。

然后把准备好的摇杆素材,拖入到JoyStick中

然后,添加一个新的摇杆脚本JoyStick.js

因为摇杆由两部分组成,一个是摇杆背景,一个是摇杆,所以在这里需要两个挂载两个节点

    properties: {
        joyStickBG: {
            type: cc.Node,
            default: null
        },
        joyStickBar: {
            type: cc.Node,
            default: null
        }
    },

我们先创建一个公共的工具类Common/Tools.js,因为摇杆操作需要用到一些几何计算,所以抽出公共方法便于通用。

class Tools {

    //计算弧度
    getRadian(point) {
        let radian = Math.atan2(point.y, point.x) ;
        return radian ;
    }

    //计算两点间距离
    getDistance(pos1, pos2) {
        let x = pos1.x - pos2.x ;
        let y = pos1.y - pos2.y ;
        return Math.sqrt(x * x + y * y) ;
    }

}

export default new Tools() ;

然后去编写对摇杆操作的代码。回到JoyStick.js中,引入工具类。

import Tools from "../Common/Tools";
    onLoad () {
        //初始化时候,隐藏摇杆
        this.joyStickBG.active = false ;
        this.joyStickBar.active = false ;

        //初始化摇杆触摸状态,以及摇杆初始坐标,和摇杆与摇杆中心距离。
        this._joyStart = false ;
        this._joyStartPos = null ;
        this._radian = -100 ;

        //给这个节点添加触摸事件,此为触摸屏幕开始
        this.node.on(
            ‘touchstart‘,
            (event) => {
                //激活摇杆操作,并显示摇杆和背景
                this._joyStart = true ;
                this.joyStickBG.active = true ;
                this.joyStickBar.active = true ;

                //根据触屏位置,设置摇杆位置
                this._joyStartPos = this.node.convertToNodeSpaceAR(event.getLocation()) ;
                this.joyStickBG.setPosition(this._joyStartPos) ;
                this.joyStickBar.setPosition(this._joyStartPos) ;
            }
        ) ;

        //给这个节点添加触摸事件,此为鼠标点击屏幕开始
        this.node.on(
            ‘mousedown‘, (event) => {
                this._joyStart = true ;
                this.joyStickBG.active = true ;
                this.joyStickBar.active = true ;

                this._joyStartPos = this.node.convertToNodeSpaceAR(event.getLocation()) ;
                this.joyStickBG.setPosition(this._joyStartPos) ;
                this.joyStickBar.setPosition(this._joyStartPos) ;
            }
        ) ;

        //手指在屏幕移动的监听
        this.node.on(‘touchmove‘, (event) => {
            if(this._joyStart) {

                //将手指触摸到界面的坐标,转换到摇杆背景上,用来计算摇杆的移动位置
                let pos = this.joyStickBG.convertToNodeSpaceAR(event.getLocation()) ;
                let radian = this._radian = Tools.getRadian(pos) ;

                //将摇杆和背景中心点,最远距离设为50像素,这样手指移动的较远的话,摇杆也不会超出摇杆背景
                if(Tools.getDistance(cc.v2(0, 0), pos) <= 50) {
                    pos.x += this._joyStartPos.x ;
                    pos.y += this._joyStartPos.y ;

                }else {
                    //手指超出摇杆背景了,就需要用三角函数来计算对应的没有超出背景的坐标,来设置摇杆的位置
                    pos.x = this._joyStartPos.x + Math.cos(radian) * 50 ;
                    pos.y = this._joyStartPos.y + Math.sin(radian) * 50 ;
                }
                this.joyStickBar.setPosition(pos) ;
            }
        }) ;

        //监听鼠标用的
        this.node.on(‘mousemove‘, (event) => {
            if(this._joyStart) {

                let pos = this.joyStickBG.convertToNodeSpaceAR(event.getLocation()) ;
                let radian = this._radian = Tools.getRadian(pos) ;

                //console.log(‘mouse radian : ‘ + radian) ;

                if(Tools.getDistance(cc.v2(0, 0), pos) <= 50) {
                    pos.x += this._joyStartPos.x ;
                    pos.y += this._joyStartPos.y ;

                }else {
                    pos.x = this._joyStartPos.x + Math.cos(radian) * 50 ;
                    pos.y = this._joyStartPos.y + Math.sin(radian) * 50 ;
                }
                this.joyStickBar.setPosition(pos) ;
            }
        }) ;

        //离开屏幕,隐藏摇杆并设置初始值。
        this.node.on(‘touchend‘, (event) => {
            if(this._joyStart) {
                this._joyStart = false ;
                this.joyStickBG.active = false ;
                this.joyStickBar.active = false ;

                this._radian = -100 ;
            }
        }) ;

        this.node.on(‘mouseup‘, (event) => {
            if(this._joyStart) {
                this._joyStart = false ;
                this.joyStickBG.active = false ;
                this.joyStickBar.active = false ;

                this._radian = -100 ;
            }
        }) ;

        //手指滑动超出了摇杆的控制区域,视同手指离开屏幕
        this.node.on(‘touchcancel‘, (event) => {
            if(this._joyStart) {
                this._joyStart = false ;
                this.joyStickBG.active = false ;
                this.joyStickBar.active = false ;

                this._radian = -100 ;
            }
        }) ;

        this.node.on(‘mouseleave‘, (event) => {
            if(this._joyStart) {
                this._joyStart = false ;
                this.joyStickBG.active = false ;
                this.joyStickBar.active = false ;

                this._radian = -100 ;
            }
        }) ;
    },

具体的功能代码中注释也有了说明,这里就不再说了。

然后我们操作摇杆,就可以看到摇杆已经能够按照我们的操作正确表现了。

本次文章先到这里,在下一次中,我们将摇杆操作和控制人物结合在一起。

文章中的代码:

客户端: https://github.com/MythosMa/CocosCreator_ClientTest.git

服务端: https://github.com/MythosMa/NodeJS_GameServerTest.git

原文地址:https://www.cnblogs.com/mythosma/p/12034954.html

时间: 2024-10-13 04:28:09

一起来学习用nodejs和CocosCreator开发网络游戏吧(四)--- 可操纵的游戏角色(上)的相关文章

一起来学习用nodejs和CocosCreator开发网络游戏吧(六)--- 可操纵的游戏角色(下)

其实用了很长时间思考了一下一些数据运算方面放在哪里合适.当然,数值方面的运算肯定要放在服务端是正确的,本地的数值计算就会有被修改器修改.数据传输中抓包改包等作弊.外挂的问题存在,不过对于我这个小项目目前开发阶段来说,只涉及到对游戏角色移动操控这块. 在我自己所接触过的网游中,确实存在两种方式来处理角色移动数据,一个是发出操作指令,然后服务器根据操作指令计算出移动坐标再返给客户端处理,一个是本地计算移动距离,再将数据交付给服务器.这两种情况在游戏掉线的时候就能有很明显的感觉,前者掉线后,角色就无法

一起来学习用nodejs和CocosCreator开发网络游戏吧(五)--- 云服务器的搭建

为了学习websocket和CocosCreator结合开发游戏,把服务器运行在本地始终感觉缺少点什么,而且不能真正多端测试通信,于是趁着腾讯云年底促销(真的不是在打广告),99块钱一年,买了一台CentOS主机,把学习项目的服务器部署在这台云服务器上,也体验一把真正意义上的网络游戏. 因为没有任何经验,在这里记录一下整个安装部署流程,以免日后使用又忘记了. 购买好自己的服务器后,登录是需要密码的.因为不知道创建好的服务器登录密码,首先需要更改一下登录密码. 在实例=>更多=>密码/密钥=&g

spring mvc开发入门实例demo源代码下载,很适合新手入门学习用。

原文:spring mvc开发入门实例demo源代码下载,很适合新手入门学习用. 源代码下载:http://www.zuidaima.com/share/1550463469046784.htm Eclipse + Maven + Spring MVC - Simple Example 源代码框架截图:

学习用CMake来编写Qt程序

最近开始学习CMake,因为项目需求需要用到Qt,自带的qmake会出现许多问题(比如文件修改之后有时候qmake不会侦测到不会重新编译,需要手动去编译等),于是开始尝试使用CMake来编写Qt程序,顺便学习一下怎么用CMake来使用find_package,也算给自己一次学习的机会. 切入正题,CMake对于一些有名的库都有自带文件夹中Modules里.cmake文件查询的支持,比如你需要编写Qt程序,你就可以去cmake_dir/Moudles/查找 FindQt4.cmake这个文件,里面

学习用5W1H来管理自己的项目/工作

学习用5W1H来管理自己的项目/工作 ? 最近开始需要系统化的思维模型,这只是一个开始,一下用脑图的形式来简介5W1H的具体内容: 先写xmind思维树的文本导出,后面附上图片.^ _ ^ 5W1H ????WHAT? ????????首先定义是什么? ????????5W1H分析法是一种分析问题的方法,在解决问题时可以得到广泛的应用 ????????内容包括What?.where?.when?.who?.why?.how? ????WHERE? ????????用在哪里? ????????管理

从零开始学ios开发(十四):Navigation Controllers and Table Views(上)

这一篇我们将学习一个新的控件Navigation Controller,很多时候Navigation Controller是和Table View紧密结合在一起的,因此在学习Navigation Controller的同时,我们还将继续学习Table View其他一些特性,毕竟Navigation Controller还是相对来说毕竟简单的,没有什么太大的花头,它的主要作用就是一个view的切换,切来切去,而Table View的花头就比较多了,这次我们将这2个控件结合在一起进行学习. 再多说一

NodeJS+Express+MySQL开发小记(2):服务器部署

http://borninsummer.com/2015/06/17/notes-on-developing-nodejs-webapp/ NodeJS+Express+MySQL开发小记(1)里讲过在本地搭建 NodeJS 网站的若干细节.本人最近在阿里云服务器上面按最低配租了4个月的云服务器,所以想试着把这个项目部署到云上.云服务器操作系统是Ubuntu 14.04 LTS.之前一直在Windows下做开发,对于Linux下的环境搭建.配置还不是很熟悉,搭建的过程中学到很多东西. 本文简单记

从零开始学ios开发(十二):Table Views(上)

这次学习的控件非常重要且非常强大,是ios应用中使用率非常高的一个控件,可以说几乎每个app都会使用到它,它就是功能异常强大的Table Views.可以打开你的iphone中的phone.Messages.Contacts.Mail.Settings等等等等,这些都用到了Table Views. 在Table Views中,Table是用来显示一系列数据的,每条数据占用且只占用一行(一个table cell),在ios中没有规定table到底可以容纳多少行数据,也就是说,只要内存足够多,tab

使用nodejs进行WEB开发

这里,准备从零开始用nodejs实现一个微博系统.功能包括路由控制.页面模板.数据库访问.用户注册.登录.用户会话等内容. 将会介绍Express框架.MVC设计模式.ejs模板引擎以及MongoDB数据库的操作. 准备工作 使用http模块,Express框架, nodejs的抽象如此之差,把不该有的细节暴露给开发者.你可以用它做任何HTTP服务器能做的事情,不仅仅是做一个网站,甚至实现一个HTTP代理服务器都行. Express是WEB开发框架. 实现: 为HTTP模块提供了更高层的接口,