Flash AS3 probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi Tweakers,

Ik ben bezig met een simpel spel aan het maken voor school. Ik gebruik Flash Professional CS5. Ik werk met de tijdlijn. Ik heb 2 schermen tot nu toe. Het hoofdscherm, waar je kan klikken op een button en die gaat dan naar frame 2. Nu heb ik op frame 2 een terug button die weer terug naar frame 1 moet gaan.

Dit is de code daarvoor,:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
stop ();

//Aardbei button

aardbeibtn.addEventListener(MouseEvent.CLICK, aardbeibutton);
function aardbeibutton(event:MouseEvent):void{
    gotoAndStop(2);
}

//Terug button

terugbtn.addEventListener(MouseEvent.CLICK, terugbutton);
function terugbutton(event:MouseEvent):void{
    gotoAndStop(1);
}


De button naar scherm 2 dus frame 2 werkt perfect, maar ik kan niet terug van frame 2 naar frame 1. Ik krijg de volgende error:

TypeError: Error #1009: Kan geen eigenschap of methode benaderen via een verwijzing naar een object dat null is.
at ProjectDeel1_fla::MainTimeline/frame1()

Hoe kan ik dit oplossen?

[ Voor 0% gewijzigd door MueR op 15-03-2011 00:37 ]


Acties:
  • 0 Henk 'm!

  • Guillome
  • Registratie: Januari 2001
  • Niet online

Guillome

test

Noob in AS3 maar een poging: staat je code wel op alle frames? Dus een layer met maar 1 keyframe, en daar je code in? Was vroeger wel eens belangrijk.

If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router


Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Tijdje geleden dat ik was met AS3 heb gedaan, maar waar staat je code? Op de tijdlijn in een clip? En wanneer gaat het exact fout? Op het moment dat je op frame 2 aanbeland of pas op het moment dat je op de terugbutton klikt?

Misschien heb je hier nog wat aan:
http://curtismorley.com/2...-a-null-object-reference/

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een aparte layer gemaakt en daarin al m'n code bij elkaar gedaan. Is dat fout? nee toch?

Ik krijg de fout meteen als ik op test movie klik

[ Voor 21% gewijzigd door Verwijderd op 14-03-2011 16:40 ]


Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Ah, je heb zeker eerst alleen de code voor de eerste button getest en daarna de tweede erbij geplakt wat vervolgens niet werkte?

Je script word meteen geladen op het eerste frame waarin een verwijzing staat naar je button op frame2. Op frame 1 bestaat je tweede button nog niet dus krijg je deze error welke aangeeft dat het object wat je probeert aan te roepen niet bestaat (oftewel null is).

De oplossing staat in de link die ik je eerder gaf. Je plempt je tweede button ook in het eerste frame en werkt met de visibility van je buttons. Of je zet de code mbt je tweede button apart in hetzelfde keyframe als je button. Layer maakt niet uit. Wel handig om alle as3 in één layer te houden natuurlijk ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks! Ik snap helemaal wat je bedoeld, ik ben alleen nog vrij nieuw met AS3 en hoe ik zet ik m'n 2de button ook in frame 1? Ik ga met enorm veel buttons werken. Het is namelijk een spel waarbij je vragen moet beantwoorden. In totaal ongeveer 12 vragen met elk 4 keuzes. Moet ik dan elke button terug verwijzen naar frame 1?

Of is er een handigere manier om dit te doen? Het enige is dat ik moet is met buttons doorverwijzingen maken naar andere schermen. Het kan zelfs in powerpoint, maar dat mag niet en aangezien flash via timeline best goed te doen is wil ik dit doen, maar het doet gewoon niet wat ik zeg

[ Voor 30% gewijzigd door Verwijderd op 14-03-2011 16:58 ]


Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Er zijn veel verschillende manier om met flash te programmeren en welke de beste is hangt voornamelijk af van de situatie. In jou geval moet het snel en simpel zijn dus zou ik je de volgende aanraden:

Je hangt in iedere button/movieclip een script die de desbetreffende button afhandelt:

JavaScript:
1
2
3
4
5
this.addEventListener(MouseEvent.CLICK, btn1Handler);

function btn1Handler(event:MouseEvent):void{
//Doe je ding
}


Voordeel: Je hoeft je geen zorgen te maken over de plaatsing van de buttons en het is simpel en snel te doen
Nadeel: Je code staat verspreid wat het aanpassen van heel veel buttons een pain in the *** kan maken.

Er zijn meerdere manieren om het netter en handiger te doen maar daar is wel wat meer kennis/ervaring voor nodig.

Succes ermee ;)

