Zurück   Flashforum > Software > 3D

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 15-11-2010, 15:08   #1 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 3
Problem mit Eventhandling bei Papervision - wer kann helfen?

Hallo zusammen!

Ich bin ein ziemlicher Actionscript-Trottel und hab mich sozusagen gezwungenermaßen jetzt eingearbeitet. Ich habe einen rotierbaren 3D-Scatterplot mit Papervision erstellt (natürlich mit Hilfe zahlreicher Tutorials... ;-) bei dem die Datenpunkte aus einem Textfile eingelesen werden.

( Format des Textfiles: x,y,z,farbe,ID des Datenpunktes;x2,y2,z2,Farbe2;ID2 usw. ...)

Das klappt auch soweit alles ganz gut, allerdings soll da jetzt noch eine Funktion rein, dass man die einzelnen Datenpunkte (via Sphere dargestellt) anklicken kann und dann wird das ganze zurück an PHP übergeben.

Aber egal was für einen EventListener ich auf die Punkte lege, es passiert nix! Eine Fehlermeldung beim Debuggen bekomme ich aber auch nicht. Hat jemand eine Idee?

Damit ihr wisst was ich meine hier der komplette Code. Die Stellen wo die Eventlistener sind habe ich Kenntlich gemacht...

Code:
package {
    import flash.events.Event;
    import flash.events.MouseEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLVariables;
	import flash.net.navigateToURL;
	import flash.net.URLLoaderDataFormat;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
    import org.papervision3d.core.geom.Lines3D;
    import org.papervision3d.core.geom.renderables.Line3D;
    import org.papervision3d.core.geom.renderables.Vertex3D;
    import org.papervision3d.materials.ColorMaterial;
    import org.papervision3d.materials.special.LineMaterial;
    import org.papervision3d.objects.DisplayObject3D;
    import org.papervision3d.objects.primitives.Sphere;
    import org.papervision3d.view.BasicView;
	import org.papervision3d.events.InteractiveScene3DEvent;
	
	
	 
     [SWF(backgroundColor="#C2C2C2",width="600",height="600")]
    public class Line3DChart_XtraSmall extends BasicView 
    {
        public var chartContainer:DisplayObject3D;
        public var chart:DisplayObject3D;
        private var dataPoints : Array;
		private var color:ColorMaterial;
             
        private static const RADIUS : int = 15;
        private static const MAX_SIZE : int = 600; 
        private static const AXIS_SIZE : int = 400;
		private static const AXIS_CORRFACT : int = 400;
		
		
		//Hiermit bekomme ich die Daten aus dem Textfile geladen...
		public var loader:URLLoader;
		public var Kunden:Array;
		
				
		  
        public function Line3DChart_XtraSmall()
        {
            super(stage.stageWidth, stage.stageHeight, false, true);
            init(); 
        }
 
        private function init():void
        {
 
            chartContainer = new DisplayObject3D("Chart Container");
            chart = new DisplayObject3D("Chart");
            
            chartContainer.rotationY=-15;
            chartContainer.rotationX=-15;
            dataPoints = new Array(); 

             var defaultMaterial : LineMaterial = new LineMaterial(0xFFFFFF, .1);
        	 var xAxisMaterial : LineMaterial = new LineMaterial( 0x3299FF, .75 );
             var yAxisMaterial : LineMaterial = new LineMaterial( 0xFF00FF, .75 );
             var zAxisMaterial : LineMaterial = new LineMaterial( 0xFFFFFF, .75 );

         
             var axes : Lines3D = new Lines3D( defaultMaterial, "Axes" );
             axes.addLine( new Line3D( axes, xAxisMaterial, 2, new Vertex3D( -AXIS_SIZE,-AXIS_CORRFACT,-AXIS_CORRFACT ), new Vertex3D( AXIS_SIZE,-AXIS_CORRFACT,-AXIS_CORRFACT ) ));
             axes.addLine( new Line3D( axes, yAxisMaterial, 2, new Vertex3D( -AXIS_CORRFACT,-AXIS_SIZE,-AXIS_CORRFACT ), new Vertex3D( -AXIS_CORRFACT,AXIS_SIZE,-AXIS_CORRFACT ) ));
             axes.addLine( new Line3D( axes, zAxisMaterial, 2, new Vertex3D( -AXIS_CORRFACT,-AXIS_CORRFACT,-AXIS_SIZE ), new Vertex3D( -AXIS_CORRFACT,-AXIS_CORRFACT,AXIS_SIZE ) ));
              
			 axes.addLine( new Line3D( axes, xAxisMaterial, 2, new Vertex3D( -AXIS_SIZE,-AXIS_CORRFACT,AXIS_CORRFACT ), new Vertex3D( AXIS_SIZE,-AXIS_CORRFACT,AXIS_CORRFACT ) ));
             axes.addLine( new Line3D( axes, yAxisMaterial, 2, new Vertex3D( AXIS_CORRFACT,-AXIS_SIZE,AXIS_CORRFACT ), new Vertex3D( AXIS_CORRFACT,AXIS_SIZE,AXIS_CORRFACT ) ));
             axes.addLine( new Line3D( axes, zAxisMaterial, 2, new Vertex3D( AXIS_CORRFACT,-AXIS_CORRFACT,-AXIS_SIZE ), new Vertex3D( AXIS_CORRFACT,-AXIS_CORRFACT,AXIS_SIZE ) ));
			 axes.addLine( new Line3D( axes, zAxisMaterial, 2, new Vertex3D( -AXIS_CORRFACT,AXIS_CORRFACT,-AXIS_SIZE ), new Vertex3D( -AXIS_CORRFACT,AXIS_CORRFACT,AXIS_SIZE ) ));
             axes.addLine( new Line3D( axes, yAxisMaterial, 2, new Vertex3D( -AXIS_CORRFACT,-AXIS_SIZE,AXIS_CORRFACT ), new Vertex3D( -AXIS_CORRFACT,AXIS_SIZE,AXIS_CORRFACT ) ));			var lines : Lines3D = new Lines3D( defaultMaterial, "Lines" );
             axes.addLine( new Line3D( axes, xAxisMaterial, 2, new Vertex3D( -AXIS_SIZE,AXIS_CORRFACT,AXIS_CORRFACT ), new Vertex3D( AXIS_SIZE,AXIS_CORRFACT,AXIS_CORRFACT ) ));
			 
             chart.addChild( axes );
             chart.addChild( lines );
             
             var lastVertex : Vertex3D;

			 
			 //Daten reinladen
			 loadTextFile('tempData.txt');
			 trace(Kunden);
       
             chartContainer.addChild(chart);
             scene.addChild(chartContainer); 
			 
             singleRender(); 
 
       
			stage.addEventListener(KeyboardEvent.KEY_DOWN, pfeiltasteDown);

        }
		
			
		private function loadTextFile(path:String):void {
			
			loader = new URLLoader();
			loader.addEventListener(Event.COMPLETE,makeArray);
			loader.load(new URLRequest(path));
			trace(Kunden);
						
		}
			
		private function makeArray(e:Event):void {
			var dictionaryText:String=String(e.target.data);
			Kunden=dictionaryText.split(";");
			trace(Kunden[0]);
			var currentVertex : Vertex3D = new Vertex3D();
			var itemArray:Array = new Array();
			for each (var num in Kunden)
            {

                currentVertex = new Vertex3D();
          				
				var a:Array = num.split(/,/);           // Daten aus dem Textfile a == ["x","y","z","Farbe","PunktID"]
					
				currentVertex.x = a[0]-AXIS_CORRFACT;
                currentVertex.y = a[1]-AXIS_CORRFACT;
                currentVertex.z = a[2]-AXIS_CORRFACT;
				
                var dataMaterial : ColorMaterial = new ColorMaterial( a[3], .65, false );
				
								
                if (a[3]=="0x33CCFF")
				{
					var point : Sphere = new Sphere( dataMaterial, RADIUS*2 );
				}
				else
				{
					var point : Sphere = new Sphere( dataMaterial, RADIUS );
				}
                point.x = currentVertex.x;
                point.y = currentVertex.y;
                point.z = currentVertex.z;
				point.myTargetID = a[4];
				
                
                chart.addChild( point ); 
				itemArray.push(point);
		
				
            }
// ############################################################### HIER KOMMEN DIE EVENTS UM DIE ES GEHT!!!			
			for  (var i:String in itemArray)
			{
				itemArray[i].addEventListener(MouseEvent.MOUSE_DOWN, openNewURL);						//funktioniert nicht, openNewURL wird nicht aufgerufen
				itemArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, openNewURL);		//funktioniert auch nicht, openNewURL wird nicht aufgerufen
				trace(itemArray[i].myTargetID);															//gibt die korrekte ID aus
			}
					
			singleRender();
						
		}
		
		
		public function pfeiltasteDown(evt:KeyboardEvent):void {
            switch (evt.keyCode) {
               case Keyboard.DOWN :
                    chart.rotationX-=5;
                    break;
                case Keyboard.UP :
                    chart.rotationX+=5;
                    break;
                case Keyboard.LEFT :
                    chart.rotationY+=5;
                    break;
                case Keyboard.RIGHT :
                    chart.rotationY-=5;
                    break;
                default :
            }
			singleRender();
        }

	
		
		// die funktion soll aufgerufen werden beim click
		public function openNewURL(event:MouseEvent):void 
		{
			trace(event.currentTarget.myTargetID);
			var pageURL:URLRequest = new URLRequest("distribute.php?target=" + event.currentTarget.myTargetID);
			navigateToURL(pageURL, "_self");
		}
        
    }
}
Ich hab mich schon durch diverse Foren geklickt, aber alle Posts die passten haben mich nicht weitergebracht... Deswegen vielen Dank für eure Hilfe!!!

