Seite 1 von 1

[AS3] Langsame Events

Verfasst: 15.11.2011, 17:50
von BeRsErKeR
Hi ich lerne gerade ein wenig AS3 um ein kleines Flashspiel zu schreiben. Prinzipiell kein Ding, wenn Flash CS5 nicht pausenlos rumstocken und abspacken würde. Aber das ist nicht mein Problem.

Ich möchte eine Grafik neben dem Cursor anzeigen (Drag). Das habe ich gemacht indem ich die Grafik (bzw. eigentlich ist es ein MovieClip mit mehreren Frames) zur Bühne / zum Dokument /zum MovieClip hinzufüge und dann:

1. startDrag benutze
2. einen EventListener für MouseEvent.MOUSE_MOVE hinzufüge und in diesem die Koordinaten der Grafik anpasse und den Screen neu zeichne

Prinzipiell geht das auch nur ist es extrem lahm. Die Grafik ruckelt gemächlich hinterm Mauszeiger hinterher, verblüffender Weise dauert es auch ein Weilchen bis CLICK-Events mal was machen.

Was aber noch merkwürdiger ist, ist die Tatsache, dass sobald ich ziemlich weit rechts mit der Maus bin beides so flüssig ist wie ich mir das vorstelle. Also im (sagen wir mal) rechten Achtel der Bühne läuft alles wie geschmiert. Weiter links ruckelt es.

Hier mal der Code (teilweise sind da noch Sachen zum Testen drin):

Code: Alles auswählen

package
{
	import flash.display.*;
	import flash.events.MouseEvent;
	
	public class MainScreen extends MovieClip
	{
		private static const MapWidth:uint = 10;
		private static const MapHeight:uint = 10;
		private static const TileWidth:uint = 64;
		private static const TileHeight:uint = 64;
		private static const OffsetX:uint = 16;
		private static const OffsetY:uint = 16;
		private var CursorImage:Images = new Images();

		public function MainScreen()
		{
			for (var y:uint=0; y<MapHeight; ++y)
			{
				for (var x:uint=0; x<MapWidth; ++x)
				{
					var index:int = x + y * MapWidth;
					var tile:Tile = new Tile();
					var image:Images = new Images();
					tile.x = OffsetX + x * TileWidth;
					tile.y = OffsetY + y * TileHeight;
					tile.index = index;
					image.x = 0;
					image.y = 0;
					image.gotoAndStop(1);
					image.index = index;
					image.name = "image";
					addChild(tile);
					tile.addChild(image);
					
					tile.addEventListener(MouseEvent.CLICK, clickHandler);
				}
			}
			
			CursorImage.gotoAndStop(1);
			addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
			addChild(CursorImage);
			
			setDraggedObject(3);
		}
		
		public function clickHandler(event:MouseEvent):void
		{
			if (event.currentTarget != null && event.currentTarget != this)
			{
				if (CursorImage.currentFrame > 1)
				{
					var image:Images = event.currentTarget.getChildByName("image");
					image.gotoAndStop(CursorImage.currentFrame);
				}
			}
		}
		
		private function setDraggedObject(index:uint)
		{
			CursorImage.gotoAndStop(index);
			// hier stand mal das dragStart
		}
		
		private function moveHandler(event:MouseEvent):void
		{
			CursorImage.x = mouseX;
			CursorImage.y = mouseY;
			event.updateAfterEvent();
		}
	}
}
Ich denke mal ich mache was falsch. Ich würde nur gern wissen was. :)

Re: [AS3] Langsame Events

Verfasst: 15.11.2011, 18:12
von Chromanoid
Also erst mal zu Flash CS5: Du kannst auch in FlashDevelop programmieren und in Flash CS5 nur den Grafikkram machen. Dazu musst du den richtigen Klassenpfad in den Projekteigenschaften setzen und bei den entsprechenden Objekten die entsprechende Klasse setzen.

Vielleicht solltest du zum Einen lieber MouseEvent.DOWN abfangen und zum Anderen den Hardwarecursor ausblenden. Evt. kannst du außerdem noch die Framerate erhöhen.

Schau dir sonst auch mal die Funktion startDrag an. Die sorgt für "natives" ziehen eines MovieClips.

Re: [AS3] Langsame Events

Verfasst: 15.11.2011, 18:22
von BeRsErKeR
Danke erstmal für die Antwort. FlashDevelop guck ich mir bei Gelegenheit mal an.

Hardwarecursor ausblenden werd ich auch mal probieren, wobei ich ja eigentlich auch nen Cursor haben will. Framerate erhöhen? Gern doch aber wie? Also dazu sei gesagt, dass zwar ein MovieClip am Cursor hängt, aber der zeigt immer nur statisch einen Frame an (gotoAndStop). MovieClip einfach deshalb, weil ich da halt einfach das jeweilige Frame anzeige (quasi eine Liste aus Bildern).

startDrag hab ich wie gesagt schon probiert. Das Ergebnis ist das selbe.

Ich bin halt verwirrt, dass die "Framerate" anscheinend von der Position des Cursors abhängt bzw. halt im größten Teil ruckelt und in einem kleinen Teil flüssig läuft.

Re: [AS3] Langsame Events

Verfasst: 15.11.2011, 18:45
von Chromanoid
Du kannst zumindest in Flash CS3 die Bildrate in den Dokument-Eigenschaften einstellen.

Re: [AS3] Langsame Events

Verfasst: 16.11.2011, 08:43
von joeydee
Bildrate geht auch per AS3: stage.frameRate=60;

Es könnte auch an den 100 EventListenern (clickHandler) liegen, die du da addest. Wird es flüssiger wenn du die weglässt? Selbst wenn nicht - du solltest besser die Tiles in einem Array halten, einen Listener auf das ganze Feld bzw. die Stage legen und dann per Mauskoordinaten das Tile bestimmen, das angeklickt wurde.

Sind denn die Tiles animiert? Enthalten sie Vektorgrafiken oder Ebenen mit Transparenzen? Am performantesten wäre da natürlich ein einzelnes deckendes unskaliertes Bitmap. Ansonsten (wenn sich ein Tile über mehrere Frames nicht ändert, also auch Drehung und Skalierung gleich bleiben) mal cacheAsBitmap testen. Auch für den Cursor.

Du kannst auch versuchen, alle Tiles in ein einziges Bitmap zu zeichnen, darauf einen Clickhandler wie oben beschrieben.