Ok, sto creando la solita galleria in flash usando per l'appunto Papervision3D usando un bel tutorial trovato qui
Tuttavia il listener ha come target solo la prima foto, ora, avevo letto su un'altro tutorial (questo) che dando come target al listener l'oggetto che contiene tutte le foto e aggiungendo poi un parametro booleano a true (lo useCapture) si poteva fa in modo che il listener fosse attivo per tutte le foto singolarmente invece che per tutto l'album in blocco.
La citazione precisa e:
Alla luce di tutto questo ho provato a fare altrettanto con il mio script e ovviamente questo non ha avuto alcun effetto:album.addEventListener(MouseEvent.ROLL_OVER, onOver, true);
album.addEventListener(MouseEvent.ROLL_OUT, onOut, true);
//listener in caso di ridimensionamento della pagina web
stage.addEventListener(Event.RESIZE, onResize);
//listener per dare l’effetto 3D al movimento del mouse
stage.addEventListener(MouseEvent.MOUSE_MOVE, muovi_album);
I 2 listener sono un po’ particolari, innanzitutto un occhio attento si accorge che il listener è inserito nell’oggetto “album” che contiene tutte le foto e che quindi, in caso di roll over, è questo l’oggetto target del listener, e non una sola foto. Come è possibile che però, andando col mouse sopra una foto, si modifica la luminosità di SOLO quella foto e non di tutto l’album?
Cerchiamo di capirlo.
Nel listener vediamo, in conclusione, la presenza (alquanto insolita) di un parametro booleano (true in questo caso), esso rappresenta un argomento denominato “useCapture” un po’ difficile da spiegare (riguarda i passaggi di propagazione di un evento, cose da puri programmatori), ma in pratica serve per far attivare il listener precisamente sull’oggetto interno che in questo caso viene colpito dal passaggio del mouse. In poche parole è come se il listener fosse su ogni foto e non su tutto l’album. In questo modo però si scrive meno codice (certo… se uno lo sa!
Per facilità di lettura ho lasciato la dichiarazione dei pacchetti e delle variabili/costanti e anche le funzioni che richiamano i listener, se serve anche il resto dite pureCodice PHP:
package com.flashmoto.gallery
{
import br.com.stimuli.loading.BulkErrorEvent;
import br.com.stimuli.loading.BulkLoader;
import br.com.stimuli.loading.BulkProgressEvent;
import caurina.transitions.Tweener;
import flash.display.Bitmap;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Rectangle;
import flash.system.Capabilities;
import flash.text.TextField;
import org.papervision3d.Papervision3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.core.log.PaperLogger;
import org.papervision3d.core.log.PaperTraceLogger;
import org.papervision3d.events.InteractiveScene3DEvent;
import org.papervision3d.materials.*;
//import org.papervision3d.materials.BitmapMaterial;
//import org.papervision3d.materials.MovieMaterial;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Plane;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
public class Gallery extends Sprite
{
public var loader : BulkLoader; // Loader for the gallery xml and gallery images
public var viewport : Viewport3D; // Papervision3d components - Viewport
public var scene : Scene3D; // Papervision3d components - Scene
public var camera : Camera3D; // Papervision3d components - Camera
public var renderer : BasicRenderEngine; // Papervision3d components - BasicRenderEngine
public var galleryImagesCollection : Array; // Collection of images urls
public var galleryPlanesCollection : Array; // Collection of gallery planes to be added to the scene
public var galleryPlanes : Array; // Collection of scene gallery planes
private var _galleryXMLLoaded : Boolean = false; // Flag that indicates if xml is loaded
private var _planesHolder : DisplayObject3D; // Holder for the gallery planes
private var _buttonsHolder : DisplayObject3D;
private var _imageZoomed : Boolean = false; // Flag that indicates zoomed image state
private var _currentPlaneIndex : uint = 0; // Current plane ( first in the line ) index
private var _firstPlaneZ : Number = 0; // First plane z coordinate, planes shift
private var _planesAreMoving : Boolean = false; // Flag that indicates if planes are moving
public static const GALLERY_XML : String = 'xml/gallery.xml'; // Path to the gallery xml file
public static const VIEWPORT_WIDTH : Number = 1400; // Viewport width
public static const VIEWPORT_HEIGHT : Number = 800; // Viewport height
public static const GALLERY_PLANE_WIDTH : Number = 400; // Gallery plane width
public static const GALLERY_PLANE_HEIGHT : Number = 400; // Gallery plane height
public static const GALLERY_PLANE_SEGMENTS_W : Number = 3; // Gallery plane segments ( width )
public static const GALLERY_PLANE_SEGMENTS_H : Number = 3; // Gallery plane segments ( height )
public static const R : Number = 2000; // Raggio della circonferenza su cui si dispongono le foto
public function Gallery() {
// Gallery Constructor
// -------------------
loadImagesData();// Load images data
}
private function loadImagesData():void {
// Loads images data from xml file
// -------------------------------
}
private function onGalleryLoaded( event:Event ):void {
// Parses gallery xml file and starts images loading process
// ---------------------------------------------------------
}
private function onGalleryLoadingProgress( event:BulkProgressEvent ):void {
// Shows loader progress info
// --------------------------
}
private function onGalleryLoadingError( event:BulkErrorEvent ):void {
// Shows loader error info
// -----------------------
private function init3DEngine():void {
// Inits 3D engine. Creates viewport, scene, camera and renderer and
// also creates and adds scene objects. Creates event listener for the
// enter frame event for the scene rendering.
// -------------------------------------------------------------------
addEventListener( Event.ENTER_FRAME, render ); // Render the scene every enter frame
}
private function createGalleryImages():void {
// Creates display objects from loaded images and updates gallery objects collection
// ---------------------------------------------------------------------------------
}
private function createGalleryDisplayObject( image:String ):DisplayObject3D {
// Creates gallery 3D object using loaded image bitmap.
// ------------------------------------------------------------------
// The method returns DisplayObject3D object, and gallery do not need
// to know if there is a plane, cube or sphere, so later I can
// rewrite this method to create any objects needed.
// ------------------------------------------------------------------
}
private function addGalleryImages():void {
// Adds gallery display objects to the scene and arranges them. Later I
// will add more arrangent strategies to this application, and all I
// need to do is to update this method which will get the stategy name
// as parameter.
// --------------------------------------------------------------------
_planesHolder = new DisplayObject3D(); // Create holder for the gallery objects
scene.addChild( _planesHolder );
galleryPlanes = new Array();
// Add gallery planes INIZIO
var flag : Number = 1;
var GammaRAD : Number = 0;
var GammaDEG : Number = 0;
var BetaRAD : Number = Math.PI/2;
var AlfaRAD : Number = 0;
var sinAlfaRAD : Number = 0;
var a : int = 0;
var b : int = 0;
for( var i : uint = 0; i < galleryPlanesCollection.length; i++ ) {
var galleryPlane : Plane = galleryPlanesCollection[i] as Plane;
GammaRAD = GammaRAD + ((2*Math.PI)/(galleryPlanesCollection.length)); //angolazione foto rispetto al centro
GammaDEG = (180*GammaRAD)/Math.PI;
galleryPlane.x = R*Math.cos(GammaRAD);
galleryPlane.z = R*Math.sin(GammaRAD);
galleryPlane.yaw(-GammaDEG);
galleryPlanes.push( _planesHolder.addChild( galleryPlane ) );
}
// Add gallery planes FINE
// Listen for the events only from the first gallery object
//galleryPlane = galleryPlanes[_currentPlaneIndex] as Plane;
galleryPlane.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onPlanePress );
_planesHolder.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onPlaneOver, true );
//galleryPlane.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onPlaneOver );
galleryPlane.addEventListener( InteractiveScene3DEvent.OBJECT_OUT, onPlaneOut );
}
private function addButtons():void{
// Aggiunge i pulsanti per scorrere la galleria avanti e indietro
// --------------------------------------------------------------
_buttonsHolder = new DisplayObject3D(); // Create holder for the gallery objects
scene.addChild( _buttonsHolder );
var materiale_rettangolo_sx : BitmapFileMaterial = new BitmapFileMaterial("prev.jpg");
var materiale_rettangolo_dx : BitmapFileMaterial = new BitmapFileMaterial("next.jpg");
materiale_rettangolo_sx.interactive = true;
materiale_rettangolo_dx.interactive = true;
var rettangolo_sx : Plane = new Plane(materiale_rettangolo_sx, 200, 200);
var rettangolo_dx : Plane = new Plane(materiale_rettangolo_dx, 200, 200);
//posizionamento PREV
rettangolo_sx.x = -2000;
rettangolo_sx.y = 450;
rettangolo_sx.z = -1500;
//posizionamento NEXT
rettangolo_dx.x = -1000;
rettangolo_dx.y = 450;
rettangolo_dx.z = -1500;
_buttonsHolder.addChild(rettangolo_sx);
_buttonsHolder.addChild(rettangolo_dx);
rettangolo_sx.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onButtonPress_Prev );
rettangolo_dx.addEventListener( InteractiveScene3DEvent.OBJECT_PRESS, onButtonPress_Next );
}
private function onButtonPress_Prev(event:InteractiveScene3DEvent):void {
trace("precedente");
}
private function onButtonPress_Next(event:InteractiveScene3DEvent):void {
trace("successivo");
}
private function onPlanePress( event:InteractiveScene3DEvent ):void {
// Gallery plane mouse press event handler
// ---------------------------------------
}
}
private function onPlaneOver( event:InteractiveScene3DEvent ):void {
// Gallery plane mouse over event handler
// --------------------------------------
trace("passato sopra");
}
private function onPlaneOut( event:InteractiveScene3DEvent ):void {
// Gallery plane mouse out event handler
// -------------------------------------
}
private function render( event:Event ):void {
// Renders the scene
// -----------------
}
}
}