1. 程式人生 > >消除表情小遊戲 【總結】

消除表情小遊戲 【總結】

timer 每次 amp 鼠標 tex axis isa ron 功能

需求

技術分享圖片

需求分析:

按鈕點擊-->

生成一個icon——icon默認速度下降——中途被點擊——觸碰底邊後抖動——失分加1——重頭開始

                 └中途被點擊——變成炸彈後抖動——得分加1——重頭開始

實現思路:

生成icon:html階段在遊戲區域寫好圖片標簽不賦值

js隨機生成圖片和圖片位置並給圖片賦值( 利用Math.random() ),寫一個下降函數,每次回調判斷是否被點擊和是否已經到底,如果被點擊執行抖動清除定時器return並重頭開始,如果到底調用抖動函數抖動窗口並重頭開始。

難點:

1.由於doMove函數沒有下落過程中斷的功能(雖然添加也可以,但需要改的太多),需要自己擼一個新的專用。

2.怎樣在第10個的時候先在面板上顯示並且不要抖動,顯示後在彈窗提示遊戲結束。

3.當下降速度加快時,鼠標很難點到icon

難點解決方案:

1.手寫個專用的

2.因為alert()執行級別比innerHTML高,所以利用抖動函數回調,把alert放入異步事件列表,但這樣第10個還是會抖動,可以修改抖動函數,但有點殺雞用牛刀大動幹戈的感覺,就算了。

3. 這個應該是延遲問題,視覺會延遲,所看的icon被點擊其實這是上一幀的畫面///////或者是鼠標點到了但從機械的點擊到js可以識別這過程需要花費1幀的時間或更多,導致點不到;

  *解決辦法,將icon的上方留多一點空白,點的地方可以大一點,不過這治不了本,當快到一定程度還是會點不到。

涉及的新知識:

優化方向:

圖片的參數用ajax要讓它自動獲得;

即使下降速度再快也可能被點到;

代碼依賴太強;

備註:

alert()執行級別比innerHTML高,有什麽方法可以降低alert()的執行級別呢?除了定時器,回調還有什麽方法?

連連看遊戲的實現

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title></title>

<style>

h2,p{ text-align: center; }
#btn{ display: block; margin: 10px auto; } .wrap{ position: relative; margin: 0 auto; width: 850px; height: 450px; } #playArea{ overflow: hidden; position: absolute; margin: 0 auto; width: 850px; height: 450px; background: #fff; border: 1px solid #000 } #counter{ background: #FFEB3B; position: absolute; top: 0px; left: -161px; width: 160px; height: 80px; border: 1px solid #000; } #eIcon{ width: 24px; height: 50px; position: absolute; } </style> </head> <body> <h2>你的鼠標有多快?</h2> <p>遊戲說明:點擊“開始遊戲”,隨機掉下QQ表情,點中它,千萬別讓它掉下去!!</p> <input type="button" id="btn" value="開始遊戲" > <div class="wrap"> <div id="playArea" > <div id="eIcon"></div> </div> <div id="counter"> <p style=" margin-top: 10px;">得分:0</p> <p>失分:0</p> </div> </div> <script src="getId.js"></script> <script src="doMove.js"></script> <script src="main.js"></script> </body> </html>

var oBtn = $(‘btn‘);
oBtn.onclick = function(){

    oBtn.value = ‘正在遊戲中‘;
    oBtn.disabled = ‘disabled‘;

    setIcon();
    execute(speed);
}





//數據
var icon = [ 
            ‘img/1.png‘,
            ‘img/2.png‘,
            ‘img/3.png‘,
            ‘img/4.png‘,
            ‘img/5.png‘,
            ‘img/6.png‘,
            ‘img/7.png‘,
            ‘img/8.png‘,
            ‘img/9.png‘,
            ‘img/10.png‘,
            ‘img/11.png‘
];

//元素
var iconW = 24,
    playArea = $(‘playArea‘);
var tWidth = parseInt( getStyle(playArea,‘width‘) ),
    tHeight = parseInt( getStyle(playArea,‘height‘) ),
    eIcon = $(‘eIcon‘);



