HTML5版的String Avoider小遊戲
從遊戲起始點移動滑鼠到終點位置,滑鼠移動過程繪製出移動軌跡的String平滑曲線,整個過程不能碰撞到邊界,從技術角度來說其核心就是根據滑鼠移動位置生成String線的演算法,該遊戲是ActionScript寫的Flash版,這裡將其改造成HTML5版的JavaScript實現,並增加可自定義關卡功能的一種設計思路。
String連線我是快取了300個點資訊的陣列,滑鼠移動時不斷調整300個點的新位置資訊,每次更新時先將新滑鼠點設定給第一個元素,後續更新x點時,計算其與x-1點的角度,在此方向長度為1的位置更新座標,這樣就達到了平滑曲線的效果。
除了繪製String線外還有個技術點就是監測碰撞,該Flash遊戲的邊界都是線段,因此第一想到的監測方式就是線線相交的思路,演算法可參考 ,如果以LineLine的相交思路只需要遍歷所有point間的線段,判斷是否與遊戲關卡定義的邊界線相交,但這種方式對不規則邊界就比較麻煩,監測效能也不高。
考慮到我們還需要提供使用者可DIY自定義遊戲關卡的功能,我們將採用監測顏色透明度資訊的方式,由於正常遊戲時場景無需使用者動態修改,因此邊界的資訊可提前快取到ImageData記憶體中,並且我們300個點的距離都是1,監測只需根據點進行就可以。
整個程式採用
的
拓撲圖元件,再其上透過addTopPainter新增頂層畫筆繪製曲線,當曲線碰到Node圖元時繪製成紅色,否則繪製成黃色,監聽
拓撲圖的interaction事件,在該事件中設定dirty的髒標誌,在繪製時根據dirty的標誌進行更新,採用這樣的方式可將多次變換最終聚合成一次更新,這也是圖形重新整理繪製常用的基本技巧。同時透過GraphView.setEditable(true)開啟了拓撲圖的視覺化編輯功能,使用者可隨時改變介面圖元位置和旋轉等形狀資訊,相當於自定義關卡的效果。
所有程式碼和執行效果如下:
function init(){ dataModel = new ht.DataModel(); graphView = new ht.graph.GraphView(dataModel); graphView.handleScroll = function(){}; graphView.setEditable(true); graphView.setPannable(false) view = graphView.getView(); view.style.left = '10px'; view.style.top = '10px'; view.style.width = '600px'; view.style.height = '400px'; view.style.background = 'black'; document.body.appendChild(view); createNode(20, 20, 80, 40, 'rect'); createNode(200, 300, 80, 40, 'star'); createNode(400, 100, 80, 40, 'oval'); createShape(); length = 1; count = 300; points = []; for(var i=0; i<count; i++){ points.push({x: 0, y: 0}); } view.addEventListener('mousemove', function(e){ var point = graphView.lp(e); points[0].x = point.x; points[0].y = point.y; for (var i = 1; i < count - 1; i++) { var angle = Math.atan2(points[i].y - points[i - 1].y, points[i].x - points[i - 1].x); points[i].x = points[i - 1].x + length * Math.cos(angle); points[i].y = points[i - 1].y + length * Math.sin(angle); } if(imageData){ hit = false; for (var i = 0; i < count; i++) { var x = Math.floor(points[i].x); var y = Math.floor(points[i].y); var index = (y * graphView.getWidth() + x) * 4; if(imageData.data[index+3] !== 0){ hit = true; break; } } } graphView.redraw(); }); dirty = true; imageData = null; graphView.mi(function(e){ dirty = true; }); graphView.addTopPainter(function(g){ if(dirty){ dirty = false; hit = false; imageData = g.getImageData(0, 0, graphView.getWidth(), graphView.getHeight()); ht.Default.callLater(graphView.redraw, graphView); }else{ g.beginPath(); g.lineWidth = 3; g.strokeStyle = hit ? 'red' : 'yellow'; g.moveTo(points[0].x, points[0].y); for (var i = 1; i < count - 1; i++) { g.lineTo(points[i].x, points[i].y); } g.stroke(); } }); } function createNode(x, y, w, h, shape){ var node = new ht.Node(); node.setRect(x, y, w, h); node.s({ 'shape': shape, 'select.width': 0 }); dataModel.add(node); return node; }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557424/viewspace-2218787/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於WebGL HTML5 的場景小遊戲WebHTML遊戲
- 小遊戲陷版號恐慌遊戲
- 掃雷小遊戲-網頁版遊戲網頁
- 憤怒的小鳥太空版下載遊戲遊戲
- 小遊戲大市場,運用新思維抓住 HTML5 遊戲出海變現新機遊戲HTML
- 阿里開源HTML5小遊戲開發框架Hilo實戰教程阿里HTML遊戲開發框架
- 小遊戲的前景遊戲
- MATLAB 簡易版 你畫我猜小遊戲Matlab遊戲
- 小遊戲的製作遊戲
- python手機版做小遊戲程式碼大全-python簡單小遊戲程式碼 怎麼用Python製作簡單小遊戲...Python遊戲
- iOS 小遊戲專案——數字速算升級版iOS遊戲
- Java小遊戲Java遊戲
- 桌球小遊戲遊戲
- HTML5遊戲開發過程中的二三事HTML遊戲開發
- 小遊戲的高留存套路遊戲
- 小遊戲改變世界——談談內建小遊戲的設計之道遊戲
- 隨機組句小遊戲-V1.13版本隨機遊戲
- HTML小遊戲2—— 2048網頁版(附完整原始碼)HTML遊戲網頁原始碼
- 日本遊戲批評小史:“厲害”的遊戲文化遊戲
- Facebook 小遊戲上傳的遊戲包有大小限制遊戲
- Python小遊戲2048Python遊戲
- 好玩的小遊戲推薦1遊戲
- 小CP做遊戲的新思路遊戲
- 如何做出“好玩”的小遊戲?——升級遊戲體驗遊戲
- “拼多多”版吃雞遊戲如何擊中美國“小鎮青年”遊戲
- 微信互動小遊戲:有創意的抽獎小遊戲怎麼做?遊戲
- Facebook測試、釋出和分享小遊戲(開發小遊戲)遊戲
- String方法小總結
- String和StringBuffer的幾個小程式
- Facebook Instant Game 小遊戲上傳的遊戲包有大小限制GAM遊戲
- 抖音的小遊戲大祕密遊戲
- 今日頭條的小遊戲戰術遊戲
- 微信小遊戲分包遊戲
- pygame開發小遊戲GAM遊戲
- CRAPS賭博小遊戲遊戲
- Java Swing坦克小遊戲Java遊戲
- 猜數字小遊戲遊戲
- Chrome小遊戲《Boxel Rebound》Chrome遊戲