Autor Tópico: [Duvida] Flash Developer (ciclo 'FOR')  (Lida 2171 vezes)

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[Duvida] Flash Developer (ciclo 'FOR')
« em: 22 de Fevereiro de 2006, 01:52:42 »
Olá a todos,

Tenho este código AS, mas precisava de usar um ciclo "for" de maneira a evitar que tivesse de escrever o código vezes e vezes sem conta até conseguir que todos os movieclips ficassem "codificados".

Tenho mais de 20 movieclips deste tipo e por isso tinha de mudar o código sempre que me refirisse a outro movieclip. Neste caso refiro-me ao mc_one que chama o cap_one, mas a seguir vem o mc_two com o cap_two e por aí em diante até ao mc_twenty que chama o cap_twenty.

Código: [Seleccione]
// Um
mc_one.onRollOver = function() {
this.onEnterFrame = function () {
cap_one._alpha += (100-cap_one._alpha)/3;
cap_one._x -= (cap_one._x-_xmouse)/2;
cap_one._y -= (cap_one._y-_ymouse)/2;
}
};
mc_one.onRollOut = function() {
this.onEnterFrame = function() {
 cap_one._alpha += (0-cap_one._alpha)/3;
};
};



Um colega meu deu-me o seguinte ciclo "for" mas não está a funcionar.

Código: [Seleccione]
for (var i:Number = 1;i<=20;i++){
 this["mc_"+i].onRollOver = function() {
this["mc_"+i].onEnterFrame = function () {
this["cap_"+i]._alpha += (100-this["cap_"+i]._alpha)/3;
this["cap_"+i]._x -= (this["cap_"+i]._x-_xmouse)/2;
this["cap_"+i]._y -= (this["cap_"+i]._y-_ymouse)/2;
}
};


 this["mc_"+i].onRollOut = function() {
  this["mc_"+i].onEnterFrame = function() {
   this["cap_"+i]._alpha += (0-  this["cap_"+i]._alpha)/3;
};
};

};



Sei que as referências do primeiro código "mc_one" e "cap_one" são os instance name dos movieclips e no segundo código mudei as instance names para "mc_1" e "cap_1" que seriam os instance names que o ciclo "for" iria gerar.

 Tanto os mc's e os cap's ficam no Stage separados.

O q acontece (ou devia acontecer) é que ao passarmos o mouse por cima de um mc aparecia o cap (como legenda). Ao tirarmos o mouse de cima do mc o cap desapareceria.

É um sistema de legendas para mapas. É uma tentativa de imitar a tag "ALT" do HTML quando passamos o mouse sobre uma imagem.

O efeito pretendido é este:
http://www.tutorio.com/tutorial/flash-rollover-alt-text-or-captions

Alguém me pode dar uma ajuda?
Cumps e obg.

Offline yarcub

  • Aprendiz
  • **
  • Mensagens: 138
    • Ver Perfil
[Duvida] Flash Developer (ciclo 'FOR')
« Responder #1 em: 22 de Fevereiro de 2006, 05:14:46 »
Penso q esse código ñ esteja a funcionar pela seguinte razão:

Como nos "eventos" estás a declarar funções sem parâmetros de passagem, a variável i dentro das funções está como "undefined".

