Skocz do zawartości

[AS3] problemik


R0NIN

Rekomendowane odpowiedzi

Witam,

 

męczę prostą "grę" w AS3, posiłkuję się tutorialami ale część rzeczy robię sam więc... mam problem.

Stworzyłem przycisk (button) i wyeksportowałem go (aby później stworzyć instancje za pomocą kodu).

W przycisku mam grafikę tworzącą przycisk a na niej pole tekstowe typu "dynamic text".

 

W 2 klatce animacji tworzę nowy przycisk

var myButton ....

myButton ....

addChild(myButton);

 

jak za pośrednictwem kodu zmienić zawartość pola tekstowego w przycisku ?

Z movieClipem nie było problemu pisałem:

 

myButton.nazwaPolaTekstowegoWButtonie.text = "wyswietlany tekst";

 

A jak to zrobić w przypadku buttona? bo mi flash wywala błędy :/

 

"TypeError: Error #1009: Nie można uzyskać dostępu do właściwości lub metody dla odniesienia do obiektu null."

Pozdrawiam i szukam nadal ...

Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 27
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Nie no Panowie, z pisaniem klas to u mnie jeszcze ciężko (jakoś trudno mi pojąć programowanie obiektowe :/).

ale poradziłem sobie właśnie przy pomocy MC. Jak zobaczyłem ile to kodu z buttonem to dałem spokój.

 

var player1Button:btnButton = new btnButton();
   player1Button.x = 275;
   player1Button.y = 160;
   player1Button.scaleX = 0.75;
   player1Button.scaleY = 0.75;
   player1Button.buttonText.text = "1 Player";
   player1Button.mouseChildren = false;
   player1Button.buttonMode = true;
   addChild(player1Button);

 

trochę się naszukałem rozwiązania ale znalazłem tę jedną linijkę, która psuła mi mój button z MC (zamiast łapki ciągle miałem kursor do pisania) ale jest :

 

player1Button.mouseChildren = false;

 

Moja przycisk obecnie -> [ATTACH=CONFIG]86589[/ATTACH]

 

Dzięki za odpowiedz :)

Odnośnik do komentarza
Udostępnij na innych stronach

ja osobiscie po latach zabawy z flashem napisałem sobie dosyc praktyczną klasę, polecam cos podobnego szybkosc pracy z tym jest chyba najlepsza jaka udało mi się wykminić:

 

klasy.doButt(Mc,X,target) = zakłada X listenerów dla danego mc lecąc od góry - czyli w ostatniej, górnej, warstwie wkładam mc jakie maja być buttonami i doklejam tych kilka znaków i mam dowolna ilosc guzikow w klipie - wygodne dla grafikow, bo są niezalezni od kodu w kwestii wygladu miejsca itp. samych przycisków. Listenery odwołuja się do jednej funkcji ktora rozpoznaje je po nazwach. A co najwazniejsze w jednej linijce mam wywołanie guzików dla wszystkich obiektów w dokumencie flashowym. Sama klasa tez ma jedną linijkę.

Odnośnik do komentarza
Udostępnij na innych stronach

Hum... ola-f, szczerze to nie bardzo wiem o czym piszesz ;p (ja rbie prostego ping-ponga - próbuje rozbudować tutorial).

 

Czy ktoś wie dlaczego moja... "aplikacja" nie chce przejść do kolejnej klatki ?

 

Mam taki oto wycinek kodu

 

helpButton.addEventListener(MouseEvent.CLICK, F_goToHelp);

function F_goToHelp(event:MouseEvent):void
{
   trace("Go to 3 frame");
   gotoAndStop(3);
}

 

 

po wciśnięciu buttona w logu wyświetla mi się tekst wpisant w trece(....) w 3 klatce, ale nie tworzą się żadne nowe elementy, które są tam zdefiniowane :/ Tak jak by wszystko z jakiegoś powodu zastygło w tej nieszczęsnaj 2 klatce... Nie ma nawet żadnego błędu... nic.

 

