JS学习笔记------打飞机

学习了JS四天有余,想利用现在所学的一点知识写一个简单的打飞机小游戏。

功能:

1 能够通过上下左右键控制小飞机的移动

2 能够通过按空格键 让小飞机发射***

3 敌方飞机能够随机出现在上方(目前敌方飞机随机出现的位置需要刷新一次才能改变。。需后续改进)

4 发射的***击中敌方飞机能够弹出“boom”提示框

首先,定义了小飞机对象,我使用的是工厂的方式

对象中的属性:小飞机的宽度、小飞机的高度、飞机div对象、

对象中的方法函数:初始化小飞机,实现小飞机根据键盘按键而移动以及开火。

function Plane(){
        var plane = new Object();
        plane.width = 40;
        plane.height = 48;
        document.write(‘<div id="box"><div id="plane"></div></div>‘);//box是一个大框,在这个大框中实现打飞机游戏
        plane.p =document.getElementById(‘plane‘);
        plane.box = document.getElementById(‘box‘);
        plane.sty = function (){
            p = this.p;
            p.style.width = this.width;
            p.style.height = this.height;
            p.style.backgroundImage = "url(./imgs/z5.png)";
            p.style.position = ‘absolute‘;

        }
        plane.move = (window.onkeydown=function (e){//使用onkeydown键盘事件,实现按键小飞机移动以及开火,不建议使用onkeypress
            var p = this.p;
            var b = this.box;
            var e = e ||window.event;
            switch(e.keyCode){
                case 37://zuo
                    p.style.left = Math.max(p.offsetLeft-10,0)+‘px‘;//不能超过边界

                    break;
                case 38://shang
                    p.style.top = Math.max(p.offsetTop-10,0)+‘px‘;

                    break;
                case 39://you

                    p.style.left = Math.min(p.offsetLeft+10,b.offsetWidth-p.offsetWidth)+‘px‘;
                    break;
                case 40://xia
                    p.style.top = Math.min(p.offsetTop+10,b.offsetHeight-p.offsetHeight)+‘px‘;
                    break;
                case 32:
                    bullet.fire(p.offsetLeft+p.offsetWidth/2,p.offsetTop);//调用了Bullet对象中的fire方法,实参是***应该显示的位置
                    break;

            }
        })
        return plane;
    }

然后,定义***对象

***对象的属性:宽、高、边界框内能够同时显示***的个数、边界框内当前显示的***个数,***的位置信息

***对象的方法函数:能够动态控制边框内能够同时显示的***个数,初始化***的样式,发射***,***发射后向边框上部飞出,获取***的位置(offsetLeft,offsetTop)

function Bullet(num){
        var bullet = new Object();
        bullet.width = 3;
        bullet.height =17;
        bullet.num = num;//边界框内同时显示***的个数
        bullet.j;//边界框内当前显示的***个数
        bullet.bs = create();//创建div对象,并且返回***div对象
        bullet.info=new Array;//***的位置信息
        
        function create(){
            bul = new Array();

            for(var i=0;i<num;i++){
            
                var b = document.createElement(‘div‘);
                bul[i] = this.box.appendChild(b);
            }
            //alert(bul);
            return bul;
        };
        bullet.box = document.getElementById(‘box‘);//获取边界框对象
        bullet.plane = document.getElementById(‘plane‘);//获取飞机对象
       
        //让***能够飞起来,周期性执行fly方法
        bullet.fly = function (){
            
            for(var i=0;i<num;i++){//遍历所有的***div对象

                var b = this.bs[i];

                if(b.style.display==‘block‘){//如果当前***是已经发射的,那么***的高度自身减10px
                    
                    b.style.top = (b.offsetTop-10)+‘px‘;

                }
                if(b.offsetTop<0){//如果***已经超出了边界,则***的display为none
                    b.style.display = ‘none‘;

                }
                this.getInfo(b,i);//调用getInfo函数,能够获取***当前的位置信息,实参分别是***对象以及索引
                
                
            }

        }

        setInterval(‘bullet.fly()‘,‘100‘);//周期性执行fly,使***飞起来

        bullet.sty = function (){//初始化***
  
            for(var i=0;i<num;i++){
                var b = this.bs[i];
                p = this.plane;
                b.style.width = this.width;
                b.style.height = this.height;
                b.style.backgroundImage = "url(./imgs/bullet.png)";
                b.style.position = ‘absolute‘;
                b.style.display = ‘none‘;
            }

        }
        var inf = new Array();//声明一个数组,用来存放***位置信息
        bullet.getInfo = function (b,i){
            
            if(b.style.display==‘block‘){//如果***在边界框内则把***的位置信息存入数组
            
                inf[i]=[b.offsetLeft,b.offsetTop];
                this.info = inf;
                //document.title = this.info;                
            }
        }        
        
        
        bullet.j = 0;//初始化边界内显示的当前***个数
        
        bullet.fire = function(x,y){//在小飞机对象中调用了本方法,传进来的参数是***应该显示的位置
            //alert(this.bs);
            if(this.j>num-1){如果个数超过了最大显示***个数,则从0开始计数
                this.j=0;
                
            }
           
            var b = this.bs[this.j];
           

            if(b.style.display==‘none‘){//如果***超出边界框设置为不显示,则能够再次显示,俗称补充弹药
                b.style.display = ‘block‘;
            }
            b.style.left = x+‘px‘;//设置***的位置
            b.style.top=y+‘px‘;
            
            this.j++;
            
        }

        
        
        return bullet;
        
    }

