Nape实现坐标旋转角度回弹

乒乓球以一个向量运动,碰到障碍后反弹以一个新的向量运动,如下图:

要实现回弹只需要求出向量v1,把向量v0取反,再旋转(a+b)度就可以得到向量v1.

向量取反:

var v:vec2 = new Vec2(10,10);
v.x = -v.x;
v.y = -v.y;
//或者
v=v.mul(-1);

坐标旋转:

var v:Vec2 = new Vec2(10,10);
v.rotate(Math.PI);//以弧度为单位
//rotate方法的实现
public function rotate(angle:Number):void{
    var cos:Number = Math.cos (angle);
    var sin:Number = Math.sin (angle);
    x = x * cos - y * sin;;
    y = x * sin + y * cos;
}

例子代码:

package  {
    import flash.display.MovieClip;
    import nape.callbacks.CbType;
    import nape.callbacks.InteractionType;
    import nape.callbacks.PreCallback;
    import nape.callbacks.PreFlag;
    import nape.callbacks.PreListener;
    import nape.dynamics.CollisionArbiter;
    import nape.geom.Vec2;
    import nape.phys.Body;
    import nape.shape.Circle;

    /**
     * ...
     * @author kingBook
     * 2015-02-01 21:18
     */
    public class Main extends BaseMain {

        public function Main() {
            super({gravity:{x:0,y:0}});
        }

        private var _circle:Body;
        private var _circleCbType:CbType=new CbType();
        private var _view:MovieClip;
        override protected function createBodies():void {
            _circle = new Body();
            _circle.shapes.add(new Circle(25));
            _circle.position.setxy(100,100);
            _circle.space=_space;
            _circle.velocity.setxy(500,700);//随意设置一个运动向量
            _circle.cbTypes.add(_circleCbType);

            _view = new Circle_view();//库中的 Circle_view
            this.addChild(_view);

            //侦听与边缘碰撞
            _space.listeners.add(new PreListener(InteractionType.COLLISION,_circleCbType,CbType.ANY_BODY,hitHandler));
        }

        private function hitHandler(cb:PreCallback):PreFlag{
            var colArb:CollisionArbiter=cb.arbiter.collisionArbiter;
            var normal:Vec2 = colArb.normal;
            var vel:Vec2 = _circle.velocity.copy();
            vel = vel.mul(-1);//取反
            vel.rotate(2*(normal.angle-vel.angle));//旋转2倍法线度与反向运动向量角的差
            _circle.velocity.set(vel);//重新设置向量
            return PreFlag.ACCEPT;
        }

        override protected function stepAfter():void{
            //同步外观
            _view.x = _circle.position.x;
            _view.y = _circle.position.y;
            _view.rotation = _circle.rotation*57.3;
        }

    }

}

效果:

源码下载:

http://yunpan.cn/cVU69GkaYFyKH  访问密码 8515

时间: 2025-01-18 11:55:33

Nape实现坐标旋转角度回弹的相关文章

Coreldraw中实用的使用技巧

Coreldraw在使用的时候还是有一些实用的技巧,下面和大家分享一下: 1. 按空格键可以快速切换到"挑选"工具 2. 按shift键并逐一单击要选择的对象,可连续选择多个对象 3. 选定隐藏在一系列对象后面的单个对象,按住 ALT ,然后利用"挑选"工具单击最前面的对象, 直到选定所需的对象. 4. 圈选若干个对象: 利用"挑选"工具沿对角线拖动鼠标,直到所有对象都被圈选框包围住. 5. 圈选未被圈选框完全包围住的对象: 单击"挑选

Android超高仿QQ附近的人搜索展示

如果我有机器猫 我要叫他小叮当 ~开车~~ 版权所有,转载请注明:http://blog.csdn.net/mr_immortalz/article/details/51319354 最近无意中发现了QQ群有查看附近的人的效果,感觉挺棒的,约炮神器有木有! 效果这么酷,网上有没有呢?木有!好吧,作为程序猿还是老老实实苦逼的撸吧. 1.概述 老规矩,先上图,再扯蛋(额,不对-) 这个就是我们撸出来的效果,原谅画质哈 (小米手机miui7不能用小米助手,所以录gif挺麻烦了) 原装货(就不录制gif

PDF文件添加二维码水印教程

maven配置iText的jar,主要不是所有私服都有iText的jar,maven仓库没有的,可以去https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.12 这里下载 <!-- itextpdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> &l

设置二维码图片背景透明教程

继之前的博客:PDF文件添加二维码水印教程.图片添加二维码水印教程之后,对之前的添加二维码水印功能进行完善,之前的程序生成的二维码图片背景不是透明的,所以不是很美观,所以本博客对程序进行完善,对二维码图片设置背景为透明的,不过这样美观了,但是很有可能出现遮住pdf文字或者图片的情况,这种情况会导致二维码不能扫描 参考网上教程,封装个方法调用 /** * 设置图片背景透明 * @date 2019年6月27日下午8:46:42 * @param srcImage * @param alpha *

Shader中一直一个坐标(x,y)求旋转角度angle之后的坐标。

finalx = cos(angle)*x - sin(angle)*y finaly = sin(angle)*x +cos(angle)*y 或者有原角度加上旋转后的角度的到新角度a之后,假设改箱量长度为b则: finaly = b * sin(a) finalx = b * cos(a)

一直两个坐标点求旋转角度,或已知角度求移动的方向和位置

namespace Pioneer { export class Game extends Behaviour{ private nState:number; private Camera:Camera2D; nScore:number; nGold:number; private nRotationAngle:number = 0; private nRotationCount:number = 0; private nFrameRateTimer:number; private nScore

android-ImageView的拖动、旋转、缩放、边界回弹、双击缩放、单击销毁及源码下载

博客地址:http://blog.csdn.net/u010156024 TouchImageViewActivity 是本人一句一句代码写的,参考了网上大牛的博客. 不过其中的效果是网上没有的,也是本人一直想实现的效果. * 本实例重写ImageView的触摸事件和手势方法. * 实现图片的缩放.拖动,双击放大缩小.单击销毁,边界回弹,旋转并实现自动摆正. * 详细效果请看目录下面的:结果展示动态图.gif * 其中大部分关键节点都给出了注释,相信大家一看就会很快明白的. 本示例所展示的效果,

android之超级简单的下拉回弹--仿QQ个人主页

先看效果: 效果不错吧! 进入主题之前,先了解ImageView的scaleType的center_crop,网络上说的已经很清楚了 : 以下抄自网络: android:scaleType="centerCrop" 以填满整个ImageView为目的,将原图的中心对准ImageView的中心,等比例放大原图,直到填满ImageView为止(指的是ImageView的宽和高都要填满),原图超过ImageView的部分作裁剪处理. 均衡的缩放图像(保持图像原始比例),使图片的两个坐标(宽.

OpenCV轮廓检测,计算物体旋转角度

效果还是有点问题的,希望大家共同探讨一下 // FindRotation-angle.cpp : 定义控制台应用程序的入口点. // // findContours.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <vector> #include <opencv2/opencv.hpp> #include <opencv2/core/core.h