原生javascript開發打字遊戲---代碼重構版本

瀏覽器支持版本:IE9+ 火狐 谷歌等

上一次使用canvas製作,代碼有些亂,這一次使用原生javascript製作,原理就是div動態生成,定時器刷新,div刪除,div重新生成,字母消失特效

由於使用addEventListener添加事件,IE9以下不支持,支持另外一種事件機制,但原理不同,暫時不考慮,等研究jQuery源碼之後,再回來修改兼容。

定時器

//定時器
window.requestAnimFrame=(function(){
	return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function( /* function FrameRequestCallback */ callback, /* DOMElement Element */ element) {
			return window.setTimeout(callback, 1000 / 60);
		};
})();//自動執行函數


字母對象

//字母對象
var letters={
	x:0,
	y:0,//字母座標
	ax:0,
	ay:0,//蘋果圖片座標
	awidth:40,
	aheight:40,//蘋果圖片寬高
	islive:false,
	key:null,
	le:null,
	aPic:null,//蘋果圖片
	lColor:null,//字母顏色
	leArr:[],//保存生成的字母
	getLetter:function(){
		key=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
				'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'];
		this.le=key[Math.floor(Math.random()*51)];
		this.leArr.push(this.le);
		this.ax=Math.floor(Math.random()*400)+20;
		this.x=this.ax;
		this.y=this.ay;
	},
	init:function(){
		//初始化
		this.ay=0;
		for(var i=0;i<10;i++){
			this.getLetter();//10個字母
			this.draw(i);
		}
	},
	draw:function(i){
		//畫圖
		this.ay++;
		var div=document.createElement('div');
		div.style.width=this.awidth+'px';
		div.style.height=this.aheight+'px';
		div.style.position='absolute';
		div.style.top='-50px';
		div.style.left=this.ax+'px';
		$('.left')[0].appendChild(div);
		var adiv=document.createElement('img');
		adiv.id='img'+i;
		adiv.style.width=this.awidth+'px';
		adiv.style.height=this.aheight+'px';
		adiv.style.position='relative';
		adiv.style.top=0;
		adiv.style.left=0;
		adiv.src='images/蘋果[圖形].png';
		div.appendChild(adiv);
		var odiv=document.createElement('div');
		odiv.id=i;
		odiv.style.width=this.awidth/2+'px';
		odiv.style.height=this.aheight/2+'px';
		odiv.style.fontSize='28px';
		odiv.style.color=this.lColor;
		odiv.style.position='absolute';
		odiv.style.top=3+'px';
		odiv.style.left=15+'px';
		odiv.innerHTML =this.le;
		div.appendChild(odiv);
	},
	remove:function(i){//刪除蘋果
		if(!this.islive){
			$('#img'+i).src='images/boom.gif';
			$('#'+i).style.display='none';
			setTimeout(function(){
				$('.left')[0].removeChild($('#'+i).parentNode);//刪除div節點
				this.islive=true;
			},1000);
		}
	},
	born:function(i){//重新生成蘋果
		var se=this;
		setTimeout(function(){
				if(this.islive){
					se.le=key[Math.floor(Math.random()*51)];
					se.leArr.splice(i,1,se.le);//修改數組對應下標字母
					se.ax=Math.floor(Math.random()*400)+20;
					se.draw(i);
					this.islive=false;
				}
		},1000);
		
	},
	moveDown:function(){//向下運動
		for(var i in letters.leArr){
			if(parseFloat($('#'+i).parentNode.style.top)>=472){
				letters.remove(i);//刪除
				letters.born(i);
			}//重新生成
			$('#'+i).parentNode.style.top=parseFloat($('#'+i).parentNode.style.top)+Math.random()+'px';
		}
		requestAnimFrame(letters.moveDown);
	}
}

鍵盤事件

//鍵盤事件封裝
var keyDown={};//按鍵對象
var capsLock=false;//大寫按鍵判斷

window.addEventListener('keydown',function(e){
	e=event||window.event;
	//shift組合大寫按鍵
	var capsLockKey = e.keyCode ? e.keyCode : e.which;
	var shifKey = e.shiftKey ? e.shiftKey:((capsLockKey == 16) ? true : false);
	if(((capsLockKey >= 65 && capsLockKey <= 90) && !shifKey)||((capsLockKey >= 97 && capsLockKey <= 122) && shifKey)){
	    var zh=true;
	}else{
	    zh=false;
	}
	keyDown[e.keyCode]=true;
	for(var i=0;i<letters.leArr.length;i++){
		if(capsLock==false&&zh==true){//大寫鎖未打開且沒有按下shift鍵(組合鍵)
			if(String.fromCharCode(e.keyCode).toLocaleLowerCase()==letters.leArr[i]){//字母區分大小寫
				letters.remove(i);//消除字母
				letters.born(i);//重新生成
			}
		}
		else{//按下shift鍵或者大寫鎖已經打開
			if(String.fromCharCode(e.keyCode)==letters.leArr[i]){
				letters.remove(i);//消除字母
				letters.born(i);//重新生成
			}
		}
		if(e.keyCode==20){//由於javascript是事件監聽,所以無法知道按下大寫鎖前鍵盤大寫鎖是否已經打開
			//(當做未打開),搞着玩的,可以忽略。
			if(capsLock==false){
				//大寫鎖開啓
				capsLock=true;
				return;
			}
			else{
				//大寫鎖關閉
				capsLock=false;
				return;
			}
		}
		
	}
});
window.addEventListener('keyup',function(e){
	delete keyDown[e.keyCode];//釋放按鍵對象
});	

代碼到此基本結束,生下來的就是頁面結構,css樣式,附上完整代碼

原生javascript開發打字遊戲---代碼重構版本

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章