Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Witam. Mam problem. Mianowicie, mam taki o to kod:
"package
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;

import caurina.transitions.*;
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();

public class Actions extends MovieClip {

private var off:Object;

public function Actions () {
addButtons();
}

private function addButtons():void {

var names:Array = new Array("O MNIE", "PORTFOLIO", "KONTAKT");

for (var i:int = 0; i < 4; i++) {

var myButton:MyButton = new MyButton();
myButton.txt.tf.text = names[i];
myButton.name = "b" + i;
myButton.buttonMode = true;

myButton.mouseChildren = false;

myButton.addEventListener(MouseEvent.ROLL_OUT, bOut);
myButton.addEventListener(MouseEvent.ROLL_OVER, bOver);
myButton.addEventListener(MouseEvent.CLICK, bClick);

myButton.x = 0 + (myButton.width * i);
myButton.y = 0;

addChild(myButton);
}
}

private function bOver(e:MouseEvent):void {

Tweener.addTween(e.target.bg, { y:0, _color:0x99A0A8, alpha:1, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, _color:0x666666, time:0.0, transition:"easeOutExpo" } );
}
private function bOut(e:MouseEvent):void {

Tweener.addTween(e.target.bg, { y:-90, _color:null, alpha:1, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, time:0.0, _color:null, transition:"easeOutExpo" } );
}
private function bClick(e:MouseEvent):void {

if (off != null) {

off.buttonMode = true;
off.addEventListener(MouseEvent.ROLL_OUT, bOut);
off.addEventListener(MouseEvent.ROLL_OVER, bOver);
off.addEventListener(MouseEvent.CLICK, bClick);
off.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
}
e.target.buttonMode = false;
e.target.removeEventListener(MouseEvent.ROLL_OUT, bOut);
e.target.removeEventListener(MouseEvent.ROLL_OVER, bOver);
e.target.removeEventListener(MouseEvent.CLICK, bClick);
off = e.target;


switch(e.target.name) {
case "b1": trace("I'm your button and I do nothink!");
break;
case "b2":
trace("I'm your button and I do nothink!");
break;
default: trace("I'm your button and I do nothink!");
break;
}

}

}

}"
I w pliku źródłowym fla. w bibliotece jest umieszczony movie clip o nazwie MyButoon. Jak testuje scenę w pliku źródłowym wszystko działa. Natomiast jak skopuje movie clip do innego pliku fla wraz kodem wszystko przestaje działać. Proszę mi powiedzieć dlaczego tak jest? Siedzie na tym ją cały dzień i za chiny nie wiem.
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dodam, że movie clip w ogóle nie importuje się na scenę.
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Temat nie ważny - poradziłam sobie :)
Artur Bilski

Artur Bilski Ruby on Rails &
Javascript Developer

Temat: Problem z kodem.

Tak tylko w ramach pisania zgrabnego kodu:

Klasa Actions tylko powinna umieszczać buttony

var names:Array = new Array("O MNIE", "PORTFOLIO", "KONTAKT");

for (var i:int = 0; i < names.length; i++) {
var myButton:MyButton = new MyButton(names[i]);

addChild(myButton);
}

a reszta kodu powinna być wewnątrz klasy MyButton. Kod się wtedy bardzo upraszcza.

public class MyButton extends SimpleButton {
public function MyButton(name_:String) {
name = name_;
//...reszta inicjalizacji
}
}

Generalnie, jeśli widzisz że masz przypisanie:
myObject.prop1 = 'prop';

.... i tak n razy
to prawdopodobnie jest sens przenieść cały ten kod to metody obiektu myObject.

To samo dotyczy handlera bClick.

Można go napisać tak:

if (off) {
off.activate();
}

off = e.target;

off.deactivate();

I usunąć switcha. Jeśli różnica pomiędzy przyciskami jest prosta i może być opisana tylko parametrem to można go przekazać w konstruktorze. Na przykład to co robi switch może być w metodzie deactivate()

... // kod wyłączający przycisk
trace("I'm your button " + name + " and I do nothink!");

