Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[AS3] Balletje stuiteren binnen cirkel

Pagina: 1
Acties:

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Hallo allemaal, ik heb me de laatste dagen verdiept in AS3 en ben er flink mee bezig. Nu stuit ik alleen op een nieuw probleem: Ik heb naar mijn idee de functie gemaakt die bepaalt op welk y coordinaat welk x coordinaat de maximale waarde heeft maar hij wilt deze functie niet aanroepen!

Als iemand een idee heeft van wat ik fout doe dan ben ik zeer geinteresseert in antwoord :)

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import flash.net.URLVariables;
    import flash.text.TextField;
    
    /**
     * ...
     * @author Maarten
     */
    public class Main extends Sprite 
    {
        
        public var stuiterbal: Sprite = new Sprite();
        public var naarLinks: Boolean = false;
        public var naarBoven: Boolean = false;
        public var cirkel: Sprite = new Sprite();
        public var velocityX: int = 3; //aantal pixels/frame per seconde horizontaal
        public var xpunten:int = vindRandpuntenCirkelX();
        

        
        
        public function Main():void 
        {
            stuiterbal.x = 400
            stuiterbal.y = 300
            stuiterbal.graphics.beginFill(0x49A116, 1);
            stuiterbal.graphics.drawCircle (0, 0, 10);
            addChild(stuiterbal) //addchild buiten main functie werkt niet (?)
            cirkel.graphics.beginFill(0x000000, 0.2);
            cirkel.graphics.drawCircle(400, 300, 100)
            addChild(cirkel)
            
            stuiterbal.addEventListener(Event.ENTER_FRAME, beweegX)
            
            
            
        }
        
        public function vindRandpuntenCirkelX():int
        {
            var radius: Number = 100;
            var middelpuntX: int = 400 ;
            var cirkelformuleX: Number = middelpuntX +( radius * Math.cos(2 * Math.PI * i / aantalpunten));
            var aantalpunten: int = 10;
            
            for (var i: int = 0; i < aantalpunten; i++)
            {
                
                var xpuntenberekenen : Number = cirkelformuleX;
                
            }
            return xpuntenberekenen;
            
            
        }
        
        
        public function beweegX(e:Event):void // Heeft als resultaat dat het figuur binnen de maximaal aangegeven waarden blijft
        {
            stuiterbal.x += velocityX;
            if (naarLinks == false)
            {
                if (stuiterbal.x > xpunten)
                {
                    velocityX = velocityX * -1;
                    naarLinks = true;
                }
            }
            else
            {
                if (stuiterbal.x < xpunten)
                {
                    velocityX = velocityX * -1
                    naarLinks = false;
                }
            }
 
        }   
        
    }
    
}

[ Voor 34% gewijzigd door suikerberg op 25-11-2013 20:17 ]


  • 4Real
  • Registratie: Juni 2001
  • Laatst online: 14-09-2024
Wat is het nu van de functie "vindRandpuntenCirkelX()". Je kan die loop wel weghalen aangezien je daar niet echt iets nuttigs uitvoert. Je overschrijft een variabel 10keer met dezelfde waarde, dus je kan dan beter de variabel cirkelformuleX terug geven.

En wat je op regel 22 doet mag volgens mij helemaal niet. Zoals je het nu ook toepast kan het beter een constant worden, aangezien de waarde altijd hetzelfde is.

Java:
1
2
var cirkelformuleX: Number = middelpuntX +( radius * Math.cos(2 * Math.PI * i / aantalpunten));
            var aantalpunten: int = 10; 

Krijg je hier geen foutmelding op aangezien aantalpunten pas wordt gedefinieerd nadat hij al is gebruikt.

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 19-11 15:57

Armageddon_2k

Trotse eigenaar: Yamaha R6

Ik denk dat je je toch echt eerst wat meer moet verdiepen in hoe programma's geschreven worden.
Je maakt hier basis fouten.

Java:
1
2
3
            var radius: Number = 100; 
            var middelpuntX: int = 400 ; 
            var cirkelformuleX: Number = middelpuntX +( radius * Math.cos(2 * Math.PI * i / aantalpunten)); 

Wat wil je bereiken met je "formule". Dit is geen formule, maar een berekening die op dat moment wordt uitgevoerd. "aantalpunten" is nog niet geinstantieerd, dus je doet een deling door 0.

Java:
1
2
3
4
5
6
7
           
            for (var i: int = 0; i < aantalpunten; i++) 
            { 
                 
                var xpuntenberekenen : Number = cirkelformuleX; 
                 
            } 

Loop hier eens stap voor stap doorheen.
Je doet nu 10x een stukje code dat elke keer hetzelfde doet.

Je idee is niet verkeerd, maar loop eens met een debugger door je code en probeer te begrijpen wat je code gaat doen.

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Armageddon_2k schreef op dinsdag 26 november 2013 @ 09:43:
Ik denk dat je je toch echt eerst wat meer moet verdiepen in hoe programma's geschreven worden.
Je maakt hier basis fouten.

