javascript 小遊戲小技巧教學5(場景變暗)

按下按鈕後,場景變暗,顯示遊戲結束(Game Over)

我們要呈現的效果是:按下按鈕後,場景變暗,顯示遊戲結束(Game Over)
範例網址如下:
http://www.googledrive.com/host/0B7hg_8WvMyfJOXFqZWd5V0JtSjA
中間的按鈕就是<input type="button" value="點擊遊戲就結束了!" id="btnOver">
value裡面的內容就是按鈕要顯示什麼字樣,id就是你要使用他的名稱(以英文為主)
而<style type="text/css">裡面,
用#btnOver{}來裝飾、設定這個按鈕。
中間與排版不同的就是多了z-index以及cursor兩個設定。
cursor就是滑鼠移過去時,滑鼠鼠標是什麼造型?
可以參考這篇:
http://www.w3schools.com/cssref/playit.asp?filename=playcss_cursor&preval=alias
基本上我們常用的就是cursor: pointer;也就是讓鼠標變成可以點擊的手以及cursor:default;也就是讓鼠標變成一般的白色箭頭。
至於z-index則是設定z座標,也就是物體的遠近。值越大就越靠近我們,也就是越前面。
為了讓按鈕凸顯出來,因此我刻意把z-index設很大。
這樣,就能保證按鈕在所有元件的前面了。
再來,變暗的效果的原理就是:有個黑色的背景(要與背景大小一模一樣),接著讓他慢慢顯示出來~
首先準備黑色背景的部分:
多了<div id="bgBlack" class="bg"></div>
這個是準備好做黑色背景的部分,接著是用css讓他變成黑色的
雖然是這樣說,但是我們先把它"隱藏"起來,這隱藏跟之前的dispaly:none;不同,
而是讓他的透明度為0(opacity:0)。
若你想設定別的背景色,可以參考:

http://www.w3schools.com/cssref/css_colors.asp

因為你的遊戲可能有其他物品,因此最後的黑色背景是在最前面蓋住他們。

接著就是慢慢顯示的部分了:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>小遊戲教學5</title>
<style type="text/css">
#scene_main{
    background:url(ebg.gif);
}
#desk{
    background:url(table.gif) no-repeat;
    width: 135px;
    height: 69px;
    position:absolute;
    left: 50px;
    top: 150px;
}
#door{
    background:url(door.gif) no-repeat;
    width: 60px;
    height: 82px;
    position:absolute;
    left: 270px;
    top: 44px;
}
.bg{
    background-repeat:no-repeat;
    width: 533px;
    height: 273px;
    position: absolute;
    left: 0px;
    top: 0px;
    cursor: default;
    z-index: -100;
}
#btnOver{
    position:absolute;
    left: 200px;
    top: 100px;
    z-index:1000;
    cursor: pointer;
}
#bgBlack{
    background: #000000;
    z-index:1000;
    opacity:0;
}
</style>
<script type="text/javascript">
    window.onload=function(){
        var timerOver; var speed=0.1; var opacity=0;
        var bgBlack=getById("bgBlack");
        getById("btnOver").onclick=function(){
            this.style.display="none";
            timerOver=setInterval(function(){
                if(opacity<1){
                    opacity+=speed;
                    bgBlack.style.opacity = opacity; // 大部分的瀏覽器支援
                    bgBlack.style.filter = "alpha(opacity=" + opacity + ")"; //IE使用的方法
                }else {
                    clearInterval(timerOver);
                }
            },100);
        }
        function getById(id){
            return document.getElementById(id);
        }
    }
</script>
</head>

<body>
<div id="bgBlack" class="bg"></div>
<input type="button" value="點擊遊戲就結束了!" id="btnOver">
<div id="desk"></div>
<div id="door"></div>
<div class="bg" id="scene_main"></div>
</body></html>

看<script type="text/javascript">裡面的部分,

window.onload=function(){}包住的部分是我們要做的事情。

var timerOver; var speed=0.1; var opacity=0;這幾個變數分別是計時器(用來算時間)、顯示的速度、目前的透明度。

因為opacity是0~1,因此我的作法是用計時器讓透明度從0開始加,每次加0.1直到1。

