-
直接將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
嘗試進行手動編譯編譯成功的標誌是
在
libs/modules/
路徑下有編譯出來的physics
庫文件目錄
-
wrold,plane(地平線),物體都已經設置好並且添加到world中,但是並沒有顯示圖案
可能原因:沒有給相關物理引擎中的物體綁定貼圖,綁定貼圖通過,
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,物體碰撞仍然能夠穿過物體表面
地面剛體初始化的屬性是這樣的
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
應該在和物體碰撞的時候不會發生穿破的現象
-
首先懷疑的是球體是不是沒有設置剛體的原因,將球體的
type
同樣設置成STATIC
試一下。。。。emmm發現自己是個智障,前面剛剛說了
STATIC
類型不能移動,如下圖,完全不動
-
懷疑球體
shape
形狀有問題,目前的設置是這樣的var boxShape:p2.Shape = new p2.Box({width:20,height:20})
暫時沒解決,今天有點晚,準備休息了
-
world 和 地平線,小球都設置好了,或者說怎麼讓物理引擎運動起來
可能的情況有以下幾種
- 設置剛體的
type
類型都是static
,靜態的剛體是不能有位移發生 - 沒有調
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);
- 物體沒有設置
mass
重量屬性,或者視圖綁定有問題