Java:
1
2
3
            var radius: Number = 100; 
            var middelpuntX: int = 400 ; 
            var cirkelformuleX: Number = middelpuntX +( radius * Math.cos(2 * Math.PI * i / aantalpunten)); 

Wat wil je bereiken met je "formule". Dit is geen formule, maar een berekening die op dat moment wordt uitgevoerd. "aantalpunten" is nog niet geinstantieerd, dus je doet een deling door 0.

Java:
1
2
3
4
5
6
7
           
            for (var i: int = 0; i < aantalpunten; i++) 
            { 
                 
                var xpuntenberekenen : Number = cirkelformuleX; 
                 
            } 

Loop hier eens stap voor stap doorheen.
Je doet nu 10x een stukje code dat elke keer hetzelfde doet.

Je idee is niet verkeerd, maar loop eens met een debugger door je code en probeer te begrijpen wat je code gaat doen.
dat ik 10x hetzelfde doe, is idd een beetje dom :p

Dat met die punten heb ik gefixt, ik zal straks het resultaat posten.

Ik heb de code wat aangepast, wat er nu gebeurt is dat het balletje blijft ''trillen'' op het de rand van de cirkel aan de rechterkant, de rand van de cirkel aan de linkerkant kan hij niet uitrekenen, ik denk dat ik verkeerd bezig ben met loops. Zodra ik de if (naarlinks == true) stuitert hij gewoon terug op de zijkant rechts.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.geom.Point;
        import flash.net.URLVariables;
        import flash.text.TextField;
        
        /**
         * ...
         * @author Maarten
         */
        public class Main extends Sprite 
        {
                
                public var stuiterbal: Sprite = new Sprite();
                public var naarLinks: Boolean = false;
                public var naarBoven: Boolean = false;
                public var cirkel: Sprite = new Sprite();
                public var velocityX: int = 3; //aantal pixels/frame per seconde horizontaal
                public var xpunten:int = 0;
                

                
                
                public function Main():void 
                {
                        stuiterbal.x = 400
                        stuiterbal.y = 300
                        stuiterbal.graphics.beginFill(0x49A116, 1);
                        stuiterbal.graphics.drawCircle (0, 0, 10);
                        addChild(stuiterbal) //addchild buiten main functie werkt niet (?)
                        cirkel.graphics.beginFill(0x000000, 0.2);
                        cirkel.graphics.drawCircle(400, 300, 100)
                        addChild(cirkel)
                        stuiterbal.addEventListener(Event.ENTER_FRAME, beweegX)
                        
                        
                        
                }
                
                 public function vindRandpuntenCirkelX():int
                {
                        var radius: Number = 100;
                        var middelpuntX: int = 400 ;
                        var cirkelformuleX: int = new int();
                        var hoek:Number = 2 * Math.PI;
                       
                        for (var i: int = 0; i < 10; i++)
                        {
                            cirkelformuleX = middelpuntX + (radius * Math.cos(hoek * i));
                        }
                        return cirkelformuleX;
                        
                        
                }
                
                
                public function beweegX(e:Event):void // Heeft als resultaat dat het figuur binnen de maximaal aangegeven waarden blijft
                {
                        
                        var arie:Array = new Array();
                        xpunten = vindRandpuntenCirkelX();
                        arie.push (xpunten);
                        
                        stuiterbal.x += velocityX;
                        if (naarLinks == false)
                        {
                                if (stuiterbal.x >= xpunten - 10)
                                {
                                        velocityX = velocityX * -1;
                                        naarLinks = true;
                                }
                        }
                        else if(naarLinks == true)
                        {
                                if (stuiterbal.x <= xpunten + 10)
                                {
                                        velocityX = velocityX * -1
                                        naarLinks = false;
                                }
                        }
 
                }        

        } 
        
}

[ Voor 60% gewijzigd door suikerberg op 26-11-2013 16:36 ]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:45
Heel simpel.. Kijk eens goed naar regel 67.
Ik vraag me ook nog steeds af waarom je bezig bent met naarLinks. Gebruik gewoon die 'velocity' en keer die om als je out of bounds gaat zoals al meerdere malen aangegeven in dit topic.

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Caelorum schreef op dinsdag 26 november 2013 @ 20:04:
Heel simpel.. Kijk eens goed naar regel 67.
Ik vraag me ook nog steeds af waarom je bezig bent met naarLinks. Gebruik gewoon die 'velocity' en keer die om als je out of bounds gaat zoals al meerdere malen aangegeven in dit topic.
Maar als je de velocity zou aanpassen zonder de boolean naarLinks dan gaat hij toch ''vastzitten''/trillen

EDIT: hij werkt zonder de boolean! Zit mijn leraar ernaast? Nu pakt hij helaas alleen nog maar de meest rechtse waarde en op een of andere manier werkt de trace functie ook niet op mijn pc! >.< (heb al gegoogled en flash dev. installatie opnieuw gedaan)

