Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 24-11-2008, 20:02   #1 (permalink)
Neuer User
 
Benutzerbild von cryten
 
Registriert seit: Nov 2008
Beiträge: 5
Question Spielausschnitt zentrieren

Hi,

bin neu hier im Forum und hoffe, dass mir jemand weiterhelfen kann.

Ich bin dabei ein 2D-Game (Mischung aus Action Adventure und Jump'n'Run) zu programmieren und haben folgenden Aufbau in meiner Fla-Datei:

-Auf der Bühne befindet sich ein MovieClip namens "background_mc"(--> Spielwelt) und in diesem befindet sich ein weiterer MovieClip "held_laufen_mc"(--> animierte Spielfigur).
-Bühnenmaße sind 1024x768 bei 25 FPS
-Die Grafik der Spielwelt ist ca. 3315 Pixel breit

Nun mein Problem:

Die Spielfigur bewegt sich per Pfeiltasten nach inks und rechts und jetzt will ich es erreichen, dass sich die Spielfigur immer in der Mitte der Bühne befindet, außer wenn sie in der Nähe des linken und rechten Bildrandes ist. Das klappt bis jetzt leider nur teilweise, denn wenn ich die Figur nach rechts bewege über die Bühnenmitte, wird zwar die Spielwelt nach links verschoben, hört aber leider auch nicht mehr damit auf bis das Spielende erreicht ist. Die Funktion, die für das Positionieren zuständig ist, heißt "heldPositionieren".

Hier der Code meiner Level2_Ctrl.as:

Code:
package
{
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.ui.Keyboard;
	import flash.geom.Point;
	
	public class Level2_Ctrl extends MovieClip
	{
		public var level2:Object = new Object();
		
		//Konstruktor
		public function Level2_Ctrl()
		{
			//Animation des Helden stoppen
			background_mc.held_laufen_mc.stop();
			
			//Erstellen eines Level2-Objektes und Festlegen der Eigenschaften
			level2.gravity = 1;
			level2.acceleration = 0;
			level2.falling = false;
			level2.speed = 7;
			level2.sprungkraft = -15;
			level2.breite = 1024;
			level2.spielbreite = 3312;
			
			//Levelbegrenzung für Helden
			level2.leftBorder = 0;
			level2.rightBorder = 3300;
			
			//Position des Helden anhand des Screens zentrieren
			level2.scrollSpeed = 3;
			
			//Listener für Heldenpositionierung und Gravitation
			stage.addEventListener(Event.ENTER_FRAME, heldPositionieren);
			//background_mc.held_laufen_mc.addEventListener(Event.ENTER_FRAME, heldFallenLassen);
			
			//Listener für Tastatur-Steurung
			stage.addEventListener(KeyboardEvent.KEY_DOWN, heldGo);
			stage.addEventListener(KeyboardEvent.KEY_UP, heldStop);
		}
		
		public function heldPositionieren (event:Event) : void
		{
			//Position des Helden festlegen
			var heroPoint:Point = new Point();
			heroPoint.x = background_mc.held_laufen_mc.x;
			heroPoint.y = background_mc.held_laufen_mc.y;
				
			background_mc.localToGlobal(heroPoint);
				
			var xabstand = Math.round((level2.breite/2) - heroPoint.x);
			
			if (Math.abs(xabstand) > level2.scrollSpeed) 
			{
				if (xabstand > 0) 
				{
					//Held befindet sich im linken Bereich des Screens
					//=> Bildausschnitt nach rechts verschieben
					if (background_mc.x < 0) 
					{
						background_mc.x += level2.scrollSpeed;
					}
				}
					
				if (xabstand < 0) 
				{
					//Held befindet sich im rechten Bereich des Screens
					//=> Bildausschnitt nach links verschieben
					if ((background_mc.x + level2.spielbreite) > level2.breite) 
					{
						background_mc.x -= level2.scrollSpeed;
					}
				}
			}
		}
		
		/*public function heldFallenLassen (event:Event) :void
		{
			//Gravitation wirkt auf Held
			if (level2.falling == true)
			{
				level2.acceleration += level2.gravity;
				background_mc.held_laufen_mc.y += level2.acceleration;
			}
		}*/
		
		//Funktionen für Tastatur-Steurung
		public function heldGo(event:KeyboardEvent) :void
		{
			var key:uint = event.keyCode;
   
      		switch (key) 
	  		{
				//nach rechts laufen
				case Keyboard.RIGHT :
				// Grenzen des levels
				if (background_mc.held_laufen_mc.x < level2.rightBorder) 
				{
					// Bewegen
					background_mc.held_laufen_mc.x += level2.speed;
					// Laufbewegung
					background_mc.held_laufen_mc.play();
					// Drehen in die richtige Richtung
					background_mc.held_laufen_mc.scaleX = 1;
				}
				break;
				
				//nach links laufen
			  	case Keyboard.LEFT :
				// Grenzen des levels
				if (background_mc.held_laufen_mc.x > level2.leftBorder) 
				{
					// Bewegen
					background_mc.held_laufen_mc.x -= level2.speed;
					// Laufbewegung
					background_mc.held_laufen_mc.play();
					// Drehen in die richtige Richtung
					background_mc.held_laufen_mc.scaleX = -1;
				}
				break;
				
				//springen
			  	case Keyboard.SPACE :
				if (level2.falling == false) 
				{
					level2.acceleration = level2.sprungkraft;
					  background_mc.held_laufen_mc.gotoAndPlay(60);
					background_mc.held_laufen_mc.y += level2.acceleration;
				}
				break;
      		}
		}
		
		public function heldStop(event:KeyboardEvent) :void
		{
			var key:uint = event.keyCode;
   
		  	switch (key) 
		  	{
				case Keyboard.RIGHT :
				background_mc.held_laufen_mc.stop();
				break;
				
			  	case Keyboard.LEFT :
				background_mc.held_laufen_mc.stop();
				break;
	
			  	case Keyboard.SPACE :
				background_mc.held_laufen_mc.stop();
				break;
		  	}
		}

	}
}
cryten ist offline   Mit Zitat antworten
Alt 12-12-2008, 21:50   #2 (permalink)
Neuer User
 
Registriert seit: Sep 2008
Beiträge: 38
genau das gleiche problem hab ich auch ^^
UmbraNox ist offline   Mit Zitat antworten
Alt 15-12-2008, 13:49   #3 (permalink)
Neuer User
 
Benutzerbild von cryten
 
Registriert seit: Nov 2008
Beiträge: 5
Hab es jetzt mitllerweile auf eine andere Art lösen können.
Da ich mich vorher mit AS2 befasst habe, musste ich mich auch erstmal auf AS3 umgewöhnen und es hat wohl an der "localToGlobal" Sache gelegen, Da wurde irgendetwas falsch berechnet. Deswegen habe ich es komplett weggelassen.

Jetzt liegt die Spielfigur auf dem MovieClip des Spielhintergrunds und nicht mehr in ihm drinnen und es funktioniert. Man sollte aber den Hintergrund und die Figur um den gleichen Wert verschieben, sonst holt der Held irgendwann den rechten oder linken Rand des Hintergrunds ein.
cryten ist offline   Mit Zitat antworten
Antwort

Lesezeichen

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



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

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


Copyright ©1999 – 2012 Marc Thiele