防止按钮点击一次 ,函数执行多次
private clickTime=0;
public ClickGoldBtnTimes() {
//this.showBanner();
if(Laya.Browser.now() - this.clickTime <= 100){
console.log(“点击失败”);
this.goldBtn.off(Laya.Event.CLICK,this,this.GoldcallBack);
return ;
}
else{
this.goldBtn.on(Laya.Event.CLICK, this,this.GoldcallBack);
}
this.clickTime=Laya.Browser.now() ;
}

GoldcallBack(){  this.goldTimes++;console.log("点击了goldBtn" + this.goldTimes);this.showBanner();
}

//砸金蛋的函数 计时器
showBanner() {
//如果showBannerAd流量主界面已经存在,先把他关闭
platform.hideBannerAd();
let a = function () {
console.log(“3秒时间到,弹出流量主”);
platform.showBannerAd();
}
//goldEgg界面出现3秒以后就显示流量主
Laya.timer.once(3000, this, a)
//如果三秒之前就点击超过了10次,就不在计时弹出流量组
console.log(“调用showBanner” + this.goldTimes);
if (this.goldTimes >= 10) {
console.log(“10次以后砸蛋成功”);
this.goldEgg.visible = false;
Laya.timer.clear(this, a);
//奖励用户金币100~200之间
let gold = 100 + Math.random() * 101;
this.AddGoldEgg(gold);
this.goldTimes = 0;
}
}

设备像素分辨率:Laya.Browser.clientWidth,Laya.Browser.clientHeight;
设备物理分辨率:Laya.Browser.width,Laya.Browser.height;
像素比:Laya.Browser.pixelRatio;
(显然平时常用的是:设备物理分辨率 width 与 height ,它们代表着浏览器窗口的实际分辨率)

Hander 事件处理器类

https://blog.csdn.net/wangmx1993328/article/details/86152443

1、Handler 是事件 处理器 类。这是优化内存的方式之一,可以参考《LayaAir 对象池 laya.utils.Pool》

2、推荐使用 Handler.create() 方法从对象池创建,减少对象创建消耗。创建的 Handler 对象不再使用后,可以使用 Handler.recover() 将其回收到对象池,回收后不要再使用此对象,否则会导致不可预料的错误。

3、注意:由于鼠标事件也用本对象池,不正确的回收及调用,可能会影响鼠标事件的执行。

4、开发过程中会经常使用 Handler 来完成异步回调。Laya.Handler.create 使用了内置对象池管理,因此在使用Handler对象时可使用 Laya.Handler.create 来创建回调处理器。以下代码使用 Laya.Handler.create 创建资源加载的回调处理器:
Laya.loader.load(urls, Laya.Handler.create(this, onAssetLoaded));

laya.utils.Handler
Laya.Handler 这个类使用的非常多。 一般一次性的操作需要透传我都会使用 Laya.Handler.create() 从对象池内创建一个Handler事件处理器类,默认会执行一次并立即回收,如果不需要自动回收,设置once参数为false。
这个方法进行透传 回调 它指向某些资源(可以是函数,内存等等)。

Promise异步加载(资源,图片) 用以微信分包

//game.json类
{
“name”: “ui”,
“root”: “ui”
}
//main.ts类

private loadSub(name): Promise {//异步加载,返回一个已给定解析后的对象
return new Promise((resolve, reject) => {
const loadTask = wx.loadSubpackage({ //微信加载分包
name: name,
success: resolve,
fail: reject,
})
})
}

onConfigLoaded(): void {
//加载IDE指定的场景
if (wx) {
// const loadTask = wx.loadSubpackage({
// name: ‘subpackages’, // name 可以填 name 或者 root
// success: function (res) {
// // 分包加载成功后通过 success 回调
// // GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);
// Laya.loader.load([“ui/loadui/背景.png”], Laya.Handler.create(this, () => {
// GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);
// }))
// },
// fail: function (res) {
// // 分包加载失败通过 fail 回调
// }
// })
//Promise.resolve()用于将现有对象转换为Promise对象,从而控制异步流程
//而立即resolve的Promise对象是在本轮“事件循环(Event loop)的结束时,而不是在 //下一轮“事件循环”的开始时
Promise.resolve()
.then(() => {
this.loadSub(‘ui’) //ui是一个分包,要在game.js中进行创建
})
.then(() => {
this.loadSub(‘subpackages’) //subpackages也是一个分包
})
.then(() => {
Laya.loader.load([
“ui/loadui/背景.png”,
“ui/startUI/to2bg.jpg”,
], Laya.Handler.create(this, (x) => {//从对象池中创建一个事件处理器类
console.log(x);
console.log(Laya.loader.getRes(“ui/startUI/to2bg.jpg”));
console.log(Laya.loader.getRes(“ui/loadui/背景.png”));
GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);
}))
})
.catch(console.error);
}
else {
Laya.loader.load(‘to2bg.jpg’);
GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);
}
}
}
//比如初始场景,对应到Main.js里面的 GameConfig.startScene && //Laya.Scene.open(GameConfig.startScene); 即如果这里设置了,编辑的
// GameConfig.js的时候,将会在startScene 属性上生成目标场景名称。

