<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        怎樣用JS編寫模擬器

        來源:懂視網 責編:小采 時間:2020-11-27 20:01:24
        文檔

        怎樣用JS編寫模擬器

        怎樣用JS編寫模擬器:這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。0x00 CHIP8簡介我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的
        推薦度:
        導讀怎樣用JS編寫模擬器:這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。0x00 CHIP8簡介我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的

        這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。

        0x00 CHIP8簡介

        我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的出現讓電子游戲編程變得簡單些了(相對于那個年代來說)。用CHIP8實現的電子游戲有,比如小蜜蜂,俄羅斯方塊,吃豆人等。更多可以前往CHIP8的Wiki了解。

        0x01 創建CHIP8對象

        我們假設CHIP8是由處理器、鍵盤、顯示屏與揚聲器組成,其中CPU是CHIP8核心,那么代碼應該像這樣的:

        <!DOCTYPE html><html><head> 
         <title>創建Chip8對象</title></head><body> 
         <script>
         (function () { function CPU() {/*...*/ }; function Screen() {/*...*/ }; function Keyboard() {/*...*/ }; function Speaker(){/*...*/ }; window.CHIP8 = function () { var c8 = new CPU();
         c8.screen = new Screen();
         c8.speaker = new Speaker();
         c8.input = new Keyboard(); return c8;
         };
         })(); </script></body></html>

        0x02 編寫簡單的顯示屏

        根據CHIP8的Wiki可以了解到,CHIP8顯示分辨率是64X32的像素,并且是單色的。某像素點為1則屏幕上顯示相應像素點,為0則不顯示。但某個像素點由有到無則進位標識被設置為1,可以用來進行沖撞檢測。
        那么代碼應該像這樣:

        function Screen() { this.rows = 32;//32行
         this.columns = 64;//64列
         this.resolution = this.rows * this.columns;//分辨率
         this.bitMap = new Array(this.resolution);//像素點陣
         this.clear = function () { this.bitMap = new Array(this.resolution);
         } this.render = function () { };//顯示渲染
         this.setPixel = function (x, y) {//在屏幕坐標(x,y)進行計算與顯示
         // 顯示溢出處理
         if (x > this.columns - 1) while (x > this.columns - 1) x -= this.columns; if (x < 0) while (x < 0) x += this.columns; if (y > this.rows - 1) while (y > this.rows - 1) y -= this.rows; if (y < 0) while (y < 0) y += this.rows; //獲取點陣索引
         var location = x + (y * this.columns); //反向顯示,假設二值顏色黑白分別用1、0代表,那么值為1那么就將值設置成0,同理0的話變成1
         this.bitMap[location] = this.bitMap[location] ^ 1; return !this.bitMap[location];
         }
        };

        編寫好顯示模塊我們編寫顯示屏來測試顯示模塊(在線查看屏幕測試):

        var chip8 = CHIP8();
        chip8.screen.render = function () {//自定義實現顯示渲染
         var boxs = document.getElementById("boxs");
         boxs.innerHTML = ""; for (var i of this.bitMap) { var d = document.createElement("span");
         d.style = "width: 5px;height: 5px;float: left;";
         d.style.backgroundColor = i ? "#000" : "#fff";
         boxs.appendChild(d);
         }
        };/** 測試 **/chip8.screen.setPixel(2, 2);//設置x,y坐標像素chip8.screen.render();
        chip8.screen.setPixel(2, 2);//設置x,y坐標像素

        0x03 編寫揚聲器

        這里需要參考 Web APIs:

        API https://developer.mozilla.org/en-US/docs/Web/API/AudioContext
        API https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode

        示例 https://mdn.github.io/violent-theremin/

        示例 https://codepen.io/gregh/pen/LxJEaj

        揚聲器也十分簡單:

        function Speaker() { var contextClass = (window.AudioContext || window.webkitAudioContext || window.mozAudioContext || window.oAudioContext || window.msAudioContext)
         , context
         , oscillator
         , gain; 
         if (contextClass) {
         context = new contextClass();
         gain = context.createGain();
         gain.connect(context.destination);
         } 
         //播放聲音
         this.play = function (frequency) { //API https://developer.mozilla.org/en-US/docs/Web/API/OscillatorNode
         //示例 https://mdn.github.io/violent-theremin/
         if (context && !oscillator) {
         oscillator = context.createOscillator();
         oscillator.frequency.value = frequency || 440;//聲音頻率 
         oscillator.type = oscillator.TRIANGLE;//波形這里用的是三角波 查看示例:https://codepen.io/gregh/pen/LxJEaj
         oscillator.connect(gain);
         oscillator.start(0);
         }
         } 
         //停止播放
         this.clear = this.stop = function () { if (oscillator) {
         oscillator.stop(0);
         oscillator.disconnect(0);
         oscillator = null;
         }
         }
        };

        編寫好揚聲器我們可以對揚聲器進行測試(在線查看揚聲器測試):

        <!DOCTYPE html><html><head> 
         <title>編寫揚聲器</title></head><body>
         頻率: <input type="range" id="frequency" value="440" min="100" max="1000">
         <label id="showfv">(440)</label>
         <button id="play_btn">播放</button>
         <script>
         (function () { function CPU() {/*...*/ }; function Screen() {/*...*/ };//略...
         function Keyboard() {/*...*/ }; function Speaker() {/*...*/};//略...
         window.CHIP8 = function () { var c8 = new CPU();
         c8.screen = new Screen();
         c8.speaker = new Speaker();
         c8.input = new Keyboard(); return c8;
         };
         })(); var chip8 = CHIP8(); //=======
         var f = document.getElementById("frequency"); var isPlay = false; var play_btn = document.getElementById("play_btn");
         f.onchange = function () { var v = Number(this.value); document.getElementById("showfv").innerHTML = "(" + v + ")"; if (isPlay) {
         chip8.speaker.stop();
         chip8.speaker.play(v);
         }
         };
         play_btn.onclick = function () {
         isPlay = !isPlay; this.innerHTML = isPlay ? '停止' : '播放'; if (!isPlay) chip8.speaker.stop(); else chip8.speaker.play(f.value);
         }; </script></body></html>

        相信看了本文案例你已經掌握了方法,更多精彩請關注Gxl網其它相關文章!

        相關閱讀:

        ES6的字符串模板詳解

        ES6的變量的作用域與聲明詳解

        怎樣利用插件工具將ES6的代碼轉化成ES5

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        怎樣用JS編寫模擬器

        怎樣用JS編寫模擬器:這次給大家帶來怎樣用JS編寫模擬器,用JS編寫模擬器的注意事項有哪些,下面就是實戰案例,一起來看一下。0x00 CHIP8簡介我們根據CHIP8的Wiki可以了解到CHIP8是一種解釋性的編程語言。最初被應用是在1970年代中期。CHIP8的程序運行在CHIP8虛擬機中,它的
        推薦度:
        標簽: 使用 如何 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产综合人成综合网站| 99久久99这里只有免费费精品| 国产jizzjizz视频免费看| 亚洲人成网网址在线看| 99爱在线精品免费观看| 亚洲 日韩经典 中文字幕| 成年男女男精品免费视频网站| 亚洲粉嫩美白在线| 国产成人免费a在线视频色戒| 国产精品亚洲一区二区无码| 亚洲av无码成人精品区在线播放| 一级一级一级毛片免费毛片| 国产亚洲一区二区手机在线观看| a毛片在线免费观看| 久久精品国产亚洲AV大全| 啦啦啦高清视频在线观看免费| 亚洲精品天堂无码中文字幕| www.亚洲色图.com| 西西人体免费视频| 亚洲最新永久在线观看| 野花高清在线观看免费完整版中文 | 国产精品亚洲视频| 久久免费线看线看| 亚洲午夜国产精品| 日韩高清免费在线观看| 一区二区三区免费视频网站| 亚洲va无码专区国产乱码| 亚洲a∨国产av综合av下载| 又粗又大又硬又爽的免费视频| 精品一区二区三区高清免费观看 | 四虎影视在线看免费观看| 亚洲日韩精品一区二区三区无码| 亚洲综合免费视频| 国产精品亚洲专区在线播放| 亚洲av无码av制服另类专区| 最近中文字幕免费mv视频7| xxxxx做受大片视频免费| 亚洲乱码卡一卡二卡三| 国产成人毛片亚洲精品| 97免费人妻无码视频| 国产精品内射视频免费|