Jeśli jest jednak zasadnicza różnica w działaniu przycisku to wtedy każdy przycisk mógłby być klasą dziedziczącą po MyButton i implementującą onDeactivate(), wtedy w MyButton.deactivate mogłoby wyglądać tak:

... // kod wyłączający przycisk
onDeactivate();


Teraz nawet można wyłączyć wspólny kod aktywacji przycisku z konstruktora i bClick do prywatnej metody doActivate():

private function doActivate():void {
buttonMode = true;

addEventListener(MouseEvent.ROLL_OUT, bOut);
addEventListener(MouseEvent.ROLL_OVER, bOver);
addEventListener(MouseEvent.CLICK, bClick);
}
Ten post został edytowany przez Autora dnia 30.03.14 o godzinie 15:14
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dziękuję bardzo za wskazówki dotyczące pisania kodu.
Przy okazji chciałam się zapytać w jaki sposób za pomocą kodu eksportować movie clip'a np: do klatki 20, zamiast do 1?
Artur Bilski

Artur Bilski Ruby on Rails &
Javascript Developer

Temat: Problem z kodem.

Najlepiej w klatce 20tej danego MovieClipa powiązanego z klasą OuterClip wrzucić kod:

createClip();
// i pewnie jakiś stop(); żeby to miało sens

a w klasie OuterClip zdefiniować metodę:

private function createClip():void {
var clip = new InnerClip();

addChild(clip);
// etc.
}
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dziękuję za pomoc :)
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Wyskakuje mi błąd:"1180: Call to a possibly undefined method InnerClip."
Artur Bilski

Artur Bilski Ruby on Rails &
Javascript Developer

Temat: Problem z kodem.

Musisz wyeksportować klip w bibliotece i powiązać z klasą InnerClip.
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Z klasą InnerClip mam powiązać tylko movieclip czy cały kod?..
Coś muszę robić nie tak bo teraz wyskakuje mi ten sam błąd tyle,że dotyczy on metody createClip
Artur Bilski

Artur Bilski Ruby on Rails &
Javascript Developer

Temat: Problem z kodem.

W Bibliotece powinny być dwa MovieClipy:
- OuterClip
- InnerClip
Oba powinny być powiązane z odpowiednimi klasami "OuterClip" i "InnerClip" (prawy klik na elemencie w bibliotece i Linkage czy coś takiego; nie mam już flasha i nie pamiętam ;) )
Klasy powinny być w osobnych plikach (mogą być w tej samej lokalizacji co .fla więc powinny być domyślnie widoczne dla kompilatora).
To już podstawowe rzeczy z dokumentacji flasha i nie ma chyba sensu pisać o nich na forum. W razie pytań pisz na priv.
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dobrze. Bardzo dziękuje za pomoc :).
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Postanowiłam odświeżyć temat, gdyż mam problem. Wiem, że odnosi się on do raczej podstawowej znajomości AS3, ale niestety nie wiem jak sobie z nim poradzić. A mianowicie nie wiem jaki kod powinnam napisać (odnosząc się do kodu, który podałam zakładając temat

"package{
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;

import caurina.transitions.*;
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();

public class Actions extends MovieClip {

private var off:Object;

public function Actions () {
addButtons();}
private function addButtons():void {

var names:Array = new Array("O MNIE", "PORTFOLIO", "KONTAKT");

for (var i:int = 0; i < 4; i++) {

var myButton:MyButton = new MyButton();
myButton.txt.tf.text = names[i];
myButton.name = "b" + i;
myButton.buttonMode = true;

myButton.mouseChildren = false;

myButton.addEventListener(MouseEvent.ROLL_OUT, bOut);
myButton.addEventListener(MouseEvent.ROLL_OVER, bOver);
myButton.addEventListener(MouseEvent.CLICK, bClick);

myButton.x = 0 + (myButton.width * i);
myButton.y = 0;

addChild(myButton);
}
}

private function bOver(e:MouseEvent):void {

Tweener.addTween(e.target.bg, { y:0, _color:0x99A0A8, alpha:1, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, _color:0x666666, time:0.0, transition:"easeOutExpo" } );
}
private function bOut(e:MouseEvent):void {

Tweener.addTween(e.target.bg, { y:-90, _color:null, alpha:1, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, time:0.0, _color:null, transition:"easeOutExpo" } );
}
private function bClick(e:MouseEvent):void {

if (off != null) {

off.buttonMode = true;
off.addEventListener(MouseEvent.ROLL_OUT, bOut);
off.addEventListener(MouseEvent.ROLL_OVER, bOver);
off.addEventListener(MouseEvent.CLICK, bClick);off.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
}
e.target.buttonMode = false;
e.target.removeEventListener(MouseEvent.ROLL_OUT, bOut);
e.target.removeEventListener(MouseEvent.ROLL_OVER, bOver);
e.target.removeEventListener(MouseEvent.CLICK, bClick);off = e.target;

switch(e.target.name) {
case "b1": trace("I'm your button and I do nothink!");
break;
case "b2":
trace("I'm your button and I do nothink!");
break;
default: trace("I'm your button and I do nothink!");
break; }
}
}
}"
) aby po kliknięciu na którykolwiek z trzech przycisków, zmieniły one swoje położenie. Dodam, że próbowałam już kodu np:
 "this.x = 10;  this.y = 10;" 