function setIcon(){
    //  挑表情    //設置表情出現的位置
    var tIcon = icon[ Math.floor( Math.random()*icon.length ) ],
        xAxle = Math.floor( Math.random()*(tWidth-iconW) ),
        yAxle = 0;

    // 設置參數
    eIcon.style.backgroundImage = ‘url(‘+ tIcon +‘)‘;
    eIcon.style.backgroundRepeat = ‘no-repeat‘;
    eIcon.style.backgroundPosition = ‘center 7px‘;
    eIcon.style.left = xAxle + ‘px‘;
    eIcon.style.top = yAxle + ‘px‘;

}






var speed = 1,
    cnt = 0,
    loseCnt = 1,
    counter = $(‘counter‘).getElementsByTagName(‘p‘);



function execute(tSpeed){
    //獲取icon
    var timer = null,
        timerInner = null;

    eIcon.eTop = null;



    timer = setTimeout(function timerFn(){

        //取值-加值-判斷邊界-賦值
        eIcon.eTop = parseInt( getStyle(eIcon,‘top‘) );
        eIcon.eTop += speed;
        ( eIcon.eTop > tHeight ) && ( eIcon.eTop = tHeight )
        eIcon.style.top = eIcon.eTop + ‘px‘;
        eIcon.onOff = false;

        //中途icon被點擊-禁止連續點擊-清除定時器-改圖片-增加得分-速度增加-抖動icon-回調重新生成icon-執行execute
        eIcon.onclick = function(){

            if( eIcon.onOff ){ return; }
            eIcon.onOff = true;

            clearTimeout(timer);
            clearTimeout(timerInner);

            eIcon.style.backgroundImage = ‘url(img/qq.png)‘;
            cnt++;
            counter[0].innerHTML = ‘得分:‘+cnt;

            speed++;
            shakeFn(eIcon,‘left‘,function(){
                setIcon();
                execute();
            });

        }


        //判斷邊界-true-->>繼續    false-->>清除定時器-速度增加-失分增加-增加下一次的失分
        //判斷失分邊界-true-->>允許抖動窗口  false-->>初始化各項值-“重載”抖動窗口回調-彈出窗口-面板歸零-生成-執行
        if( eIcon.eTop != tHeight ){
            timerInner = setTimeout(timerFn,30);
        }else{

            clearTimeout(timer);
            clearTimeout(timerInner);

            
            speed++;
            counter[1].innerHTML = ‘失分:‘+loseCnt;
            loseCnt++;


            if( loseCnt <= 10 ){ 
                shakeFn( playArea,‘top‘); 
            }else{
                cnt = 0;
                loseCnt = 1;
                speed = 1;
                oBtn.value = ‘開始遊戲‘;
                oBtn.disabled = ‘‘;
                shakeFn( playArea,‘top‘,function(){
                    alert(‘遊戲結束,請重新開始‘);
                    counter[0].innerHTML = ‘得分:0‘;
                    counter[1].innerHTML = ‘失分:0‘;
                }); 
                
                return;
            }

            setIcon();
            execute();


            
            

            }

            

        
        
    },30);




}











function shakeFn(obj,tAxis,endFn){
    //抖動參數
    var step = 2,
        range = 16,
        shakeArr = [];

    for(var i=range; i>0; i-=step){
        shakeArr.push(i,-i);
    }
    shakeArr.push(0);

    //抖動數組遍歷的下標
    var j = 0,
        timer = null,
        tLeft = parseInt( getStyle(obj,‘left‘) );

        console.log(tLeft);

    timer = setTimeout(function timeFn(){


        obj.style[tAxis] = (tLeft+shakeArr[j]) + ‘px‘;
        j++;


        if( j <= shakeArr.length ){
            timer.inner = setTimeout(timeFn,30);
        }else{
            (endFn) && (endFn());
            clearTimeout(timer);
            clearTimeout(timer.inner);
        }


    },30);


}

消除表情小遊戲 【總結】