Dla sprawdzenia jak to to działa dodałem trace(..) w funkcji i w następnej klatce... obie informacje się wyświetlają.

 

a w 3 klatce mam (dwie duże grafiki na całe okno flasha - rozumiem ze powinny być utworzone na wierzchu ? ) :

 

var HelpBackground:mcBackground = new mcBackground();
HelpBackground.x = 275;
HelpBackground.y = 200;
addChild(HelpBackground);


var HelpLeafs:mcLeafs = new mcLeafs();
HelpLeafs.x = 275;
HelpLeafs.y = 200;
addChild(HelpLeafs);


trace(testText);


trace("U r in 3 frame");


stop();

Odnośnik do komentarza
Udostępnij na innych stronach

jezeli to as3 to zbadaj ich obecność na scenie. np.

przed swoim kodem w 3ciej klatce daj:

trace(this.numChildren);

na koncu to samo i zobaczy czy w ogole sa na scenie. - numer powinien być +2 wiekszy. CIęzko mi radzic, bo raczej nie pracuje się na kolejnych klatkach.

Odnośnik do komentarza
Udostępnij na innych stronach

Eh.... już wiem w czym problem.

Musze jakoś pousuwać poprzednie grafiki :/

 

Nie wiem dlaczego ale jak przeglądam tutki to właśnie często trafiam na zabawę z klatkami, dlatego też w ten sposób kombinuję :).

Nic spadam męczyć nadal.

 

PS. Ola-f, mógłbyś podać jakiś przydatny link do "nie robienia gry na klatkach" ?

Może ja na złe tutoriale trafiam, a jak się uczyć to już tak żeby coś z tego było ;p

Edytowane przez R0NIN
Odnośnik do komentarza
Udostępnij na innych stronach

ilosc grafik to nie powinien byc problem.

 

wstaw przed swoim kodem:

trace('obecna ilosc obiektow: '+this.numChildren+' nazwa obiektu na samej gorze: '+this.getChildAt(this.numChildren-1).name);

 

po swoim kodznie wstaw to samo. powinienes miec inna ilosc obiektow - o dwa więcej - jezeli prawidłowo sie dodały. jak dopiszesz"

HelpLeafs.name='nazwa klipu';

to powinna przy drugim trace wyswietlic sie nazwa tego klipu, bo został dodany na scene jako ostatni.

 

Co do tutooriali: programisci w ogole nie uzywaja flasha i sceny, ale dla grafikow jest ona przydatna. Ogolnie dzialasz jak na klatkach ale operujesz np. visible, przywolujac okreslone obiekty itp. trzeba miec wiekszy porzadek w kodzie i bez klas nie ma sie co za to zabierac, bo sie pogubisz jak wrocisz do projektu po kilku tyg. Pamietaj tylko, ze obiekt musi byc na scenie by go wywolac, wiec nie wywolasz np. w 1klatce obiektu z drugiej - wtedy najpierw skok, pozniej wywolanie.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeżeli zamierzasz docelowo robić bardziej skomplikowane rzeczy, to zrób tak jak pisze Olaf i olej te wszystkie tutki uzywające klatek.

Ja gdy zaczynałem z flashem, po 2 tygodniach zrozumiałem jak ta metoda mnie ogranicza, i po pierwsze od razu olalem as2 (mówiono mi że łatwiejsze od as3 - gówno prawda. Nie dość że kod brzydki to jeszcze szukanie błedów w kodzie jest męką), a po drugie, od razu przeszedłem na OOP. Jeżeli nie masz tajmingu na to co robisz teraz, i robisz to dla nauki i funu z nauki, to polecam zrobić tak samo jak ja.

 

Dla samej przyjemności pisania warto sie też przesiąść na inny soft. Flash builder albo FDT (oba na eclipsie) to chyba najczęstsze rozwiązania komercyjne. Dodatkowo, kozystanie z nich wcale nie przeszkadza w korzystaniu z możliwości animowania na timelinie w Flash IDE. U nas w pracy siedzi 2 chłopaków na flashu. Jeden od grafiki i animacji, a drugi od kodu, i świetnie sie dogadują.

 

