[AS3] Langsame Events

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

[AS3] Langsame Events

Beitrag 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. :)
Zuletzt geändert von Chromanoid am 15.11.2011, 17:58, insgesamt 1-mal geändert.
Grund: habe mal java als code ingestellt, dann erkennt man das besser
Ohne Input kein Output.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4258
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [AS3] Langsame Events

Beitrag 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.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: [AS3] Langsame Events

Beitrag 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.
Ohne Input kein Output.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4258
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [AS3] Langsame Events

Beitrag von Chromanoid »

Du kannst zumindest in Flash CS3 die Bildrate in den Dokument-Eigenschaften einstellen.
joeydee
Establishment
Beiträge: 1044
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: [AS3] Langsame Events

Beitrag 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.
Antworten