var bgBlack=getById("bgBlack");則是用bgBlack這個變數來設定黑色背景。

getById("btnOver").onclick=function(){}就是用onclick設定當按鈕被點擊後會發生的事情。

function getById(id){}是用來簡寫抓取元件的方法,請直接照抄~

為了模擬真實效果,我的情境是:按下按鈕後,按鈕會消失(隱藏),然後畫面變黑。

因此,在按鈕的onclick裡面,

我用this.style.display="none";讓按鈕被點擊後消失。

再來用timerOver做計時器的動作。

首先,計時器原本應該是長這樣:

setInterval(function(){

//你要做的事情

},100);

裡面的function(){}就是計時器要做的事情(也就是讓黑色背景慢慢顯示出來),而後面的100則代表它的速度。因為單位是1/1000,因此速度為0.1秒。你可以改變這個數值來測出你喜歡的速度。

也就是說,計時器每0.1秒會做你function裡面的事情。

然後用timerOver=setInterval(funciotn(){},100);

則是預備到時候要將計時器停掉。

什麼時候計時器要停掉呢?就是黑色背景完全顯示出來時(也就是透明度為1時)。

因此看看function()裡面的內容:

if(opacity<1){
    opacity+=speed;
    bgBlack.style.opacity = opacity; // 大部分的瀏覽器支援
    bgBlack.style.filter = "alpha(opacity=" + opacity + ")"; //IE使用的方法
}else {
    clearInterval(timerOver);
}

用id判斷透明度是否為1?如果不為1,基本上就是小於1(因為從0開始),

然後opacity+=speed;其實就是opacity=opacity+speed;

意思就是讓opacity這個變數累加speed(這邊我設定為0.1)

然後後面的bgBlack.style.opacity = opacity;跟bgBlack.style.filter = "alpha(opacity=" + opacity + ")";其實就是讓黑色背景的透明度改變。

因為IE瀏覽器比較龜毛,因此要用兩種寫法Orz

那麼什麼意思呢?

按下按鈕後,

過了0.1秒,opacity+speed=0+0.1,opacity=0.1,黑色背景的透明度變成0.1

又過了0.1秒,opacity+speed=0.1+0.1,opacity=0.2,黑色背景的透明度變成0.2

又過了0.1秒,opacity+speed=0.2+0.1,opacity=0.3,黑色背景的透明度變成0.3

依此類推,

注意!如果沒有else的部分,計時器是不會停止的!雖然不表示網頁會當掉或出錯,但是你之後可能有其他設定或處理,因此要用else的部分停止計時器。

那麼這樣下來的結果,等到opacity累加到1時,也就是沒有小於1時,就會跳到else的部分,

這時,用clearInterval(timerOver);就可以停止計時器,而整個畫面變暗的效果就達到了。

不過,光是這樣有點low,因此我在範例還是加上了顯示Game Over的部分,

結果就會變成這樣:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>小遊戲教學5</title>
<style type="text/css">
#scene_main{
    background:url(ebg.gif);
}
#desk{
    background:url(table.gif) no-repeat;
    width: 135px;
    height: 69px;
    position:absolute;
    left: 50px;
    top: 150px;
}
#door{
    background:url(door.gif) no-repeat;
    width: 60px;
    height: 82px;
    position:absolute;
    left: 270px;
    top: 44px;
}
.bg{
    background-repeat:no-repeat;
    width: 533px;
    height: 273px;
    position: absolute;
    left: 0px;
    top: 0px;
    cursor: default;
    z-index: -100;
}
#btnOver{
    position:absolute;
    left: 200px;
    top: 100px;
    z-index:1000;
    cursor: pointer;
}
#bgBlack{
    background: #000000;
    z-index:1000;
    opacity:0;
}
#lbOver{
    position:absolute;
    left: 150px;
    top: 100px;
    z-index:1002;
    color: #ff0000;
    cursor: default;
}
div{
    font-size: 48px;
    -webkit-touch-callout: none; /* iOS Safari */
    -webkit-user-select: none;   /* Chrome/Safari/Opera */
    -khtml-user-select: none;    /* Konqueror */
    -moz-user-select: none;      /* Firefox */
    -ms-user-select: none;       /* IE/Edge */
    user-select: none;           /* non-prefixed version, currently
                                      not supported by any browser */
}
.hide{
    display: none;
}
</style>
<script type="text/javascript">
    window.onload=function(){
        var timerOver; var speed=0.1; var opacity=0;
        var bgBlack=getById("bgBlack");
        getById("btnOver").onclick=function(){
            this.style.display="none";
            timerOver=setInterval(function(){
                if(opacity<1){
                    opacity+=speed;
                    bgBlack.style.opacity = opacity; // 大部分的瀏覽器支援
                    bgBlack.style.filter = "alpha(opacity=" + opacity + ")"; //IE使用的方法
                }else {
                    getById("lbOver").style.display="block";
                    clearInterval(timerOver);
                }
            },100);
        }
        function getById(id){
            return document.getElementById(id);
        }
    }
</script>
</head>

<body>
<div id="lbOver" class="hide">Game Over</div>
<div id="bgBlack" class="bg"></div>
<input type="button" value="點擊遊戲就結束了!" id="btnOver">
<div id="desk"></div>
<div id="door"></div>
<div class="bg" id="scene_main"></div>
</body></html>

多了<div id="lbOver" class="hide">Game Over</div>

以及設定這個div的css:

#lbOver{
    position:absolute;
    left: 150px;
    top: 100px;
    z-index:1002;
    color: #ff0000;
    cursor: default;
}
div{
    font-size: 48px;
    -webkit-touch-callout: none; /* iOS Safari */
    -webkit-user-select: none;   /* Chrome/Safari/Opera */
    -khtml-user-select: none;    /* Konqueror */
    -moz-user-select: none;      /* Firefox */
    -ms-user-select: none;       /* IE/Edge */
    user-select: none;           /* non-prefixed version, currently
                                      not supported by any browser */
}
.hide{
    display: none;
}

看#lbOver這部分,是單就lbOver這個div的設定。

這裡多了color: #ff0000;

也就是讓這個字用紅色顯示。一樣,如果想要字體不同顏色,可以去上面的網址查色碼。

而font-size就是改變字的大小。一般使用的字體大小是12px,而字體有很多單位,我習慣是用px,可以改變數字達到你喜歡的字體大小。

接著有個div{}一大串的css設定,那個是用來讓文字無法反白的方法。

在網頁上,只要是文字通常都可以反白,因此用上這樣的css就可以不讓文字反白。

為什麼要這樣做呢?這是讓使用者有玩遊戲的一致性或使用者經驗。

除了可以點擊的東西外,其他區域的鼠標都應該是cursor:default,而如果你點擊的物品會反白,會讓使用者覺得很奇怪,

因此這麼做就不會有使用者狂點結果反白物品的情況了。

再來.hide的部分就是之前說到的隱藏,在lbOver上加入class="hide"先讓Game Over字樣隱藏。

那麼,什麼時候,Game Over的字會顯示出來呢?

也就是黑色背景完全顯示出來的時候。

因此,在else裡面加入getById("lbOver").style.display="block";

這個範例就完成了!!!

如果想要用白色背景呢?

簡單,

將黑色背景的色碼改掉就好(不用改id):

#bgBlack{
    background: #FFFFFF;
    z-index:1000;
    opacity:0;
}

那麼效果就會是這樣:

http://www.googledrive.com/host/0B7hg_8WvMyfJdks5Z3pEbkhHU2c

通常Game Over是變暗,Success是變白,當然你也可以用自己喜歡的背景而非變黑變白。

而變換的速度也可以調整變數或計時器速度來達到你喜歡的感覺。

舉例:

http://www.googledrive.com/host/0B7hg_8WvMyfJN1B5VjBURkhEQWc

你會發現變暗的速度非~常緩慢!這是因為我把speed調成0.01了,當然,我是讓你感受改變速度的感覺,如果把這變數數值調大,當然速度就會變快。不過,不要調到超過1呀!因為透明度是0~1的範圍!

那麼,久久才發一次的教學文就先這樣囉~

下一個教學應該是跟物品欄有關!雖然是換湯不換藥啦XDDD