LightBulb回顧

samael發表於2019-07-15

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,
    }
}