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

[AS3] Probleem met kaatsen op x coordinaat.

Pagina: 1
Acties:

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Best lezer,

Om een of andere reden die ik niet kan vinden werkt mijn beweeg functie niet goed, het balletje gaat ipv terug vastzitten, nieteens op het x coordinaat waar hij terug moet gaan. Hier is de code die ik gebruik om te testen, om het te laten werken voeg ik de nu in comment geschreven boolean toe.

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
package 
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;
    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 v: int = 3; //aantal pixels/frame per seconde
        
        public function Main():void
        {
        //Opdracht 1
        
        //geknipt
        
        //Opdracht 2
        
        //geknipt
        
        //Opdracht 3
        
        stuiterbal.graphics.beginFill(0x49A116, 1);
        stuiterbal.graphics.drawCircle (400, 300, 10);
        addChild(stuiterbal) //addchild buiten main functie werkt niet (?)
        
        stuiterbal.addEventListener(Event.ENTER_FRAME, beweegX)
        //stuiterbal.addEventListener(Event.ENTER_FRAME, beweegY)
        stuiterbal.addEventListener(MouseEvent.CLICK, verdwijnen)
        
        
        }

        public function beweegX(e:Event):void // zorgt ervoor dat het balletje horizontaal gaat bewegen
        {
            
                if (stuiterbal.x < 400)
            {
                stuiterbal.x = stuiterbal.x + 5; 
                //Boolean invoegen
                //if ( stuiterbal.x < math.pi * 1)
            }
            
        
            else if (stuiterbal.x > 650)
            {
                stuiterbal.x = stuiterbal.x - 5;
                //Boolean invoegen
            }
            
            
        }   

public function verdwijnen(e:MouseEvent):void // Als je klikt verdwijnt het balletje
        {
            stuiterbal.visible = false;
        
        }


Alvast bedankt voor de reacties! De uiteindelijk opdracht is om het balletje te laten stuiteren binnen een cirkel. Dat lukt dan wel om uit te zoeken. :)

[ Voor 70% gewijzigd door suikerberg op 21-11-2013 17:06 ]


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Lees je if statements eens goed. Wat gebeurt er tussen 400 en 650 bijvoorbeeld?

Engineering is like Tetris. Succes disappears and errors accumulate.


Verwijderd

Alsook, als je stuitergedrag wil simuleren is het geen slecht idee om te kijken hoe 2D Vectors werken ;)

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

Armageddon_2k

Trotse eigenaar: Yamaha R6

Je gedachten gang is niet goed.

Probeer de statements eens uit te schrijven om te kijken wat er gebeurt.
Ik zal je een voorbeeld geven:

code:
1
2
3
Stuiterbal.x begint op 0.
beweegX() wordt aangeroepen.
Omdat Stuiterbal.x kleiner is dan 400, beweegt de bal +5

Dit gaat net zolang door tot de bal op plek 400 ligt.
En dan? dan niks, je statement zegt: Als het balletje minder dan 400 is, beweegt hij +5.
Er zal dus niks meer gebeuren.

Wat je het beste kunt doen is een state machine maken.
iets als:

code:
1
2
3
4
5
6
7
8
9
//Initieel
stuiterbal.richting = omhoog

//Beweeg.x()
If stuiterbal.richting == omhoog then stuiterbal.x = stuiterbal.x + 5
If stuiterbal.richting == omlaag then stuiterbal.x = stuiterbal.x - 5

