Comunidad de diseño web y desarrollo en internet online

[Tutorial] como arrastrar imagenes y posicionarlas CS3

Citar            
MensajeEscrito el 28 Sep 2010 08:30 pm
Hola, pues hace tiempo, mucho tiempo diria yo, intente ayudar a una persona en este foro y por causa de que mi trabajo cambio de rubro me vi con menos tiempo para ayudarle, gracias a dios existen las vacaciones y he aqui la solucion a la idea que el tuvo, la encontre mientras surfeaba en la web y me acorde de el... espero que aun le sirva.

Ver post original:[/url]

Ahora la solucion... Creamos y posicionamos en nuestra esena cuatro diferentes Sprite Objects, estos seran tres cuadrados a mover y un rectangulo contenedor llamado "holder".

Código ActionScript :

//Parte I -- Creamos los graficos 
 
var holder:Sprite = new Sprite(); 
var block1:Sprite = new Sprite(); 
var block2:Sprite = new Sprite(); 
var block3:Sprite = new Sprite(); 
  
this.addChild(holder); 
this.addChild(block1); 
this.addChild(block2); 
this.addChild(block3); 
 
holder.graphics.beginFill(0xDDDDDD); 
holder.graphics.lineStyle(2,0); 
holder.graphics.moveTo(0,0); 
holder.graphics.lineTo(0,300); 
holder.graphics.lineTo(100,300); 
holder.graphics.lineTo(100,0); 
holder.graphics.endFill(); 
holder.x = 350; 
holder.y = 50; 
 
block1.graphics.beginFill(0xDDDDFF); 
block1.graphics.lineStyle(0,0); 
block1.graphics.moveTo(0,0); 
block1.graphics.drawRect(0,0,100,100); 
block1.graphics.endFill(); 
block1.x = 50; 
block1.y = 50; 
  
block2.graphics.beginFill(0xFFDDDD); 
block2.graphics.lineStyle(0,0); 
block2.graphics.moveTo(0,0); 
block2.graphics.drawRect(0,0,100,100); 
block2.graphics.endFill(); 
block2.x = 50; 
block2.y = 200; 
  
block3.graphics.beginFill(0xDDFFDD); 
block3.graphics.lineStyle(0,0); 
block3.graphics.moveTo(0,0); 
block3.graphics.drawRect(0,0,100,100); 
block3.graphics.endFill(); 
block3.x = 175; 
block3.y = 100; 



Como podemos ver cada cuadrado es creado y posicionado en nuestra escena, asi tambien al darle una ubicacion en las coordenadas X, Y haremos que el cuadrado regrese a esa posicion en caso de no haber "colisionado" con el rectangulo contenedor; las cuales guardaremos en una variable llamada startingPt al momento de ser llamado el evento MOUSE_DOWN o que vaya al rectangulo contenedor en cuanto el cuadrado lo toque. El metodo hitTestObject de nuestros sprites puede determinar esto facilmente. Se tomo la decision de usar holder.hitTestObject(movingBlock) en lugar de movingBlock.hitTestObject(holder) -ambas regresan el mismo resultado-. Notaras que una vez que el objeto toca la linea de contenedor ("holder" sprite", removemos el listener del evento MOUSE_DOWN, manteniendolo efectivamente si se vuelve a mover. En la parte 3 se mostrara como agregar una funcion "reset".

Código ActionScript :

// Global variables to keep up with things 
 
var movingBlock:Sprite; 
var startingPt:Point = new Point(); 
var placed:int = 0; 
 
// Part II -- Add drag and drop functionality 
  
block1.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
block2.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
block3.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
  
function startBlockMove(evt:MouseEvent):void { 
   movingBlock = Sprite(evt.currentTarget); 
   startingPt.x = movingBlock.x; 
   startingPt.y = movingBlock.y; 
   stage.addEventListener(MouseEvent.MOUSE_MOVE, moveBlock); 
} 
  
function moveBlock(e:MouseEvent):void { 
   movingBlock.x = stage.mouseX; 
   movingBlock.y = stage.mouseY; 
} 
  
stage.addEventListener(MouseEvent.MOUSE_UP, stopMotion); 
  
function stopMotion(evt:MouseEvent):void { 
   stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveBlock); 
   snapInPlace(); 
   movingBlock = new Sprite(); 
   startingPt = new Point(); 
} 
  
function snapInPlace():void { 
   if (holder.hitTestObject(movingBlock)) { 
      movingBlock.x = holder.x; 
      movingBlock.y = holder.y + 100*placed; 
      placed++; 
      movingBlock.removeEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
   } 
   else { 
      movingBlock.x = startingPt.x; 
      movingBlock.y = startingPt.y; 
   } 
} 



Algunas veces esta no es la interaccion que queremos, especialmente si es posible que nuestros movingBlock colisionen posiblemente mas de un objeto contenedor simultaneamente. En esos casos, deberias considerar el metodo similarhitTestPont, el cual tomara los argumentos en las coordinadas de X y Y de un punto relavito al "parent object". Por ejemplo, en el codigo de abajo, si cambias la linea que containing hitTestObject :

Código ActionScript :

if (holder.hitTestPoint(stage.mouseX, stage.mouseY)) { 



El resultado sera que el mouse estara sobre el rectangulo contenedor para soltar el cuadrado y colocarlo dentro del contenedor. Esta interaccion es mucho mas intuitiva para los usuarios en algunas aplicaciones.

La parte final del codigo es una simple funcion de reset, que permite al usuario volver a usar la aplicacion sin tener que actualizar la pagina. Esto puede ser acompañado de un boton "resetear" usando el mismo codigo.

Código ActionScript :

// Part III -- Add a reset capability with a keyboard event 
 
stage.addEventListener(KeyboardEvent.KEY_DOWN,reset); 
  
function reset(evt:KeyboardEvent) { 
   if (evt.keyCode == Keyboard.UP) { 
      block1.x = 50; 
      block1.y = 50; 
      block2.x = 50; 
      block2.y = 200; 
      block3.x = 175; 
      block3.y = 100; 
        
      block1.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
      block2.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
      block3.addEventListener(MouseEvent.MOUSE_DOWN, startBlockMove); 
        
      placed = 0; 
   } 
} 



Bajar ejemplo: [url=http://www.flashandmath.com/basic/dragdroptour/DragDrop4.fla]


Fuente: [url=http://www.flashandmath.com/basic/dragdroptour/dd_tour5.html][/url]

Por holler

65 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 28 Sep 2010 08:31 pm
bah, nunca pude arreglar eso de que todo el texto se ve como link, espero no cause muchos problemas.

Por holler

65 de clabLevel



Genero:Masculino  

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.