Pozdro

Odnośnik do komentarza
Udostępnij na innych stronach

No nic, dzięki Panowie za komentarze i nakierowanie. Znalazłem kilka innych tutoriali, gdzie rzeczywiście wszystko jest robione za pomocą kodu. Póki co przerabianie ping ponga na kolejne ekrany w kolejnych klatkach [loader] [startGame] [game] i [the end] muszą pójść w odstawkę... a już taką ładną grafikę zrobiłem ;p.

 

może to i jakiś pdf o flashu zdadzą egzamin :)

 

Pozdrawiam i dzięki za pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

czy ktoś może się orientuje cóż zrobić z taki oto komunikatem flasha ?

 

[ATTACH=CONFIG]86659[/ATTACH]

 

[ATTACH=CONFIG]86660[/ATTACH]

 

Rozumiem że chodzi o kłopot z ilością argumentów w tworzonym "buttonie" ale przePACZAŁEM cały kod i nigdzie nic takiego nie mogę znaleźć :/

 

mam w "projekcie" 2 klasy do tworzenia buttonów (różnią się ilością parametrów), sprawdzałem linia po linii, nigdzie nie widzę błędu (zwłaszcza opcji że nie podaję żadnego parametru).

 

w jaki sposób mogę dojść do tego, co powoduje ten błąd ?

 

Póki co cały "projekt" to:

 

1. loader (jeli ilosc załadowanych bajtów = całość swf to idz do ekranu opcji),

2. ekran opcji z 3 przyciskami (tylko w 1 jest podpieta tunkcja) - wybór ilości graczy

3. ekran "help" z napisami i nieaktywnymi przyciskami.

 

Możliwe że to jakiś błąd flasha ? jakiś śmieć, którego ja nie widzę a gdzieś siedzi ?

Dziwna sprawa bo ja w projekcie nie używam żadnego sprite'a O_o.

 

Pozdr.

Odnośnik do komentarza
Udostępnij na innych stronach

no chyba korzystasz z klasy, ktora wymaga podania argumentów a ich nie podajesz. rzuć okiem na funkcję klasy.

problem ze spritem moze dotyczyc klasy, ktora nie ma zaimportowanej w dokumencie klasy sprite. Strzelam, bo często jest tak, ze twórca klas przyjmuje, ze masz odpowiednie importy w dokumencie. Jeżeli korzystasz z klasy z poziomu flasha, to on sam sobie importuje co potrzeba i powstaje luka, bo tych rzeczy nie importuje.

 

co do debugowania to to jedno z niewielu aspektów, gdzie studia mogą się przydać. Pogrzeb na sieci jakie sa praktyki na debugowanie kodu. Jest kilka sprytnych i ergonomicznych metod.

Odnośnik do komentarza
Udostępnij na innych stronach

W wolnej chwili siadłem znowu nad AS3

 

pojawił się kolejny schodek, na który póki co nie mogę wejść :).

próbuję zrobić funkcję ruszającą "plackiem" do odbijania piłeczki.

 

w skrypcie kulturalnie wywołuje funkcję:

import flash.display.MovieClip;
import flash.events.KeyboardEvent;
import flash.events.*;

padPlayerOne.addEventListener(KeyboardEvent.KEY_DOWN, movePlayerPad); // .charCode / .keyCode - powoduje błąd (niby brak zaimportowanej biblioteki, która jest zaimportowana - mniejsza z tym).

public function movePlayerPad(event:KeyboardEvent)
	{
		if(event.keyCode == 87)
		{
		padPlayerOne.y += 5;
		}
	}

Efekt jest taki że... dusze ten klawisz i dusze, aż mi się już napis wytarł i nic :/

 

Ktoś ma propozycje jak skonstruować funkcję wykrywającą wciśnięcie klawisza o konkretnym identyfikatorze / kodzie ?

