收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 1555|回复: 5

[AS3] 在学习中遇见的一些问题请教高手

[复制链接]
发表于 2009-7-9 22:49:47 | 显示全部楼层 |阅读模式
在学习碰撞检测有这样的一个例子就是
package {
import flash.display.Sprite;
import flash.events.Event;
public class Bubbles extends Sprite {
  private var balls:Array;
  private var numBalls:Number = 10;
  private var centerBall:Ball;
  private var bounce:Number = -1;
  private var spring:Number = 0.2;
  public function Bubbles() {
   init();
  }
  private function init():void {
   balls = new Array();
   centerBall = new Ball(100, 0xcccccc);
   addChild(centerBall);
   centerBall.x = stage.stageWidth / 2;
   centerBall.y = stage.stageHeight / 2;
   for (var i:uint = 0; i < numBalls; i++) {
    var ball:Ball = new Ball(Math.random() * 40 + 5,
    Math.random() * 0xffffff);
    ball.x = Math.random() * stage.stageWidth;
    ball.y = Math.random() * stage.stageHeight;
    ball.vx = Math.random() * 6 - 3;
    ball.vy = Math.random() * 6 - 3;
    addChild(ball);
    balls.push(ball);
   }
   addEventListener(Event.ENTER_FRAME, onEnterFrame);
  }
  private function onEnterFrame(event:Event):void {
   for (var i:uint = 0; i < numBalls; i++) {
    var ball:Ball = balls[i];
    move(ball);
    var dx:Number = ball.x - centerBall.x;
    var dy:Number = ball.y - centerBall.y;
    var dist:Number = Math.sqrt(dx * dx + dy * dy);
    var minDist:Number = ball.radius + centerBall.radius;
    if (dist < minDist) {
     var angle:Number = Math.atan2(dy, dx);
     var tx:Number = centerBall.x +
     Math.cos(angle) * minDist;
     var ty:Number = centerBall.y +
     Math.sin(angle) * minDist;
     ball.vx += (tx - ball.x) * spring;
     ball.vy += (ty - ball.y) * spring;
    }
   }
  }
  private function move(ball:Ball):void {
   ball.x += ball.vx;
   ball.y += ball.vy;
   if (ball.x + ball.radius > stage.stageWidth) {
    ball.x = stage.stageWidth - ball.radius;
    ball.vx *= bounce;
   } else if (ball.x - ball.radius < 0) {
    ball.x = ball.radius;
    ball.vx *= bounce;
   }
   if (ball.y + ball.radius > stage.stageHeight) {
    ball.y = stage.stageHeight - ball.radius;
    ball.vy *= bounce;
   } else if (ball.y - ball.radius < 0) {
    ball.y = ball.radius;
    ball.vy *= bounce;
   }
  }
}
}
其中Ball类是
package {
        import flash.display.Sprite;
        public class Ball extends Sprite {
                public var radius:Number;
                private var color:uint;
                public var vx:Number=0;
                public var vy:Number=0;
                public function Ball(radius:Number=40,color:uint=0xff0000) {
                        this.radius=radius;
                        this.color=color;
                        init();
                }
                public function init():void {
                        graphics.beginFill(color);
                        graphics.drawCircle(0,0,radius);
                        graphics.endFill();
                }
        }
}
我不明白的是
if (dist < minDist) {
        var angle:Number = Math.atan2(dy, dx);
        var tx:Number = centerBall.x + Math.cos(angle) * minDist;
        var ty:Number = centerBall.y +Math.sin(angle) * minDist;
        ball.vx += (tx - ball.x) * spring;
        ball.vy += (ty - ball.y) * spring;
                                }
中所有小球和大球碰撞后反弹的角度是怎么算出来的
ball.vx += (tx - ball.x) * spring;
ball.vy += (ty - ball.y) * spring;
按照理解 02.jpg
tx是小圆和大圆相切时的坐标
其中的ball.x应该是相重叠的坐标所以tx-ball.x就应该是速度的相反值(可能是负数或是整数)
那么ball.vx+=(tx-ball.x)*spring就应该是零或者原路返回
可怎么能计算出它的反弹角度呢?希望大虾们帮忙解释下 我想了好长时间了 也没想通谢谢了
源文件我也传上来了

大家不要理解错这个是书上的一个例子是个没有问题的例子,是我不知道怎么理解ball.vx += (tx - ball.x) * spring;改变了小球方向的问题

[[i] 本帖最后由 feige22 于 2009-7-10 09:15 编辑 ]

新建文件夹.rar

6.02 KB, 下载次数: 127

发表于 2009-7-10 00:31:56 | 显示全部楼层
ball.vx += (tx - ball.x) * spring;
tx是小圆碰撞后的坐标,你可以这样理解
后一次坐标endX ,上一次坐标orgX;
endX - orgX 就是两次的差值,也就是一个顺时的加速度,spring就是碰撞后的损失
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-10 09:08:38 | 显示全部楼层
原帖由 [i]libins 于 2009-7-10 00:31 发表
ball.vx += (tx - ball.x) * spring;
tx是小圆碰撞后的坐标,你可以这样理解
后一次坐标endX ,上一次坐标orgX;
endX - orgX 就是两次的差值,也就是一个顺时的加速度,spring就是碰撞后的损失


endX - orgX和endy - orgy是不是使小球原路反回了
这个我理解 我不理解的是碰撞后小球在方向改变了也就是ball.vx变了还有就是改变的角度是怎么算出来的??谢谢大虾
回复 支持 反对

使用道具 举报

发表于 2009-7-10 10:38:32 | 显示全部楼层

回复 3# feige22 [楼主] 的帖子

小球碰撞后的方向由x轴方向的速度ball.vx和y轴方向的速度ball.vy决定的。至于角度的变化是由Math.atan2转化cos计算时产生的。
回复 支持 反对

使用道具 举报

发表于 2009-7-11 14:54:32 | 显示全部楼层

Math.atan2

var ang:Number=Math.atan(dy,dx)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-27 22:23:03 | 显示全部楼层
谢谢大家帮忙   终于明白了
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2019-12-12 08:23 , Processed in 0.124684 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

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