开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2790|回复: 3
收起左侧

[JS例程分享] JS异步编程五:Jscex制作愤怒的小鸟

[复制链接]

发表于 2013-2-22 20:39:43 | 显示全部楼层 |阅读模式   内蒙古自治区呼和浩特市
Jscex真的能制作愤怒的小鸟?在我没有接触Jscex之前,我也不相信!但是只要解决了重力场运动和碰撞的两大物理问题,Jscex版的愤怒小鸟,那就是囊中之物。


Jscex真的能制作愤怒的小鸟?在我没有接触Jscex之前,我也不相信!但是只要解决了重力场运动和碰撞的两大物理问题,Jscex版的愤怒小鸟,那就是囊中之物。
如果关注这个系列的话,在JS异步编程二:自由落体中,模拟了苹果在重力场下的自由落体运动。
那么我们可以轻松的帮它扩展一个水平方向上的速度.


    <script type="text/javascript">  
  • function Bird(startPos, speed_X, speed_Y, element) {  
    this.speed_X = speed_X;  
  • this.speed_Y = speed_Y;  
    this.startPos = startPos;  
  • this.fly = function () {  
    flyAsync(element, startPos, speed_X, speed_Y).start();  
  • }  
    }  
  • var flyAsync = eval(Jscex.compile("async", function (e, startPos, speed_X, speed_Y) {  
    e.style.left = startPos.x;  
  • e.style.top = startPos.y;  
    //vt=v0+at  
  • //重力加速度  
    var a_y = 40;  
  • var speed_YTemp = speed_Y;  
    var time = 0;  
  • while (Math.abs(speed_Y) <= speed_YTemp) {  
    $await(Jscex.Async.sleep(50));  
  • time = time + 50;  
    speed_Y = speed_Y - a_y;  
  • startPos.y -= (speed_Y * 0.05);  
    e.style.top = startPos.y;  
  • startPos.x += speed_X * 0.05;  
    e.style.left = startPos.x;  
  • }  
    }));  
  • function Button1_onclick() {  
    var bird = new Bird({ x: 0, y: 300 }, 400, 700, document.getElementById("birdDiv"));  
  • bird.fly();  
    }  
  • </script>  
    <input id="Button1" type="button" value="发¢射?" />  
  • <div id="birdDiv" style="left: 0px; top: 300px; position: absolute;">  
    <img id="bird" src="bird.jpg" alt="" />  
  • </div>  
可以看得出来,有点生硬,而且位移有点偏差,比如启始的top:1000,终止的top:1100!主要原因是在结束while (Math.abs(speed_Y) <= speed_YTemp)的之前那最后一次
循环带来的误差!那么就完善一下while里面的条件,让它不执行最后一次循环。


    var flyAsync = eval(Jscex.compile("async", function (e, startPos, speed_X, speed_Y) {  
  • e.style.left = startPos.x;  
    e.style.top = startPos.y;  
  • //vt=v0+at  
    //重力加速度  
  • var a_y = 40;  
    var speed_YTemp = speed_Y;  
  • var time = 0;  
    var maxY = startPos.y  
  • while (speed_Y > 0 ? (Math.abs(speed_Y) <= speed_YTemp) : (e.offsetTop - (speed_Y - a_y) * 0.05 <= maxY)) {  
    $await(Jscex.Async.sleep(50));  
  • time = time + 50;  
    speed_Y = speed_Y - a_y;  
  • startPos.y -= (speed_Y * 0.05);  
    e.style.top = startPos.y;  
  • startPos.x += speed_X * 0.05;  
    e.style.left = startPos.x;  
  • }  
  • }));
最后让小鸟撞击地面弹起,然后又撞击地面弹起···一直循环下去


    var flyAsync = eval(Jscex.compile("async", function (e, startPos, speed_X, speed_Y) {  
  • e.style.left = startPos.x;  
    e.style.top = startPos.y;  
  • var maxY = startPos.y;  
    //所用公式?:vt=v0+at  
  • //重力加速度  
    var a_y = 40;  
  • var speed_YTemp = speed_Y;  
    var time = 0;  
  • while (true) {  
    $await(Jscex.Async.sleep(1));  
  • while (speed_Y > 0 ? (Math.abs(speed_Y) <= speed_YTemp) : (e.offsetTop - (speed_Y - a_y) * 0.05 <= maxY)) {  
    $await(Jscex.Async.sleep(50));  
  • time = time + 50;  
    speed_Y = speed_Y - a_y;  
  • startPos.y -= (speed_Y * 0.05);  
    e.style.top = startPos.y;  
  • startPos.x += speed_X * 0.05;  
    e.style.left = startPos.x;  
  • }  
  • //与地面撞击,X轴损失一部分速度,Y轴损失一部分速度并且被弹起


    speed_X = speed_X / 2;  
  • speed_Y = -speed_Y / 3;  
    if (speed_X < 6) break;  
  • }  
  • }));
因为撞击的过程当中,X轴损失一部分速度,Y轴损失一部分速度并且被弹起,当speed_X小于6的时候退出循环。
未完待续啊·····················要去上班了啊······
ps:感兴趣的小盆友可以利用CSS3,让小鸟在空中运动的过程中受到了一定的空气阻力,导致小鸟旋转一定角度,小鸟在落地之后,导致小鸟在地上滚动前进,这样更加逼真的体现了现实中的物体运动。
b]代码下载


JscexDemo0824.zip

55.57 KB, 下载次数: 14, 下载积分: 精币 -2 枚

结帖率:97% (37/38)
发表于 2013-7-29 15:46:11 | 显示全部楼层   福建省莆田市
的沙发沙发
回复 支持 反对

使用道具 举报

结帖率:75% (24/32)
发表于 2013-7-17 21:56:20 | 显示全部楼层   湖北省恩施土家族苗族自治州
回复 支持 反对

使用道具 举报

结帖率:90% (9/10)
发表于 2013-2-22 20:42:29 | 显示全部楼层   广东省佛山市
沙发。。。
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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