四元数 Laya小游戏 对对球

/**
*根据绕X轴的角度旋转四元数 a与x,y,z,w的组合乘以bw + a与x,y,z,w的倒序组合乘以bx
*@param rad 角度
*@param out 输出四元数
*/
__proto.rotateX=function(rad,out){
var e=out.elements;
var f=this.elements;
rad *=0.5;
var ax=f[0],ay=f[1],az=f[2],aw=f[3];
var bx=Math.sin(rad),bw=Math.cos(rad);
e[0]=ax *bw+aw *bx;
e[1]=ay *bw+az *bx;
e[2]=az *bw-ay *bx;
e[3]=aw *bw-ax *bx;
}

/**
*根据绕Y轴的制定角度旋转四元数  a与x,y,z,w的组合乘以bw   +  a与x,y,z,w的倒序组合乘以by
*@param rad 角度
*@param out 输出四元数
*/
__proto.rotateY=function(rad,out){var e=out.elements;var f=this.elements;rad *=0.5;var ax=f[0],ay=f[1],az=f[2],aw=f[3],by=Math.sin(rad),bw=Math.cos(rad);e[0]=ax *bw-az *by;e[1]=ay *bw+aw *by;e[2]=az *bw+ax *by;e[3]=aw *bw-ay *by;
}/**
*根据绕Z轴的制定角度旋转四元数 a与x,y,z,w的组合乘以bw   +  a与x,y,z,w的倒序组合乘以bz
*@param rad 角度
*@param out 输出四元数
*/
__proto.rotateZ=function(rad,out){var e=out.elements;var f=this.elements;rad *=0.5;var ax=f[0],ay=f[1],az=f[2],aw=f[3],bz=Math.sin(rad),bw=Math.cos(rad);e[0]=ax *bw+ay *bz;e[1]=ay *bw-ax *bz;e[2]=az *bw+aw *bz;e[3]=aw *bw-az *bz;/**
*分解四元数到欧拉角(顺序为Yaw、Pitch、Roll),参考自http://xboxforums.create.msdn.com/forums/p/4574/23988.aspx#23988,问题绕X轴翻转超过±90度时有,会产生瞬间反转
*@param quaternion 源四元数*@param out 欧拉角值
*/

//三维向量

// 限速
if (Laya.Vector3.scalarLength(this.touchSpeed) > TOUCH_SPEED_LIMIT) { //计算标量长度
Laya.Vector3.normalize(this.touchSpeed, this.touchSpeed); //归一化三维向量(源向量,输出结果向量)
Laya.Vector3.scale(this.touchSpeed, TOUCH_SPEED_LIMIT, this.touchSpeed);//缩放三维向量(源向量,(缩放比例值) ,输出结果向量)
}
//Righrbody 详解
https://www.jianshu.com/p/0e70a64547b3

Rightbody 使物体移动

1: 添加力的方式
1) ApplyForce方法会在刚体上施加一个力。学过物理力学的同学都知道,F=ma,有了力F就有了加速度a,有了加速度,物体就会有速度,就会慢慢动起来。(但是不会立马动起来,因为力不会直接影响速度)。

2:添加速度的方式
1)setLinearVelocity 直接设置是速度
setLinearVelocity与ApplyImpulse一样,直接影响刚体的速度。不一样的是,setLinearVelocity添加的速度会覆盖刚体原有的速度。

2) 添加冲量 这个速度会与原有速度叠加作用于物体,通常用于突然改变物体的运动状态
ApplyImpulse冲量 可以理解为一个有大小和方向的向量
与ApplyForce不同,ApplyImpulse不会产生力,而是直接影响刚体的速度。通过ApplyImpulse方法添加的速度会与刚体原有的速度叠加,产生新的速度

**

Panel 直接用getChildAt() 和 List 直接用getItem()方法是直接获取不到子物体的 因为addChild() 和 addItem()可能是子物体的子物体

**