接着,声明一个敌人对象

敌人对象属性:宽、高、边界框内能够显示的最大个数,敌人对象的位置信息,边界框内当前显示的敌人个数

敌人对象方法:能够动态控制边框内能够同时显示的***个数、初始化敌人样式、周期性执行显示敌人,周期性让敌人不停的往下飞,获取敌人的位置信息,周期性判断***有没有打中敌人

function Enemy(num){
        var enem = new Object();
        enem.width = 40;
        enem.height =48;
        enem.num = num;//边界框内最多显示敌人个数
        enem.k;//当前边界框内显示的敌人个数
        enem.boom=0;
        enem.es = create();
        enem.box = document.getElementById(‘box‘);
        enem.info = new Array();
        function create(){//动态创建敌人div对象,返回敌人对象
            ene = new Array();

            for(var i=0;i<num;i++){
            
                var e = document.createElement(‘div‘);
                ene[i] = this.box.appendChild(e);
            }
            //alert(bul);
            return ene;
        }

        enem.styl = function(){
            var b = this.box;
            
            for(var i=0;i<num;i++){
                var en = this.es[i];

                en.style.width = this.width;
                en.style.height = this.height;
                en.style.backgroundImage = "url(./imgs/enemy.png)";
                en.style.position = ‘absolute‘;
                en.style.display = ‘none‘;
                en.style.left = getRandom(0,b.offsetWidth-this.width);//敌人出现的位置随机,但是不超出边界框

            }
            
        }

        function getRandom(min,max){//随机
            return (max-min)*Math.random()+min;

        }
        enem.k = 0;//初始化定义当前边界框内显示的敌人个数
        

        setInterval(function(){//周期性执行,如果敌人对象不显示,则重新从边界框上部显示
            
            if(enem.k>num-1){
                enem.k=0;

            }

            
            var en = enem.es[enem.k];
            
            if(en.style.display==‘none‘){
                
                en.style.top=‘0px‘;
                en.style.display = ‘block‘;

            }
            enem.k++;//统计当前敌人个数

        },getRandom(0,1000));
        
        

        setInterval(function(){//周期性执行让敌人显示,并且向下降 如果敌人一直下降到边界框外部,则不显示
            var b = enem.box;
            for(var i=0;i<num;i++){

                var en = enem.es[i];

                if(en.style.display==‘block‘){
                    //alert(b.offsetTop-10);
                    en.style.top = (en.offsetTop+10)+‘px‘;

                }
                if(en.offsetTop>b.offsetHeight-en.offsetHeight){
                    en.style.display = ‘none‘;

                }
                enem.getInfo(en,i);
            }

            
        },‘100‘)
        var infom =new Array();
        enem.getInfo = function (en,i){//获取敌人的位置信息
            
            if(en.style.display==‘block‘){
            
                infom[i]=[en.offsetLeft,en.offsetTop];
                this.info = infom;
                //document.title = this.info;                
            }
        }    

        //document.title = enem.info;
        //周期性判断***有没有打中敌人
        setInterval(function(){
            
            var b_num = bullet.num;
            var e_num = enem.num;
            var e_i = new Array();
            var b_i = new Array();

            for(var i=0;i<enem.k;i++){//循环遍历所有敌人对象
                
                e_i[i] = enem.info[i];//获取敌人的位置信息
                
                e_b_l = e_i[i][0];//获取敌人的offsetLeft
                e_b_r = e_i[i][0]+enem.width;//获取敌人的右侧距离左边界的距离
                
                e_b_h = e_i[i][1];//获取敌人的offsetTop
                e_b_t = e_i[i][1]+enem.height;//获取敌人的下部到上边界的距离
                
                for(var j=0;j<bullet.j;j++){//循环遍历所有***信息
                    

                    b_i[j] =  bullet.info[j];//获取***的位置信息
                    
                    b_b_l = b_i[j][0];//获取***的offsetLeft

                    b_b_r = b_i[j][0]+bullet.width;//获取***的右部到左边界的距离
                    
                    b_b_t = b_i[j][1];//获取***的offsetTop
                    
                    if(e_b_t>b_b_t&&b_b_t>e_b_h){//判断***与敌人有么有相撞
                        
                        if(e_b_l<b_b_l&&e_b_r>b_b_r){    
                            enem.boom++;
                            alert(‘boom‘);
                        }
                    }
                }

            }

        },‘1‘);

        return enem;

    }

