egret p2物理引擎 遇到的坑(1)

  • 直接將pythsic包丟到libs目錄下並且修改egretPropertis.json文件


TypeError [ERR_INVALID_ARG_TYPE]: The "to" argument must be of type string. Received type object
    at validateString (internal/validators.js:125:11)
    at Object.relative (path.js:493:5)
    at C:\Users\mi\AppData\Roaming\EgretLauncher\download\EgretCompiler\@egret\egret-webpack-bundler\lib\egretproject\data.js:149:34
    at Array.map (<anonymous>)
    at EgretProjectData.getModulesConfig (C:\Users\mi\AppData\Roaming\EgretLauncher\download\EgretCompiler\@egret\egret-webpack-bundler\lib\egretproject\data.js:145:51)     
    at Object.getLibsFileList (C:\Users\mi\AppData\Roaming\EgretLauncher\download\EgretCompiler\@egret\egret-webpack-bundler\lib\egretproject\index.js:8:24)
    at EgretWebpackBundler.startDevServer (C:\Users\mi\AppData\Roaming\EgretLauncher\download\EgretCompiler\@egret\egret-webpack-bundler\lib\index.js:47:38)
    at C:\Users\mi\Documents\EgretProjects\keli_go\scripts\plugins\webpack-plugin.ts:59:21
    at new Promise (<anonymous>)

原因分析

一般都是路徑有問題,沒有配置正確的p2包的具體文件路徑**,to入參接收的是對象參數

解決方案

需要在egretProperties.json文件配置具體的path路徑,具體如下:將physics.d.ts/physics.js/physics.min.js 放到 根目錄/../physics目錄下

然後將egretProperties.json添加配置項

{
      "name":"physics",
      "path":"../physics"
    }
  • 修改配置文件和地址之後雖然編譯不報錯,但是在瀏覽器創建p2對象的時候還是會有找不到p2這個對象的問題

    Main.ts:89 Uncaught (in promise) ReferenceError: p2 is not defined
        at HelloWorld../src/Main.ts.HelloWorld.createWorld (Main.ts:89:22)
        at HelloWorld.<anonymous> (Main.ts:24:10)
        at step (main.js:80:19)
        at Object.next (main.js:61:49)
        at fulfilled (main.js:51:54)
    

    解決方案:

    需要使用`egret`自帶的`wing`編輯器找到 插件-Egret項目工具-編譯引擎
    
    點擊進行編譯,編譯之後,再次打開項目即可
    
    ![截圖](9e3c157f63630e22e7e4397976151e41.png)
    

    或者使用代碼 egret build -e嘗試進行手動編譯

    編譯成功的標誌是截圖
    image

    libs/modules/路徑下有編譯出來的physics庫文件目錄


  • wrold,plane(地平線),物體都已經設置好並且添加到world中,但是並沒有顯示圖案

    截圖
    image

    可能原因:沒有給相關物理引擎中的物體綁定貼圖,綁定貼圖通過,p2.Body對象的displays屬性進行綁定,示例

    this.display =  new egret.Shape()
        this.display.x = 100
        this.display.graphics.beginFill(0xff0000,1)
        this.display.graphics.drawCircle(0,0,(<p2.Box>boxShape).width)
        this.display.graphics.endFill()
        // this.display.width = (<p2.Box>bfoxShape).width
        // this.display.height = (<p2.Box>boxShape).height
        boxBody.displays = [this.display]
    

    通過綁定貼圖之後,可以看到物理引擎中的body剛體對象也有了相應的貼圖

  • 剛體設置材質爲STATIC,物體碰撞仍然能夠穿過物體表面

    2.gif
    image


地面剛體初始化的屬性是這樣的

new p2.Body({
      type:p2.Body.STATIC,
      position:[0,stageHeight -100]
    })

球體剛體初始化的屬性是這樣的

new p2.Body({ mass: 1, position: [200, 200], angularVelocity: 1})

這裏剛體的type一共有三種類型:

Dynamic :動態, Dynamic類型剛體可以與任何類型的剛體交互,可以移動。

STATIC: 靜態,Static類型剛體不可以移動,但是可以與 dynamic類型剛體交互。

Kinematic: 動態剛體,Kinematic類型剛體通過設置速度來控制,其他方面則和Static剛體相同。

講道理這裏設置了STATIC應該在和物體碰撞的時候不會發生穿破的現象

  1. 首先懷疑的是球體是不是沒有設置剛體的原因,將球體的type同樣設置成 STATIC試一下

    。。。。emmm發現自己是個智障,前面剛剛說了STATIC類型不能移動,如下圖,完全不動

    截圖
    image

  2. 懷疑球體shape形狀有問題,目前的設置是這樣的

    var boxShape:p2.Shape =  new p2.Box({width:20,height:20})
    
    暫時沒解決,今天有點晚,準備休息了
    
  • world 和 地平線,小球都設置好了,或者說怎麼讓物理引擎運動起來

    截圖
    image

可能的情況有以下幾種

  1. 設置剛體的type類型都是static ,靜態的剛體是不能有位移發生
  2. 沒有調world.step()步進函數,使物理世界按照公式軌跡運行,使用定時器,或者在egret幀刷新事件綁定step函數,並且在函數中刷新egret視圖位置
    //幀事件,步函數
      private update() {
        this.world.step(1);
        var l = this.world.bodies.length;
        for (var i:number = 0; i < l; i++) {
            var boxBody:p2.Body = this.world.bodies[i];
            var box:egret.DisplayObject = boxBody.displays[0];
            if (box) {
                //將剛體的座標和角度賦值給顯示對象
                box.x = boxBody.position[0];
                box.y = boxBody.position[1];
                //如果剛體當前狀態爲睡眠狀態,將圖片alpha設爲0.5,否則爲1
                if (boxBody.sleepState == p2.Body.SLEEPING) {
                    box.alpha = 0.5;
                }
                else {
                    box.alpha = 1;
                }
            }
        }
      }
      
      
      
      主函數中,監聽事件
      this.addEventListener(egret.Event.ENTER_FRAME,this.update,this);
    
  3. 物體沒有設置mass重量屬性,或者視圖綁定有問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章