private adItemList: Array = []; //可以声明一个相同类型的数组放panel的每一个item,同时把item赋给List或Panel
public initfullAd() {
//let sourceDateLeft = []
let adList = this.ad.getNowHotGame118();
this.hotGameButtonsFullAd = this.ad.getNowHotGame118();
for (let i = 0; i < adList.length; i++) {
let item = new AdItem(adList[i]);
item.x = 24 + 229 * Math.round(i % 3);
item.y = 16 + 265 * Math.floor(i / 3);
this.adItemList.push(item);
this.fullScreenAdList.addChild(item);
this.adItemList.push(item);
}
//this.fullScreenAdList.array = sourceDateLeft;
console.error(this.fullScreenAdList); //数量为0,说明没有加载上

    //console.log(this.fullScreenAdList.getChildAt(0)['x']);console.error("this.fullScreenAdList量 子物体数量 =  " + this.fullScreenAdList.numChildren);  //数量为0,说明没有加载上console.error("this.adItemList[0].x 子物体数量 =  " + this.adItemList[0].x);  //数量为0,说明没有加载上this.adItemList[0].x;
}

进度条progress 和 滑动条Slider 和 复选框CheckBox


Progress
this.progress < this.progressLimit ? this.progress += .3 * this.deltaTime : (this.allResLoadFinished && Ad.Ins.isComplete) ? this.progress += .5 * this.deltaTime : this.progress < .98 && (this.progress += .01 * this.deltaTime);
this.progress <= 1 && (this.percent.changeText(Math.ceil(100 * this.progress) + “%”), this.percent.x = 95 + 440 * this.progress);
this.progress >= 1 && (!this.openNextScene && (this.loadMainScene(), Laya.timer.clearAll(this), console.log(“haha test”)));
this.prog1.value = this.progress;
//this.progress < this.progressLimit ? this.progress += .3 * this.deltaTime : (this.allResLoadFinished && Ad.Ins.isComplete) ? this.progress += .5 * this.deltaTime : this.progress < .98 && (this.progress += .01 * this.deltaTime);可以理解为第一个判断?否则后有一次的判断?
CheckBox
// if(this.RewordCheckBox[0].selected == true){} //多个的时候用数组进行判断是否选中
if( this.RewordCheckBox.selected == true){ //只有一个的时候判断是否选中
//label_show.text = “已选中”;
this.TimerTemp = 2;
} else {
//label_show.text = “未选中”;
this.TimerTemp = 1;
}

滑动条Slider
this.slider.value = ???

暴走小球 加载U3D导出场景,和对场景的控制