VG, simeon
simeon.newbie ist offline   Mit Zitat antworten
Alt 15-11-2010, 16:29   #2 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 3
Problemverdeutlichung

Um das ganze für euch zugänglicher zu machen, hier nochmal der Kern meines Problems:

Ich erzeuge mit
Code:
var point : Sphere = new Sphere( dataMaterial, RADIUS );
innerhalb einer Schleife zu jedem Datenpunkt eine Kugel und adde die zu einem DisplayObject3D namens chart:
Code:
chart.addChild( point );
um jeden Punkt einzeln ansprechen zu können packe ich den danach via
Code:
itemArray.push(point);
in ein Array. Dieses lasse ich dann nach der Schleife durchlaufen und will jedem Punkt einen Eventlistener anhängen:
Code:
for  (var i:String in itemArray)
			{
				itemArray[i].addEventListener(MouseEvent.MOUSE_DOWN, openNewURL);						//funktioniert nicht, openNewURL wird nicht aufgerufen
				itemArray[i].addEventListener(InteractiveScene3DEvent.OBJECT_PRESS, openNewURL);		//funktioniert auch nicht, openNewURL wird nicht aufgerufen
				trace(itemArray[i].myTargetID);															//gibt die korrekte ID aus
			}
(Anmerkung: für die Eigenschaft myTargetID habe ich die Sphere Klasse erweitert, da steckt die ID drin, die nachher von dem empfangenden PHP-Skript weiterverarbeitet werden kann.)

