LightBulb回顾
最近帮朋友做在做一个超休闲的物理游戏, 在Android与微信小游戏上发布, 制作过中的一些小问题总结一下, 使用引擎是cocos creator
共有问题
- 谨慎使用物理世界中的rayCast, 如果没有物理碰撞效果的, 可以尝试与cocos自带的碰撞组件进行组合使用
- cc.Graphics效率并不高,
- 对于不同的版本UI设置可能些不一样, 可以通过组件继承的方式进行
// GameUIWX
cc.Class({
extends: require('GameUI'), // <= 继承自GameUI
properties: {},
onGameReady() {
this._super() // <= 父类
},
})
微信小游戏
- 微信小游戏子域中背景不透明
子域工程中的摄像机改为透明 - 包体超出限制
使用腾讯云的COS进行远程资源的下载, 注意区别版本号, 并用md5 cached
Android
- 如果release下有些JSB接口调用不了要修改proguard-rules.pro 把相关的代码混乱进行忽略
-keep public class main.** { *; }
-keep public class com.janusgames.lightbulb.** { *; }
TIPS
绘制瞄准线的代码
IMG_5081
rayCast(p1, p2) {
var manager = cc.director.getPhysicsManager();
var result = manager.rayCast(p1, p2, cc.RayCastType.Closest)
//[0];
if (result.length > 0) {
result = result[0]
} else {
result = null
}
if (result && result.collider.node.group == 'line') {
p2 = result.point;
this.ctx.circle(p2.x, p2.y, 5);
}
//获得从start到end的向量
var line = p2.sub(p1)
//获得这个向量的长度
var lineLength = line.mag()
//根据每条线段的长度获得一个增量向量
let length = 45
var increment = line.normalize().mul(length)
//确定现在是画线还是留空的bool
var drawingLine = true
// 临时变量
var pos = p1.clone()
//只要线段长度还大于每条线段的长度
for (; lineLength > length; lineLength -= length) {
//画线
if (drawingLine) {
this.ctx.circle(pos.x, pos.y, 5)
pos.addSelf(increment)
this.ctx.fill()
}
//留空
else {
pos.addSelf(increment)
}
//取反
drawingLine = !drawingLine
}
if (!result) return;
if (result.collider.node.group != 'line') return
// 反射
let l = p2.sub(p1)
let n = result.normal.normalize()
var r = l.sub(n.mul(n.dot(l)).mul(2)).mul(500).add(p2)
p1 = p2;
// 返回停止点
// 多次组合可以实现反射的效果
return {
p1: p1,
p2: r,
}
}
网友评论