菜鳥做HTML5小游戲 - 翻翻樂


記錄下開放過程。做小游戲開發,又要跨平台,flash又不支持iPhone,html5是最好的選擇。

先看看最后效果:

 好了,開始demo。

1.准備工作:

 圖片素材(省略...最后代碼一起打包

   了解 HTML5 Canvas API

2.開工:

 首先創建Canvas

1 <div style=" background-image:url(sudoku-bg.png); width:590px; height:632px; position:relative">
2     <canvas id="CanvasCup" width="540" height="500"></canvas>
3 </div>

   ok,簡單明了,現在要搞清楚的是擺放9張圖片到Canvas,計算下x,y坐標,下面我定義一個數組

    var bgImg=[];
    bgImg[0]=[20,0];
    bgImg[1]=[190,0];
    bgImg[2]=[360,0];
    bgImg[3]=[20,170];
    bgImg[4]=[190,170];
    bgImg[5]=[360,170];
    bgImg[6]=[20,340];
    bgImg[7]=[190,340];
    bgImg[8]=[360,340];

   要畫在Canvas上面,直接循環下即可,首先定義下 Canvas對象,Image對象,初始化Image對象高,寬

  var imageWidth = 150;  var imageheight = 150;,然后調用HTML5 Canvas API 去繪畫

var canvas =document.getElementById("CanvasCup");      
var context2D = canvas.getContext("2d");
var pic = new Image();   
pic.src = "bg.png";  //注意目錄結構,這里是把圖片和html放在一個目錄
for(var i =0;i<9;i++){
    pic.onload = function(){
    context2D.drawImage(pic,bgImg[i][0], bgImg[i][1],imageWidth,imageheight);
}
}

   好了,現在就可以看到9張圖片擺放的整整齊齊。

  接下來的動作就是動畫效果,從第1~9張圖片 一張一張 向中間移動,既然要向中間移動的話就要知道中間的坐標位置,就是bgImg[4]=[190,170];第一張坐標是bgImg[1]=[20,0] ,相當於是從20移動到190,0移動到170,移動的時候按Speed計算,這里我把速度初始化為 Speed = 1,fps = 1000的話 ,那么1毫秒x移動1個單位,y移動1個單位。第二的時候 x坐標等於190,y坐標0,相對中心點而言,只需移動y坐標即可,以此類推。最后去維護一個setInterval函數

 

 1 function draw(){
 2     if( iy+Speed == CenterPint[1] || ix + Speed == CenterPint[0] || ix == CenterPint[0] && iy == CenterPint[1]  ){
 3                     if(t<9){t++; ix = bgImg[t][0]; iy = bgImg[t][1];}
 4                 }  
 5     if(ix != CenterPint[0]){
 6        CenterPint[0]-ix > 0 ?  ix = ix + Speed : ix = ix - Speed;
 7  8     if(iy != CenterPint[1]){
 9        CenterPint[1]-iy > 0 ?  iy = iy + Speed :  iy = iy - Speed; 
10 11 
12    context2D.clearRect(0,0,canvas.getAttribute("width"),canvas.getAttribute("height"));
13             if( t >= 4) {context2D.drawImage(pic,bgImg[4][0], bgImg[4][1],imageWidth,imageheight);};
14             for(var i =0;i<9;i++){
15                 if( t < i ){
16                     context2D.drawImage(pic,bgImg[i][0], bgImg[i][1],imageWidth,imageheight);
17                 }
18             }
19             context2D.save();//保存畫筆狀態
20             context2D.translate(ix ,iy);
21             context2D.drawImage(pic,0, 0,imageWidth,imageheight);  
22             context2D.restore();//繪制結束以后,恢復畫筆狀態
23
24}interval = setInterval(draw, 1000/fps);  

 這樣就可以實現動畫效果了。(截圖的時候正在移動.....)

最終都會移動到中心點集合。現在又要返回去移動到原來的9個點的坐標,就是從中心點向外移動。原理與正方向移動一樣,這里還需要維護一個正方向和反方向的bool,反方向時候的第一次初始化x,y, 這里我重新改造下draw函數,增加反方向到最后一個的時候 增加點擊事件

 1 var direction = true; //true正面轉動,false 反面轉動  stop(); return;
 2 var bool = true;  //維護反方向 x坐標 第一次初始化賦值
 3 var booly = true; //維護反方向 y坐標 第一次初始化賦值 
 4 function draw(){
 5             if(t > 8){ direction=false;t--;ix = bgImg[t][0]; iy = bgImg[t][1];}
 6             if(t < 0){ direction=true; t++; stop(); boxclick(canvas,context2D); return;}//點擊事件
 7             if(direction){
 8                 if( iy+Speed == CenterPint[1] || ix + Speed == CenterPint[0] || ix == CenterPint[0] && iy == CenterPint[1]  ){
 9                     if(t<9){t++; ix = bgImg[t][0]; iy = bgImg[t][1];}
10                 }
11             }
12             else{
13                 if(iy+Speed == bgImg[t][1] || ix+Speed == bgImg[t][0] || ix == CenterPint[0] && iy == CenterPint[1])
14                     if(t>=0){t--; ix = bgImg[t][0];iy = bgImg[t][1]; bool=true; booly=true;}
15             }
16             if(ix != CenterPint[0]){
17               if(direction){CenterPint[0]-ix > 0 ?  ix = ix + Speed : ix = ix - Speed;}
18               else{
19                    if(CenterPint[0]-ix < 0){
20                          if(bool){ 
21                             bool =false;
22                             ix = CenterPint[0];
23                          }
24                          ix = ix+ Speed;
25                     }
26                     else { if(bool){ 
27                         bool =false;ix = CenterPint[0];
28                      }
29                      ix = ix- Speed;}
30                 }
31             }
32             if(iy != CenterPint[1]){
33               if(direction){
34                     CenterPint[1]-iy > 0 ?  iy = iy + Speed :  iy = iy - Speed;}
35               else{
36                    if(CenterPint[1]-iy < 0){
37                          if(booly){ 
38                             booly =false;
39                             iy = CenterPint[1];
40                          }
41                          iy = iy+ Speed;
42                     }
43                         else { if(booly){ 
44                             booly =false;iy = CenterPint[1];
45                          }
46                          iy = iy - Speed;
47                     }
48                }
49             }
50             context2D.clearRect(0,0,canvas.getAttribute("width"),canvas.getAttribute("height"));
51             if( t >= 4) {context2D.drawImage(pic,bgImg[4][0], bgImg[4][1],imageWidth,imageheight);};
52             for(var i =0;i<9;i++){
53                 if( t < i ){
54                     context2D.drawImage(pic,bgImg[i][0], bgImg[i][1],imageWidth,imageheight);
55                 }
56             }
57             context2D.save();//保存畫筆狀態
58             context2D.translate(ix ,iy);
59             context2D.drawImage(pic,0, 0,imageWidth,imageheight);  
60             context2D.restore();//繪制結束以后,恢復畫筆狀態
61         }
62         interval = setInterval(draw, 1000/fps);

 下面是點擊事件函數,當點擊的時候獲取到點擊的坐標,然后去判斷坐標區域在9個坐標的哪個坐標范圍內,再進行圖片替換。我這里是demo就直接圖片替換了,做成抽獎的話,還需要通過后台概率,然后返回前端去顯示對應的圖片。

 1 function boxclick(canvas,context2D){
 2         canvas.onclick = function(e) {
 3             var canvasOffset = $(canvas).offset();
 4             var canvasX = Math.floor(e.pageX - canvasOffset.left);
 5             var canvasY = Math.floor(e.pageY - canvasOffset.top);
 6             //console.log("x:"+canvasX +"   y:"+canvasY);
 7             var p = new Image();   
 8             p.src = "get-2.png";  //注意目錄結構,這里是把圖片和html放在一個目錄的
 9             lottery(canvasX,canvasY,context2D,p);
10         }
11     }
12     function lottery(x,y,context2D,p){
13         //alert("x:"+x+"y:"+y);    
14         for(var i =0;i<9;i++){
15             var w = bgImg[i][0] + imageWidth;
16             var h = bgImg[i][1] + imageheight;
17             
18             if(bgImg[i][0] <=x && x <= w && bgImg[i][1]<=y && y<=h)
19             {
20                 console.log("p:"+i);
21                 var pWidth = bgImg[i][0];
22                 var pHeight = bgImg[i][1];
23                 p.onload = function(){
24                     context2D.drawImage(p,pWidth,pHeight,imageWidth,imageheight);
25                 }
26             }
27         }
28     }
29     function stop(){
30         clearInterval(interval);
31     }

請各位大牛們指點,小弟在此由衷的感謝。

 附件:源代碼 下載

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM