Loading:


Odbicie piłki od pochylonej powierzchni [ ActionScript 3 ]

Skrypt tworzy efekt odbicia się piłki od pochylonej powierzchni linii, z nadaną na nią siłą grawitacji oraz tarciem, gdy dojdzie do zderzenia.

 

Przykład symuluje realną sytuację zachowania piłki po odbiciu się od krawędzi linii.

 

Wersja On-Line:

 



Napisz Artyku³

Listing

//KOD DLA OdbicieOdPochylonejPowierzchni.as

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.display.StageScaleMode;
        import flash.display.StageAlign;
        import flash.geom.Rectangle;

        public class OdbicieOdPochylonejPowierzchni extends Sprite
        {
                private var pilka:Pilka;
                private var linie:Array;
                private var liczbaLinii:uint = 5;
                private var grawitacja:Number = 0.3;
                private var odbicie:Number = -0.6;
               
                public function OdbicieOdPochylonejPowierzchni()
                {
                        init();
                }
               
                private function init():void
                {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        pilka = new Pilka(20);
                        addChild(pilka);
                        pilka.x = 100;
                        pilka.y = 50;
                       

                        linie = new Array();
                        for(var i:uint = 0; i < liczbaLinii; i++)
                        {
                                var line:Sprite = new Sprite();
                                line.graphics.lineStyle(1);
                                line.graphics.moveTo(-50, 0)
                                line.graphics.lineTo(50, 0);
                                addChild(line);
                                linie.push(line);
                        }
                       
       
                        linie[0].x = 100;
                        linie[0].y = 100;
                        linie[0].rotation = 30;
                       
                        linie[1].x = 100;
                        linie[1].y = 230;
                        linie[1].rotation = 45;
                       
                        linie[2].x = 250;
                        linie[2].y = 180;
                        linie[2].rotation = -30;
                       
                        linie[3].x = 150;
                        linie[3].y = 330;
                        linie[3].rotation = 10;
                       
                        linie[4].x = 230;
                        linie[4].y = 250;
                        linie[4].rotation = -30;
                       
                        addEventListener(Event.ENTER_FRAME, onEnterFrame);
                }
               
                private function onEnterFrame(event:Event):void
                {
       
                        pilka.vy += grawitacja;
                        pilka.x += pilka.vx;
                        pilka.y += pilka.vy;
                       
       
                        if(pilka.x + pilka.radius > stage.stageWidth)
                        {
                                pilka.x = stage.stageWidth - pilka.radius;
                                pilka.vx *= odbicie;
                        }
                        else if(pilka.x - pilka.radius < 0)
                        {
                                pilka.x = pilka.radius;
                                pilka.vx *= odbicie;
                        }
                        if(pilka.y + pilka.radius > stage.stageHeight)
                        {
                                pilka.y = stage.stageHeight - pilka.radius;
                                pilka.vy *= odbicie;
                        }
                        else if(pilka.y - pilka.radius < 0)
                        {
                                pilka.y = pilka.radius;
                                pilka.vy *= odbicie;
                        }
                       
       
                        for(var i:uint = 0; i < liczbaLinii; i++)
                        {
                                checkLine(linie[i]);
                        }
                }
               
                private function checkLine(line:Sprite):void
                {
               
                        var bounds:Rectangle = line.getBounds(this);
                        if(pilka.x > bounds.left && pilka.x < bounds.right)
                        {
                               
                       
                                var angle:Number = line.rotation * Math.PI / 180;
                                var cos:Number = Math.cos(angle);
                                var sin:Number = Math.sin(angle);
                               
                       
                                var x1:Number = pilka.x - line.x;
                                var y1:Number = pilka.y - line.y;
                               
               
                                var y2:Number = cos * y1 - sin * x1;
                               
                       
                                var vy1:Number = cos * pilka.vy - sin * pilka.vx;
                               
                       
                                if(y2 > -pilka.height / 2 && y2 < vy1)
                                {
                               
                                        var x2:Number = cos * x1 + sin * y1;
                                       
                               
                                        var vx1:Number = cos * pilka.vx + sin * pilka.vy;
                               
                                        y2 = -pilka.height / 2;
                                        vy1 *= odbicie;
                                       
                               
                                        x1 = cos * x2 - sin * y2;
                                        y1 = cos * y2 + sin * x2;
                                        pilka.vx = cos * vx1 - sin * vy1;
                                        pilka.vy = cos * vy1 + sin * vx1;
                                        pilka.x = line.x + x1;
                                        pilka.y = line.y + y1;
                                }
                        }
                }
        }
}




//KOD DLA Pilka.as

package {
        import flash.display.Sprite;
       
        public class Pilka extends Sprite {
                private var promien:Number;
                private var kolor:uint;
               
                public function Pilka(promien:Number=40, kolor:uint=0xff0000) {
                        this.promien = promien;
                        this.kolor = kolor;
                        init();
                }
               
                public function init():void {
                        graphics.beginFill(kolor);
                        graphics.drawCircle(0,0, promien);
                        graphics.endFill();
                }
        }
}




Dodano przez: divix
Ranga: Administrator serwisu Punktów: 38523
Komentarze użytkowników
    • Tre¶æ komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-2024 v.1.5 | design: diviXdesign & rainbowcolors