import GameUI from “./…/…/script/GameUI”
/*球的状态 Player是球/
export enum EBallState {
Idle,
Moving,
Draw,
Stop
}

export default class Player extends Laya.Script3D {

/**当前最大力度*/
public froceScale: number = 0.5;public hp = 5;
public isMain = true;
get curBallState() {return this.ballState };
private ballState: EBallState = EBallState.Idle;rigi: Laya.Rigidbody3D;
player: Laya.Sprite3D;
dicPoint: Laya.Sprite3D;
arrow: Laya.Sprite3D;
arrowPoint: Laya.Sprite3D;
private mesh: Laya.MeshSprite3D;
private curParticle: Laya.ShuriKenParticle3D; // 当前的粒子特效
private particle: Laya.ShuriKenParticle3D; // 粒子特效
private particleFire: Laya.ShuriKenParticle3D; // 粒子特效startPos = new Laya.Vector3();
constructor() {super();}
onStart() {window["player"] = this;this.rigi = this.owner.getComponent(Laya.Rigidbody3D);this.mesh = this.owner as Laya.MeshSprite3D;this.mesh.meshRenderer.castShadow = true;this.rigi.restitution = 1;//获取弹力。 设置弹力。this.rigi.linearVelocity = new Laya.Vector3();//获取线速度。 设置速度。this.rigi.angularVelocity = new Laya.Vector3();获取角速度。 设置角速度this.rigi.angularFactor = new Laya.Vector3(0, 1, 0);获取角因子。 设置角因子。this.rigi.linearFactor = new Laya.Vector3(1, 1, 1);//获取线因子。 设置线因子。this.rigi.isKinematic = false;/*获取是否为运动物体,如果为true仅可通过transform属性移动物体,而非其他力相关属性*/this.rigi.ccdMotionThreshold = 0;  /*获取用于连续碰撞检测(CCD)的速度阈值,当速度小于此值时,不进行检测*/this.rigi.mass = 1;this.player = this.owner as Laya.Sprite3D;let pos = this.player.transform.position;pos.cloneTo(this.startPos);    //克隆(克隆源)this.dicPoint = this.player.getChildByName("dic") as Laya.Sprite3D;this.arrow = this.player.getChildByName("arrow") as Laya.Sprite3D;this.arrowPoint = this.dicPoint.getChildByName("Plane").getChildByName("arrowPoint") as Laya.Sprite3D;this.particle = this.player.getChildByName("Particle") as Laya.ShuriKenParticle3D;this.particleFire = this.player.getChildByName("ParticleFire") as Laya.ShuriKenParticle3D;this.particle.particleSystem.stop();this.particleFire.particleSystem.stop();this.curParticle = this.particle;// this.particle.active = false;this.rigi.isKinematic = false;this.init();//this.loadParticle();
}
setBallSkin(e) {if (e.mesh == "") {return;}let mat: Laya.BlinnPhongMaterial = this.mesh.meshRenderer.material as Laya.BlinnPhongMaterial;let urlT = 'subpackages/ballSkin/Textures/' + e.texture;Laya.Texture2D.load(urlT, Laya.Handler.create(this, function (texture: Laya.Texture2D): void {mat.albedoTexture = texture;}));// let skinurl = "subpackages/ballSkin/LayaScene_outbraekBallSkin/Conventional/outbraekBallSkin.lh";let skinurl = "subpackages/ballSkin/LayaScene_outbraekBallSkin/Conventional/Assets/Textures/Ball_ALL-Ball_" + e.mesh; //Unity3D场景加载 // 加载球的皮肤模型网格Laya.Mesh.load(skinurl, Laya.Handler.create(this, (skinMesh: Laya.Mesh) => {console.log("加载球的皮肤模型");// console.log(skinMesh);this.mesh.meshFilter.sharedMesh = skinMesh;}))
}init() {this.dicPoint.transform.localScaleZ = 0;this.arrow.transform.position = this.player.transform.position;this.ballState = EBallState.Idle;this.player.transform.position = this.startPos;this.player.transform.rotationEuler = new Laya.Vector3();this.rigi.linearVelocity = new Laya.Vector3();this.rigi.angularVelocity = new Laya.Vector3();this.rigi.clearForces();this.arrow.active = true;this.dicPoint.active = true;
}
reset() {this.hp = 5;this.player.transform.position = this.startPos;this.player.transform.rotationEuler = new Laya.Vector3();this.ballState = EBallState.Idle;this.dicPoint.transform.localScaleZ = 0;this.arrow.transform.position = this.player.transform.position;this.rigi.linearVelocity = new Laya.Vector3();this.rigi.angularVelocity = new Laya.Vector3();this.arrow.active = true;this.dicPoint.active = true;this.rigi.clearForces();}showParticle() {this.curParticle.particleSystem.play();
}
hidePatticle() {this.curParticle.particleSystem.stop();}
/**切换粒子特效 true:火粒子 */
switchParticle(isFire: boolean) {this.curParticle = isFire ? this.particleFire : this.particle;
}
revivePlayer() {this.hp = 5;
}private arrowControlTmp = new Laya.Vector3();
arrowControl(angleOfLine, docZ) {this.arrowControlTmp.x = 0;this.arrowControlTmp.y = (-angleOfLine) + 90;this.arrowControlTmp.z = 0;this.player.transform.rotationEuler = this.arrowControlTmp; // new Laya.Vector3(0, (-angleOfLine) + 90, 0)this.dicPoint.transform.localScaleZ = docZ;// 箭头移动可以用九宫格或者UI的方式解决 未研究this.arrow.transform.position = this.arrowPoint.transform.position;
}readyGo() {if (this.ballState == EBallState.Idle)this.ballState = EBallState.Draw;
}private ballForward = new Laya.Vector3();
/**给球一个力的大小 让他射出去 */
shootBall(dis) {this.ballState = EBallState.Moving;this.arrow.active = false;this.dicPoint.active = false;// let forword: Laya.Vector3 = new Laya.Vector3();this.player.transform.getForward(this.ballForward);// console.log(forword, this.player.transform.rotationEuler);let force = -dis * this.froceScale;this.ballForward.x *= force;this.ballForward.y *= force;this.ballForward.z *= force;this.rigi.applyImpulse(this.ballForward)this.showParticle();
}curPos: Laya.Vector3 = new Laya.Vector3();/**检查球是否停下 true:停下 false:运动中 */
checkIsStop(): boolean {// console.log(this.player.name,this.curBallState.toString())if (this.curBallState == EBallState.Moving) {let pos = this.player.transform.position;if (Laya.Vector3.distance(this.curPos, pos) < 1) {console.log("球停下了")this.ballState = EBallState.Stop;this.stopParticle();return true;} else {this.curPos = new Laya.Vector3(pos.x, pos.y, pos.z)// console.log("球 mei 停下")// console.log(pos,this.curPos);// pos.cloneTo(this.curPos);return false;}} else {return true;}
}stopParticle() {this.hidePatticle();this.switchParticle(false);
}

}