Podes resolver o problema dos eventos do MC da seguinte maneira:
Código: [Seleccione]
(...)
this["mc_"+i].onRollOver = function() {
this.onEnterFrame = function () {             // <--
(...)


Mas depois para  this["cap_"+i] continuas com o mesmo problema a ñ ser q declares i como uma variável global.


Se bem percebi o que pretendes no teu caso a melhor maneira é teres um array com tds as legendas, e apenas um cap_mc com uma textBox lá dentro.

Assim o mesmo MC serve para tds as imagens.

Eu testei este código e parece funcionar razoávelmente bem, mas depois percebi pq querias um "cap_mc" para cada legenda. Como está tem um pequeno problema com o _alpha, mas deve dar para contornar.

Código: [Seleccione]

/***********************Exemplo para 4 imagens***************/
legenda = new Array("imagem 1", "imagem 2", "imagem 3", "imagem 4");

for (var i = 1; i<=4; i++) {
this["mc_"+i].onRollOver = function() {
//Tira o último char do instance name do mc para saber a    legenda a atribuir.
var n = substring(this._name, this._name.length, 1);
cap.textBox.text = legenda[n-1];
this.onEnterFrame = function() {
cap._alpha += (100-cap._alpha)/3; //<--Rever esta parte
cap._x -= (cap._x-_xmouse)/2;
cap._y -= (cap._y-_ymouse)/2;
};
};
this["mc_"+i].onRollOut = function() {
cap.textBox.text = "";
this.onEnterFrame = function() {
cap._alpha += (0-cap._alpha)/3;//<--Rever esta parte
};
};
}


Espero que seja isto. :wink:


Edit: em relação à variável "i", parece q a razão afinal é esta:
Vê o último post do Grettir neste tópico->http://forum.redcodestudio.com/viewtopic.290.html

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[Duvida] Flash Developer (ciclo 'FOR')
« Responder #2 em: 22 de Fevereiro de 2006, 19:44:46 »
Bem que bom post :)

Obrigado pela atenção e esforço.
Vou experimentar essa nova maneira embora ainda gostasse que alguém conseguisse colocar o ciclo 'for' no código original do tutorial (com os captions e os movieclips separados), porque já andei muito tempo às turras e agora estou curioso. De qualquer valeu o esforço e vou experimentar.

Agora também tinha outra questão àcerca do clico 'for'.
Imaginem que cada mapa tem 15 regiões, cada uma dela é um movieclip. Quando passamos o rato por cima de uma delas faz com que avance para a frame 2 do movieclip. Quando tiramos o rato volta à frame 1. Ou seja, comporta-se como um botão nos seus hover e normal. Mas tem de ser mesmo movieclip senão o resto do ActionScript não funciona.

Em cada movieclip coloquei o seguinte:

Código: [Seleccione]
on (rollOver) {
gotoAndStop (2);
}

on (rollOut) {
gotoAndStop (1);
}


Eu queria é evitar andar a visitar as acções de cada movieclip (porque são muitos) e queria usar de novo o ciclo 'for'.

Tentei isto:

Código: [Seleccione]
for (var i:Number = 1;i<=20;i++){
_root["mc_"+i].onRollOver = function() {
gotoAndStop (2);
};

_root["mc_"+i].onRollOut = function() {
gotoAndStop (1);
};
};


Mas não funciona.

:(

Portanto fica lançado o desafio. Se alguém descobrir ganha um bombom.
Cumps.

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[Duvida] Flash Developer (ciclo 'FOR')
« Responder #3 em: 23 de Fevereiro de 2006, 01:30:46 »
Ora aqui está, finalmente, a resposta:

Código: [Seleccione]
for (var i:Number = 1;i<=20;i++){
this["mc_"+i].onRollOver = function() {
 var numero:Number = Number(this._name.split("_").pop());
 _root.onEnterFrame = function () {
  this["cap_"+numero]._alpha += (100-this["cap_"+numero]._alpha)/3;
  this["cap_"+numero]._x -= (this["cap_"+numero]._x-_xmouse)/2;
  this["cap_"+numero]._y -= (this["cap_"+numero]._y-_ymouse)/2;
 };
};
this["mc_"+i].onRollOut = function() {
 var numero:Number = Number(this._name.split("_").pop());
 _root.onEnterFrame = function() {
  this["cap_"+numero]._alpha += (0-  this["cap_"+numero]._alpha)/3;
 };
};
};


;)

Agora só falta a cena do rollover rollout.

Cumps.

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[Duvida] Flash Developer (ciclo 'FOR')
« Responder #4 em: 23 de Fevereiro de 2006, 19:00:19 »
Boas afinal esse ciclo 'for' não funciona também :S Credo, será imposível?

Reparem que os caps não desaparecem e ficam por cima do mapa, quando deveriam desaparecer.
http://escape.do.sapo.pt/togo2.swf
http://escape.do.sapo.pt/togo2.fla

Cumps.

Offline gimbras

  • Emblema de Prata
  • ****
  • Mensagens: 1105
    • Ver Perfil
    • NoFuturo.com
[Duvida] Flash Developer (ciclo 'FOR')
« Responder #5 em: 28 de Fevereiro de 2006, 20:55:28 »
Pronto pequenas alterações resultaram no efeito pretendido.

Código: [Seleccione]
for (var i:Number = 1;i<=20;i++){
this["mc_"+i].onRollOver = function() {
 var numero:Number = Number(this._name.split("_").pop());
 this.onEnterFrame = function () {
  _root["cap_"+numero]._alpha += (100-_root["cap_"+numero]._alpha)/3;
  _root["cap_"+numero]._x -= (_root["cap_"+numero]._x-_xmouse)/2;
  _root["cap_"+numero]._y -= (_root["cap_"+numero]._y-_ymouse)/2;
 };
};
this["mc_"+i].onRollOut = function() {
 var numero:Number = Number(this._name.split("_").pop());
 this.onEnterFrame = function() {
  _root["cap_"+numero]._alpha += (0-_root["cap_"+numero]._alpha)/3;
 };
};
};


Está a funcionar.
Obg.

Cumps.

 




Roleta das Anedotas - Abre noutra janela