,ale wówczas cała strona zmieniała swoje położenie, a gdy odnosiłam się do symbolu myButton pojawiała się problem,z odwołaniem do symbolu.
Bardzo proszę o pomoc i równocześnie z góry dziękuje :)
Piotr Kubasiak

Piotr Kubasiak Flex developer

Temat: Problem z kodem.

W metodzie button clicka. (e.target as MyButton).x = 10; (e.target as MyButton).y = 10;Ten post został edytowany przez Autora dnia 17.04.14 o godzinie 12:40
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dziękuję za pomoc. Metoda działa, ale tylko dla przycisku, na który kliknę, a nie na wszystkie. Chciałabym, żeby wszystkie trzy przyciski zmieniły swoje położenie po kliknieciu. Jest to możliwe?
Piotr Kubasiak

Piotr Kubasiak Flex developer

Temat: Problem z kodem.

Oczywiście. Proponuje dwa sposoby:
1)
jeśli w tym kontenerze ( Actions extends MovieClip) znajdują się tylko przyciski to :

pisane z 'palca'

for (var i=0, i= this.numChilds, i++){
(this.getchildatindex(i) as MyButton).x = 10;
(this.getchildatindex(i) as MyButton).y = 10;
}

jesli znajdują się tam też inne komponenty to :
for (var i=0, i= this.numChilds, i++){

var compObj:Object = this.getchildatindex(i);
if (compOb is MyButton){
(compOb as MyButton).x = 10;
(compOb as MyButton).y = 10;
}

}

2)
podczas tworzenia przycisków zapisać je w tablicy i wtedy zrobić pętle po tej tablicy i przesunac przyciski

var buttonsTab:Array = [];
...
myButton.x = 0 + (myButton.width * i);
myButton.y = 0;

addChild(myButton);

buttonsTab.push(myButton);

...