if stuiterbal. x > 600 then stuiterbal.richting = omlaag
if stuiterbal. x < 400 then stuiterbal.richting = omhoog

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
armageddon_2k1 schreef op donderdag 21 november 2013 @ 19:02:
Lees je if statements eens goed. Wat gebeurt er tussen 400 en 650 bijvoorbeeld?
Ik heb ze wat aangepast, nu blijft het balletje hangen op het x coordinaat 650. Dit is de functie beweegX

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public function beweegX(e:Event):void // zorgt ervoor dat het balletje horizontaal gaat bewegen
        {
            
                if (stuiterbal.x < 400)
            {
                naarLinks = false
            }
            
        
            else if (stuiterbal.x > 650)
            {
                naarLinks = true
            }
            
            else if (naarLinks == false)
            {
                stuiterbal.x = stuiterbal.x + v
            }
            else if (naarLinks == true)
            {
                stuiterbal.x = stuiterbal.x -v
            }
            

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Armageddon_2k schreef op vrijdag 22 november 2013 @ 10:41:
Je gedachten gang is niet goed.

Probeer de statements eens uit te schrijven om te kijken wat er gebeurt.
Ik zal je een voorbeeld geven:

code:
1
2
3
Stuiterbal.x begint op 0.
beweegX() wordt aangeroepen.
Omdat Stuiterbal.x kleiner is dan 400, beweegt de bal +5

Dit gaat net zolang door tot de bal op plek 400 ligt.
En dan? dan niks, je statement zegt: Als het balletje minder dan 400 is, beweegt hij +5.
Er zal dus niks meer gebeuren.

Wat je het beste kunt doen is een state machine maken.
iets als:

code:
1
2
3
4
5
6
7
8
9
//Initieel
stuiterbal.richting = omhoog

//Beweeg.x()
If stuiterbal.richting == omhoog then stuiterbal.x = stuiterbal.x + 5
If stuiterbal.richting == omlaag then stuiterbal.x = stuiterbal.x - 5

if stuiterbal. x > 600 then stuiterbal.richting = omlaag
if stuiterbal. x < 400 then stuiterbal.richting = omhoog
waarom werk je dan met omhoog en omlaag bij X coordinaten? of is dat een foutje?

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
maarten0009 schreef op vrijdag 22 november 2013 @ 10:42:
[...]


Ik heb ze wat aangepast, nu blijft het balletje hangen op het x coordinaat 650. Dit is de functie beweegX

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    public function beweegX(e:Event):void // zorgt ervoor dat het balletje horizontaal gaat bewegen
        {
            
                if (stuiterbal.x < 400)
            {
                naarLinks = false
            }
            
        
            else if (stuiterbal.x > 650)
            {
                naarLinks = true
            }
            
            else if (naarLinks == false)
            {
                stuiterbal.x = stuiterbal.x + v
            }
            else if (naarLinks == true)
            {
                stuiterbal.x = stuiterbal.x -v
            }
            
Loop nu eens in je hoofd door deze code heen.. wat gebeurt er als x kleiner is dan 400? Wat gebeurt er als x groter is dan 650? Wat gebeurt er daarna?

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:18
Armageddon_2k schreef op vrijdag 22 november 2013 @ 10:41:
[...]
Wat je het beste kunt doen is een state machine maken.
iets als:
[...]
Dan is wel weer overkill zeg ^^ Zijn idee van de functie is zo slecht nog niet, juist vanwege de eenvoud. Als je het al gaat herschrijven zou ik de basis zo laten alleen dus kijken naar vectoren zoals boe2 al heeft aangegeven. Dan wordt een stuitereffect realiseren een stuk eenvoudiger. Dan kan je namelijk met krachten werken en aan de hand daarvan de verplaatsing berekenen met wat eenvoudige natuurkundige berekeningen.

Maar voor nu maarten0009 meer gebaat bij het logisch nadenken en in zijn hoofd (of op papier) uitschrijven wat er gebeurt bij verschillende waardes. Wat gebeurt er bijv. bij 399? en wat bij 651? en wat bij 401?
Wat maarten0009 wil is dat de bal altijd in een bepaalde richting beweegt, maar als het ergens tegenaan botst (denkbeeldige lijn?) de andere kant op beweegt. maarten0009, sla de verplaatsing op in variabelen en bij botsing tegen een lijn die verplaatsing vermenigvuldigen met -1. Vervolgens altijd, ongeacht botsen, het object verplaatsen met de waardes in die variabelen. Dan zit je alleen nog met of je tegen de bovenkant, onderkant of zijkanten aanbotst, maar daar kom je ook wel uit denk ik :)

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Probeer het eens als volgt:

Je hebt 2 variable; velocityX en velocityY. Elk frame, dus bij beweeg, tel je deze op bij de sprite X en Y. Wanneer de sprite iets raakt draai je de velocityX om, door dit te doen:

code:
1
velocityX = -velocityX;


De bal zal dan de andere kant op bewegen, zoals je verwacht. Optioneel kan je nog de velocity wat afnemen, dit zorgt ervoor dat het balletje minder hard gaat na een collision.

Freelance Unity3D developer


  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Rotterdammertje schreef op vrijdag 22 november 2013 @ 10:57:
[...]


Loop nu eens in je hoofd door deze code heen.. wat gebeurt er als x kleiner is dan 400? Wat gebeurt er als x groter is dan 650? Wat gebeurt er daarna?
als het goed is maakt hij er een loop van door telkens op dat punt de boolean te triggeren.
Caelorum schreef op vrijdag 22 november 2013 @ 11:38:
[...]

Dan is wel weer overkill zeg ^^ Zijn idee van de functie is zo slecht nog niet, juist vanwege de eenvoud. Als je het al gaat herschrijven zou ik de basis zo laten alleen dus kijken naar vectoren zoals boe2 al heeft aangegeven. Dan wordt een stuitereffect realiseren een stuk eenvoudiger. Dan kan je namelijk met krachten werken en aan de hand daarvan de verplaatsing berekenen met wat eenvoudige natuurkundige berekeningen.

Maar voor nu maarten0009 meer gebaat bij het logisch nadenken en in zijn hoofd (of op papier) uitschrijven wat er gebeurt bij verschillende waardes. Wat gebeurt er bijv. bij 399? en wat bij 651? en wat bij 401?
Wat maarten0009 wil is dat de bal altijd in een bepaalde richting beweegt, maar als het ergens tegenaan botst (denkbeeldige lijn?) de andere kant op beweegt. maarten0009, sla de verplaatsing op in variabelen en bij botsing tegen een lijn die verplaatsing vermenigvuldigen met -1. Vervolgens altijd, ongeacht botsen, het object verplaatsen met de waardes in die variabelen. Dan zit je alleen nog met of je tegen de bovenkant, onderkant of zijkanten aanbotst, maar daar kom je ook wel uit denk ik :)
Kun je dit iets nader uitleggen: sla de verplaatsing op in variabelen. hoe zou ik dat het beste doen?
TJHeuvel schreef op vrijdag 22 november 2013 @ 11:56:
Probeer het eens als volgt:

Je hebt 2 variable; velocityX en velocityY. Elk frame, dus bij beweeg, tel je deze op bij de sprite X en Y. Wanneer de sprite iets raakt draai je de velocityX om, door dit te doen:

code:
1
velocityX = -velocityX;


De bal zal dan de andere kant op bewegen, zoals je verwacht. Optioneel kan je nog de velocity wat afnemen, dit zorgt ervoor dat het balletje minder hard gaat na een collision.
In mijn code staat de variabele v voor velocity maar helaas werkt deze code ook niet:
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
public function beweegX(e:Event):void // zorgt ervoor dat het balletje horizontaal gaat bewegen
        {
            
                if (stuiterbal.x < 400)
            {
                naarLinks = false
            }
            
        
            else if (stuiterbal.x > 650)
            {
                naarLinks = true
            }
            
            else if (naarLinks == false)
            {
                stuiterbal.x = stuiterbal.x + v
            }
            else if (naarLinks == true)
            {
                stuiterbal.x = stuiterbal.x + (v * -1)
            }
            
        }   


misschien een for loop die i++ en i-- doet op de velocity met in de for loop een if, else if structuur?


EDIT:

Ik heb dit gevonden, misschien is mijn denkwijze fout. Ik probeer het object steeds te ''verplaatsen'' maar misschien moet je hem juist telkens opnieuw tekenen. Code die ik heb gevonden:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  public function beweegHor(e:Event):void 
        { 
            teken.x += vx; 
            if(links == false){  
                if (teken.x > 800 - 15)  
                {  
                    vx *= -1;  
                    links = true;  
                }  
            }  
            else  
            {  
                if (teken.x < 0 + 15)  
                {  
                    vx *= -1;  
                    links = false;  
                }  
            }  
             
        } 