Odnośnik do komentarza
Udostępnij na innych stronach

zrobiłes sobie trace kodu? Np. trace('klawisz: '+event.keyCode);

kod wygląda ok, powinien trace'ować numer klawisza. Powiem Ci jednak, ze ja mam klasę do klawiszy podpiętą pod stage a nie dokument czy klip.

Czyli różnica taka: stage.addEventListener(KeyboardEvent.KEY_DOWN, movePlayerPad);

 

zobacz, bo z tego co pamiętam, to właśnie tu może być problem.

Odnośnik do komentarza
Udostępnij na innych stronach

Musze pokombinować bo:

 

bez dołączonego ...display.stage;

 

ten kod działa bez problemu

 

if(ball.y + ball.height/2 >= stage.stageHeight-20)

{

ballSpeedY *= -1;

}

 

a ten nie

 

stage.addEventListener(KeyboardEvent.KEY_DOWN, movePlayerPad);

 

po dołączeniu ...display.stage;

 

if(ball.y + ball.height/2 >= stage.stageHeight-20)

{

ballSpeedY *= -1;

}

 

wywala błędy :/

 

Oba fragmenty kodu są w tej samej klasie xD.

W wolnej chwili coś pokombinuję, dzięki za pomocną dłoń :).

Odnośnik do komentarza
Udostępnij na innych stronach

Męczę się z as3 nadal...

Czy mógłbym prosić o jakiś przykład (np. link do tutka, bo znaleźć nie mogę), jak za pomocą "if else if" wykryć kliknięcie przycisku ?

 

Chodzi o to że mam w scenie 3 przyciski

var wybór:int = 0;

btnPlayerOne;

btnPlayerTwo;

btnHelp;

 

Chciałbym za pomocą funkcji ustawić zmienną "wybór" na jakąś wartość w chwili kliknięcia danego przycisku.

 

coś w stylu:

 

if(btnHelp jest kliknięty)

{wartość = 1;}

else if(btnPlayer1 jest kliknięty)

{wartość = 2;}

 

pod jakim hasłem czegoś takiego szukać ?

 

Pozdr i dzięki za wszelaką odpowiedź.

Odnośnik do komentarza
Udostępnij na innych stronach

a musi byc koniecznie konstrukcja if else?

 

tu chyba lepsze bedzie for. chociaz ja zawsze wrzucam zwykle if bez else.

druga sprawa to klikniecie wywoluje funkcje wiec wiesz co zostalo klinkiete. ale mozliwe ze nie do konca zrozumialem

Odnośnik do komentarza
Udostępnij na innych stronach

teraz próbuje problem rozwiązać poprzez

btnPlayer1.addEventListener(MouseEvent.CLICK, setPlayer1);  // tu wywołuje funkcję, która zmienia tylko {wartość = 2;} itd. ale kiszkowato to działa ;p
btnPlayer2.addEventListener(MouseEvent.CLICK, setPlayer2);
btnHelp.addEventListener(MouseEvent.CLICK, setHelp);

function setPlayer1(e:Event)
{
               Main.allowOptionsUse = true
               trace("CLICKED " + choose);
               return 2;
}
function setPlayer2(e:Event)
{
               trace("CLICKED");
               return 3;
}
function setHelp(e:Event)
{
               trace("CLICKED");
               return 4;
}

a chodzi mi o taką funkcję (jedną) która by mi wykryła, który button wcisnąłem.

Coś szukałem z currentTarget ale póki co nie wiem jak to podłączyć do wykrycia czy button był kliknięty.

 

Cały szkopuł tkwi w tym że mam to wszystko rozdzielone na 2 klasy:

class OptScreen
{
btnPlayerOne;
btnPlayerTwo;
btnHelp;

function wykryj wybrany button
{
    return wartość (w zależności od klikniętego buttona)
}

}.

-------------------------

class Main
{
wywołanie funkcji z class OptScreen (tu w zależności od zwróconej wartości coś dalej będzie się działo)
}

