前言
開發基於Html5的小遊戲並不困難,基本思路就是使用Html5的canvas進行遊戲影象繪製,通過監聽Dom元素的touch事件並觸發相應的動畫,來實現遊戲的互動。難在於解決開發後面臨的不同裝置遊戲畫面、音效等相容性問題。
使用Hilo可以幫助我們解決開發過程遇到的一些常見的坑。在Hilo中,所有元素包括舞臺、舞臺裡的人物物品都是一個物件,有著一些相似的屬性,如寬度、高度等。一個物件可以包括另一個子物件,如舞臺物件可以有人物等子物件。所有元素類物件都是Hilo.View類的子類。
下面通過一個手指觸控拋球動畫的例子為大家介紹一下怎麼使用Hilo來開發一個H5小遊戲。
一、 安裝
引入Hilo類庫。
<script type="javascript" src="hilo-standalone.js" ></script>
複製程式碼
二、資源預載入
預先載入各種圖片資源,提升使用者體驗。
//這裡可以加開始顯示loading動畫的邏輯
var queue = new Hilo.LoadQueue();
var resources = [
{id:'ball',type:'png',src:_ball,noCache:false,crossOrigin:'anonymous'},
{id:'ball2',type:'png',src:_ball2,noCache:false,crossOrigin:'anonymous'},
];
queue.add(resources);
queue.on('complete',function(e) {
//資源載入完成後的邏輯,比如隱藏loading
});
queue.start();
複製程式碼
三、建立舞臺
舞臺是一個各種圖形、精靈動畫等的總載體。所有用Hilo建立的可見的物件都必須新增到舞臺或其子容器後,才會被渲染和顯示出來。 舞臺實質上也是一個容器Container,不過它是一個頂級容器。它除開擁有普通容器的功能,它還擁有一些特殊屬性和方法。
- html程式碼
<div id="game-container"></div>
複製程式碼
- js程式碼
var stage = new Hilo.Stage({
renderType:'canvas',
container: document.getElementById('game-container'),
width: 480,
height: 320
});
複製程式碼
四、啟用事件互動
Hilo物件預設不允許觸發點選等事件,需要先給舞臺物件啟用。下面這段程式碼表示啟用對使用者手指開始觸控、移動、停止觸控等事件的事件監聽。
stage.enableDOMEvent(Hilo.event.POINTER_START, true);
stage.enableDOMEvent(Hilo.event.POINTER_MOVE, true);
stage.enableDOMEvent(Hilo.event.POINTER_END, true);
複製程式碼
五、建立定時器
用於不斷重新整理渲染頁面動畫
var ticker = new Hilo.Ticker(100);
ticker.addTick(stage);
ticker.addTick(Hilo.Tween);
ticker.start();
複製程式碼
六、新增舞臺元素
給舞臺新增一個元素“球”。image是資源物件,可以從預載入佇列中獲取,x是球的起始橫座標,y是球的起始縱座標,width、height分別是寬度和高度。
var ballImg = queue.getContent('ball');
ball = new Hilo.Bitmap({
image:ballImg,
x:ballX,
y:ballY,
width:trueBallWidth,
height:trueBallHeight
});
stage.addChild(ball);
複製程式碼
七、監聽觸控事件
使用者開始觸控舞臺時記錄一下觸控點的座標,觸控結束後再記錄一下此時觸控點的座標,通過這兩個座標計算出手指滑動的方向,從而控制球往哪個方向丟擲。
stage.on(Hilo.event.POINTER_START,function(e)
e.preventDefault();
currentEvent = e.changedTouches[0].identifier;
startTouchXList[currentEvent] = e.changedTouches[0].clientX;
startTouchYList[currentEvent] = e.changedTouches[0].clientY;
endTouchXList[currentEvent] = e.changedTouches[0].clientX;
endTouchYList[currentEvent] = e.changedTouches[0].clientY;
});
stage.on(Hilo.event.POINTER_MOVE,function(e)
e.preventDefault();
currentEvent = e.changedTouches[0].identifier;
endTouchXList[currentEvent] = e.changedTouches[0].clientX;
endTouchYList[currentEvent] = e.changedTouches[0].clientY;
});
stage.on(Hilo.event.POINTER_END,function(e)
e.preventDefault();
endTouchXList[currentEvent] = e.changedTouches[0].clientX;
endTouchYList[currentEvent] = e.changedTouches[0].clientY;
//拋球
throwBall(startTouchXList[currentEvent],startTouchYList[currentEvent],endTouchXList[currentEvent],endTouchYList[currentEvent]);
})
複製程式碼
八、動畫實現
實現球飛出的動畫,用Hilo.Tween.to方法來控制tmpBall物件移動。
var tmpBall = new Hilo.Bitmap({
image:ballImg,
x:ballX,
y:ballY-5,
width:trueBallWidth,
height:trueBallHeight
});
stage.addChild(tmpBall);
//球飛出
Hilo.Tween.to(tmpBall,{
x:endPoint.x,
y:endPoint.y,
width:trueBallWidth/percent,
height:trueBallWidth/percent
},{
duration:ballSpeed,
delay:0,
ease:Hilo.Ease.Linear.EaseNone,
onComplete:function() {
});
複製程式碼
參考文件
-
關注微信公眾號“全棧社群”,可獲取更多站長、開發者必備的前端、後端、運維技術乾貨。
-
18元美國VPS、建站主機:www.salasolo.com