Volledige versie bekijken : Probleem met meerdere URLS vanaf buttons in AS3
TDW
%Europe/Berlin %533 %2010, 12:48
Zoals de titel al zegt, heb ik een probleem en ik hoop dat iemand hier me daarmee kan helpen. Ik ben recent weer begonnen met Flash om mijn websites van wat *Schwung* te voorzien en qua animatie lukt het allemaal wel, maar ik loop stuk op Actionscript 3. (Even voor het beeld, ik werk met Flash CS4) IK geef toe dat ik qua codering een n00b ben, maar ik wil het wel graag leren.
Nu ben ik bezig met een header voor een website en daarin wil ik 7 knoppen plaatsen die allemaal een andere URL toegewezen moeten krijgen. Ik heb al de nodige tutorials uitgezocht en allemaal zeggen die dat ik het goed aan het doen ben. (Alle code's ongeveer 20.000 keer nagelopen) maar toch krijg ik steeds bij de output de volgende foutmelding:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Template_fla::MainTimeline/frame55()
Bizar genoeg werkt de eerste knop dus wel volledig (De home knop), gezien die netjes de pagina opent in de primaire browser naar keuze, maar de rest weigert dienst. Wat doe ik verkeerd?
Even voor jullie beeld verder. De knoppen staan allemaal in losse layers. de complete animatie werkt goed en ik heb een losse actions layer gemaakt. (Die heb ik ook bovenaan gezet, just to be sure) In deze heb ik aan het einde (het laatste frame van het filmpje) een keyframe geplaatst met daarin de volgende code:
stop();
Home.addEventListener(MouseEvent.MOUSE_DOWN, HomeHandler);
function HomeHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("index.html"));
}
About.addEventListener(MouseEvent.MOUSE_DOWN, AboutHandler);
function AboutHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("about.html"));
}
Jobs.addEventListener(MouseEvent.MOUSE_DOWN, JobsHandler);
function JobsHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("jobs.html"));
}
Portfolio.addEventListener(MouseEvent.MOUSE_DOWN, PortfolioHandler);
function PortfolioHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("portfolio.html"));
}
Prices.addEventListener(MouseEvent.MOUSE_DOWN, PricesHandler);
function PricesHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("prices.html"));
}
Links.addEventListener(MouseEvent.MOUSE_DOWN, LinksHandler);
function LinksHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("links.html"));
}
Contact.addEventListener(MouseEvent.MOUSE_DOWN, ContactHandler);
function ContactHandler(event:MouseEvent):void {
navigateToURL(new URLRequest("contact.html"));
}
Het idee is dat de code het filmpje stopt en dat je dan de links kan benaderen via de buttons.
Als iemand me hiermee kan helpen waardeer ik dat enorm! Alvast bedankt!
Dauntless
%Europe/Berlin %551 %2010, 13:14
Welkom op FlashFocus!
Bestaan alle buttons op het moment dat je die acties zet? Je kan bv geen AS toekennen op frame 10 aan een button die pas op frame 11 bestaat. Daarnaast wordt er in AS met de instancenaam gewerkt (zie properties) en niet met de naam die een object in de library heeft. (Al wist je dat waarschijnlijk, anders zou geen enkele button werken).
Als het nog niet opgelost is, upload dan een .fla waarin je de situatie nagebouwd hebt en waar het dus ook mis loopt.
Aratramba
%Europe/Berlin %580 %2010, 13:56
wat Dauntless zegt is helemaal waar: Check goed of alle buttons bestaan én of ze wel de instance-name hebben die je probeert aan te roepen. Dus niet alleen op frame1 een instance name geven, maar ook op het frame waar je je code aanroept (55).
Klein puntje over je naamgeving: In Actionscript is de conventie dat je hoofdletters gebruikt voor Classes, niet voor instances.
Daarnaast voelt je code niet erg DRY (http://en.wikipedia.org/wiki/Don't_repeat_yourself). Je maakt voor elk -vrijwel identiek- stukje code een nieuwe functie aan. Dat kan makkelijker. Bijvoorbeeld je links in een Array stoppen en die aanroepen, of een switch gebruiken in een functie, bijv:
home.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
about.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
jobs.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
portfolio.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
prices.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
links.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
contact.addEventListener(MouseEvent.MOUSE_DOWN, gotoUrl);
function gotoUrl(e:MouseEvent):void{
var url:String;
switch(e.target.name){
case "home":
url = 'index.html'
break;
case "about":
url = 'about.html'
break;
case "jobs":
url = 'jobs.html'
break;
case "portfolio":
url = 'portfolio.html'
break;
case "prices":
url = 'prices.html'
break;
case "links":
url = 'links.html'
break;
case "contact":
url = 'contact.html'
break;
}
navigateToURL(new URLRequest(url));
}
Verder werkt je code natuurlijk prima. Tis alleen omdat je zegt dat je graag wilt leren ;)
Oh…ennem, er is ook een MouseEvent.CLICK; is dat niet meer wat je zoekt?
alexa
%Europe/Berlin %600 %2010, 14:24
Dank je Aratramba,
voor je extra stukje script met de links in een array en die switch. Ik had hem getest om op die manier swf's in te laden, maar kennelijk werkt dit alleen voor html-pagina's.
Heb je ook zoiets om swf's te laden? Ben nl ook bezig as3 te leren ...
Groet,
Alex
Dauntless
%Europe/Berlin %705 %2010, 16:55
Dat werkt ook voor SWF's in te laden. Maar in plaats van dit topic te hijacken, maak je beter je eigen topic aan.
TDW
%Europe/Berlin %798 %2010, 19:09
Zozo, het doet me in elk geval goed, om te zien dat mijn probleem zo snel bekeken wordt! :D
@ Dauntless: Voor zover ik weet bestaan alle buttons wel ja. Ik voeg de code ook pas in op het allerlaatste frame van mijn action laag. (En daarin zou alles toch geladen moeten zijn) Ik had al het vermoeden dat dat belangrijk was, dus had dat al nagelopen. Wel altijd goed om zulke tips te krijgen! :) Ik plaats de code sowieso pas in het laatste keyframe omdat ik wil dat het filmpje dan stopt en dat dan de buttons gaan werken.
@ Aratramba: Kijk, dat zijn nou dingen waar ik blij mee ben, daar kan ik tenminste wat van leren! Ik zal eens kijken of ik dit in het vervolg kan toepassen, want jouw manier lijkt inderdaad een stuk efficienter. Ook je punt over de hoofdletters voor de instances en dergelijke is een handige tip. Doet MouseEvent.CLICK; hetzelfde als wat ik nu heb staan qua code?
Alleen los van alle goede hulp, blijf ik de foutmelding nog steeds krijgen en werkt alleen de home button, maar de rest niet... :S Voor wie het wil, ik kan het bestand direct toesturen, wellicht dat jullie dan kunnen zien waar het fout gaat?
En wat de vraag van Alexa betreft, stiekem ben ik wel benieuwd, want werkt dit alleen voor HTML of kan je in feite elk bestandssoort in de link zetten? (hoewel ik me voor kan stellen dat dat met een URL aanroeping lastig wordt.)
Dauntless
%Europe/Berlin %801 %2010, 19:13
Je kan je bestand mailen naar mijn nickname @flashfocus.nl als je wil.
Voor bv SWF's te laden moet je een Loader instance gebruiken, maar die aanvaard ook een URLRequest, dus er moet alleszinds niet veel veranderd worden.
Dauntless
%Europe/Berlin %954 %2010, 22:54
Het is me eigenlijk niet geheel duidelijk _waarom_, maar als je de buttons op frame 29 (begin van je tweens) dezelfde instancenames geeft als op het einde, dan werkt het wel...
TDW
%Europe/Berlin %646 %2010, 15:30
hmm, dan denk ik dat dit probleem hoort in de categorie "Niet nadenken, gewoon doen" :P In elk geval erg tof dat je ernaar wilde kijken! :D
bas007gsm
%Europe/Berlin %437 %2010, 11:30
Bovenstaande code van Aratramba heeft mij ook uit de brand geholpen, alleen nog 1 vraagje, op die manier worden de links in een nieuw venster geopend, ik zou graag _self willen toevoegen, ben al een poosje bezig maar krijg niet anders dan compile errors, iemand een hint?
solo244
%Europe/Berlin %447 %2010, 11:44
Via google, URL + self
var:urlTarget:URLRequest = new URLRequest("http://www.plenarycreation.com/");
this.btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(event:MouseEvent):void
{
navigateToURL(urlTarget, "_self");
}
Iasonic
%Europe/Berlin %627 %2010, 16:04
Je kan ook al je buttons in 1 movieclip stoppen ....
b.v menu en daar de eventlistener opzetten.
p.s. je moet wel even e.target veranderen in e.currentTarget
menu.addEventListener(MouseEvent.CLICK,gotoUrl);
function gotoUrl(e:MouseEvent):void{
var url:String;
switch(e.currentTarget){
case "home":
url = 'index.html'
break;
case "about":
url = 'about.html'
break;
case "jobs":
url = 'jobs.html'
break;
case "portfolio":
url = 'portfolio.html'
break;
case "prices":
url = 'prices.html'
break;
case "links":
url = 'links.html'
break;
case "contact":
url = 'contact.html'
break;
}
navigateToURL(new URLRequest(url));
}
bas007gsm
%Europe/Berlin %736 %2010, 18:40
Bedankt, ik heb onderstaande er van gemaakt
navigateToURL(new URLRequest(url), "_self");
vic10us
%Europe/Berlin %366 %2010, 09:47
Ik heb deze code ook gebruikt, thanks daarvoor.
Alleen opent hij de vensters steeds opnieuw en als ik die _self erin zet krijg ik een error van flash zelf.
SecurityError: Error #2137: Schending van beveiligingssandbox: file:///Y:/blog/site/flash.swf kan niet door venster _self navigeren binnen file:///Y:/blog/site/test.htm (allowScriptAccess is sameDomain). Uitgevoerde URL was index.htm.
at global/flash.net::navigateToURL()
at flash_action3_fla::MainTimeline/gotoUrl()
Dauntless
%Europe/Berlin %412 %2010, 10:53
Welkom op FlashFocus!
Voeg je site/ folder toe aan de vertrouwde locaties:
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502
Online zal je applicatie wel werken zonder dat je deze zoals hierboven moet toevoegen.
vic10us
%Europe/Berlin %446 %2010, 11:43
Welkom op FlashFocus!
Voeg je site/ folder toe aan de vertrouwde locaties:
http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502
Online zal je applicatie wel werken zonder dat je deze zoals hierboven moet toevoegen.
Super bedankt! :D
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.