雙人撲克-技術文檔(2)11.7-11.11.md

1. 使用canvas截取部分精靈圖,并且轉成base64

原本使用drawImage()無法獲取單張撲克牌。發現錯誤原因:參數錯誤。
應該采用如下參數表,才能實現截取圖像功能:

drawImage(image,sourceX,sourceY,sourceWidth,sourceHeight,destX,destY,destWidth, destHeight)

2.1 牌面取值問題

按順序賦值,用序號模13得到牌面值

2.2 對牌進行排序

出現的問題:序號值模13之后,A~Q的排列沒有問題,但是K的順序有誤,因為K模13之后得0。
解決方法:對sort()中的function進行改造

// 目標順序: 大王小王在最左, A~K依次排列
function compare(value1, value2) {
 if((value2%13) == 0){
   return -1;
 } else if ((value1%13) == 0){
   return 1;
 } else if(value1 == 53 || value1 == 54){
   return -1;
 } else if(value2 == 53 || value2 == 54){
   return 1;
 } else if ((value1)%13 < (value2)%13 ) {
   return -1;
 } else if ((value1)%13 > (value2)%13) {
   return 1;
 } else {
   return 0;
 }
}

3. 遮罩層半透明,內容不透明

問題:在編寫登錄遮罩層與等待遮罩層到時候,把兩個div容器的opacity設置為了0.3,導致內容也出現了半透明效果。
解決方法:用div的background: rgba()屬性實現div的半透明效果。

4.flexbox的隱藏效果

問題:在使用逐級顯現的flexbox時,在類樣式中設置display:none無效,錯誤原因為與display:flex相沖突,使得隱藏效果無法實現。
解決方法:給flexbox添加外層div用來實現display:none的效果。

JS打亂數組最高效的方法

var arr=[];
for(var i=0;i<100;i++){
arr[i]=i;
}
arr.sort(function(){ return 0.5 - Math.random() })
var str=arr.join();
alert(str);

js數組的有序排列

升序排列

function compare(value1, value2) {

   if (value1 < value2) {

       return 1;

   } else if (value1 > value2) {

       return -1;

   } else {

       return 0;

   }

}

var values = [0, 1, 2, 5, 10, 15];

values.sort(compare);

alert(values);  //15,10,5,1,0

狀態機的邏輯封裝

對象設置一個變量 status,使用switch判別status的不同值,執行不同狀態下的操作。

狀態機

把一個對象的行為分解成為易于處理的“塊”或狀態。
狀態機的實現:
判斷當前狀態,執行當前點擊事件應該發生的動作;判斷狀態更改條件是否符合,修改狀態。
使用switch語句來表達狀態的代碼如下:

switch ($state) {
    case STATE_RUNAWAY : // 逃跑狀態
        // 躲避敵人
        // 若安全,進入巡邏狀態
        break;
    case STATE_PATROL :  // 巡邏狀態
        // 巡邏
        // 若遇到比自己強的敵人,進入逃跑狀態
        // 若遇到比自己弱的敵人,進入攻擊狀態
        break;
    case STATE_ATTACK : // 攻擊狀態
        // 若攻擊比自己強的敵人,進入逃跑狀態
        // 否則取其首級
        break;
    // etc...
}

狀態變換表

屏幕快照 2016-11-18 下午11.27.30.png

參考資料:有限狀態機的實現

點擊事件

e.target 是目標對象,e.event是目標所發生的事件。
target屬性的返回值是Element類型,返回最初觸發事件的DOM元素。
event.target.tagName 獲取元素標簽

event.target.id 獲取元素id
event.target.attr('class') 獲取元素的類名(jquery方式)

event.target[0].className; 獲取元素類名(原生JavaScript方式)
這里調用this無效.
$(
this
).index() 或者
$('.a').index(this); 獲取當前元素在當前class下的次序

通過e.target來對文檔元素進行操作

e.target返回的類型是一個對象,{},而不是一個文檔元素

可以直接調用該對象的屬性值,也可以直接修改對象的屬性值。

通過對屬性值賦值,可以實現對該對象的操作,間接改變這個文檔元素的css與js操作。這個對象沒有具體方法。


var tag = e.target ;

var cname =  tag.className;

cname += " chosen";

數組的深度拷貝

1、使用slice()
可使用slice()進行復制,因為slice()返回也是數組。


var array1 = new Array("1","2","3"); 
var array2; array2 = array1.slice(0); 
array1.length = 0; alert(array2); //返回1、2、3  

2、 使用concat()
注意concat()返回的并不是調用函數的Array,而是一個新的Array,所以可以利用這一點進行復制。

var array1 = new Array("1","2","3"); 
var array2; array2 = array1.concat(); 
array1.length = 0; alert(array2); //返回1、2、3
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,809評論 1 92
  • 1.JQuery 基礎 改變web開發人員創造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,379評論 0 2
  • <a name='html'>HTML</a> Doctype作用?標準模式與兼容模式各有什么區別? (1)、<...
    clark124閱讀 3,567評論 1 19
  • 1.JQuery 基礎 改變web開發人員創造搞交互性界面的方式。設計者無需花費時間糾纏JS復雜的高級特性。 1....
    LaBaby_閱讀 1,200評論 0 1
  • 如果五臟評選勞模…… 近日 君主之官心,頗為頭疼,因為明天就是五一“勞動節”了,可是究竟選誰當“勞模”,仍然舉棋不...
    常生灸舍閱讀 227評論 0 0