Nie wiem na ile jasno to opisałem :)

Odnośnik do komentarza
Udostępnij na innych stronach

może tak. nazwij swoje buttony, daj każdemu tą samą funkcję np.

 

var mojaZ=0;

button1.name='b1'; button2.name='b2'; button2.name='b2';

 

function doButt(M,F){M.addEventListener(MouseEvent.CLICK, F);}

doButt(button1,onClick);doButt(button2,onClick);doButt(button3,onClick);

 

function onClick(e){var B=e.currentTarget.name;

Z=Number(B.substring(1,4)); // wersja A lub

if(B=='b1'){Z=1};if(B=='b2'){Z=2}; if(B=='b3'){Z=3} // wersja B:

}

Odnośnik do komentarza
Udostępnij na innych stronach

Znalazłem coś... bardziej zrozumiałego :)

 

funkcje NavigateOptions() wywołuję w innej klasie.

 

Prawie działa, wyświetla mi komunikat który przycisk kliknąłem

trace("NavigateOptions() CLICKED " + choose); po tej linii utykam i nie mogę przejść dalej i nie wiem czemu, tak jakby funkcja się zatrzymywała :/

 

public function NavigateOptions():int
       {

           btnPlayer1.addEventListener(MouseEvent.CLICK, chooseButton);
           btnPlayer2.addEventListener(MouseEvent.CLICK, chooseButton);
           btnHelp.addEventListener(MouseEvent.CLICK, chooseButton);

           function chooseButton(e:MouseEvent):uint
           {
               //Main.allowOptionsUse = true
               var clickedButton:DisplayObject = e.currentTarget as DisplayObject;
               var ch:int = 0;

               if(selectedButton)
               {
                   selectedButton.addEventListener(MouseEvent.CLICK, chooseButton);
               }
               selectedButton = clickedButton;

               switch(selectedButton)
               {
                   case btnPlayer1:
                   {choose = 2; break;}
                   case btnPlayer2:
                   {choose = 3; break;}
                   case btnHelp:
                   {choose = 4; break;}
               }
               trace("NavigateOptions() CLICKED " + choose);
               return choose;  //na mój rozum powinienem dostać jeszcze w output to: trace ("::::::" + choose);
           }
           trace ("::::::" + choose);
           return choose;
           }
       }

 

Pasuje do czegoś przypisać wynik funkcji chooseButton(), ale nie bardzo wiem jak :(.

Odnośnik do komentarza
Udostępnij na innych stronach

no ja Ci teraz nie pomogę - dla mnie tyle kodu jest nie do ogarnięcia jak się klamry nie wyświetlają.

Szkoda, ze moj sposób Ci nie podpasował, 3linijki i gotowe. tylko najpierw zworibłem sobie funkcję tworzącą buttony, bo wpisywanie X razy addEventListener to śmiecenie kodu. Pozniej sprawdzałem nazwę guzika i po sprawie. Widze tylko, ze raz wpisałem mojaZ, raz tylko Z i tu by wywalil błąd ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, poradziłem sobie na chama (zmieniając bezpośrednio zmienną z klasy głównej) xD

 

function chooseButton(e:MouseEvent)//:uint
		{
			var clickedButton:DisplayObject = e.currentTarget as DisplayObject;

			if(selectedButton)
			{
				selectedButton.addEventListener(MouseEvent.CLICK, chooseButton);
			}
			selectedButton = clickedButton;

			switch(selectedButton)
			{
				case btnPlayer1:
				{Main.gameState = 2; break;}
				case btnPlayer2:
				{Main.gameState = 3; break;}
				case btnHelp:
				{Main.gameState = 4; break;}
			}

		}

 

Co do buttonów to mam opcję tworzenia ich, ale na moim etapie "programowania" muszę jeszcze dla każdego z nich podać trochę parametrów xD

 

btnPlayer1 = new ButtonClass(148, 75, "1 Player", 32, 12);

 

Dzięki dzięki.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności