zoukankan      html  css  js  c++  java
  • 了解Nape 2d物理引擎 第一天

    首先 谢谢拉登大叔

    预览效果

    AS3代码

    package
    {
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import nape.geom.Vec2;
        import nape.phys.*;
        import nape.shape.Polygon;
        import nape.space.Space;
        import nape.util.ShapeDebug;
        
        /**
         * @author jacky<br>
         * 
         * 创建时间:2013-9-23 下午03:20:18
         *
         */
        [SWF(width= 550,height= 400,backgroundColor=0xffffff,frameRate=60)]
        public class NapeExe1 extends Sprite
        {
            
            private var space:Space;
            private var debug:ShapeDebug;
            
            public function NapeExe1()
            {
                //1.创建一个基本的Nape空间
                //声明空间重力
                var gravity:Vec2 = new Vec2(0, 400);
                space = new Space(gravity);
                
                //2.创建静态的Nape刚体
                //        a.创建一个Body对象,并指定它的类型和坐标
                var body:Body = new Body(BodyType.STATIC, new Vec2(stage.stageWidth/2, stage.stageHeight-10));
                //        b.创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
                var shape:Polygon = new Polygon(Polygon.box(stage.stageWidth, 10));
                body.shapes.add(shape);
                //        c.指定刚体所存在的空间,即第一部分提到的空间。
                body.space = space;
                
                //3.创建模拟视图
                debug = new ShapeDebug(550, 400);
                addChild(debug.display);
                
                addChild(new Stats());
                //4.在ENTER_FRAME事件处理器中进行Nape模拟
                addEventListener(Event.ENTER_FRAME, loop);
                stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseEventHandler);
            }
            private function mouseEventHandler(e:MouseEvent):void
            {
                //        a.创建一个Body对象,并指定它的类型和坐标
                var body:Body = new Body(BodyType.DYNAMIC, new Vec2(mouseX, mouseY));
                //        b.创建刚体的形状shape,可以接收的形状有两种Cirle和Polygon,后者通过指定不同的顶点来创建任何非圆形的形状。
                var shape:Polygon = new Polygon(Polygon.box(Math.random()*30+30,Math.random()*30+30));
                body.shapes.add(shape);
                //        c.指定刚体所存在的空间,即第一部分提到的空间。
                body.space = space;
            }
            
            private function loop(e:Event):void
            {
                //Nape空间模拟
                space.step(1 / 60, 30);
                //清除视图
                debug.clear();
                //优化显示图像
                debug.flush();
                //绘制空间
                debug.draw(space);
            }
        }
    }
    View Code

    FPS类

    /**
     * Hi-ReS! Stats
     * 
     * Released under MIT license:
     * http://www.opensource.org/licenses/mit-license.php
     *
     * How to use:
     * 
     *    addChild( new Stats() );
     *    
     *    or
     *    
     *    addChild( new Stats( { bg: 0xffffff } );
     * 
     * version log:
     *
     *    09.03.28        2.1        Mr.doob            + Theme support.
     *    09.02.21        2.0        Mr.doob            + Removed Player version, until I know if it's really needed.
     *                                            + Added MAX value (shows Max memory used, useful to spot memory leaks)
     *                                            + Reworked text system / no memory leak (original reason unknown)
     *                                            + Simplified                
     *    09.02.07        1.5        Mr.doob            + onRemovedFromStage() (thx huihuicn.xu)
     *    08.12.14        1.4        Mr.doob            + Code optimisations and version info on MOUSE_OVER
     *    08.07.12        1.3        Mr.doob            + Some speed and code optimisations
     *    08.02.15        1.2        Mr.doob            + Class renamed to Stats (previously FPS)
     *    08.01.05        1.2        Mr.doob            + Click changes the fps of flash (half up increases, half down decreases)
     *    08.01.04        1.1        Mr.doob            + Shameless ripoff of Alternativa's FPS look :P
     *                            Theo            + Log shape for MEM
     *                                            + More room for MS
     *     07.12.13        1.0        Mr.doob            + First version
     **/
    
    package 
    {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Rectangle;
        import flash.system.System;
        import flash.text.StyleSheet;
        import flash.text.TextField;
        import flash.utils.getTimer;    
    
        /**
         * <b>Hi-ReS! Stats</b> FPS, MS and MEM, all in one.
         */
        public class Stats extends Sprite
        {    
            private var _xml : XML;
    
            private var _text : TextField;
            private var _style : StyleSheet;
    
            private var _timer : uint;
            private var _fps : uint;
            private var _ms : uint;
            private var _ms_prev : uint;
            private var _mem : Number;
            private var _mem_max : Number;
            
            private var _graph : BitmapData;
            private var _rectangle : Rectangle;
            
            private var _fps_graph : uint;
            private var _mem_graph : uint;
            private var _mem_max_graph : uint;
            
            private var _theme : Object = { bg: 0x000033, fps: 0xffff00, ms: 0x00ff00, mem: 0x00ffff, memmax: 0xff0070 }; 
    
            /**
             * <b>Hi-ReS! Stats</b> FPS, MS and MEM, all in one.
             * 
             * @param theme         Example: { bg: 0x202020, fps: 0xC0C0C0, ms: 0x505050, mem: 0x707070, memmax: 0xA0A0A0 } 
             */
            public function Stats( theme : Object = null ) : void
            {
                if (theme)
                {
                    if (theme.bg != null) _theme.bg = theme.bg;
                    if (theme.fps != null) _theme.fps = theme.fps;
                    if (theme.ms != null) _theme.ms = theme.ms;
                    if (theme.mem != null) _theme.mem = theme.mem;
                    if (theme.memmax != null) _theme.memmax = theme.memmax;
                }
                
                addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
            }
    
            private function init(e : Event) : void
            {
                removeEventListener(Event.ADDED_TO_STAGE, init);
                
                graphics.beginFill(_theme.bg);
                graphics.drawRect(0, 0, 70, 50);
                graphics.endFill();
    
                _mem_max = 0;
    
                _xml = <xml><fps>FPS:</fps><ms>MS:</ms><mem>MEM:</mem><memMax>MAX:</memMax></xml>;
            
                _style = new StyleSheet();
                _style.setStyle("xml", {fontSize:'9px', fontFamily:'_sans', leading:'-2px'});
                _style.setStyle("fps", {color: hex2css(_theme.fps)});
                _style.setStyle("ms", {color: hex2css(_theme.ms)});
                _style.setStyle("mem", {color: hex2css(_theme.mem)});
                _style.setStyle("memMax", {color: hex2css(_theme.memmax)});
                
                _text = new TextField();
                _text.width = 70;
                _text.height = 50;
                _text.styleSheet = _style;
                _text.condenseWhite = true;
                _text.selectable = false;
                _text.mouseEnabled = false;
                addChild(_text);
                
                var bitmap : Bitmap = new Bitmap( _graph = new BitmapData(70, 50, false, _theme.bg) );
                bitmap.y = 50;
                addChild(bitmap);
                
                _rectangle = new Rectangle( 0, 0, 1, _graph.height );            
                
                addEventListener(MouseEvent.CLICK, onClick);
                addEventListener(Event.ENTER_FRAME, update);
            }
    
            private function update(e : Event) : void
            {
                _timer = getTimer();
                
                if( _timer - 1000 > _ms_prev )
                {
                    _ms_prev = _timer;
                    _mem = Number((System.totalMemory * 0.000000954).toFixed(3));
                    _mem_max = _mem_max > _mem ? _mem_max : _mem;
                    
                    _fps_graph = Math.min( 50, ( _fps / stage.frameRate ) * 50 );
                    _mem_graph =  Math.min( 50, Math.sqrt( Math.sqrt( _mem * 5000 ) ) ) - 2;
                    _mem_max_graph =  Math.min( 50, Math.sqrt( Math.sqrt( _mem_max * 5000 ) ) ) - 2;
                    
                    _graph.scroll( 1, 0 );
                    
                    _graph.fillRect( _rectangle , _theme.bg );
                    _graph.setPixel( 0, _graph.height - _fps_graph, _theme.fps);
                    _graph.setPixel( 0, _graph.height - ( ( _timer - _ms ) >> 1 ), _theme.ms );
                    _graph.setPixel( 0, _graph.height - _mem_graph, _theme.mem);
                    _graph.setPixel( 0, _graph.height - _mem_max_graph, _theme.memmax);
                    
                    _xml.fps = "FPS: " + _fps + " / " + stage.frameRate;
                    _xml.mem = "MEM: " + _mem;
                    _xml.memMax = "MAX: " + _mem_max;
                    
                    _fps = 0;
                }
    
                _fps++;
                
                _xml.ms = "MS: " + (_timer - _ms);
                _ms = _timer;
                
                _text.htmlText = _xml;
            }
            
            private function onClick(e : MouseEvent) : void
            {
                mouseY / height > .5 ? stage.frameRate-- : stage.frameRate++;
                _xml.fps = "FPS: " + _fps + " / " + stage.frameRate;
                _text.htmlText = _xml;
            }
            
            // .. Utils
            
            private function hex2css( color : int ) : String
            {
                return "#" + color.toString(16);
            }
        }
    }
    View Code

     Nape SWC文件下载点击这里

  • 相关阅读:
    面向对象设计原则
    面向对象设计流程
    mysql远程连接命令(转)
    如何使用matplotlib绘制一个函数的图像
    svn:ignore eclipse开发一般忽略文件
    zookeeper client 常用操作
    pip使用
    vi常用快捷键
    python常用函数
    RabbitMQ 学习记录
  • 原文地址:https://www.cnblogs.com/LLLoveLL/p/3335009.html
Copyright © 2011-2022 走看看