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: 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