LayBox 3D场景的加载和对里面对象的控制相关推荐

  1. 【Unity】场景异步加载、卸载

    场景异步加载.卸载: using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit ...

  2. Unity3D 场景切换加载进度条实现

    需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...

  3. Unity 多场景/大场景加载解决方法

    Unity 多场景/大场景加载解决方法 文章目录 Unity 多场景/大场景加载解决方法 前言 一.通过距离判断实现加载场景 1.1.原理: 1.2.范围检测 1.3.方法弊端 二.通过触发检测实现加 ...

  4. Unity 场景异步加载(加载界面的实现)

    前言: 玩游戏最讨厌的是什么呢?当然是游戏加载界面啦 但是你知道吗,加载界面在游戏制作中是不可或缺的,它可以使我们的场景完全加载完毕后再进入游戏,确保用户不会出现加载卡顿的情况. 如何实现一个简易的加 ...

  5. 按字段顺序加载或解析JSON对象

     1.保证json对象按put顺序加载属性 // 保证json对象按字段顺序put JSONObject jsonObject = new JSONObject(true); 原理: 2.字符串解析j ...

  6. 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...

    # 一行代码是怎么运行的 首先,java代码会被编译成字节码,字节码就是java虚拟机定义的一种编码格式,需要java虚拟机才能够解析,java虚拟机需要将字节码转换成机器码才能在cpu上执行. 我们 ...

  7. CEF3—在网页加载前给js对象填值

    文章目录 CEF3-在网页加载前给js对象填值 前言 思路 代码 CEF3-在网页加载前给js对象填值 前言 记录一次笔者在实际开发中遇到的问题.在用cef做多页应用开发的时候,多个单页共享数据的问题 ...

  8. Python 加载二进制文件到 CkByteArray 对象

    Python 加载二进制文件到 CkByteArray 对象 import chilkat zipData = chilkat.CkByteData() success = zipData.loadF ...

  9. 小程序使用threejs第五篇—室内效果3D文件的加载,可旋转查看上下四周效果

    在上一篇小程序使用threejs第四篇-加载3D模型中我们介绍了threejs加载几种3D模型,包括gltf.obj.glb等格式.但好像一直没有用的场景,最直观的场景应该是室内效果了. 解决思路 室 ...

最新文章

  1. getElementByName????????,????????,
  2. 20171019_Python学习第四天
  3. SVN用户验证,调错
  4. linux第9天 UDP
  5. 十九、前端必学Bootstrap美化(下篇)
  6. java动态代理原理
  7. 第一章 略说中医的学习与研究(6)
  8. 闲来无聊,随便看下asp.net Mvc 的收获
  9. 在实战中学习项目管理 --专栏《项目管理实战20讲》学习总结
  10. python表格控件_python--excel操作插件openpyxl
  11. nodejs 安装环境配置以及解决‘node‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
  12. 宝宝生活点滴(12.3)
  13. matlab用我爱你绘制立体桃心,用MATLAB画心形图案
  14. 《可复制的领导力》读书笔记
  15. 软件测试学习心得-5
  16. Redis上踩过的一些坑-美团
  17. 汉字在计算机中的表示
  18. python浏览器怎么设置_如何用python控制浏览器
  19. 北理工计算机系裴教授,裴明涛_北京理工大学计算机学院
  20. 【第十二篇】Flowable事件-定时器事件

热门文章

  1. python哲学翻译_从 Python 之父的对话聊起,关于知识产权、知识共享与文章翻译...
  2. 李沐读论文笔记--大模型时代下做科研的四个思路
  3. 墙王谓古哥曰 Recent GoogleGate in Classical Chinese
  4. STM32F103ZE(ADC模数转换)光照以及空气质量数据获取
  5. 《Java后端性能调优实战方案手册》,看完至少阿里P7
  6. 收集了三年的最好的设计站点
  7. KNN算法之好感度预测
  8. 全局唯一id生成器----Vesta
  9. WIN7 背景设置浅绿色 保护眼睛
  10. 『影视评论』 [电影众论]越狱中觉得比较经典的十段台词(转载)