在三个对象外部,分别调用,然后打飞机小游戏的初步功能就实现了!

刚刚开始学JS,对JS的对象的理解还不是很深刻,有的时候使用的PHP的思维方式,感觉写得不是很完美,心里有点不自在,有些地方在写博客的时候也感觉到了不足,今后会改正。

另外敌方小飞机的只有通过刷新,才会改变位置,这个是后期需要改正的,***碰撞了敌人之后,应该消失,但是本方法中还没有实现,击中敌人后依然能够击中再次出现的敌人。。。这个也需要改进。

写得第一个JS小玩意儿让我感受到了JS的乐趣,但是也感受到了JS的痛苦!!!!

时间: 2024-10-11 13:08:32

JS学习笔记------打飞机的相关文章

Vue.js学习笔记:在元素 和 template 中使用 v-if 指令

f 指令 语法比较简单,直接上代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title></title> <script src="https://cdn.bootcss.com/vue/2.2.

[Pro Angular.JS]学习笔记1.1:设置开发环境

可以使用yeoman.io,很方便.我已经写了一篇随笔,介绍如何使用.这里也有一篇介绍的文章:http://www.cnblogs.com/JoannaQ/p/3756281.html 代码编辑器,在Mac下用了一下WebStorm,太恶心了.另外发现书的作者使用的开发环境是Windows + VS Express 2013,为了方便学习,我也使用VS Express 2013 Update2.VS2013用起来蛮舒服的,把WebStorm比得跟驼屎一样.也许是因为我没用习惯吧. 1.安装Nod

【转】Backbone.js学习笔记(二)细说MVC

文章转自: http://segmentfault.com/a/1190000002666658 对于初学backbone.js的同学可以先参考我这篇文章:Backbone.js学习笔记(一) Backbone源码结构 1: (function() { 2: Backbone.Events // 自定义事件 3: Backbone.Model // 模型构造函数和原型扩展 4: Backbone.Collection // 集合构造函数和原型扩展 5: Backbone.Router // 路由

Angular JS 学习笔记

特定领域语言 编译器:遍历DOM来查找和它相关的属性, 分为编译和链接两个阶段, 指令:当关联的HTML结构进入编译阶段时应该执行的操作,可以写在名称里,属性里,css类名里:本质上是函数 稳定的DOM:绑定了数据模型的DOM元素的实例不会在绑定的生命周期发生改变 作用域:用来检测模型的改变和为表达式提供执行上下文的 AngularJS 和其它模板系统不同,它使用的是DOM而不是字符串 指令: 由某个属性.元素名称.css类名出现而导致的行为,或者说是DOM的变化 Filter过滤器:扮演着数据

Node.js学习笔记(3) - 简单的curd

这个算是不算完结的完结吧,前段时间也是看了好久的Node相关的东西,总想着去整理一下,可是当时也没有时间: 现在看来在整理的话,就有些混乱,自己也懒了,就没在整理,只是简单的记录一下 一.demo的简单介绍 这次demo,只涉及到简单的curd操作,用到的数据库是mongo,所以要安装mongo数据库,数据库连接驱动是mongoose: 当然关于mongo的驱动有很多,比如mongous mongoskin等:(详见http://cnodejs.org/topic/4f4ca8e0940ce2e

JS学习笔记-OO疑问之封装

封装是面向对象的基础,今天所要学习的匿名函数与闭包就是为了实现JS的面向对象封装.封装实现.封装变量,提高数据.系统安全性,封装正是面向对象的基础. 匿名函数 即没有名字的函数,其创建方式为 function(){...} 单独存在的匿名函数,无法运行,可通过赋值给变量调用或通过表达式自我执行来实现运行. 1.赋值给变量为一般的函数使用方式 var run = function(){ return '方法运行中'; }; alert(run()); 2.通过表达式自我执行 (function(a

每日js学习笔记2014.5.4

<script language="javascript">var mystring = "这是第一个正则表达式的例子";var myregex = new RegExp("这是"); //创建正则表达式if (myregex.test(mystring)) //test的功能是查找字符串中是否有匹配项,有则返回true,没有则返回false{ document.write ("找到了指定的模式");}else{

每日js学习笔记2014.5.5

<script language="javascript"><!-- var textstr = prompt("请输入一个字符串:",""); //prompt的用法,包含两个参数 var regex = /[A-Z][a-z]tion/; //[A-Z]有无匹配项 var result = regex.test(textstr); //test的用法 document.write ("<font size='

JS学习笔记-OO疑问之对象创建

问一.引入工厂,解决重复代码 前面已经提到,JS中创建对象的方法,不难发现,基本的创建方法中,创建一个对象还算简单,如果创建多个类似的对象的话就会产生大量重复的代码. 解决:工厂模式方法(添加一个专门创建对象的方法,传入参数避免重复) function createObject(name,age){ var obj =new Object(); //创建对象 obj.name = name; obj.age = age; obj.run = function(){ return this.nam