zoukankan      html  css  js  c++  java
  • JavaScript 关于游戏

    一、 图片加载时(为何要写 onload ???)

      1、先 alert 弹出值然后再出现图片

        var img = new Image();
    alert(111);
    img.src
    = "images/1.jpg"; document.body.appendChild(img);

      2、先出现图片然后再alert 弹出值

        var img = new Image();
        img.onload = function(){
            document.body.appendChild(img);
            alert(111);
        }
        img.src = "images/1.jpg";

      3、图片加载完毕后再执行其他的代码

      //图片数组
        var imgs = ['images/1.jpg','images/2.jpg','images/3.jpg','images/4.jpg'];
        //imgCache 装加载完毕图片数组    
        var imgCache = {};
        function load(img){
            //如果传进来的值是一个数组,就调用_load()函数
            if(img instanceof Array){
                img.forEach(function(url){
                    _load(url);
                })
            }else{
                _load(img)
            }
        }
        function _load(url){
            var img = new Image();
            img.onload = function(){
                imgCache[url] = img;
                if(isReady()){
                    alert('图片全部加载完成');
                }
            }
            imgCache[url] = false;
            img.src = url;
        }
        function isReady(){
            var flag = true;
            for(var i in imgCache){
                if(!imgCache[i]){
                    flag = false;
                }
            }
            return flag;
        }
        load(imgs);

    二、 调用自己写好的函数 

      var readyCallback = [];   //装调用时传入的数组
        var img = new Image();
        img.src = 'images/1.jpg';
        img.onload = function(){
            document.body.appendChild(img);
            readyCallback.forEach(function(func){  //循环所有调用时传入的函数
                func();
            })
        };
    
        function onReady(func){
            readyCallback.push(func);   //在图片加载完毕后将要执行的函数push到数组中
        }
    
        function borders(){
            img.style.border = '1px solid #f00';
        }
        function borderRadius(){
            img.style.borderRadius = '5px';
        }
        function opacity(){
            img.style.opacity = .8;
        }
        onReady(borders);
        onReady(borderRadius);
        onReady(opacity);

    三、 用 forEach 遍历HTML中的元素标签

      //html源代码:
      <ul id="ul1">   <li class="findLi">1111</li>   <li>2222</li>   <li class="findLi">3333</li>   <li>4444</li>   <li class="findLi">5555</li>   </ul>   <ul id="ul2">   <li class="findLi">1111</li>   <li class="findLi">2222</li>   <li class="findLi">3333</li>   <li>4444</li>   <li>5555</li>   </ul>

      //js源代码
      function findNodes(func){
        var nodes = [];
        var htmlNodes = document.getElementsByClassName('findLi'); //获取所有class为findLi的标签

          nodes = Array.prototype.slice.call(htmlNodes);    //将得到的对象转换为数组
         nodes.forEach(function(node){     //
    用forEach 遍历出数组, 这里的node代表数组中的元素
            func(node);
         });
         return nodes;   
      };
      function setBorder(node){
        node.style.border = "1px solid #ccc";
      };
      function hide(node){
        node.style.display = 'none';
      };
      var nodes = findNodes(setBorder);

    四、 游戏主循环思想

      var lastTime = Date.now();
        var box1Speed = 100;
        var box2Speed = 150;
    
        var box1 = document.getElementById('box1');
        var box2 = document.getElementById('box2');
    
        function main(){
            var now = Date.now();
            var dt = (now - lastTime) / 1000;
    
            box1.style.left = parseInt(box1.style.left) + box1Speed * dt + "px";
            box2.style.left = parseInt(box2.style.left) - box2Speed * dt + "px";
    
            lastTime = now;
            //用 setTimeout 回调 update 函数,让函数不停地执行,实现循环
            setTimeout(main,1000/60);
        }
        main();   //调用 main 函数

    五、 碰撞判断

      //css 源代码
            #div1{
                position: absolute;
                left: 30px;
                top: 150px;
                 100px;
                height: 100px;
                background: #f56205;
            }
            #div2{
                position: absolute;
                left: 1200px;
                top: 150px;
                 100px;
                height: 100px;
                background: greenyellow;
            }
    
      //html源代码 <div id="div1"></div> <div id="div2"></div>
      //js 源代码 var speed1 = 100; var speed2 = 200; var div1 = document.getElementById('div1'); var div2 = document.getElementById('div2'); var lastTime = Date.now(); function update(){ //得到毫秒数的算法 var nowTime = Date.now(),dt = (nowTime - lastTime) / 1000; var rect1 = getAttr(div1); var rect2 = getAttr(div2); var flag = collides(rect1,rect2); if(flag){ return; }else{ div1.style.left = (parseInt(div1.offsetLeft) + speed1 * dt) + "px"; div2.style.left = (parseInt(div2.offsetLeft) - speed2 * dt) + "px"; } lastTime = nowTime; //用 setTimeout 回调 update 函数,让函数不停地执行,实现循环 setTimeout(update,1000 / 60); } update(); //得到某元素标签的 left right width height 值 function getAttr(element){ //返回一个对象 return { x: element.offsetLeft, y: element.offsetTop, element.offsetWidth, height:element.offsetHeight } } //判断是否碰撞,如果碰撞到了返回 true,否则返回 false function collides(div1,div2){ return !((div1.x + div1.width) < div2.x || (div2.x + div2.width) < div1.x || (div1.y + div1.height) < div2.y || (div2.y + div2.height) < div1.y ) }

    六、使在自动执行函数中的函数可以在整个浏览器窗口中被调用

      Javascript中的window对象 表示浏览器中打开的窗口。

      (function(){
            var name = "红红";
            var arr = [];
            function load(){   //在内部调用_load函数,作用是在当外界调用他的时候看不到函数中的内容
                _load();
            }
            function _load(){   //在内部书写不会外泄的代码,增强了代码的可维护性
                alert(name)
            }
            window.loads = {   //把函数指向window,使它可以在整个浏览器窗口中被调用
                load:load
            }
        })();
        loads.load();   //等价于 window.loads.load();  相当于window调用

    注:如果你有疑问,可直接将代码复制到编辑器中看其效果,相信聪明的你是能看懂的。

  • 相关阅读:
    正当防卫与互殴的界限在哪里
    [php入门] 5、初学CSS从中记下的一些基础点(For小白)
    [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)
    [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG
    [ZigBee] 11、ZigBee之睡眠定时器二
    [ZigBee] 10、ZigBee之睡眠定时器
    [ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示
    [ZigBee] 8、ZigBee之UART剖析·二(串口收发)
    [php入门] 4、HTML基础入门一篇概览
    [ZigBee] 2、 ZigBee开发环境搭建
  • 原文地址:https://www.cnblogs.com/Waiting-for-you/p/4118989.html
Copyright © 2011-2022 走看看