Sérgio Lopes
28-11-2007, 22:04
Boas
estou a criar um prototipo para um gps (trabalhinho da faculdade) e tenho aqui alguns problemas que não consigo resolver (dado que sou um nabo em flash ando a aprender googlando por tuturials e assim)
tenho esta função na frame actions:
function zoomOut(movieClip) {
if(movieClip._yscale && movieClip._xscale > zoomMin) {
movieClip._xscale = movieClip._xscale - zoomIncrement;
movieClip._yscale = movieClip._yscale - zoomIncrement;
zoom = zoom - zoomIncrement;
}
e dps tenho um botao de zoom com o seguinte codigo:
on(release){
_root.zoomOut(_root.Mapa);
}
só que eu queria que ao carregar no botão emquanto não o solta-se ele ficasse a fazer zoom.... isto é possivel? tentei por "on(press)" mas o resultado é o mesmo :(
tenho aqui o swf (http://ragnarock.110mb.com/ccu/teste.swf) e o fla (http://ragnarock.110mb.com/ccu/teste.fla)
dicas pra resolver problemas de drag n' drop também são bem vindas:)
msdevweb
30-11-2007, 18:28
Bom, o que te aconselho é criares uma função zoom, e quando carregar no botão activa a função, e só a desactiva com o on(release)... ou seja, do estilo, tena a função, zoom_in(estado), guardas por exemplo uma constante com o estado do zoom, tipo
on(press) {
estadoZoom="activo";
zoom_in("inicia");
}
e no on(release) {
estadoZoom="inactivo";
zoom_in("para");
}
depois na função, se for para "iniciar", verificas se o estadoZoom="activo", se nao for, inicias o zoom, e dizes à variavel estadoZoom="activo";
O mesmo ao contrario quando dizes "para".
O estadoZoom é importante para evitar a activação da função zoom com repetidos clicks no botão, isto pode nao ser necessário para o teu exemplo... mas vê... e diz se conseguiste resolve o teu problema.
Quanto ao drag & drop, o estilo é o mesmo que te disse em cima :) mas dentro da função, jogas com as posições do teu objecto "movivel" de acordo com as posições do cursor, tens acesso às coordenadas do cursor com o comando _xmouse e y_mouse. (se possivel usar no teu caso)
Se quiseres ser mais directo, podes usar a propria função do flash que já tem a papinha feita e que serve mesmo para drag & drop, a função startDrag, que pode ser usado num objecto, tipo meu_objecto.startDrag(true); ou startDrag("meu_objecto", true);
Seria isto?
Sérgio Lopes
30-11-2007, 19:52
bom o drag já está a funcionar são só mais uns retoques
em relaçao ao zoom fui experimentar fazer isso do estado... fiz algo do genero
function zoomIn(){
while(ZoomActivo){
....
}
}
e dps onPress metia a variavel a activo e chamava a função e onRelease metia o zoomActivo a falso...
mas assim que chamo a função com zoomActivo a true ele diz que fica instável :S, existe alguma funçao tipo sleep de C em action script? só pra testar se isso o acalma..
msdevweb
30-11-2007, 20:32
bem... está aí uma confusao... nao estou a perceber... o while(ZoomActivo) está a verificar só se a variavel está declarada... logo esteja a true ou false ele executa na mesma...
terias que colocar while(ZoomActivo=true) {}...
mas bom, para te poder ajudar mais devias colocar aqui o código... seria bem mais facil... :)
Sérgio Lopes
01-12-2007, 02:03
a função de zoomIn ficou
function zoomIn(movieClip) {
while(zoomActivo==true){
if(movieClip._yscale && movieClip._xscale < zoomMax) {
movieClip._xscale = movieClip._xscale + zoomIncrement;
movieClip._yscale = movieClip._yscale + zoomIncrement;
zoom = zoom + zoomIncrement;
} //end if statement
}
} //end zoomIn function
e no botão meti:
on(press){
_root.zoomActivo = true;
_root.zoomIn(_root.Mapa);
}
on(release){
_root.zoomActivo = false;
_root.zoomIn(_root.Mapa);
}
a minha ideia é que ele a fazer zoom sozinho vai até ao maximo em menos de nada..e breaka... :s
eu tava a espera de que já existise uma forma de raiz de fazer este tipo de coisa em flash...mas parece que não :S
bem... está aí uma confusao... nao estou a perceber... o
terias que colocar while(ZoomActivo=true) {}...
.
não seria while(ZoomActivo==true) {}?!? em vez de = ser == ?!
podias dar um exemplo de como ficaria isso a funcionar, eu percebi a ideia mas não como fazer..
por exemplo:
function zoomOut(movieClip,estado){
while(estado == 1){
movieClip._xscale += 5;
movieClip._yscale += 5;
}
}
eu testei e nao funcionou... :S
msdevweb
01-12-2007, 14:20
não seria while(ZoomActivo==true) {}?!? em vez de = ser == ?!
Sim... nem reparei que tinha escrito mal...
Bom, supostamente deveria funciona assim:
Tens um botão zoom com o nome de "zoomItButton", crias um layer de Actions e fazemos o seguinte.
Nota que as funções têm de estar sempre disponiveis ao longo de toda a duração do flash...
function zoomIn(movieClip) {
while(zoomActivo==true){
if(movieClip._yscale && movieClip._xscale < zoomMax) {
movieClip._xscale = movieClip._xscale + zoomIncrement;
movieClip._yscale = movieClip._yscale + zoomIncrement;
zoom = zoom + zoomIncrement;
} //end if statement
}
} //end zoomIn function
Aqui supostamente estará tudo bem, mas devias adicionar dentro do while um if(movieClip._yscale==ZoomMaxY) ZoomActivo=false; o mesmo para o _xscale para que se chegar ao maximo desactive o zoom.
O zoomActivo convem tem que ser uma variavel global.
os eventos on(press) e on(release) devem ser colocados neste mesmo layer actions, logo
zoomItButton.onPress = function() {
zoomActivo=true;
zoomIn(Mapa);
}
e o mesmo para o release
zoomItButton.onRelease = function() {
zoomActivo=false;
}
Bom, entretanto andei à procura de uma solução para estes problemas e encontrei http://www.gogoat.com/2006/08/07/flash-zoom/ que vos será util, e provavelmente é o que procuram... já usei uma vez, e é bastante util e simples personalizar, e podem usar no vosso projecto bem como vos ajudar a entender... Na pagina que indiquei o zoom é feito atravez da roda "wheel" do rato. Vejam se era isso que queriam.
Neste momento não me esta a ser util, mas muito obrigado porque estou a fazer uma apresentação e para uma coisa vou precisar de algo parecido...
Se puderes dar uma vista de olhos neste tópico: http://www.techzonept.com/showthread.php?t=215924
Abraços
Sérgio Lopes
01-12-2007, 17:12
tentei o que disseste msdevweb ... ele cracha...
criei um fla só pra testar isso.. podes velo aqui (http://ragnarock.110mb.com/ccu/zoomTeste.fla) todo o codigo esta na layer action action as linhas que estao comentadas são as do while...pq sao as que fazem isto crachar...
se alguem detectar o erro que me diga...
Sérgio Lopes
01-12-2007, 23:01
após ter pedido a esperança encontrei a solução por acaso noutro forum :P
deixo aqui a solução pra possiveis interessados:
zoomOut.onPress = function(){
ROOT.onEnterFrame = function(){
zoom._xscale*=0.9;
zoom._yscale*=0.9;
checkBounds(0,0,0,0);
}
}
zoomOut.onRelease = function() {
delete ROOT.onEnterFrame;
}
zoomOut.onReleaseOutside = function() {
delete ROOT.onEnterFrame;
}
zoomIn.onPress = function(){
ROOT.onEnterFrame = function(){
zoom._xscale*=1.1;
zoom._yscale*=1.1;
checkBounds(0,0,0,0);
}
}
zoomIn.onRelease = function() {
delete ROOT.onEnterFrame;
}
zoomIn.onReleaseOutside = function() {
delete ROOT.onEnterFrame;
}
confesso que não entendo estes deletes..nem os onEnterFrame mas funcionou hehe