Kompilieren geht auch ohne Fehlermeldung, aber wenn ich auf die Punkte klicke passiert gar nichts... Und zwar weder beim normalen MouseEvent noch beim InteractiveScene3DEvent, ich hab beides ausprobiert.

So, hoffe das hat die Frage etwas konkretisiert/verdeutlicht. Der komplette Code steht ja im Post oben...

Wäre euch echt für Hilfe Dankbar, weiß nämlich nicht mehr weiter.

Danke und VG, Simeon
simeon.newbie ist offline   Mit Zitat antworten
Alt 16-11-2010, 09:08   #3 (permalink)
Neuer User
 
Registriert seit: Nov 2010
Beiträge: 3
Problem gelöst!

Ich konnte das Problem selber nach einigem suchen lösen! Für alle die sowas auch mal haben hier die Lösung:

Um die Sphere anklickbar zu machen muss dem verwendeten Material die Eigenschaft interactive mitgegeben werden.

Also z.B.
Code:
var dataMaterial : ColorMaterial = new ColorMaterial( Farbe, .65, false );
dataMaterial.interactive = true;                               // Das war es was fehlte!
var point : Sphere = new Sphere( dataMaterial, RADIUS );
Und danach ist point ganz normal über den EventListener InteractiveScene3DEvent erreichbar...
simeon.newbie ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
events, papervision3d

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Movie Problem, kann jemand helfen?? aalecs Flash 8 1 30-03-2006 09:35
Problem mit Animation! kann wer helfen? corvin-natas Flash MX 2004 1 26-09-2004 11:42
setInterval Problem wer kann helfen?? Rack ActionScript 1 8 25-09-2004 14:13
servus wer kann mir helfen hab nen problem Grisuuu ActionScript 1 2 10-10-2003 12:30
kleines problem wer kann helfen Steelman Flash 4 und Flash 5 3 09-09-2002 15:42


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele