JS小游戲之極速快跑源碼詳解
本文實(shí)例講述了JS小游戲的極速快跑源碼,分享給大家供大家參考。具體如下:
游戲運(yùn)行后如下圖所示:

Javascript部分代碼如下:
/** 極速快跑
* Author: fdipzone
* Date: 2012-07-15
* Ver: 1.0
*/
var gameimg = ['images/start.png', 'images/start_over.png', 'images/go.png', 'images/go_over.png', 'images/running.gif', 'images/run_start1.gif', 'images/run_start2.gif', 'images/run_start3.gif'];
var speed_obj = new SpeedClass();
window.onload = function(){
var callback = function(){
speed_obj.init();
}
img_preload(gameimg, callback);
}
// Speed Class
function SpeedClass(){
this.levelset = [8,5,8,12]; // 難度參數(shù)
this.playerlist = null; // 選手列表
this.player = 0; // 選中的選手
this.level = 2; // 難度
this.lock = 0; // 鎖定
this.isstart = 0; // 是否開(kāi)始
this.isover = 0; // 是否結(jié)束
}
// init
SpeedClass.prototype.init = function(){
this.reset();
this.create_player();
this.create_event();
}
// reset
SpeedClass.prototype.reset = function(){
this.player = 0;
this.level = $('level').value; // level
this.playerlist = $_tag('li', 'playerlist');
for(var i=0; i<this.playerlist.length; i++){
this.playerlist[i].className = '';
}
disp('start_btn', 'show', 'start_btn');
disp('go_btn', 'hide', 'go_btn');
this.lock = 0; // unlock
this.isstart = 0; // unstart
this.isover = 0; // unover
}
// create player
SpeedClass.prototype.create_player = function(){
var runway = [];
var playerlist = [];
for(var i=1; i<=8; i++){
runway[i] = '<li><div id="player' + (9-i) + '" class="run_status1"></div></li>';
playerlist[i] = '<li>' + i + '</li>';
}
$('runway').innerHTML = runway.join('');
$('playerlist').innerHTML = playerlist.join('');
runway = null;
playerlist = null;
}
// create event
SpeedClass.prototype.create_event = function(){
var self = this;
this.playerlist = $_tag('li', 'playerlist');
for(var i=0; i<this.playerlist.length; i++){
this.playerlist[i].onmouseover = function(){
if(this.className!='on'){
this.className = 'over';
}
}
this.playerlist[i].onmouseout = function(){
if(this.className!='on'){
this.className = '';
}
}
this.playerlist[i].onclick = function(o,c){
return function(){
if(self.lock==0){
o.playerlist[c].className = 'on';
if(o.player!=0 && o.player!=c+1){ // 不等於0且不等於自己
o.playerlist[o.player-1].className = '';
}
o.player = c + 1;
}
}
}(self, i);
}
$('start_btn').onmouseover = function(){
this.className = 'start_over_btn';
}
$('start_btn').onmouseout = function(){
this.className = 'start_btn';
}
$('start_btn').onclick = function(){
if(self.player==0){
return alert('請(qǐng)選擇要支持的選手');
}else{
self.lock = 1; // locked
disp('start_btn','hide');
disp('go_btn','show');
for(var i=1; i<=8; i++){
self.start(i);
}
}
}
$('go_btn').onmouseover = function(){
this.className = 'go_over_btn';
}
$('go_btn').onmouseout = function(){
this.className = 'go_btn';
}
$('go_btn').onclick = function(){
self.go();
}
}
// start game
SpeedClass.prototype.start = function(c){
var o = $('player' + c);
var step = 1;
var self = this;
var exert = 0;
o.style.marginLeft = '62px'; // init
var et = setInterval(function(){
if(step<4){ // step 1-3 is ready
o.className = 'run_status' + step;
}else{
// run
if(o.className!='running'){
o.className = 'running';
}
// start can go
if(self.isstart==0){
self.isstart = 1;
}
// 已有一名選手到達(dá)終點(diǎn)
if(self.isover==1){
clearInterval(et);
}else{
if(self.player!=c){ // 其他選手
exert = Math.floor(Math.random()* self.levelset[self.level])+3; // 根據(jù)level調(diào)整
}
o.style.marginLeft = parseInt(o.style.marginLeft) + Math.floor(Math.random()*8)+4 + exert + 'px';
// 到達(dá)終點(diǎn)
if(parseInt(o.style.marginLeft)>=745){
clearInterval(et);
self.isover = 1;
self.gameover(o.id);
}
}
}
step ++;
}, 350)
}
// go
SpeedClass.prototype.go = function(){
if(this.isstart==1 && this.isover==0){
var o = $('player' + this.player);
var exert = Math.floor(Math.random()*3)+2; // 2-5
o.style.marginLeft = parseInt(o.style.marginLeft) + exert + 'px';
}
return false;
}
// gameover
SpeedClass.prototype.gameover = function(id){
id = id.replace('player','');
var self = this;
var msg = '';
if(id==this.player){
msg = "恭喜你,你支持的選手獲得勝利\n\n";
}else{
msg = "很遺憾,你支持的選手沒(méi)有獲得勝利,獲勝的是" + id + "號(hào)選\n\n";
}
if(confirm(msg + '是否重新開(kāi)始?')==true){
setTimeout(function(){
self.init();
},1000);
}else{
return false;
}
}
/** common function */
// get document.getElementBy(id)
function $(id){
this.id = id;
return document.getElementById(id);
}
// get document.getElementsByTagName
function $_tag(name, id){
if(typeof(id)!='undefined'){
return $(id).getElementsByTagName(name);
}else{
return document.getElementsByTagName(name);
}
}
/* div show and hide
* @param id dom id
* @param handle show or hide
* @param classname
*/
function disp(id, handle, classname){
if(handle=='show'){
$(id).style.display = 'block';
}else{
$(id).style.display = 'none';
}
if(typeof(classname)!='undefined'){
$(id).className = classname;
}
}
/* img preload
* @param img 要加載的圖片數(shù)組
* @param callback 圖片加載成功后回調(diào)方法
*/
function img_preload(img, callback){
var onload_img = 0;
var tmp_img = [];
for(var i=0,imgnum=img.length; i<imgnum; i++){
tmp_img[i] = new Image();
tmp_img[i].src = img[i];
if(tmp_img[i].complete){
onload_img ++;
}else{
tmp_img[i].onload = function(){
onload_img ++;
}
}
}
var et = setInterval(
function(){
if(onload_img==img.length){ // 定時(shí)器,判斷圖片完全加載后調(diào)用callback
clearInterval(et);
callback();
}
},200);
}
完整實(shí)例代碼點(diǎn)擊此處本站下載。
相信本文所述對(duì)大家的javascript游戲設(shè)計(jì)有一定的借鑒價(jià)值。
- JS寫(xiě)的數(shù)字拼圖小游戲代碼[學(xué)習(xí)參考]
- 用js做一個(gè)小游戲平臺(tái) (一)
- js猜數(shù)字小游戲的簡(jiǎn)單實(shí)現(xiàn)代碼
- js實(shí)現(xiàn)俄羅斯方塊小游戲分享
- JS小游戲之象棋暗棋源碼詳解
- JS小游戲之宇宙戰(zhàn)機(jī)源碼詳解
- JS小游戲之仙劍翻牌源碼詳解
- Nodejs實(shí)現(xiàn)多人同時(shí)在線(xiàn)移動(dòng)鼠標(biāo)的小游戲分享
- js實(shí)現(xiàn)大轉(zhuǎn)盤(pán)抽獎(jiǎng)游戲?qū)嵗?/a>
- 七夕情人節(jié)丘比特射箭小游戲
- 純javascript模仿微信打飛機(jī)小游戲
相關(guān)文章
javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法
這篇文章主要介紹了javascript動(dòng)態(tài)添加checkbox復(fù)選框的方法的相關(guān)資料,需要的朋友可以參考下2015-12-12
javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換
javaScript 數(shù)值型和字符串型之間的轉(zhuǎn)換2009-07-07
js獲取checkbox復(fù)選框選中的選項(xiàng)實(shí)例
這篇文章主要介紹了js如何獲取checkbox復(fù)選框選中的選項(xiàng),比較適合新手,需要的朋友可以參考下2014-08-08
JavaScript中的Array對(duì)象使用說(shuō)明
JavaScript中的Array對(duì)象是一個(gè)動(dòng)態(tài)的數(shù)組,也是一個(gè)Stack,還是一個(gè)Dictionary2011-01-01
微信小程序?qū)崿F(xiàn)吸頂效果的方法實(shí)例
在微信小程序的開(kāi)發(fā)中,經(jīng)常會(huì)有列表分類(lèi)標(biāo)簽隨著界面滾動(dòng)吸頂?shù)男Ч?下面這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)吸頂效果的相關(guān)資料,需要的朋友可以參考下2021-08-08
JS比較兩個(gè)時(shí)間大小的簡(jiǎn)單示例代碼
本篇文章主要介紹了JS比較兩個(gè)時(shí)間大小的簡(jiǎn)單示例代碼。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2013-12-12
通過(guò)js判斷訪(fǎng)客顯示器屏幕分辨率并給出提示
這段代碼大意是通過(guò)比較圖片分辨率和桌面分辨率來(lái)判定改圖是否適合直接用作訪(fǎng)客的桌面壁紙2013-07-07
javascript小組件 原生table排序表格腳本(兼容ie firefox opera chrome)
javascript小組件 原生table排序表格腳本 兼容ie firefox opera chrome,需要的朋友可以參考下2012-07-07

