【精品教程系列2】​《Fantasy Warrior 3D》之角色选择场景

上一节中分析了《FantasyWarrior3D》项目中的加载场景和主菜单场景,本节主要介绍游戏角色选择场景(ChooseRoleScene)。

1. 触摸事件

1
function ChooseRoleScene:initTouchDispatcher()

初始化监听对象

1
local listenner = cc.EventListenerTouchOneByOne:create()

注册

1
eventDispatcher:addEventListenerWithSceneGraphPriority(listenner, self.layer)

设置处理函数函数

1
2
3
4
listenner:registerScriptHandler(function(touch, event)
//函数体
return true
end,cc.Handler.EVENT_TOUCH_BEGAN )

(1) EVENT_TOUCH_BEGAN

实现旋转 如果点击到了英雄区域

1
2
3
4
if cc.rectContainsPoint(heroSize,touchbeginPt) then --rotate
isRotateavaliable = true
return true
end

记录一下点击位置 touchbeginPt。

(2) 判断是否点击背包里的装备

因为self._weaponItem:getBoundingBox()获得的区域都是与背包的相对区域,所以鼠标点击位置首选转换到与背包的相对位置

1
touchbeginPt = self._bag:convertToNodeSpace(touchbeginPt)

如果点到装备了,放大和调透明度

1
2
self._weaponItem:setScale(1.7)
self._weaponItem:setOpacity(150)

(3)EVENT_TOUCH_MOVED滑动角色

判断滑动位置是否超过50像素调用:rotate3Heroes

通过3D坐标的移动来实现位置轮换,EaseCircleActionInOut增加了一些先慢后快的弹性效果

1
cc.EaseCircleActionInOut:create(cc.MoveTo:create(rotatetime,pos[3]))

(4)EVENT_TOUCH_ENDED

换装的实现,在每个角色中实现了switchArmour、switchWeapon、switchHelmet,切换两套装备mesh的显示与隐藏。

不过这种实现方式的扩展性有待考量,难道说有n套装备,那么每个部位都需要 n个对应的mesh吗?

2. UI上的对象

(1)

1
function ChooseRoleScene:addButton()

“进入游戏”按钮。使用到了全局变量 ReSkin 来记录穿戴的装备id。

在跳转BattleScene之前把相关的lua 对象清空了一下

1
2
3
4
5
package.loaded[ "BattleScene" ]=nil
package.loaded[ "Manager" ]=nil
package.loaded[ "Helper" ]=nil
package.loaded[ "MessageDispatchCenter" ]=nil
package.loaded[ "BattleFieldUI" ]=nil

设置button位置

1
next_Button:setNormalizedPosition({x=0.34,y=0.13})

Node::setNormalizedPosition方法, Node的位置像素会根据它的父节点的尺寸大小计算,即按比例

(2)function ChooseRoleScene:addBag()装备和属性

self:switchTextWhenRotate()切换职业图标和设置属性值,其实装备的位置都是写死了的, 就没有什么参考的必要了。

(3)function ChooseRoleScene:addHeros() 添加角色

旋转英雄:

1
2
3
4
local function hero_rotate()
local rotation = self.layer:getChildByTag(sortorder[2]):getRotation3D()
self.layer:getChildByTag(sortorder[2]):setRotation3D({x=rotation.x,y=rotation.y+rotate,z=0})
end
  • sortorder[2] 存放的中间位置的英雄

  • setRotation3D({x=rotation.x,y=rotation.y+rotate,z=0}) 开启一个schedule每次旋转了0.5个弧度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值