for (var i=0, i= buttonsTab.length, i++){

var compObj:Object = this.buttonsTab[i];
if (compOb is MyButton){
(compOb as MyButton).x = 10;
(compOb as MyButton).y = 10;
}
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Dziękuję za pomoc. Niestety kody nie działa, wyskakują błędy...
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Poradziłam sobie. Wszystko działa... ale w osobnym pliku, gdzie poza przyciskami nic nie ma. Natomiast w pliku ze stroną już nie- wyskakuje błąd, że nie można uzyskać dostępu do właściwości lub metody dla odniesienia do obiektu null. Ktoś może mi powiedzieć jak jest tego przyczyna?

Kod :
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.net.URLRequest;
import flash.net.navigateToURL;

import caurina.transitions.*;
import caurina.transitions.properties.ColorShortcuts;
ColorShortcuts.init();

var off:Object;

addButtons();

function addButtons():void
{

var names:Array = new Array("O MNIE","PORTFOLIO","KONTAKT");

for (var i:int = 0; i < 4; i++)
{

var myButton:MyButton = new MyButton();
myButton.txt.tf.text = names[i];
myButton.name = "b" + i;
myButton.buttonMode = true;

myButton.mouseChildren = false;

myButton.addEventListener(MouseEvent.ROLL_OUT, bOut);
myButton.addEventListener(MouseEvent.ROLL_OVER, bOver);
myButton.addEventListener(MouseEvent.CLICK, bClick);

myButton.x = 730.55 + (myButton.width * i);
myButton.y = 374.35;

this.addChild(myButton);
}
}

function bOver(e:MouseEvent):void
{

Tweener.addTween(e.target.bg, { y:0, _color:0x99A0A8, alpha:1, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, _color:0x000000, alpha:1, time:0.0, transition:"linear" } );
}
function bOut(e:MouseEvent):void
{

Tweener.addTween(e.target.bg, { y:-90, _color:0x0000000, alpha:0.75, time:1, transition:"easeOutExpo" } );

Tweener.addTween(e.target.txt, { y:32.2, _color:0xFFFFFF, alpha:1, time:0.0, transition:"linear" } );
}
function bClick(e:MouseEvent):void
{
for (var i:int = 0; i < this.numChildren; i++)
{
(this.getChildAt(i) as MyButton).x = 730.55 + (132 * i);
(this.getChildAt(i) as MyButton).y = 5.35;
}

if (off != null)
{

off.buttonMode = true;
off.addEventListener(MouseEvent.ROLL_OUT, bOut);
off.addEventListener(MouseEvent.ROLL_OVER, bOver);
off.addEventListener(MouseEvent.CLICK, bClick);
off.dispatchEvent(new MouseEvent(MouseEvent.ROLL_OUT));
}

e.target.buttonMode = false;
e.target.removeEventListener(MouseEvent.ROLL_OUT, bOut);
e.target.removeEventListener(MouseEvent.ROLL_OVER, bOver);
e.target.removeEventListener(MouseEvent.CLICK, bClick);
off = e.target;

switch (e.target.name)
{
case "b1" :
gotoAndPlay("label1");
case "b2" :
gotoAndPlay("label2");
default :
gotoAndPlay("label3");
}

}
Ten post został edytowany przez Autora dnia 22.04.14 o godzinie 17:31
Marta H.

Marta H. Fotograf/Grafik
komputerowy/Webmaste
r

Temat: Problem z kodem.

Czy ktoś mógłby mi powiedzieć jaki jest bład w kodzie, dokładniej w
 (this.getChildAt(i) as MyButton).x = 730.55 + (132 * i);
(this.getChildAt(i) as MyButton).y = 5.35;
.
Cały kod jest podany wyżej, jak by co.
Jerzy Wierzchowski

Jerzy Wierzchowski Senior Software
Developer

Temat: Problem z kodem.

Wtrącę się. Straszne zło tworzysz. Wszędzie fory i mega bałagan w kodzie:/

Z nulem to pewnie this.getChildAt(i) nie zwraca wcale obiektu MyButton,więc operator "as" zwraca null'a ponieważ rzutowanie nie jest możliwe.

Polecam:
- absolutnie nie kodować na klatkach, Takiego kodu nie utrzymasz, bo szybko się robi spaghetti.
Szybki start z klasami:
http://gotoandlearn.com/play.php?id=43
oraz
http://gotoandlearn.com/play.php?id=71
http://gotoandlearn.com/play.php?id=72
- zapisać sobie buttony w tablicy, a nie forować bo po displayliście i na ślepo rzutując obiekty.
- zamiast tweenera polecam to czego uzywa cała branża: TweenLite/TweenMax (chyba najlepszy tweener - szybszy, dobrze udokumentowany, nie ma takich problemów z nadpisywaniem tweenów) :
http://www.greensock.com/

I ostatnie:
Net etykieta - pisząc post w tytule zawrzyj sedno problemu inaczej na liście tematów były by same "Problemy z kodem" .

Pozdrawiam.

Następna dyskusja:

Problem z kodem




Wyślij zaproszenie do