[AS3] Ballen tegen de wanden aan kaatsen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hedva
  • Registratie: Augustus 2010
  • Laatst online: 02-09 19:29

Hedva

Blobfish

Topicstarter
Ik ben net begonnen met leren programmeren (in AS3, moet van school).

Nu wilde ik een bal spelletje maken, waarbij de ballen tegen de wanden aan kaatsen.
Nu valt hier heel erg veel over te vinden op internet, allemaal verschillende manieren om dit te doen. Alleen om een onduidelijke reden (onduidelijk voor mij) lukt dit niet.

Ik heb verschillende sites geraadpleegd, heb zelf een boek (ActionScript 3.0 Animation: Making Things Move!)

Maar zelfs daarmee lukt het mij niet.

Zou iemand mij kunnen uitleggen wat ik fout doe? (en liever nog; waarom het fout is)

Dit is mijn main.as
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package 
{
    import flash.display.MovieClip;

    public class Main extends MovieClip
    {

        private var aantalBallen:int = 100;
        private var mijnBal:Bal;

        public function Main()
        {

            for (var i:int = 1; i <= aantalBallen; i++)
            {
                mijnBal = new Bal ();
                addChild(mijnBal);
            }
        }

    }

}


En dit mijn Bal.as

code:
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
package 
{
    import flash.display.Sprite;
    import flash.events.MouseEvent;
    import flash.events.Event;
    import flash.display.StageAlign;

    public class Bal extends Sprite
    {
        public var balSprite:Sprite;
        private var angle:Number = (Math.random()*360);
        private var speed:Number = 3;
        private var radius:Number = 10;

        public function Bal()
        {
            addEventListener(Event.ADDED_TO_STAGE, handlerAdded);
        }


        private function handlerAdded(evt:Event):void
        {
            stage.align = StageAlign.TOP_LEFT;
            balSprite = new Sprite();
            balSprite.graphics.beginFill((Math.random()*0xffffff), 0.5);
            balSprite.graphics.drawCircle((Math.random()*stage.stageWidth), (Math.random()*stage.stageWidth), radius);
            balSprite.graphics.endFill();
            addChild(balSprite);
            addEventListener(Event.ENTER_FRAME, moveOnStage);
            
        }
        
        private function moveOnStage(evt:Event):void
        {
            var radians:Number = angle*Math.PI / 2;
            var vx:Number = Math.cos(angle) * speed;
            var vy:Number = Math.sin(angle) * speed;
            balSprite.x += vx;
            balSprite.y += vy;
            
            
            if ( balSprite.x >= stage.stageWidth - 10 )
            {
                balSprite.x = stage.stageWidth - 10;
                speed *= -1;
            }
            else if ( this.x <= 10 )
            {
                balSprite.x = 10;
                speed *= -1;
            }
 
            if ( balSprite.y >= stage.stageHeight - 10 )
            {
                balSprite.y = stage.stageHeight - 10;
                speed *= -1;
            }
            else if ( this.y <= 10 )
            {
                balSprite.y = 10;
                speed *= -1;
            }
        }

    }

}



Edit:

Als ik dat laatste deel uit die code verwijder doet die het wel gewoon. Dit stuk dus dus weghalen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if ( balSprite.x >= stage.stageWidth - 10 )
            {
                balSprite.x = stage.stageWidth - 10;
                speed *= -1;
            }
            else if ( this.x <= 10 )
            {
                balSprite.x = 10;
                speed *= -1;
            }
 
            if ( balSprite.y >= stage.stageHeight - 10 )
            {
                balSprite.y = stage.stageHeight - 10;
                speed *= -1;
            }
            else if ( this.y <= 10 )
            {
                balSprite.y = 10;
                speed *= -1;
            }


Dan komen de ballen op een random plek, willekeurige kleur en willekeurige richting.
Maar met dat deel wilde ik juist ervoor zorgen dat de ballen tegen de wand aan kaatsen.

