Loading:


    Wykrywanie kolizji - wersja zaawansowana - ActionScript 3

    Skrypt wykrywa kolizje pomiędzy obiektami, bazując na ich wewnętrznym środkowym punkcie.

     

    Każda piłka posiada nadaną siłę oraz przyspieszenie początkowe, które reaguje na proporcjonalnie na kolizje.

     

    Wersja On-line:

     



    Napisz Artyku³

    Listing

    //Kod dla pliku Babelki.as

    package
    {
            import flash.display.Sprite;
            import flash.events.Event;
           
            public class Babelki extends Sprite
            {
                    private var pilki:Array;
                    private var iloscPilek:Number = 6;
                    private var odbicie:Number = -0.5;
                    private var sprezynowy:Number = 0.05;
                    private var grawitacja:Number = 0.1;
                   
                   
                    public function Babelki()
                    {
                            init();
                    }
                   
                    private function init():void
                    {
                            pilki = new Array();
                           
                            for(var i:uint = 0; i < iloscPilek; i++)
                            {
                                    var pilka:Pilka = new Pilka(Math.random() * 30 + 20, Math.random() * 0xffffff);
                                    pilka.x = Math.random() * stage.stageWidth;
                                    pilka.y = Math.random() * stage.stageHeight;
                                    pilka.vx = Math.random() * 6 - 3;
                                    pilka.vy = Math.random() * 6 - 3;
                                    addChild(pilka);
                                    pilki.push(pilka);
                            }
                           
                            addEventListener(Event.ENTER_FRAME, onEnterFrame);                     
                    }
                   
                    private function onEnterFrame(event:Event):void
                    {
                            for(var i:uint = 0; i < iloscPilek - 1; i++)
                            {
                                    var pilka0:Pilka = pilki[i];
                                    for(var j:uint = i + 1; j < iloscPilek; j++)
                                    {
                                            var pilka1:Pilka = pilki[j];
                                            var dx:Number = pilka1.x - pilka0.x;
                                            var dy:Number = pilka1.y - pilka0.y;
                                            var dist:Number = Math.sqrt(dx * dx + dy * dy);
                                            var minDystanst:Number = pilka0.radius + pilka1.radius;
                                            if(dist < minDystanst)
                                            {
                                                    var angle:Number = Math.atan2(dy, dx);
                                                    var tx:Number = pilka0.x + dx / dist * minDystanst;
                                                    var ty:Number = pilka0.y + dy / dist * minDystanst;
                                                    var ax:Number = (tx - pilka1.x) * sprezynowy;
                                                    var ay:Number = (ty - pilka1.y) * sprezynowy;
                                                    pilka0.vx -= ax;
                                                    pilka0.vy -= ay;
                                                    pilka1.vx += ax;
                                                    pilka1.vy += ay;
                                            }
                                    }
                            }
                           
                            for(i = 0; i < iloscPilek; i++)
                            {
                                    var pilka:Pilka = pilki[i];
                                    move(pilka);
                            }
                    }
                   
                    private function move(pilka:Pilka):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;
                            }
                    }
            }
    }





    //Kod dla pliku 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: 0
    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-2025 v.1.5 | design: diviXdesign & rainbowcolors