cocosCreator 和 Laya 的常用API与方法 ,多边形点击解决正方形重叠点击问题,emit,dispatchEvent,EventCustom

CocosCreator 同时被 2 个专栏收录
17 篇文章 0 订阅
17 篇文章 0 订阅

常用API

引入: require / import

导出:export / module.exports / exports

Nodejs 不支持 import 和 export

es6 兼容以上所有语法,当然需要 webpack + babel 来支撑

es6是ECMAScript (European Computer Manufacturers AssociationEuropean Computer Manufacturers Association
European Computer Manufacturers Association
欧洲计算机制造商协会)ECMAScript是JavaScript语言的国际标准,JavaScript是ECMAScript的实现。ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript

尽管es6兼容以上所有语法,但需要注意:

在webpack打包的时候,可以在js文件中混用 require 和 export。但是不能混用 import 以及 module.exports

全局变量 window. 可以全部换成 cc.

声明属性 ---- Ts
@property(cc.Sprite)
backGround: cc.Sprite = null;

// 声明一个Sprite属性
@property(cc.Sprite)
backGround: cc.Sprite = null;

// 声明一个Label属性
@property(cc.Label)
label: cc.Label = null;

@property({
    type: cc.Sprite,
    displayName: "背景"
})
backGround: cc.Sprite = null;
 // 声明一个带说明的属性
@property({
    type: cc.Node,
    displayName: "底座",
    tooltip: "底部炮台的父节点"
})
baseNode: cc.Node = null;

https://blog.csdn.net/dawn_moon/article/details/90897725

声明属性 ---- Js

  1. 可以直接 ShowAlert : cc.Node;

2)nameArray: {
default: [],
type: cc.Label
},

  1. score: {
    default: 0, //如果是节点0可以改为Null
    type:cc.Integer,
    displayName: “分数”,
    tooltip: “玩家的分数”
    }
    *4) global.js 脚本 *
    var GlobalData = { //module.exports 模块化暴露
    testString: null,
    testInt: null,
    };
    CommonInclude.js 脚本
    window.GlobalData = require(‘GlobalData’) //最好把window换成其他,要不然系统可能会不识别 //模块化引入
    *test.js 脚本 *
    global.testString = “testString”

1.场景加载
cc.director.loadScene(‘场景名称’);//场景跳转
cc.director.preloadScene(‘场景名称’);//预加载场景

cc.director.getScene();//获取当前场景
cc.director.preloadScene(‘Game’,this.losds,() => {
cc.director.loadScene(‘Game’);
})

在需要的脚本里实例化预制体 ShowAlert
//显示ShowAlert提示语言
let tips = cc.instantiate(this.ShowAlert);
this.node.addChild(tips);
预制体ShowAlert上的脚本设置自动销毁
start() {
this.node.y = (0);
},
update(dt) {
if (!this.hadPlay) {
this.hadPlay = true;
let finish = cc.callFunc(function () {
this.node.removeFromParent();
this.node.destroy();
}, this);
let actSpan = cc.spawn(cc.fadeOut(0.8), cc.moveBy(0.8, cc.v2(0,250)));
this.node.runAction(cc.sequence(actSpan,finish));

        cc.log("234567890-!@#¥%……&*()——+" + this.node.getPosition());
    }
},

系统方法
cc.sys.localStorage.getItem(“currentLevel”)

setStorageQianDao: function(day)
{
cc.sys.localStorage.setItem(“qiandao”,day);
},
getStorageQianDao: function()
{
var day = cc.sys.localStorage.getItem(“qiandao”);
day = day ? day : 0;
return Number(day);
},
setStorageQianDaoTime: function(time)
{
cc.sys.localStorage.setItem(“qiandaotime”,time);
},
getStorageQianDaoTime: function()
{
var time = cc.sys.localStorage.getItem(“qiandaotime”);
time = time ? time : 0;
return Number(time);
},

cc.view.getVisibleSize()

cc.isValid(this.node_tryzhanshi) //检查该对象是否不为 null 并且尚未销毁

在这里插入图片描述
签到 和 (多Button一函数的判断) 枪王对枪王————qiandao.js__click
click: function(event,data) //第一个是点击事件,event.target.riqiId还可以是任何形式(比如EventTarget)代表点击的第几个子物体,通常用于判断每周签到的第几天的判断,data是Button 按钮下的CustomEventData,代表click()函数要执行哪一个Button的事件
{
if(data == “close_qiandao”)
{
this.main.wxQuanState(true);
this.hide();
}
else if(data == “riqi”)
{
console.error(“签到 1=1 " + event.target.riqiId +” : " +event.target.canset + " : " + this.node_qiandao_vedio.getComponent(“cc.Toggle”).isChecked);
if(event.target.canset)
{
/* if(this.node_qiandao_vedio.getComponent(“cc.Toggle”).isChecked)
{
this.riqiId = event.target.riqiId;
if(this.main.GAME.shareqiandao)
this.share();
else
this.main.wxVideoShow(7);
}
else*/
{
this.setGunRiQi(event.target.riqiId);
//console.log(“签到 2”);
this.updateUI();
//console.log(“签到 3”);
}
}
}
cc.log(data);
},

this.node_qiandao_vedio.getComponent(“cc.Toggle”).isChecked //复选框是否被勾选

动态播放音效
if (GlobalDate.liMiShow) {
this.audioContext = BK.createAudioContext({ ‘type’: ‘effect’ });
}
},
playBtnSfx(type){

    if (GlobalDate.liMiShow) {
        if(type == 1)
          this.audioContext.src = "GameRes://" + this.btnSfx;
          else    if(type == 2)
            this.audioContext.src = "GameRes://" + this.changePlayerSfx;
          
        this.audioContext.play();
    }

2.获取节点
var node = cc.find(“Canvas/bg”);//通过访问路径来获取节点

var a = this.node.getChildByName(‘name’);//通过名字获取子节点
node.getComponent(cc.Label).string = ‘abc’;//获取节点上的组件值

var a = cc.find(“Canvas/bg”).getComponent(cc.Sprite);//通过访问路径来获取节点,及获取该节点的指定组件

this.node .getChildByName(‘节点名称’).getComponent(cc.Label)//通过节点名获取子节点,获取该节点指定组件

var a = this.node;//获取当前脚本所在的节点
var a = this.node.parent;//获取父节点
var a = this.node.getChildByTag(1001);//通过标签获取子节点
var a = cc.find(“bg/score”,this.node);//通过指定节点下的路径获取节点

var a = this.node.children;//获取所有子节点
var a = this.node.childrenCount;//获取子节点数量
var a = cc.director.getScene();//获取场景主节点

var a = cc.instantiate(node);//克隆节点
this.node.parent = cc.find(‘Canvas’);//绑定父节点
this.node.addChild(nodeName,zIndex,tag);//添加子节点,可设置层级和标签
this.node.removeChild(nodeName);//通过名字移除子节点
this.node.removeChildByTag (nodeTag);//通过标签移除子节点
this.node.destroy();//销毁节点
this.node.isValid;//判定节点是否可用

this.node.removeChild(newNode);//移除节点中指定的子节点
this.node.removeChildByTag(1001);//通过标签移除节点中指定的子节点
this.node.removeAllChildren();//移除所有子节点
this.node.destroyAllChildren();//销毁所有子节点
this.node.cleanup();//停止所有正在播放的动作和计时器
var sprites = this.node.getComponentsInChildren(cc.Label);//递归查找自身及所有子节点中指定类型的组件

3.获取节点位置,设置节点
var a = node.getPositionX();或 getPositionY() //获取节点的X轴或Y轴坐标
var a = node.getScaleX(); 或getScaleY() //获取节点的X轴或Y轴缩放比例
node.x = 100;//设置节点x轴坐标
node.y = 100;//设置节点y轴坐标
node.setPosition(x,y); //设置节点坐标
node.rotation = 90; //设置节点旋转角度
node.scaleX = 2; //设置节点x轴缩放倍数
node.scaleY = 2; //设置节点y轴缩放倍数
node.setScale(2); //设置节点整体缩放倍数
node.width = 100; //设置节点宽度大小
node.height = 100; //设置节点高度大小
node.setContentSize(100, 100); //设置节点宽高尺寸大小
node.anchorX = 1; //设置节点x轴锚点坐标
node.anchorY = 0; //设置节点y轴锚点坐标
node.setAnchorPoint(1, 0); //设置节点锚点坐标
node.opacity = 128; //设置节点透明度大小(0-255)
node.setOpacity(20); //设置节点透明度(0~255)
node.color = new cc.color(100,100,100,255); //设置节点颜色(R,G,B,透明度)
if (cc.isValid(this.label.node) ) //判定节点是否存在
node.destroy(); //销毁节点
this.cannons = [];
this.cannons = node.getChildren(); //获取所有子节点
this.cannons = node.getChildrenCount(); //获取子节点数量
node.active = false; //关闭节点(隐藏节点)
cc.game.addPersistRootNode(myNode); //常驻节点(全局变量)
cc.game.removePersistRootNode(myNode); //取消常驻节点

4.动作操作

cc.show()//立即显示
cc.hide ()//立即隐藏
cc.toggleVisibility()//显隐切换
cc.fadeIn(1)//渐显效果
cc.fadeOut(1)//渐隐效果
cc.delayTime(1)//等待1秒
node.runAction(cc.moveTo(1,0,0)); //移动到当前节点(时间(s),X轴坐标,Y 轴坐标)
node.runAction(cc.scaleTo(1,0.7,0.8));//缩放到当前倍数节点(时间(s),X轴倍数,Y 轴倍数)
node.runAction(cc.rotateTo(1,160,160));//旋转到指定角度(时间(s),X轴角度,Y 轴角度)
node.runAction(cc.skewTo(1,5,-5));//变化节点倾斜度(时间(s),X轴倾斜度,Y 轴倾斜度)

node.runAction(cc.fadeTo(2,0));//变化当前节点的透明度(时间(s),透明度)

node.runAction(cc.tintTo(2,255,255,0));//变化当前节点颜色(时间,R,G,B)
node.stopAllActions();//停止所有动作
//自定义动作
var action = cc.moveTo(2, 100, 100);// 创建一个移动动作
node.runAction(action);// 执行动作
node.stopAction(action);// 停止一个动作

cc.sequence(action1,action2); //按顺序连续执行,先action1,后action2

cc.spawn(action1,action2); //同时执行,action1和action2一起执行

cc.repeatForever(cc.sequence(action1,action2)); //一直重复括号里的动作

5.计时器 js计时器
setTimeout()
setTimeout(function(){
self.isCanOverVideo = true;
console.log("scheduleOnce = "+self.isCanOverVideo);
},self.minVideoTime)
clearTimeout
clearTimeout(this.delayOverTimer);

clearInterval()

//只用1次的计时器,2秒后执行
this.scheduleOnce(function(){
//一条或多条执行语句

    },2); //(function(){},时间(s))

//每隔5秒执行1次
this.schedule(function(){
//一条或多条执行语句

    },5);

//计算多次的计时器(1秒后,以0.1秒的执行间隔,执行10次)
this.schedule(function(){
//一条或多条执行语句

    },0.1,10,1); //(function(){},间隔时间,次数,多久后开始)

this.unscheduleAllCallbacks(this);//停止某组件的所有计时器

//自定义定时器执行内容(相比常规使用的定时器优势是:方便随时开启或关闭)
var cb= function(){
//do something
};
this.schedule(cb,1);//启动定时器
this.unschedule(cb);//取消定时器

6.事件监听

(开始:‘touchstart’,移动:‘touchmove’,结束:‘touchend’,取消:‘touchcancel’)
node.on(‘touchstart’,function(event){
this.doSomething();
},this);
var a = event.getID();//获取触点的ID
var a = event.getLocationX();//获取触摸点的坐标X
var b = event.getLocationY();//获取触摸点的坐标Y

cc.eventManager.addListener({
event: cc.EventListener.KEYBOARD/TOUCH_ONE_BY_ONE,myfunction},self.node);

7.定义全局变量

window.DEFAULT_IP = “192.168.1.1”;//任意脚本里可定义全局变量
//任意脚本里可定义全局变量
window.G = {
a: null,
b: null,
};
//任意脚本里可访问全局变量(切记定义全局变量的那个脚本已执行过)
G.a = 0;
G.b = 0;

var something = require(‘something’);

cc.game.addPersistRootNode(myNode);//常驻节点,必须位于层级的根节点(也可算全局节点吧)

module.exports = {

     config: 123

}

8.分辨率
//获得设备分辨率
var b = cc.director.getWinSizeInPixels()
var bx = b.width
var by = b.height

cc.view.getCanvasSize().width;//获得设备分辨率的宽度
cc.view.getCanvasSize().height;//获得设备分辨率的高度
cc.view.getDesignResolutionSize();
cc.director.setDisplayStats(true);//显示帧数信息

cc.director.getWinSize 获取视图的大小,以点为单位
cc.director.getWinSizeInPixels 获取视图大小,以像素为单位(这里的像素指的是资源分辨率。 如果要获取屏幕物理分辨率,需要用 cc.view.getFrameSize())
cc.View.getVisibleSize 返回视图窗口可见区域尺寸。
cc.View.getVisibleSizeInPixel 返回视图窗口可见区域像素尺寸。
一个 是窗口 大小 就是屏幕。。。。一个是实际大小。。。主要是适配的时候用的
getVisibleSize:获得视口(可视区域)的大小,若是DesignResolutionSize跟屏幕尺寸一样大,则getVisibleSize便是getWinSize。
getVisibleOrigin:获得可视区域的出发点坐标,在处理相对位置时,确保节点在不同分辨率下的位置一致。

在cocos2d-x里CCNode对象有缩放的方法setScaleX和setScaleY。所以在获取对象大小的时候必须根据情况明确指定获取对象原始大小,还是缩放后的大小。
getContentSize函数来获得节点原始的大小。只是逻辑尺寸,不是像素
boundingBox函数来获得经过缩放和旋转之后的外框盒大小。
getContentSizeInPixels获得的是像素点大小
P.S.像素点和逻辑点关系:逻辑点大小 = 像素大小/contentScaleFactor.

cc.game.addPersistRootNode(this.node);

9.音频控制
cc.audioEngine.playMusic(this.BGAudio,true);//播放音乐(true代表循环)
cc.audioEngine.stopMusic()//停止播放背景音乐
cc.audioEngine.playEffect(this.ClickAudio,false);//播放音效(false代表只播放一次)
cc.audioEngine.stopEffect(音效变量名);//停止指定音效(需要先把音效赋值给变量)
cc.audioEngine.AllEffects();//停止所有音效
cc.audioEngine.setMusicVolume(参数); //设置背景音乐的音量(该参数范围是0到1)
cc.audioEngine.setEffectsVolume(参数); //设置音效的音量(该参数范围是0到1)

10.存档操作
cc.sys.localStorage.setItem(‘存储标识名’,变量名);//存储存档数据
var a = cc.sys.localStorage.getItem(‘存储标识名’);//读取存档数据
cc.sys.localStorage.removeItem(‘存储标识名’);//擦除存档数据
userData = {
name: ‘Tracer’,
level: 1,
gold: 100
};
cc.sys.localStorage.setItem(‘userData’, JSON.stringify(userData));//存取复杂对象数据
var userData = JSON.parse(cc.sys.localStorage.getItem(‘userData’));//读取复杂对象数据

11.判断平台

cc.sys.isNative //是否是本地
cc.sys.isBrowser //是否是网页
cc.sys.isMobile //是否是移动系统
cc.sys.platform //正在运行的平台
cc.sys.language //当前运行系统的语言
cc.sys.os //当前正在运行的系统
cc.sys.OS_IOS //是否是IOS系统
cc.sys.OS_ANDROID //是否是android系统
cc.sys.OS_WINDOWS //是否是windows系统
cc.sys.openURL(‘Http://www.baidu.com’); //打开网页

12.监听和发射事件

this.node.pauseSystemEvents(true);//暂停节点系统事件
this.node.resumeSystemEvents(true);//恢复节点系统事件
this.node.targetOff(this);//移除所有注册事件

触摸监听
开始’touchstart’,移动’touchmove’,结束’touchend’,取消’touchcancel’
var pos = event.getLocation();//获取触摸点的坐标(包含X和Y)
var x = event.getLocationX();//获取触摸点的X坐标
var y = event.getLocationY();//获取触摸点的Y坐标
var a = event.getID();//获取触点的ID

鼠标监听:
鼠标按下’mousedown’,移入节点’mouseenter’,节点中移动’mousemove’,移出节点’mouseleave,‘松开鼠标’mouseup’
var a = event.getScrollY();//获取滚轮滚动的 Y 轴距离,只有滚动时才有效
var a = event.getLocation();//获取鼠标位置对象,对象包含 x 和 y 属性

输入框监听
获得焦点’editing-did-began’,文字变化’text-changed’,失去焦点’editing-did-ended’,按下回车’editing-return’

**属性变化监听:
**位置’position-changed’,宽高 ‘size-changed’,旋转’rotation-changed’,缩放’scale-changed’

ScrollView控件监听
滚动中’scrolling’,停止滚动’scroll-ended’

用户自定义事件:
this.node.on(‘事件名’,function,this);//注册监听
this.node.emit(‘事件名’);//发射监听广播
this.node.off(‘事件名’,function,this);//关闭监听

emit()发射事件 和
dispatchEvent 派发事件,这个和emit的不同是逐级向上边的父节点 遍历事件 是否监听到是否 监听到派发的这个事件

cc.Event.EventCustom 用户自定义事件

dispatchEvent 的配发机制如下
在这里插入图片描述

		bubble-event
		如上图所示,当我们从节点 c 发送事件 “foobar”,倘若节点 a,b 均做了 “foobar” 事件的监听,则 事件会经由 c 依次传递给 b,a 节点。如:
		
		// 节点 c 的组件脚本中
		this.node.dispatchEvent( new cc.Event.EventCustom('foobar', true) );
		如果我们希望在 b 节点截获事件后就不再将事件传递,我们可以通过调用 event.stopPropagation() 函数来完成。具体方法如下:
		
		// 节点 b 的组件脚本中
		this.node.on('foobar', function (event) {
		  event.stopPropagation();
		});

//注册带参数监听
this.node.on(‘事件名’,function(event){

“具体方法函数内容”

},this);
//发送带参数的监听
this.node.emit(‘事件名’,{id:1001});
cc.eventManager.addListener(listener, node);//添加事件
cc.eventManager.removeListener((listener);//移除事件

EventHandler()
var eventHandler = new cc.Component.EventHandler(); 组件化代码事件回调
示例
// Let’s say we have a MainMenu component on newTarget
// file: MainMenu.js
cc.Class({
extends: cc.Component,
// sender: the node MainMenu.js belongs to
// eventType: CustomEventData
onClick (sender, eventType) {
cc.log(‘click’);
}
})
// Create new EventHandler
var eventHandler = new cc.Component.EventHandler();
eventHandler.target = newTarget;
eventHandler.component = “MainMenu”;
eventHandler.handler = “onClick”;
eventHandler.customEventData = “my data”;
索引
属性(properties)
target Node 事件响应函数所在节点 ,比如例子中脚本归属的节点本身
component String 事件响应函数所在组件名(脚本名), 比如例子中的脚本名 ‘MainMenu’
handler String 响应事件函数名,比如例子中的 ‘onClick’
customEventData String 自定义事件数据,比如例子中的 eventType
方法
emitEvents
emit 触发目标组件上的指定 handler 函数,该参数是回调函数的参数值(可不填)。

13.其他操作
cc.director.pause();//暂停
cc.director.resume();//继续
cc.director.end();//退出整个应用
cc.director.getPhysicsManager().gravity = GameInfo.G;
cc.director.getScene().children[0].on(“touchstart”,this.roleMove_start,this);

cc.log(变量) 或 console.log(something);//输出想要的信息
let self = this;//锁定当前使用的this指向
node.getLocalZOrder();//层级获取
node.setLocalZOrder(1);//层级改变
cc.find(‘canvas/map’ + num)//读取带变量的路径
cc.sys.openURL(‘Http://www.baidu.com’);//打开网页

一 延迟执行
// 3秒后
setTimeout(function () { //在一定的时间之后,执行某个功能(函数)
// do something
}.bind(this), 3000);
setInterval(function () { //在一定的时间之中,反复的执行某个功能(函数)
// do something
}.bind(this), 3000);
ClearInterval() //停止某个计时器

例:interval = setInterval(overs,1000);//启动计时器,调用overs函数,

clearInterval(interval);//停止计时器并设置为空
interval = null;

schedule(schedule_selector(HelloWorld::Move), 1.0f); //每隔1.0f执行一次,省略参数则表示每帧都要执行

this->scheduleOnce(schedule_selector(HelloWorld::Move), 1.0f); //在1.0f之后执行,并且只执行一次。
this.scheduleOnce(()=>{
HongPlaza.isInAnimals=false;
},this.time)
取自cc.Component.scheduleOnce(callback: Function, delay?: number): void 方法
停止定时器:
this->unschedule(schedule_selector(HelloWorld::Move));停止执行自己定义的函数定时器:
this->unscheduleUpdate(); 停止默认定时器:
this->unscheduleAllSelectors(); 停止所有定时器:

二 获取坐标
node.setPosition(100, 50);
node.setPosition(cc.v2(100, 50));
node.position = cc.v2[[3-i] * - 0.5 * j * 260,260 * i]

三 获取节点的颜色和Size(尺寸)
var wid = this.node.getContentSize();
var wid = this.node.color;

let self = this;
cc.loader.loadRes(url, function (err, prefab) {
if (err == null && prefab){
var node:cc.Node = cc.instantiate(prefab);
if (node){
self._father.addChild(node); //这边要注意的一点,在cc.loader里面加载不要用this,
}
}
else{
cc.warn(err + " name load error!!!");
}
});

但是这个预制体是要关闭的。当需要关闭的时候便可以直接删除预制体就可以了,操作如下

node.destroy();//直接销毁节点,最具有效率的方式
node.removeFromParent();//移除与父节点的引用

二:常见数据类型用ts怎么写?

/**

  • 1.1 ts 如何声明一个boolean, number, string类型的值
    /
    // 在js中,定义 isFlag 为true, 但是后面还可以重新给它赋值为字符串,而ts中就不行,同理,声明number, string 也一样
    let bool: boolean = true;
    // 会报错:不能将类型““str””分配给类型“boolean”。
    // isFlag = “str”
    let str: string = “a”;
    // 会报错:不能将类型“1”分配给类型“string”。
    // str = 1
    let num: number = 1;
    // 会报错:不能将类型““a””分配给类型“number”。
    // num = “a”
    /
    *
  • 1.2 ts 如何声明一个 undefined, null 类型的值
    /
    let u: undefined = undefined;
    let n: null = null;
    /
    *
  • 1.3 ts 如何声明一个数组
    /
    // 方式一:声明一个每一项只能是string类型的数组。在元素类型后面接上[],表示由此类型元素组成一个数组
    let arr1: string[] = [“a”, “b”];
    // 方式二:使用数组泛型,Array<元素类型>
    let arr2: Array = [“a”, “b”];
    // 方式三:利用接口: ts的核心原则是对值所具有的结构进行类型检查,接口的作用就是为这些类型命名和为你的代码或第三方代码定义契约
    interface NumberArray {
    // 这个接口表示:只要索引的类型是number,那么值的类型必须是number
    [index: number]: number;
    }
    let arr3: NumberArray = [1, 2, 3];
    // 数组里想放对象?
    let arr4: Array = [{ a: “1” }, { b: “2” }];
    // 数组里想放多种数据类型? 用 | 隔开就好
    let arr5: Array<string | number> = [“a”, 1];
    // 数组里想放任意类型?
    let arr6: Array = [“a”, 1, true, { a: 1 }, [1, 2]];
    /
    *
  • 1.4 ts 如何声明一个对象
    /
    // 利用接口
    interface OA {
    name: string; // 表示对象要有name属性, 值是string类型
    age?: number; // ? 表示age属性可以有也可以没有, 值是number类型
    readonly id: number; // readonly 表示 id 属性只可读,不可修改
    }
    let obj1: OA = { name: “obj1”, id: 1 };
    let obj2: OA = { name: “obj2”, age: 18, id: 2 };
    // 这种情况下name 和 id 属性必须要,age属性可要可不要,但是除了这三种属性外,其它的属性都不准出现
    // let obj3:OA = {a: 1} // 会报错
    // 有时候还是希望一个对象允许有任意的属性怎么办?
    interface OB {
    name: string;
    age?: number;
    [propName: string]: any;
    }
    let obj4: OB = { name: “a” };
    let obj5: OB = { name: “a”, age: 1 };
    let obj6: OB = { name: “a”, age: 1, other1: 2, other2: “2”, other3: { a: 1 } };
    /
    *
  • 1.5 ts 如何声明一个函数
    */
    // 一: :void 表示函数没有返回值
    function fn2(x: number): void {
    console.log(x);
    }
    // 二: 这里表示sum 函数接收两个参数(多了少了都不行), 参数类型是 number, 返回值也是number
    function fn1(x: number, y: number): number {
    return x + y;
    }
    // 三: 同样也可以用?来表示可选参数,但是可选参数只能放到最后面
    function fn3(x: number, y?: number): number {
    if (y) {
    return x + y;
    }
    return x;
    }
    // 四:ts 怎么表示默认参数
    function fn41(x: number, y: number = 1): number {
    return x + y;
    }
    // 传值的时候,默认参数可以不传
    fn41(1);
    fn41(1, 2);
    // 默认参数不像可选参数必须放后面,它也可以放前面, 但是还是推荐放后面去
    function fn42(x: number = 1, y: number): number {
    return x + y;
    }
    // 传值的时候,默认参数可以不传,但是如果默认参数不放后面,这样传值感觉很怪
    fn42(undefined, 2);
    // 五:ts表示剩余参数。利用扩展运算符
    function fn52(array: any[], …items: any[]) {
    items.forEach(item => {
    array.push(item)
    })
    }
    // 六:箭头函数
    // es6 箭头函数:没有参数的时候
    // let fn61 = () => {}

// es6 箭头函数:一个参数的时候,可以不用圆括号
// let fn62 = arg => {
// console.log(arg)
// }

// es6 箭头函数:多个参数的时候,如果致谢一行的话,不用大括号和return
// let fn63 = (arg1, arg2) => arg1 + arg2;

// es6 箭头函数:多个参数并且换行的时候,需要写大括号和return
// let fn64 = (arg1, arg2) => {
// return arg1 + arg2
// }

// es6 箭头函数:返回一个对象,必须在对象外面加上圆括号
// let fn65 = (arg1, arg2) => ({a: arg1, b:arg2})

// es6 上例中一般会不改名字,同名可以缩写成这样
// let fn66 = (arg1, arg2) => ({
// arg1,
// arg2
// })

// 很奇怪ts中是不能再用缩写形式的箭头函数了吗?上面的代码在在线编译中不会报错,但是在vscode编辑器里报错…噢多凯?
看看上面的代码被编译成了ES5是怎样的。

“use strict”;
/**

  • 1.1 ts 如何声明一个boolean, number, string类型的值
    /
    // 在js中,定义 isFlag 为true, 但是后面还可以重新给它赋值为字符串,而ts中就不行,同理,声明number, string 也一样
    var bool = true;
    // 会报错:不能将类型““str””分配给类型“boolean”。
    // isFlag = “str”
    var str = “a”;
    // 会报错:不能将类型“1”分配给类型“string”。
    // str = 1
    var num = 1;
    // 会报错:不能将类型““a””分配给类型“number”。
    // num = “a”
    /
    *
  • 1.2 ts 如何声明一个 undefined, null 类型的值
    /
    var u = undefined;
    var n = null;
    /
    *
  • 1.3 ts 如何声明一个数组
    /
    // 方式一:声明一个每一项只能是string类型的数组。在元素类型后面接上[],表示由此类型元素组成一个数组
    var arr1 = [“a”, “b”];
    // 方式二:使用数组泛型,Array<元素类型>
    var arr2 = [“a”, “b”];
    var arr3 = [1, 2, 3];
    // 数组里想放对象?
    var arr4 = [{ a: “1” }, { b: “2” }];
    // 数组里想放多种数据类型? 用 | 隔开就好
    var arr5 = [“a”, 1];
    // 数组里想放任意类型?
    var arr6 = [“a”, 1, true, { a: 1 }, [1, 2]];
    var obj1 = { name: “obj1”, id: 1 };
    var obj2 = { name: “obj2”, age: 18, id: 2 };
    var obj4 = { name: “a” };
    var obj5 = { name: “a”, age: 1 };
    var obj6 = { name: “a”, age: 1, other1: 2, other2: “2”, other3: { a: 1 } };
    /
    *
  • 1.5 ts 如何声明一个函数
    */
    // 一: :void 表示函数没有返回值
    function fn2(x) {
    console.log(x);
    }
    // 二: 这里表示sum 函数接收两个参数(多了少了都不行), 参数类型是 number, 返回值也是number
    function fn1(x, y) {
    return x + y;
    }
    // 三: 同样也可以用?来表示可选参数,但是可选参数只能放到最后面
    function fn3(x, y) {
    if (y) {
    return x + y;
    }
    return x;
    }
    // 四:ts 怎么表示默认参数
    function fn41(x, y) {
    if (y === void 0) { y = 1; }
    return x + y;
    }
    // 传值的时候,默认参数可以不传
    fn41(1);
    fn41(1, 2);
    // 默认参数不像可选参数必须放后面,它也可以放前面, 但是还是推荐放后面去
    function fn42(x, y) {
    if (x === void 0) { x = 1; }
    return x + y;
    }
    // 传值的时候,默认参数可以不传,但是如果默认参数不放后面,这样传值感觉很怪
    fn42(undefined, 2);
    // 五:ts表示剩余参数。利用扩展运算符
    function fn52(array) {
    var items = [];
    for (var _i = 1; _i < arguments.length; _i++) {
    items[_i - 1] = arguments[_i];
    }
    items.forEach(function (item) {
    array.push(item);
    });
    }
    // 六:箭头函数
    // es6 箭头函数:没有参数的时候
    // let fn61 = () => {}
    // es6 箭头函数:一个参数的时候,可以不用圆括号
    // let fn62 = arg => {
    // console.log(arg)
    // }
    // es6 箭头函数:多个参数的时候,如果致谢一行的话,不用大括号和return
    // let fn63 = (arg1, arg2) => arg1 + arg2;
    // es6 箭头函数:多个参数并且换行的时候,需要写大括号和return
    // let fn64 = (arg1, arg2) => {
    // return arg1 + arg2
    // }
    // es6 箭头函数:返回一个对象,必须在对象外面加上圆括号
    // let fn65 = (arg1, arg2) => ({a: arg1, b:arg2})
    // es6 上例中一般会不改名字,同名可以缩写成这样
    // let fn66 = (arg1, arg2) => ({
    // arg1,
    // arg2
    // })
    // 上面的代码在在线编译中不会报错,但是在vscode编辑器里报错…噢多凯?

**

分割

**

在这里插入图片描述

  • 点击区域
    *@param loaction
    */
    public getlongclickarea(loaction:cc.Vec2):boolean {
    if(!loaction){
    return;
    }

    console.log()
    var point = cc.find(‘area/black’,this.node).convertToNodeSpaceAR(loaction);
    var bool = cc.Intersection.pointInPolygon(point, this.longarea.points)//pointInPolygon函数为系统自带
    //判断鼠标点击的点‘point’(point是area/black)的节点位置,鼠标将会点到这个area/black区域内的点point上) 是否在“‘this.longarea.points’(‘this.longarea.points’是’area/black节点上添加的
    cc.PolygonCollider组件)内
    两个参数合起来可以理解为是否点击在了area/black(point)节点上的(area/black的cc.PolygonCollider(this.longarea.points))碰撞体组件内。
    return bool
    }
    public gethuclickarea(loaction:cc.Vec2):boolean {
    if(!loaction){
    return;
    }

    var point = cc.find(‘area/red’,this.node).convertToNodeSpaceAR(loaction);
    var bool = cc.Intersection.pointInPolygon(point, this.huarea.points) //判断鼠标点击的点‘point’(point是area/black)的节点位置,鼠标将会点到这个area/black区域内的点point上) 是否在“‘this.longarea.points’(‘this.longarea.points’是’area/black节点上添加的
    cc.PolygonCollider组件)内
    两个参数合起来可以理解为是否点击在了area/black(point)节点上的(area/black的cc.PolygonCollider(this.longarea.points))碰撞体组件内。
    return bool
    }

public getheclickarea(loaction:cc.Vec2):boolean {
if(!loaction){
return;
}

var point = cc.find('area/fortune',this.node).convertToNodeSpaceAR(loaction);
var bool = cc.Intersection.pointInPolygon(point, this.hearea.points)//pointInPolygon函数为系统自带
                                                                    //判断鼠标点击的点‘point’(point是area/black)的节点位置,鼠标将会点到这个area/black区域内的点point上)      是否在“‘this.longarea.points’(‘this.longarea.points’是'area/black节点上添加的

cc.PolygonCollider组件)内
两个参数合起来可以理解为是否点击在了area/black(point)节点上的(area/black的cc.PolygonCollider(this.longarea.points))碰撞体组件内。
return bool
}

TOUCH_START(event) {
// if(this.LongHuView.getheclickarea(event.getLocation())){
// clickAera=‘he’
// this.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame(‘zj’)
// }
// if(this.LongHuView.gethuclickarea(event.getLocation())){
// clickAera=‘hu’
// this.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame(‘you’)
// }
// if(this.LongHuView.getlongclickarea(event.getLocation())){
// clickAera=‘long’
// this.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame(‘zuo’)
// }
let num = null
if (this.LongHuView.getheclickarea(event.getLocation()) && !this.LongHuView.gethuclickarea(event.getLocation()) && !this.LongHuView.getlongclickarea(event.getLocation())) {
this.LongHuView.hearea.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame(‘zj’)
num = 2
}
else if (this.LongHuView.gethuclickarea(event.getLocation()) && !this.LongHuView.getheclickarea(event.getLocation())) {
this.LongHuView.huarea.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame(‘you’)
num = 1

    } else if (this.LongHuView.getlongclickarea(event.getLocation()) && !this.LongHuView.getheclickarea(event.getLocation())) {
        this.LongHuView.longarea.node.getComponent(cc.Sprite).spriteFrame = this.res.getSpriteFrame('zuo')
        num = 0

    }

    let xiazhuScore = ModuleLongHu.getInstance().xiazhuScore;
    let myScore = ModuleLongHu.getInstance().userInfoScore / 100
    if (xiazhuScore == 0) {
        // let str = '请选择筹码下注!';
        // cc.loader.loadRes('Plaza/wbPrefab/window/ScoreInsufficientWindow', cc.Prefab, (err, prefab) => {
        //     let node = ManagerWindow.getInstance().show(prefab);
        //     node.getComponent(ScoreInsufficientWindow).init(str, false, null, null);
        // })
        ManagerNotice.getInstance().show('请选择筹码下注!')
    }
    else if (myScore < xiazhuScore) {
        let str = '您的金币不足是否前去商城购买?';
        cc.loader.loadRes('Plaza/wbPrefab/window/ScoreInsufficientWindow', cc.Prefab, (err, prefab) => {
            let node = ManagerWindow.getInstance().show(prefab);
            node.getComponent(ScoreInsufficientWindow).init(str, false, null, null);
        })
    } else {
        let notifyData = {
            wArea: num,
            lScore: xiazhuScore * 100
        }
        ModuleLongHu.getInstance().onUserAddScore(notifyData);
    }
}

init(area: number) {
this.area = area
}

**

//杂知识点

**
private switchSprite() {
this.kuang.active = true
let cal = cc.callFunc(() => {

    })
    this.kuang.runAction(cc.sequence(cc.blink(2, 6), cc.delayTime(0.5), cal));
}
                                 //cc.moveTo      绝对移动位置,跟前几次移动多少无关

childrenNode.runAction(cc.moveTo(0.3, cc.v2(5, 0)));
//cc.moveBy 相对移动位置,相对于前几次移动的基础上再移动多少
childrenNode.runAction(cc.moveBy(0.3, cc.v2(5, 0)));
//cc.easeIn 缓动对象,由慢到快
bet.runAction(cc.moveTo(move_time, endPos).easing(cc.easeIn));//easing缓动运动,easeIn 缓动对 象,由慢到快
//bezierTo 贝塞尔曲线移动
let seq = cc.sequence(cc.bezierTo(1, posArr),//沿着bezierTo贝塞尔曲线移动,(1是是移动的时 间,posArr是移动中经过各个点的数组)
cc.tween(this.node) // 0s 时,node 的 scale 还是 1
.to(1, { scale: 2 }) // 1s 时,执行完第一个 action,scale 为 2
.to(1, { scale: 3 }) // 2s 时,执行完第二个 action,scale 为 3
.start() // 调用 start 开始执行 cc.tween

 to :对属性进行绝对值计算,最终的运行结果即是设置的属性值
 by :对属性进行相对值计算,最终的运行结果是设置的属性值加上开始运行时节点的属性值

cc.tween(node)
.to(1, {scale: 2}) // node.scale === 2
.by(1, {scale: 2}) // node.scale === 4 (2+2)
.by(1, {scale: 1}) // node.scale === 5
.to(1, {scale: 2}) // node.scale === 2
.start()

      //cc.blink        多少秒的时间内,闪烁多少次

this.kuang.runAction(cc.sequence(cc.blink(2, 6), cc.delayTime(0.5), cc.callFunc(() => {
})));
//fadeIn 渐显效果,1是1秒self.menuNode.runAction(cc.sequence(cc.fadeIn(1),cc.delayTime(0.5),cc.fadeOut(1),cc.callFunc(()=>{
//fadeIn渐显效果,1是1秒。 //fadeOut渐隐效果,1是1秒。
})));