[ Voor 15% gewijzigd door Hedva op 05-12-2011 10:35 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Dit kan natuurlijk nooit goed werken zo. Je gebruikt een variabele (speed) die je inverteert als je tegen de muur horizontaal of verticaal aankomt. Je kunt beter je richting als een vector opslaan, en dan alleen de x, of alleen de y component flippen bij een botsing.

(Overigens, als je meer wilt doen dan alleen dit, bijv. ballen die elkaar ook van richting kunnen veranderen, kijk dan eens naar een goeie collision detection library.)

[ Voor 24% gewijzigd door Grijze Vos op 05-12-2011 10:47 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
In dat stukje code pas je de variabele "speed" aan. Voor welke bal wordt deze variabele gebruikt? Wat gebeurt er met de speed van alle andere ballen als een bal stuitert?

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


Acties:
  • 0 Henk 'm!

  • Jegorex
  • Registratie: April 2004
  • Laatst online: 03-09 23:24
AS3 heb ik nooit mee gewerkt, maar zoals Grijze Vos al zegt lijkt het erop dat je bal achteruit zal gaan als je een muur raakt.
Verder heb je een variabele radius, waarom heb je die niet gebruikt op alle plaatsen waar nu 10 staat?

Acties:
  • 0 Henk 'm!

  • Hedva
  • Registratie: Augustus 2010
  • Laatst online: 02-09 19:29

Hedva

Blobfish

Topicstarter
Grijze Vos schreef op maandag 05 december 2011 @ 10:46:
Dit kan natuurlijk nooit goed werken zo. Je gebruikt een variabele (speed) die je inverteert als je tegen de muur horizontaal of verticaal aankomt. Je kunt beter je richting als een vector opslaan, en dan alleen de x, of alleen de y component flippen bij een botsing.

(Overigens, als je meer wilt doen dan alleen dit, bijv. ballen die elkaar ook van richting kunnen veranderen, kijk dan eens naar een goeie collision detection library.)
Wat bedoel je precies met 'als een vector opslaan'? Ik ben (nog) niet bekent met vaktermen.
Rotterdammertje schreef op maandag 05 december 2011 @ 12:18:
In dat stukje code pas je de variabele "speed" aan. Voor welke bal wordt deze variabele gebruikt? Wat gebeurt er met de speed van alle andere ballen als een bal stuitert?
De ballen hebben een willekeurige kleur en zijn transparant. Hierdoor krijg je een soort van 3e kleur als ze over elkaar heen gaan. Dat wil ik juist zo hebben.

Uiteindelijk wil ik er een soort spelletje van maken dat je op die balletjes moet klikken binnen een bepaalde tijd en dat ze dan verdwijnen. Maar daar ga ik me pas op richting als ik ze tegen de wand aan gekaatst krijg. één ding tegelijk :P Ze moeten dus niet tegen elkaar aan botsen.
Het is een tussen oefening voor school dat je iets in AS3 moet maken.(Je mocht zelf bedenken wat, in principe is het nu al goed om als oefening in te leveren. Je moet alleen laten zien dat je het wel enigszins een beetje snapt) Het is gewoon een zelfbedachte oefening(was opdracht; bedenk zelf iets), dus mag ermee doen wat ik wil. Maar ik vind het gewoon leuk om er meer uit te halen.
Had ook iets makkelijkers kunnen kiezen (bv. poppetje waarmee je loopt) maar ik vond dit idee leuker :P

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:27

Matis

Rubber Rocket

Een vector is niets meer dan een snelheid en een richting van een object.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • Patriot
  • Registratie: December 2004
  • Laatst online: 11-09 16:38

Patriot

Fulltime #whatpulsert

Je moet niet met die hoek gaan werken, maak gebruik van twee extra variabelen die de acceleratie op de x en y-as bevatten, ik zou ze voor het gemak ax en ay noemen. Die voeg je dan steeds toe aan de snelheid (vx en vy). Als je dan tegen een verticaal oppervlak komt dan flip je de vy, anders de vx.

Let wel op dat je op die manier nog niets van wrijving hebt ingebouwd. Als voorbeeld kun je ook met 1 bal beginnen, die je met behulp van de pijltjestoetsen kunt besturen (ik neem aan dat je met behulp van je boek wel op kunt zoeken hoe je toetsaanslagen moet afvangen): Als je pijltje omhoog drukt zou je dan je ay een positief getal willen geven. Druk je op het pijltje naar links, dan krijgt ax een negatieve waarde. Als je geen pijltjes hebt ingedrukt kun je dan ay op een negatieve waarde laten, op die manier simuleer je zwaartekracht.

Als je bijv. wat wrijving wilt introduceren bij een stuiter, kun je ervoor zorgen dat er bij een stuiter naast het omkeren van de snelheidswaarde ook iets van die snelheidswaarde wordt afgehaald (een percentage x, bijv.).

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Hedva schreef op maandag 05 december 2011 @ 19:25:
[...]

Wat bedoel je precies met 'als een vector opslaan'? Ik ben (nog) niet bekent met vaktermen.
Dat lijkt dan een perfecte gelegenheid om te googelen op de term 'vector' en je kennis uit te breiden.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

En ik wil eigenlijk afsluiten met de wijze woorden van Grijze Vos hierboven. Het is niet erg als je iets zelf niet snapt, maar ik mis toch echt je zelfinzet. Dit haal je bij de basis tutorial-sites al werkend vandaan en vandaaruit kan je gaan Googlen naar kreten die worden verstrooid.

Ik geef je nog een kans om zelf je probleem aan te kaarten, zelf aan te geven wat je hebt geprobeerd, zelf aan te geven waar je op hebt gezocht en waarom die specifieke dingen niet werken voor jou en anders doe ik dit topic helaas op slot.

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

Verwijderd

Niet helemaal ontopic maar qua algemene opzet is nog wel wat aan te merken, voornamelijk omdat je hebt over een spel maken en er gegarandeerd meer elementen dan een paar ballen.

- Je Bal objecten bezitten nu zelf methods voor collision-detection en movement , wat misschien beter in je 'Engine' kan zitten zodat je het op alle objecten toe kunt passen.

- ik mis de gebruikelijke 'game loop' voor je timing en je afhandeling.

er zijn genoeg resources over AS3 en game development online te vinden en als je iets leert kun je het beter meteen goed leren.

Acties:
  • 0 Henk 'm!

  • SaphuA
  • Registratie: September 2005
  • Laatst online: 10-09 22:00
.

[ Voor 100% gewijzigd door SaphuA op 31-01-2022 15:52 ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
SaphuA schreef op woensdag 07 december 2011 @ 11:26:

Tip2: waarom gelijk moeilijk doen met radians en PI?
Waarom überhaupt moeilijk doen met hoeken, sinus en cosinus als het veel makkelijker en efficienter kan met 2D vectoren. TS is in het wilde weg aan het programmeren geslagen zonder gedegen basiskennis van het probleemgebied.

Bij deze nog wat bijval voor de opmerking van Grijze Vos: tijd om bij te spijkeren en je kennis te verrijken.

Acties:
  • 0 Henk 'm!

  • Hedva
  • Registratie: Augustus 2010
  • Laatst online: 02-09 19:29

Hedva

Blobfish

Topicstarter
BtM909 schreef op dinsdag 06 december 2011 @ 10:07:
En ik wil eigenlijk afsluiten met de wijze woorden van Grijze Vos hierboven. Het is niet erg als je iets zelf niet snapt, maar ik mis toch echt je zelfinzet. Dit haal je bij de basis tutorial-sites al werkend vandaan en vandaaruit kan je gaan Googlen naar kreten die worden verstrooid.

Ik geef je nog een kans om zelf je probleem aan te kaarten, zelf aan te geven wat je hebt geprobeerd, zelf aan te geven waar je op hebt gezocht en waarom die specifieke dingen niet werken voor jou en anders doe ik dit topic helaas op slot.
Zoals ik al eerder aan heb gegeven heb ik een boek gebruikt(AS3: Making Things Move). Nu staat in dit boek dus helaas niet alles wat ik wel wil bereiken. Daarom heb ik code van online tutorials geprobeerd te gebruiken. Van o.a. deze en deze en op tutsplus.com (helaas is deze nu alleen nog maar premium only). Daarnaast een leraar gevraagd en mede studenten maar ook met hun hulp lukte het niet om de ballen tegen de wanden aan te kaatsen. Vandaar dat ik hier op tweakers met de vraag kwam.

Ik zit al 2 weken (ja echt waar) te kloten om de ballen tegen de muur aan te laten botsen, dus weinig inzet vind ik niet echt de juiste verwoording.
Maar inderdaad, dit lukt wel gewoon met een totale copypast van een script ergens online, maar dan snap ik er alsnog niets van waarom dat script het het wel doet maar als ik het in mijne gebruik niet. Zodra ik dat soort codes probeer te integreren in mijn bestand, gaat het dus mis.
R4gnax schreef op woensdag 07 december 2011 @ 13:31:
[...]
Waarom überhaupt moeilijk doen met hoeken, sinus en cosinus als het veel makkelijker en efficienter kan met 2D vectoren. TS is in het wilde weg aan het programmeren geslagen zonder gedegen basiskennis van het probleemgebied.

Bij deze nog wat bijval voor de opmerking van Grijze Vos: tijd om bij te spijkeren en je kennis te verrijken.
Over dat cos/sin, dat is een stuk code wat ik uit het boek heb gehaald. (dit boek)
Ik heb inderdaad geen kennis van programmeren verder. Maar dit is een boek met een soort van tutorial erin waarbij je steeds meer leert. Ik wilde alleen even van het pad af die het boek mij gaf om mijn eigen ding te proberen.

Maar alsnog bedankt voor de tips iedereen :)
Pagina: 1