[ Voor 12% gewijzigd door suikerberg op 22-11-2013 12:47 ]


  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
maarten0009 schreef op vrijdag 22 november 2013 @ 12:40:
[...]

als het goed is maakt hij er een loop van door telkens op dat punt de boolean te triggeren.


[...]
In plaats van te denken: "Als het goed is, zou dit moeten gebeuren...", loop nu eens stap voor stap door je code heen. Je functie wordt aangeroepen en x is kleiner dan 400. Wat gebeurt er? Welke variabelen worden gezet? Daarna wordt de functie weer aangeroepen. Wat is de waarde van x? Wat gebeurt er in je functie? Zie je wat er fout gaat?
Idem voor de situatie waarbij x groter is dan 650. Stap voor stap door je code, en je ziet (hopelijk) vanzelf waar de fout zit.

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


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

Armageddon_2k

Trotse eigenaar: Yamaha R6

maarten0009 schreef op vrijdag 22 november 2013 @ 10:44:
[...]
waarom werk je dan met omhoog en omlaag bij X coordinaten? of is dat een foutje?
Dat is inderdaad een foutje, ik ging er even vanuit dat een stuiterbal op en neer gaat.
Zoals een normale stuiterbal.

Maar het idee is hetzelfde.

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Armageddon_2k schreef op vrijdag 22 november 2013 @ 13:54:
[...]


Dat is inderdaad een foutje, ik ging er even vanuit dat een stuiterbal op en neer gaat.
Zoals een normale stuiterbal.

Maar het idee is hetzelfde.
Rotterdammertje schreef op vrijdag 22 november 2013 @ 12:54:
[...]
I

In plaats van te denken: "Als het goed is, zou dit moeten gebeuren...", loop nu eens stap voor stap door je code heen. Je functie wordt aangeroepen en x is kleiner dan 400. Wat gebeurt er? Welke variabelen worden gezet? Daarna wordt de functie weer aangeroepen. Wat is de waarde van x? Wat gebeurt er in je functie? Zie je wat er fout gaat?
Idem voor de situatie waarbij x groter is dan 650. Stap voor stap door je code, en je ziet (hopelijk) vanzelf waar de fout zit.
Ik heb heel veel gezocht, heb hem snel kunnen fixen en in een rechthoek laten stuiteren, nu probeer ik alleen hem in een cirkel te laten stuiteren.

Ik heb 2 functies gemaakt voor het berekenen van de x en y coordinaten op de rand van de cirkel:
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
public function vindmaxwaardenXcirkel (Xmidden:int, radius:Number, n:Number = 10 ) //alle  x punten op de rand van de cirkel zoeken
        {
            var cirkelformule:Number = Math.PI * 2 / n
            var maxXwaardencirkel:Array = new Array (n) // 
            var i:int = -1; // interval
            while (i++ < n ) // herhaal met een verandert interval
            {
                var alpha:Number = cirkelformule * i;
                var berekenXpunten:Point = new Point ( Math.cos (alpha) * radius, Math.sin (alpha) * radius); // x coordinaat dus cosinus
                maxXwaardencirkel [i] = Xmidden + (berekenXpunten); // voeg de uitkomst van de formule toe aan de coordinaten van het beginpunt
            }
            return maxXwaardencirkel; // geef de waardes terug
            
        }
        public function vindmaxwaardenYcirkel (Ymidden:int , radius: Number, n:Number = 10) // alle y punten op de rand van de cirkel zoeken
        {
            var cirkelformule:Number = Math.PI * 2 / n
            var maxYwaardencirkel: Array = new Array (n)
            var i:int = -1;
            while (i++ < n )
            {
                var alpha:Number = cirkelformule * i;
                var berekenYpunten:int = new int (Math.sin (alpha) * radius);
                maxYwaardencirkel [i] = Ymidden + (berekenYpunten); // voeg de uitkomst van de formule toe aan de coordinaten van het beginpunt
            }
            return maxYwaardencirkel;
        }



Hoe haal ik nu de x en y punten uit de array?

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Ehm kan aan mij liggen hoor, maar waarom zou je zo proberen de randwaarden op te halen? Je krijgt voor X dan toch alle waarden van (midden - radius) tot (midden + radius)? Idem voor de y-waarden.

