摘要:不過因?yàn)闆]有隨機(jī)時(shí)間種子,所以,不管設(shè)定的時(shí)間間隔多短暫,這一個(gè)隨機(jī)序列的每個(gè)值都是新鮮隨機(jī)出來的,即與上一個(gè)隨機(jī)值重復(fù)的概率僅等于隨機(jī)范圍分之一。
作者:云荒杯傾
1、Demo功能介紹實(shí)現(xiàn)了一個(gè)圓球在800px * 600px畫布內(nèi)隨機(jī)運(yùn)動(dòng),固定時(shí)間間隔隨機(jī)運(yùn)動(dòng)一次,運(yùn)動(dòng)方向由x和y軸組成的向量決定,這個(gè)向量是隨機(jī)值(后面會(huì)稱它為隨機(jī)向量),從C語(yǔ)言代碼中的隨機(jī)函數(shù)獲取,JS代碼實(shí)現(xiàn)小球的畫布渲染、越界糾正等工作。
Demo同時(shí)實(shí)現(xiàn)了純JS(即不使用WebAssembly)和WebAssembly兩個(gè)版本,都在Demo地址中。
2、Demo地址github倉(cāng)庫(kù)
查看演示1 :一個(gè)不顯示軌跡的小球demo
查看演示2 :一個(gè)顯示運(yùn)動(dòng)軌跡的小球demo
查看演示3:一個(gè)小球平移demo
因?yàn)閐emo比較簡(jiǎn)單,也沒有什么js庫(kù)依賴,所以本庫(kù)的所有demo都是按照目錄區(qū)分的(一個(gè)目錄是一個(gè)demo,億一共四個(gè)),而沒有使用諸如src、doc、dist之類的結(jié)構(gòu)。
canvasDemo-wasm1:C代碼中未加隨機(jī)時(shí)間種子的一種實(shí)現(xiàn),因此每次刷新HTML頁(yè)面實(shí)際上產(chǎn)生的是同一個(gè)隨機(jī)序列,也就是說每次刷新頁(yè)面后,若觀察小球的運(yùn)動(dòng)軌跡,都是一樣的。不過因?yàn)闆]有隨機(jī)時(shí)間種子,所以,不管JS setInerval設(shè)定的時(shí)間間隔多短暫,這一個(gè)隨機(jī)序列的每個(gè)值都是新鮮隨機(jī)出來的,即:與上一個(gè)隨機(jī)值重復(fù)的概率僅等于隨機(jī)范圍分之一。因此,這種實(shí)現(xiàn)下,小球的運(yùn)動(dòng)軌跡在canvas內(nèi)的分布更加的均勻。
canvasDemo-wasm2 :C代碼中加了隨機(jī)時(shí)間種子的一種實(shí)現(xiàn),小球移動(dòng)不均勻,因?yàn)殡S機(jī)種子的時(shí)間粒度比較粗,而隨機(jī)運(yùn)動(dòng)的時(shí)間間隔遠(yuǎn)小于這個(gè)時(shí)間粒度,所以同一對(duì)隨機(jī)值(矢量)會(huì)連續(xù)重復(fù)好幾次,這就造成了小球某次運(yùn)行實(shí)際上并不隨機(jī)的效果。
注:上面兩種實(shí)現(xiàn)只有下面兩句C代碼的差別: #includesrand(time(NULL))
再注:wasm1和wams2兩個(gè)demo本質(zhì)是一個(gè)。僅僅是因?yàn)镃語(yǔ)言中的隨機(jī)時(shí)間種子問題,多帶帶多寫了一個(gè)。
canvasDemo-JS版本: 是canvasDemo-wasm1 demo的純JS實(shí)現(xiàn)的版本。跟wasm沒有關(guān)系。
translate-wasm:實(shí)現(xiàn)小球從左到右平移運(yùn)動(dòng)的demo,wasm實(shí)現(xiàn),使用的wasm的API,沒有用膠水代碼。
有三個(gè)函數(shù)
函數(shù)名 | 參數(shù) | 返回值 | 描述 |
---|---|---|---|
Radom | int m,int n | int x | 使用c語(yǔ)言的rand()函數(shù)生成m和n之間的整數(shù),以x返回。 |
randomInTwoSection | int m,int n | int x | 給定一個(gè)隨機(jī)區(qū)間,如果生成的隨機(jī)值在左半邊,則生成一個(gè)負(fù)的移動(dòng)值,以x返回;反之,x返回正的移動(dòng)值 |
randomGenerator | int xpos,int ypos,int radius | char* a | 給定當(dāng)前小球在畫布內(nèi)的位置:[xpos,ypos]和小球半徑,生成下一次移動(dòng)的向量,之所以有半徑參數(shù)傳入,是設(shè)定了一個(gè)規(guī)則,如果小球pos加減radius已經(jīng)到達(dá)canvas邊界,則下次移動(dòng),某個(gè)方向的隨機(jī)值必須為負(fù)。比如已經(jīng)到達(dá)左邊界,則下次運(yùn)動(dòng),X方向的隨機(jī)數(shù)必須是正數(shù),小球才會(huì)向右滾動(dòng),否則會(huì)出左邊界。 |
功能1:初始化canvas
功能2:run函數(shù),內(nèi)部是接受C代碼傳過來的隨機(jī)向量,賦給canvas的ctx.arc()以畫圓。
功能3:設(shè)定移動(dòng)變換的時(shí)間間隔。
本demo使用的emscripten編譯命令為:
emcc -o a.html a.c -Os -s WASM=1 --shell-file shell_minimal.html
執(zhí)行完,會(huì)生成,一個(gè)a.HTML,一個(gè)a.wasm,一個(gè)a.js。
加上a.c和shell_minimal.html,共五個(gè)文件。所以第3節(jié)中的random和random2目錄下都有這5個(gè)文件,為方便大家重復(fù)編譯,還附加了1個(gè)使用的編譯命令的文本文件。
說明:
(1)a.c,a.html中的a是舉例,自己開發(fā)編譯時(shí) 請(qǐng)按實(shí)際的c文件名稱和想要輸出的html文件名;
(2)-Os是優(yōu)化參數(shù),生成的a.js是已經(jīng)壓縮過的,這是膠水代碼,它里面有引用生成的a.wasm,有使用WebAssembly API,如WebAssembly.memory和WebAssembly.Table()等;不加就不壓縮,js體積變大;
(3)shell_minimal.html是模板文件,7KB大小,有一些膠水代碼,按官方說法,不建議自己寫模板。關(guān)于到底使用什么開發(fā)模式,用asm?用wasm?用wasm的話用不用膠水代碼?這幾個(gè)問號(hào)分別對(duì)應(yīng)什么編譯命令?若想理清以上幾個(gè)問題,請(qǐng)關(guān)注以下網(wǎng)址:https://kripken.github.io/ems...
注:為啥要寫一下我demo中使用的編譯命令呢?因?yàn)閑mcc的命令選項(xiàng)實(shí)在是太多了,稍微有點(diǎn)不一樣,編譯出來的wasm就不同,導(dǎo)致報(bào)錯(cuò)之類。6、Demo使用或查看
直接運(yùn)行canvasDemo-wasm1和canvasDemo-wasm1目錄下的HTML文件應(yīng)該不行,因?yàn)槭莊tp協(xié)議,fetch之類的函數(shù)會(huì)報(bào)錯(cuò),建議git clone后到webstorm開發(fā)環(huán)境,這樣直接運(yùn)行html文件就可以了。
可以寫個(gè)node server跑一下。
或者直接用http-server庫(kù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/91935.html
摘要:寫在前面之前做過一段時(shí)間的的研究,寫過幾個(gè),并且閱讀并翻譯了很多篇官方文檔,今天對(duì)這些東西做一個(gè)總結(jié)。主要是以鏈接形式提供,并附上簡(jiǎn)短的說明。歡迎加入和技術(shù)交流群,群聊號(hào)碼 寫在前面 之前做過一段時(shí)間的WebAssembly的研究,寫過幾個(gè)WebAssembly Demo,并且閱讀并翻譯了很多篇Emscripten官方文檔,今天對(duì)這些東西做一個(gè)總結(jié)。如果有需要對(duì)這塊知識(shí)了解的同學(xué),就可...
摘要:嘗試實(shí)現(xiàn)畫出一個(gè)彈射的小球很簡(jiǎn)單,那怎么用多個(gè)小球?qū)崿F(xiàn)這樣的效果呢。 本文首發(fā)于我的博客,這是我的github,歡迎star。 ??這篇博客是模仿nest.js實(shí)現(xiàn)一個(gè)demo,由簡(jiǎn)單到復(fù)雜,來一步步的實(shí)現(xiàn)它。這里是效果預(yù)覽。我的github里邊還有很多別的前端的demo,喜歡的話可以點(diǎn)個(gè)star,你的支持就是我的動(dòng)力。 從一道面試題開始 實(shí)現(xiàn)一個(gè)半徑10px的小球在500px*5...
摘要:有些奇淫技巧玩好的話,就能提升自己的逼格,這不,一行代碼實(shí)現(xiàn)一個(gè)貪吃蛇小游戲就成了裝逼到了最高境界嘛代碼如下當(dāng)前瀏覽器不支持標(biāo)簽游戲結(jié)束我不是來裝逼的。 有些奇淫技巧玩好的話,就能提升自己的逼格,這不,一行js代碼實(shí)現(xiàn)一個(gè)貪吃蛇小游戲就成了裝逼到了最高境界嘛!代碼如下: (function(){var s = [41,40],d = 1,f = 43,x,c = document.cr...
閱讀 838·2021-09-22 15:18
閱讀 1191·2021-09-09 09:33
閱讀 2762·2019-08-30 10:56
閱讀 1197·2019-08-29 16:30
閱讀 1495·2019-08-29 13:02
閱讀 1465·2019-08-26 13:55
閱讀 1650·2019-08-26 13:41
閱讀 1948·2019-08-26 11:56