开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2198|回复: 4
收起左侧

[JS例程分享] JS异步编程二:自由落体

[复制链接]

发表于 2013-2-6 07:33:46 | 显示全部楼层 |阅读模式   山东省济南市
各种网络游戏,不管是3D的还是第一视角的,或者横版游戏(如冒险岛),模拟一个重力场是必须的。先回顾一下谷歌在牛顿诞辰,logo换成了自由落体的苹果。



重力场:地球重力作用的空间。在该空间中,每一点都有惟一的一个重力矢量与之相对应。
各种网络游戏,不管是3D的还是第一视角的,或者横版游戏(如冒险岛),模拟一个重力场是必须的。
先回顾一下谷歌在牛顿诞辰,logo换成了自由落体的苹果。

    <html>
  • <script language="javascript">
        var h = 0, v = 1;  
  •     window.setTimeout(aa, 2000);  
        function aa() {  
  •         var i = self.setInterval("bb()", 25);  
        }  
  •     function bb() {  
            var f = document.getElementById('fall');  
  •         var r = parseInt(f.style.right) + h;  
            var b = parseInt(f.style.bottom) - v;  
  •         f.style.right = r + 'px';  
            f.style.bottom = b + 'px';  
  •         if (b > -210) {  
                v += 2;  
  •         } else {  
                h = (v > 9) ? v * 0.1 : 0;  
  •             v *= (v > 9) ? -0.3 : 0;  
            }  
  •     }  
    </script>
  • <body>
        <div id="fall" style="position: relative; right: -300px; bottom: -46px">
  •        apple  
        </div>
  • </body>
  • </html>
可以看到setTimeout和setInterval!不去仔细琢磨逻辑,光从代码语意上,是非常令人费解的。
在没有口语编程之前,我非常想把代码写成这样:

    <html>
  • <script language="javascript">
            function drop() {  
  •              //自由落体  
                 code  here  
  •              //撞击地面之后  
                 code  here  
  •              //苹果摔烂  
                 code  here  
  •         }  
            </script>
  • <body>
        <div id="fall" style="position: relative; right: -300px; bottom: -46px">
  •        apple  
        </div>
  • <script language="javascript">
    drop();  
  • </script>
    </body>
  • </html>
也只有这样的代码才能调用以后的口语编程接口!那么怎么才能写出这样漂亮的代码?
这个时候【jxcex】 闪亮登场!

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
  • <html>
    <head>
  •     <title>Jscex Animation</title>
        <script language="javascript" type="text/javascript" src="lib/uglifyjs-parser.js"></script>
  •     <script language="javascript" type="text/javascript" src="src/jscex.js"></script>
        <script language="javascript" type="text/javascript" src="src/jscex.builderBase.js"></script>
  •     <script language="javascript" type="text/javascript" src="src/jscex.async.js"></script>
        <!--[if IE]>
  •     <script language="javascript" type="text/javascript" src="http://www.cnblogs.com/lib/json2.js"></script>
        <script language="javascript">
  •         Jscex.config.codeGenerator = function (code) { return "false || " + code; }  
        </script>
  •     <![endif]-->
        <script type="text/javascript">
  •         var dropAsync = eval(Jscex.compile("async", function (e, startPos, speedY, duration) {  
                $await(Jscex.Async.sleep(2000));  
  •             //e.style.left = startPos.x;  
                //重力加速度  
  •             var g = 50;  
                var time = 0;  
  •             var tag = 0;  
                while (time < duration) {  
  •                 $await(Jscex.Async.sleep(25));  
                    if (time < 800) {  
  •                     //自由落体  
                        timetime = time + 50;  
  •                     speedYspeedY = speedY + g;  
                        startPos.y += speedY * 0.05;  
  •                     e.style.top = startPos.y;  
                    }  
  •                 else {  
                        //撞击地面                  
  •                     if (speedY > 0 && tag == 0) {  
                            tag = 1;  
  •                         speedY = -speedY;  
                            speedYspeedY = speedY / 3;  
  •                     }  
                        timetime = time + 50;  
  •                     speedYspeedY = speedY + g;  
                        startPos.y += speedY * 0.05;  
  •                     e.style.top = startPos.y;  
                    }  
  •             }  
            }));  
  •         var changeImageAsync = eval(Jscex.compile("async", function () {  
                document.getElementById("heart").src = "grieve.gif";  
  •         }));  
            var executeAsync = eval(Jscex.compile("async", function () {  
  •             //自由落体并撞击地面  
                $await(dropAsync(document.getElementById("dropBox"), { x: 0, y: 20 }, 0, 1350));  
  •             //&#10084;碎  
                $await(changeImageAsync());  
  •         }));        
        </script>
  • </head>
    <body>
  •     <div id="dropBox" style="position: absolute; top: 20;">
            <img id="heart" src="heart.gif" alt="" />
  •     </div>
        <script type="text/javascript">
  •         executeAsync().start();  
        </script>
  • </body>
  • </html>
Jquery的animate可以用来制作一些动画效果,但仅限于匀速的直线运动,或者匀速的渐变,当然你可以用下面这种费解的方式去实现变速运动,而且要通过大量的计算才能减少与真实运动的差别。

    var i =0 ;  
  •         var time = 0;  
            var z = 100;  
  •         function drop() {  
                if (time <7000) {  
  •                 i += 5;  
                    z -=1;  
  •                 $(".block").animate({ top: i }, z);  
                    time += 50;  
  •                 drop();  
                }  
  •         }
如果是抛物线呢?对于这种变速运动Jquery的animate真是力不从心啊!
如果不用【jxcex】 ,你会陷入一大堆回调循环当中,痛不欲生!当然如果你觉得很爽,你能想明白,又不想让别人看明白,那又是另外一回事了。
不过话说----代码是写给别人看的。
  
下面看代码---------------------


Jscex.zip

52.93 KB, 下载次数: 7, 下载积分: 精币 -2 枚

发表于 2018-9-20 11:11:45 | 显示全部楼层   山西省太原市
算法一脸懵逼
回复 支持 反对

使用道具 举报

发表于 2017-10-25 14:29:27 | 显示全部楼层   江苏省*
学习下 关键在于算法
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)
发表于 2013-6-24 01:28:08 | 显示全部楼层   江西省赣州市
看着都膜拜啊
回复 支持 反对

使用道具 举报

发表于 2013-2-6 09:21:43 | 显示全部楼层   四川省成都市
经典啊,学习了~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表