[ Voor 22% gewijzigd door suikerberg op 26-11-2013 21:43 ]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:45
maarten0009, ik raad je aan om het boek Essential Actionscript 3.0 te kopen (of verkrijgen). Mocht je geen zin (of tijd) hebben om AS3 goed vanaf de basis te leren raad ik je aan om Acrionscript 3.0 Cookbook te verkrijgen en goed naar hoofdstuk 11 te kijken en met name 11.1 en 11.4.

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Caelorum schreef op woensdag 27 november 2013 @ 11:25:
maarten0009, ik raad je aan om het boek Essential Actionscript 3.0 te kopen (of verkrijgen). Mocht je geen zin (of tijd) hebben om AS3 goed vanaf de basis te leren raad ik je aan om Acrionscript 3.0 Cookbook te verkrijgen en goed naar hoofdstuk 11 te kijken en met name 11.1 en 11.4.
Ik moet dit doen voor school, ik ga zelf liever mijn tijd steken in een taal als Java of Csharp en dan zal ik ook echt een boek aanschaffen.

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Volgens mij hebben we dit draadje eerder gezien... Maar goed, het gaat niet alleen om de taal, het gaat ook om het idee achter de code. Je wilt een balletje laten bewegen door een 2-dimensionaal vlak. Daarbij kun je het beste gebruik maken van vectoren: een die aangeeft waar de bal zich bevindt en een andere die aangeeft in welke richting de bal beweegt.

Dus in pseudo code:

Klasse vector:
class Vector {
    public $x = 0;
    public $y = 0;

    function __construct($x, $y) {
        this.x = $x;
        this.y = $y;
    }

    function add($vector) {
        this.x += $vector.x;
        this.y += $vector.y;
    }
}

Nu kun je zelf vectoren maken:
BalXY = new Vector(0, 0);
SnelheidXY new Vector(1, 3);

Je bewegingsroutine kan vervolgens met die vectoren, dus:
function Beweeg() {
    BalXY.add(SnelheidXY);
}

Bij herhaaldelijke aanroepen zou BalXY dus worden:
[0, 0] => [1, 3] => [2, 6] => [3, 9] => etc.

Vervolgens moet je nog de 'boundaries' checken. Bij het vierkant was dit eenvoudig omdat je X en Y los kon checken tegen de minimale en maximale grenswaarden van het vierkant. Bij een cirkel moet je het echter anders aanpakken, omdat de randen niet recht zijn.

Als je met de vector rekent (dus X, Y), kun je wel testen of deze groter is dan de radius van de cirkel. Zo ja, dan moet de bal stuiteren. De lengte van de vector (t.o.v. 0 , 0!) kun je makkelijk uitrekenen door een functie toe te voegen aan de Vector klasse:

class Vector {

    ...

    function getLength() {
        return sqrt(pow(this.x, 2) + pow(this.y, 2));
    }
}

Dan moet je bij de cirkel nog wel uitvogelen welke kant de bal op moet stuiteren... (denk aan hoek met de normaal)

[ Voor 24% gewijzigd door Morrar op 27-11-2013 15:16 ]


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 10:45
Overigens kan je het in AS3 beter 2DVector noemen oid, want Vector bestaat al (==typed list).

Daarnaast nog wat resources voor je:
http://www.khanacademy.or...troduction-linear-algebra
http://www.tonypa.pri.ee/vectors/start.html
http://www.essentialmath.com/tutorial.htm

Verder moet je het zelf nu maar uitzoeken hoor. We hebben al behoorlijk wat tips en pointers gegeven en je zou het met een beetje moeite wel moeten kunnen nu. Gegeven dat je ook daadwerkelijk snapt hoe AS3 zelf werkt.

Verwijderd

maarten0009 schreef op dinsdag 26 november 2013 @ 15:52:

Ik heb de code wat aangepast, wat er nu gebeurt is dat het balletje blijft ''trillen'' op het de rand van de cirkel aan de rechterkant, de rand van de cirkel aan de linkerkant kan hij niet uitrekenen, ik denk dat ik verkeerd bezig ben met loops. Zodra ik de if (naarlinks == true) stuitert hij gewoon terug op de zijkant rechts.
Waar de linker rand is?

Waar de linker rand is is voor jou niet relevant. Je wilt enkel 1 ding weten: is er een coilission of niet? En als er een colission is, wat is dan de normal? (vector die loodrecht op het vlak staat waar hij mee botst).

Het testen of er een colission is tussen 2 cirkels is doodsimpel. je hoeft daarbij alleen de afstand tussen de 2 punten en de grootte van de 2 cirkels te weten. Teken het bijvoorbeeld uit op een papiertje, onder welke condities botsen 2 cirkels?

Als je dat weet kun je de vector welke de snelheid en richting aangeeft bijvoorbeeld omdraaien om te kijken of alles goed gaat.
Pagina: 1