ps. Excuus voor de javascript code-tag maar ik weet niet of er ook ééntje voor as3 is, maar deze lijken iig op elkaar

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Heel erg bedankt! Nog een laatste vraag ik weet niet hoe het komt maar als ik dus een object omzet naar een symbool en daar dus een button van maak en op op f9 klik voor action script krijg ik bij de button dat ik niet direct action script kan toevoegen aan het object. Hoe moet ik dit veranderen?

Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Graag gedaan!

Da's waar ook. AS3 ondersteunt geen scripts op objecten. Je kan overschakelen naar AS2 maar dan is de syntax ook meteen weer anders. Met die melding had je het antwoord trouwens ook zo op google kunnen vinden ;)

Wat ik zelf altijd deed was een clickevent-listener voor de hele stage maken. In de functie die daarbij aangeroepen werd keek ik dan naar het object wat geklikt was en riep dan via een switch het bijbehorende commando/functie aan. Op die manier gingen alle klikacties via één functie en konden we direct zien wat er gebeurde. Werkt erg fijn als je een groot project heb met een shitload aan klikbare objecten. :P

Beetje dit idee:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
stage.addeventlistener(MouseEvent.CLICK, clickHandler

private function clickHandler(Mousevent:e)
{
     switch(e.object.name)
     {
          case "btn1" : // doe dit
          case "btn2" : // doe dat
          case "btn3" : // doe zus
          //enz
     }
} 


Let op. Dit is een voorbeeld. De correcte syntax moet je zelf even uitzoeken. Ik hoop dat dit trouwens ook werkt voor buttons. Wij werkten altijd met movieclips en deden daar de animaties/states van de buttons in die we dan met as3 afspeelden met behulp van MouseEvent.MouseOver en MouseEvent.MouseOut.

Beetje zoals hier

[ Voor 3% gewijzigd door nemo55 op 15-03-2011 00:21 ]


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:33

MueR

Admin Tweakers Discord

is niet lief

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • Gamebytes
  • Registratie: April 2006
  • Laatst online: 26-08 18:19
Als je dit gaat doen (met de tijdlijn werken) maak dan een tijdlijn aan met alleen je actionscript acties, en los daarvan een tijdlijn(en) met de opmaak.

Als je button (movieclip) dan aanspreekt door het gebruik van AS3 zou je eenvoudig naar verschillende frames kunnen springen.

Code op frame 1:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import flash.display.MovieClip;

stop();

var btnOne:MovieClip = new MovieClip();
    btnOne.graphics.beginFill(0X000000);
    btnOne.graphics.drawRect(0,0,100,100);
    btnOne.graphics.endFill();

this.addChild(btnOne);

btnOne.addEventListener(MouseEvent.CLICK, advanceLevel);

function advanceLevel(me:MouseEvent) : void {
    btnOne.removeEventListener(MouseEvent.CLICK, advanceLevel);
    removeChild(btnOne);
    gotoAndStop(2);
}


Code op frame 2:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import flash.display.MovieClip;

var btnTwo:MovieClip = new MovieClip();
    btnTwo.graphics.beginFill(0XE3E3E3);
    btnTwo.graphics.drawRect(100,0,50,50);
    btnTwo.graphics.endFill();
    
    btnTwo.addEventListener(MouseEvent.CLICK, levelRecede);
    
    this.addChild(btnTwo);
    
function levelRecede(me:MouseEvent) : void {
    btnTwo.removeEventListener(MouseEvent.CLICK, levelRecede);
    this.removeChild(btnTwo);
    gotoAndStop(1);


Je kunt dit proces versimpelen door loopjes e.d te maken.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Allereerst bedankt voor de reacties!

Dat gaat niet lukken, want iemand anders heeft alle schermen in Photoshop/Illustrator gemaakt. Deze importeer ik in Flash, hierdoor zet ik die layers om, die buttons moeten worden, in symbolen, maar als ik dat doe krijg ik dus dat ik geen object in as3 kan doen. De button is er dus zeg maar al, het is een layer, maar als ik daar een symbool (dus button) van maak krijg ik dat probleem. Met beginfill etc kan ik dus niet aan beginnen omdat de buttons er al zijn alleen nog niet werken.

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
ActionScript 3 voert een actief ontmoedigingsbeleid wanneer het aankomt op het plaatsen van code op de timeline. Het hele linkage mechanisme is er dan ook niet voor niets. Assets in de asset library corresponderen allemaal met een bepaalde base class (flash.display.MovieClip, flash.display.Sprite, etc.) die je kunt overerven en waarin je dan je eigen code kwijt kunt.

I.p.v. schakelen tussen frames op de timeline kun je dan ook beter dynamisch movie clips op de actieve display list rouleren, of niet zo lui zijn en daadwerkelijk met een generiekere oplossing komen i.p.v. elk individueel scherm helemaal te hard-coden. (Van mij zou je voor het laatste een onvoldoende krijgen met de boodschap dat je het niet begrepen hebt, ondanks dat het eindproduct misschien wel zou 'werken'.)

Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
R4gnax schreef op dinsdag 15 maart 2011 @ 09:03:
I.p.v. schakelen tussen frames op de timeline kun je dan ook beter dynamisch movie clips op de actieve display list rouleren, of niet zo lui zijn en daadwerkelijk met een generiekere oplossing komen i.p.v. elk individueel scherm helemaal te hard-coden. (Van mij zou je voor het laatste een onvoldoende krijgen met de boodschap dat je het niet begrepen hebt, ondanks dat het eindproduct misschien wel zou 'werken'.)
Hangt van de context af. Als dit zijn eerste opdracht is voor Flash en/of het is om een beetje te wennen aan de Flash-omgeving en/of Actionscript dan is niet handig om meteen te coden zoals hoort. Hiervoor is meer kennis en ervaring nodig wat de topicstarter duidelijk nog moet krijgen. ;)

On-topic:
Zet je code voor iedere button anders gewoon in dezelfde keyframe (wel aparte as3-layer aub) als waar de desbetreffende button staat. As simple as it gets!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nemo55 schreef op dinsdag 15 maart 2011 @ 00:17:
Graag gedaan!

Da's waar ook. AS3 ondersteunt geen scripts op objecten. Je kan overschakelen naar AS2 maar dan is de syntax ook meteen weer anders. Met die melding had je het antwoord trouwens ook zo op google kunnen vinden ;)

Wat ik zelf altijd deed was een clickevent-listener voor de hele stage maken. In de functie die daarbij aangeroepen werd keek ik dan naar het object wat geklikt was en riep dan via een switch het bijbehorende commando/functie aan. Op die manier gingen alle klikacties via één functie en konden we direct zien wat er gebeurde. Werkt erg fijn als je een groot project heb met een shitload aan klikbare objecten. :P

Beetje dit idee:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
stage.addeventlistener(MouseEvent.CLICK, clickHandler

private function clickHandler(Mousevent:e)
{
     switch(e.object.name)
     {
          case "btn1" : // doe dit
          case "btn2" : // doe dat
          case "btn3" : // doe zus
          //enz
     }
} 


Let op. Dit is een voorbeeld. De correcte syntax moet je zelf even uitzoeken. Ik hoop dat dit trouwens ook werkt voor buttons. Wij werkten altijd met movieclips en deden daar de animaties/states van de buttons in die we dan met as3 afspeelden met behulp van MouseEvent.MouseOver en MouseEvent.MouseOut.

Beetje zoals hier
Ik vind dit wel een goed idee om alle AS3 in 1 layer te doen. Maar is dit dan de juiste manier? Ik zet de toekomstige button om in een symbool dus button en geef hem een Instantie Naam: btn1 bijvoorbeeld.

Kan ik dan met de code die ik gequote heb zeggen: case "btn1" : gotoAndStop(2);

Dus de button met instantienaam btn1 gaat naar frame 2 en stopt

Welke code kan ik dus gebruiken om te zeggen if instantie naam btn1 gotoAndStop(2);

Op die manier wil ik dan dus elke button in dezelfde layer/as3 file doen

Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Verwijderd schreef op dinsdag 15 maart 2011 @ 15:27:
[...]
Kan ik dan met de code die ik gequote heb zeggen: case "btn1" : gotoAndStop(2);
Jep, vergeet alleen niet na iedere case een break; te doen anders valt het proces door alle andere cases. O-)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
nemo55 schreef op dinsdag 15 maart 2011 @ 17:53:
[...]


Jep, vergeet alleen niet na iedere case een break; te doen anders valt het proces door alle andere cases. O-)
Ik heb die code zo geprobeerd, maar ik krijg een error case "btn1" : gotoAndStop(2);

Dan is dit dus de volledige code om te testen voor button


code:
1
2
3
4
5
6
7
8
9
stage.addeventlistener(MouseEvent.CLICK, clickHandler

private function clickHandler(Mousevent:e)
{
     switch(e.object.name)
     {
          case "btn1" : gotoAndStop(2);
     }
}


De instantienaam is dan dus btn1, maar dit werkt toch niet. Hoe komt dat?

Acties:
  • 0 Henk 'm!

  • nemo55
  • Registratie: Februari 2004
  • Laatst online: 00:17
Welke error? En tracen die hap. Één van de eerste dingen die je moet leren met programmeren/scripten is het debuggen van je eigen werk. Anders moeten mensen het hier voor je doen terwijl dat al lastig genoeg is als je al achter de machine zelf zit laat staan dat je van een afstand iemand instructies moet geven om vervolgens hun progsels voor ze te schrijven. Dit is overigens niet de bedoeling van dit forum en resulteert 9 van de 10x in een slot op het topic.

How to fix my own errors
Pagina: 1