Wat je wilt doen, is kijken of de [x,y]-vector van de bal tot het midden gelijk of groter is aan de radius van de cirkel toch? Zo ja, dan moet de bal stuiteren.

Als het om een cirkel gaat, lijkt het me niet handig om x en y apart te behandelen.

[ Voor 12% gewijzigd door Morrar op 22-11-2013 15:12 ]


  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Morrar schreef op vrijdag 22 november 2013 @ 15:10:
Ehm kan aan mij liggen hoor, maar waarom zou je zo proberen de randwaarden op te halen? Je krijgt voor X dan toch alle waarden van (midden - radius) tot (midden + radius)? Idem voor de y-waarden.

Wat je wilt doen, is kijken of de [x,y]-vector van de bal tot het midden gelijk of groter is aan de radius van de cirkel toch? Zo ja, dan moet de bal stuiteren.

Als het om een cirkel gaat, lijkt het me niet handig om x en y apart te behandelen.
Met het point gegeven werken dan?

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:18
maarten0009 schreef op vrijdag 22 november 2013 @ 15:19:
[...]
Met het point gegeven werken dan?
http://natureofcode.com/book/chapter-1-vectors/ :) En ja dit is praktisch de code weggeven, maar ik hoop dat je de tekst ook leest ^^

[ Voor 16% gewijzigd door Caelorum op 22-11-2013 15:35 ]


  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 21-11 21:44
Caelorum schreef op vrijdag 22 november 2013 @ 15:34:
[...]

http://natureofcode.com/book/chapter-1-vectors/ :) En ja dit is praktisch de code weggeven, maar ik hoop dat je de tekst ook leest ^^
Zo huiswerk weer gemaakt :D Maar vectoren lijkt me inderdaad ook de juiste richting om op te gaan.

  • suikerberg
  • Registratie: Augustus 2013
  • Laatst online: 09:52
Morrar schreef op vrijdag 22 november 2013 @ 17:08:
[...]


Zo huiswerk weer gemaakt :D Maar vectoren lijkt me inderdaad ook de juiste richting om op te gaan.
pssst niet aan me leraar vertellen haha
Caelorum schreef op vrijdag 22 november 2013 @ 15:34:
[...]

http://natureofcode.com/book/chapter-1-vectors/ :) En ja dit is praktisch de code weggeven, maar ik hoop dat je de tekst ook leest ^^
Is prima, zal er de komende dagen een kijkje nemen.

  • RocketKoen
  • Registratie: December 2001
  • Laatst online: 21-11 23:09
maarten0009 schreef op vrijdag 22 november 2013 @ 12:40:
In mijn code staat de variabele v voor velocity maar helaas werkt deze code ook niet:
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
public function beweegX(e:Event):void // zorgt ervoor dat het balletje horizontaal gaat bewegen
        {
            
                if (stuiterbal.x < 400)
            {
                naarLinks = false
            }
            
        
            else if (stuiterbal.x > 650)
            {
                naarLinks = true
            }
            
            else 
            {
                stuiterbal.x = 500 //out of bounds
            }
            if (naarLinks == false)
            {
                stuiterbal.x = stuiterbal.x + v
            }
            else if (naarLinks == true)
            {
                stuiterbal.x = stuiterbal.x + (v * -1)
            }
            
        }   
Heb er even 2 losse statements van gemaakt, anders doet het niks.
Daarnaast is stuiterbal.x + (v * -1) een beetje overdreven... + (v * -1) is hetzelfde als - v

[ Voor 5% gewijzigd door RocketKoen op 22-11-2013 17:36 ]

TheS4ndm4n#1919


  • Caelorum
  • Registratie: April 2005
  • Laatst online: 14:18
Morrar schreef op vrijdag 22 november 2013 @ 17:08:
[...]
Zo huiswerk weer gemaakt :D Maar vectoren lijkt me inderdaad ook de juiste richting om op te gaan.
Zolang je maar beseft dat je alleen jezelf er mee hebt als je de achterliggende gedachtes niet begrijpt ;)
Pagina: 1