this.gameTip.runAction(cc.sequence(cc.delayTime(15), cc.callFunc(() => {
if (!this.isUserLogin) this.btnBackCB();
})));

let pos1 = this.userData[win_id].convertToWorldSpaceAR(cc.v2(0, 0));
let pos2 = this.betArea.convertToNodeSpaceAR(pos1);
this.betArea.children[i].runAction(cc.sequence(cc.delayTime(time), cc.moveTo(0.2, pos2), cc.removeSelf()));

https://docs.cocos.com/creator/manual/zh/scripting/action-list.html# 容器动作
容器动作
1即时动作
在这里插入图片描述时间间隔动作

在这里插入图片描述
缓动动作
在这里插入图片描述
sszEffect(num, sszjudge) {
for (let k in this.sszNum) {
if (this.sszNum[k] == num) {
return
}
}
if (sszjudge) {
this.sszjudge = false;
this.sszNum.push(num);
ModuleLongHuRes.getInstance().getPrefabNode(HongLongHuRes.LongHu_FX_luckystar,
(err, node) => {
if (err) return
if (num == 1) {
node.parent = cc.find(‘Management/OtherUsers/user4/ssz’, this.node);
let pos = cc.v2(0, 0)
let pos1 = cc.v2(-500, -20)
let pos2 = cc.v2(-780, -80)
let posArr = [pos, pos1, pos2]
let seq = cc.sequence(cc.bezierTo(1, posArr),//沿着bezierTo贝塞尔曲线移动,(1是是移动的时间,posArr是移动中经过各个点的数组)
cc.callFunc(function (target, event) {
target.destroy();
cc.find(‘Canvas/area/black/luckyStar’).active = true;
}));
node.runAction(seq)
}
if (num == 2) {
node.parent = cc.find(‘Management/OtherUsers/user4/ssz’, this.node);
let pos = cc.v2(0, 0)
let pos1 = cc.v2(-110, -20)
let pos2 = cc.v2(-200, -80)
let posArr = [pos, pos1, pos2]
let seq = cc.sequence(cc.bezierTo(1, posArr),
cc.callFunc(function (target, event) {
target.destroy();
cc.find(‘Canvas/area/red/luckyStar’).active = true;
}));
node.runAction(seq)
}
if (num == 3) {
node.parent = cc.find(‘Management/OtherUsers/user4/ssz’, this.node);
let pos = cc.v2(0, 0)
let pos1 = cc.v2(-220, -20)
let pos2 = cc.v2(-511, -80)
let posArr = [pos, pos1, pos2]
let seq = cc.sequence(cc.bezierTo(1, posArr),
cc.callFunc(function (target, event) {
target.destroy();
cc.find(‘Canvas/area/fortune/luckyStar’).active = true;
}));
node.runAction(seq)
}
})
}
}
isClickClose: boolean = false;
OnClostGame(target, event) {
if (this.isClickClose) return;
this.isClickClose = true;
if (ModuleLongHu.getInstance().Is_whether) {
ManagerWindow.getInstance().showTips(“正在游戏中,确认是否退出?”, TipsType.OKCANCEL, (yes) => {
if (yes) {
ManagerNet.getInstance().request(HongLongHu.event.leaveGame, {}, (data) => {
console.log(data);
this.isClickClose = false;
cc.director.loadScene(‘MainView’);
});
} else {
this.isClickClose = false;
}
})
} else {
ManagerNet.getInstance().request(HongLongHu.event.leaveGame, {}, (data) => {
console.log(data);
this.isClickClose = false;
cc.director.loadScene(‘MainView’);
});
}
}

private switchSprite() {
this.kuang.active = true
let cal = cc.callFunc(() => {

    })
    this.kuang.runAction(cc.sequence(cc.blink(2, 6), cc.delayTime(0.5), cal));
}
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

qq_42838904

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值