上周的那篇HTML5时钟竟然被推荐为热门博客,真是让我受宠若惊啊。一直想用HTML5做个小游戏,但总是没有时间,今天抽了几个小时做了个打地鼠的小游戏,体验一下HTML5上的游戏开发。本着OSC的分享精神,特分享出来。没有花时间去找更多的素材,再加上本来就不怎么会做图,出了那个地洞的素材以外其他的全是从网上搜到的。代码也比较混乱,大家就凑合着看看吧,欢迎大家批评指正,也欢迎大家能把这个小游戏做的更完善些。
废话不说了,大家先看看效果吧:
HTML文件:
<!DOCTYPE html>
<html lang="en" >
<head>
<meta charset="utf-8" />
<title>打地鼠</title>
<script type="text/javascript" src="js/game.js"></script>
</head>
<body onload="init()">
<div class="container">
<canvas onmouseover="hideCursor(this)" onmouseout="showCursor"
onmousemove="hammerMove(this);"
onmousedown="hammerDown();" onmouseUp="hammerUp();"
id="screen" width="700" height="500" style="border:1px solid #000"></canvas>
</div>
<div id="info"></div>
</body>
</html>
JS文件:
var canvas, ctx, info;
var bg;
var hammer, hamX, hamY;
var mouseState, mouseFrmLen = 10, mousePress = false;
var sprites = [], holes = [];
var score = 0;
var Sprite = function(w, h, x, y, state, image){
var self = this;
this.w = w;
this.h = h;
this.x = x;
this.y = y;
this.image = image;
this.state = state;
this.draw = function(){
if(this.state == 'show'){
ctx.drawImage(this.image, this.x, this.y, this.w, this.h);
setTimeout(function(){
self.state = 'hide';
},3000);
}
}
}
var HoleSprite = function(w, h, x, y, state, image){
var self = this;
this.w = w;
this.h = h;
this.x = x;
this.y = y;
this.image = image;
this.state = state;
this.draw = function(){
if(this.state == 'show'){
ctx.drawImage(this.image, this.x, this.y, this.w, this.h);
}
}
}
function HammerSprite(w, h, x, y, image){
HammerSprite.prototype.w = w;
HammerSprite.prototype.h = h;
HammerSprite.prototype.x = x;
HammerSprite.prototype.y = y;
HammerSprite.prototype.draw = function(isPress){
if(isPress){
ctx.save();
ctx.translate(this.x-10, this.y+34);
ctx.rotate(Math.PI/180*330);
ctx.drawImage(image, 0, 0, w, h);
ctx.restore();
}else{
ctx.drawImage(image, this.x, this.y, w, h);
}
}
}
function clearScreen(){
//ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.drawImage(bg, 0, 0, ctx.canvas.width, ctx.canvas.height);
}
function drawScreen(){
clearScreen();
//绘制得分
ctx.font = "40px serif"
ctx.strokeStyle = "#FF00ff";
ctx.strokeText ("LION打地鼠", 50,50);
ctx.fillStyle = "#000000";
ctx.fillText("LION打地鼠",50,50);
ctx.fillStyle = "#ff0000";
ctx.fillText("你的得分:"+score,450,50);
for(i=0;i<3;i++){
for(j=0; j<3; j++){
holes[i][j].draw();
}
}
for(i=0;i<3;i++){
for(j=0; j<3; j++){
sprites[i][j].draw();
}
}
if(hammer){
hammer.draw(mousePress);
}
}
function updateLogic(){
for(i=0;i<3;i++){
for(j=0; j<3; j++){
sprites[i][j].state=='hide'
}
}
var a = Math.round(Math.random()*100)%3;
var b = Math.round(Math.random()*100)%3;
sprites[a][b].state='show';
}
function hammerMove(e){
if(hammer){
hammer.x = event.x-40;
hammer.y = event.y-40;
}
}
function hit(x, y){
for(i=0;i<3;i++){
for(j=0;j<3;j++){
var s = sprites[i][j];
if(s.state=='show'){
if(x>s.x+30 && y>s.y && x<(s.x+s.w+30) && y<(s.y+s.h)){
score++;
s.state = 'hide';
}
}
}
}
}
function init(){
info = document.getElementById('info');
canvas = document.getElementById('screen');
ctx = canvas.getContext('2d');
bg = new Image();
bg.src = 'bg.jpg';
bg.onload = function(){};
var hamImg = new Image();
hamImg.src = 'hammer.png';
hamImg.onload = function(){
hammer = new HammerSprite(48, 48, 100, 100, hamImg);
}
var msImg = new Image();
msImg.src = 'mouse.png';
msImg.onload = function(){
for(i=0;i<3;i++){
var arr = [];
for(j=0; j<3; j++){
var s = new Sprite(60, 70, 50+240*i, 80+120*j, 'hide', msImg);
arr[j] = s;
}
sprites[i] = arr;
}
}
var holeImg = new Image();
holeImg.src = 'hole.png';
holeImg.onload = function(){
for(i=0;i<3;i++){
var arr = [];
for(j=0; j<3; j++){
var s = new HoleSprite(80, 30, 40+240*i, 140+120*j, 'show', holeImg);
arr[j] = s;
}
holes[i] = arr;
}
}
setInterval(drawScreen, 30);
setInterval(updateLogic, 3000);
};
function hammerDown(){
mousePress = true;
}
function hammerUp(){
info.innerHTML=event.x+':'+event.y;
mousePress = false;
hit(event.x, event.y);
}
function hideCursor(obj){
obj.style.cursor='none';
}
function showCursor(obj){
obj.style.cursor='';
}
资源图片: