JS小游戏之极速快跑源码详解


Posted in Javascript onSeptember 25, 2014

本文实例讲述了JS小游戏的极速快跑源码,分享给大家供大家参考。具体如下:

游戏运行后如下图所示:

JS小游戏之极速快跑源码详解

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]; // 难度参数
 this.playerlist = null; // 选手列表
 this.player = 0;  // 选中的选手
 this.level = 2;  // 难度
 this.lock = 0;  // 锁定
 this.isstart = 0;  // 是否开始
 this.isover = 0;  // 是否结束
}

// 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('请选择要支持的选手');
 }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;
  }
  // 已有一名选手到达终点
  if(self.isover==1){
  clearInterval(et);
  }else{
  if(self.player!=c){ // 其他选手
   exert = Math.floor(Math.random()* self.levelset[self.level])+3; // 根据level调整
  }
  o.style.marginLeft = parseInt(o.style.marginLeft) + Math.floor(Math.random()*8)+4 + exert + 'px';
  // 到达终点
  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 = "很遗憾,你支持的选手没有获得胜利,获胜的是" + id + "号选\n\n";
 }
 if(confirm(msg + '是否重新开始?')==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 要加载的图片数组
* @param callback 图片加载成功后回调方法
*/
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){ // 定时器,判断图片完全加载后调用callback
  clearInterval(et);
  callback();
  }
 },200);
}

完整实例代码点击此处本站下载。

相信本文所述对大家的javascript游戏设计有一定的借鉴价值。

Javascript 相关文章推荐
[原创]静态页面也可以实现预览 列表不同的显示方式
Oct 14 Javascript
Prototype 学习 Prototype对象
Jul 12 Javascript
Cookie 小记
Apr 01 Javascript
JavaScript中的this实例分析
Apr 28 Javascript
jQuery中选择器小问题(新人难免遇到)
Mar 31 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
Jan 15 Javascript
JS组件Form表单验证神器BootstrapValidator
Jan 26 Javascript
JS正则替换去空格的方法
Mar 24 Javascript
禁止弹窗中蒙层底部页面跟随滚动的几种方法
Dec 07 Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 Javascript
如何通过setTimeout理解JS运行机制详解
Mar 23 Javascript
vue项目配置同一局域网可使用ip访问的操作
Oct 23 Javascript
JS小游戏之象棋暗棋源码详解
Sep 25 #Javascript
我用的一些Node.js开发工具、开发包、框架等总结
Sep 25 #Javascript
jquery中使用循环下拉菜单示例代码
Sep 24 #Javascript
用C/C++来实现 Node.js 的模块(二)
Sep 24 #Javascript
用C/C++来实现 Node.js 的模块(一)
Sep 24 #Javascript
JS实现一个列表中包含上移下移删除等功能
Sep 24 #Javascript
一个JavaScript函数把URL参数解析成Json对象
Sep 24 #Javascript
You might like
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
form表单传递数组数据、php脚本接收的实例
2017/02/09 PHP
PHP连接MYSQL数据库的3种常用方法
2017/02/27 PHP
js修改input的type属性及浏览器兼容问题探讨与解决
2013/01/23 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
JavaScript的React Web库的理念剖析及基础上手指南
2016/05/10 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
JS正则表达式学习之贪婪和非贪婪模式实例总结
2016/12/26 Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
2017/02/12 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
使用原生js编写一个简单的框选功能方法
2019/05/13 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
Pycharm学习教程(4) Python解释器的相关配置
2017/05/03 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
2017/11/16 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
Python气泡提示与标签的实现
2020/04/01 Python
Django-imagekit的使用详解
2020/07/06 Python
Python库安装速度过慢解决方案
2020/07/14 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
python 实现单例模式的5种方法
2020/09/23 Python
python3排序的实例方法
2020/10/20 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
体育系毕业生求职自荐信
2014/04/16 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
出差报告格式模板
2014/11/06 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers