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

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 30-06-2007, 11:48   #1 (permalink)
Rock'n'Bass
 
Benutzerbild von <sVkVmVit>
 
Registriert seit: Feb 2006
Ort: Hamburg
Beiträge: 202
Question Items einsammeln

Hi!

Hab gerade so ein kleines Testgame begonnen, wobei der Spieler eine Spielfigur aus der Vogelperspektive steuert ( also ähnlich GTA1+2, nur n bissl simpler ).
Nun soll sich diese Spielfigur durch einzelne kleine Abschnitte bewegen und dabei Items einsammeln können. Zum Beispiel läuft die Figur durch einen Corridor und öffnet am Ende eine Tür. Dann wird der nächste Abschnitt geladen und der vorige ist nicht mehr sichtbar. So in der Art. Das heißt, Items, die in einem Abschnitt übrig bleiben, müssen im fertigen Spiel beim Übergang in einen neuen Abschnitt entfernt werden und wieder erscheinen, wenn die Figur besagten Abschnitt erneut betritt. Dabei sollen natürlich nur noch die Items vorhanden sein, die man noch nicht eingesammelt hat.

Das ganze hat bis jetzt gut geklappt (Items platzieren und einsammeln), ABER jetzt habe ich ein Problem ( bestimmt irgendetwas ganz simpes ), aber ich find ihn irgendwie nicht!
Zwar werden alle Items korrekt an Ort und Stelle platziert, nur kann ich sie jetzt ( nach einer kleinen Änderung des Codes ) nicht mehr einsammeln.. es scheint, als würde die Kollision garnicht erkannt. hab mir alles genau angeschaut, aber irgendwie...


Hier eine kleine Übersicht über die MCs:

"char": Die Spielfigur
"testitem": Ein Item (mit Export für Actionscript)
"areale.areal0": Dieser Clip enthält einen kleinen Levelabschnitt. In diesem Clip werden die items platziert.


PS: benutze Flash MX


Hier der Code, welcher im ersten Bild der Hauptzeitleiste steht (Der Fehler müsste ja irgendwo in der for-Schleife (siehe unten im Code) sein, die für die Kollision mit den Items zuständig ist):

Code:
stop();



itemset = [[["testitem",160,240],["testitem",160,210],["testitem",160,180],["testitem",50,50],["testitem",50,80]]];



//--------------------------------------------------


/*
Die folgende Funktion ist dafür zuständig, 
die Items eines Spielabschnitts zu verteilen, 
wobei auf die im Array "itemset" stehenden 
x- und y-Positionen zugegriffen wird. 
Allerdings wird ein Item nur dann gesetzt, 
wenn es nicht bereits zuvor von einem 
eingesammelt wurde. 
*/

function itemsverteilen() {
	
	for (i=0; i<=_root.itemset[_root.abschnitt].length - 1; i++){
		if (_root.itemset[_root.abschnitt][i][0] != "kein"){
			_root.areale.areal0.attachMovie(_root.itemset[_root.abschnitt][i][0], _root.itemset[_root.abschnitt][i][0]+i, i);
			_root.areale.areal0[_root.itemset[_root.abschnitt][i][0]+i]._x = _root.itemset[_root.abschnitt][i][1];
			_root.areale.areal0[_root.itemset[_root.abschnitt][i][0]+i]._y = _root.itemset[_root.abschnitt][i][2];
			}
		}
	
	}



//--------------------------------------------------



/*
Hier wird für den ersten Abschnitt die 
Variable "abschnitt" auf 0 gesetzt und 
die Funktino "itemsverteilen" aufgerufen, 
um alle vorhandenen Items dieses Abschnitts 
zu positioneren. 
*/

abschnitt = 0;
itemsverteilen();



//--------------------------------------------------


// ( an dieser Stelle steht noch eine Funktion, mit der sich die Spielfigur mit den Pfeiltasten bewegen lässt. )


//--------------------------------------------------


/*
Die folgende for-Schleife durchläuft 
das Array "itemset" und fragt ab, ob 
es eine Kollision mit einem der Items 
gibt. 
Ist dies der Fall, wird der jeweilige 
Itemname im Array "itemset" auf "kein" 
gesetzt, um zu signalisieren, dass es 
dieses Item nun niocht mehr gibt. 
*/

for (j=0; j<=_root.itemset[_root.abschnitt].length - 1; j++){
			if (_root.char.hitTest(_root.areale.areal0[_root.itemset[_root.abschnitt][i][0]+j])){
				_root.areale.areal0[_root.itemset[_root.abschnitt][i][0]+j].removeMovieClip();
				_root.itemset[_root.abschnitt][j][0] = "kein";
				}
			}

Hier zur Veranschulichung, wie das ganze so in etwa ausschaut:
http://freenet-homepage.de/nr_portfo...earb5_hmmm.swf



> Danke schonmal im Vorraus!

_
__________________
==>remix.nin.com<==
//
Life Is Too Short For Boring Music!
Fantasie ist die einzige Waffe gegen die Wirklichkeit.

Geändert von <sVkVmVit> (30-06-2007 um 12:43 Uhr)
<sVkVmVit> ist offline   Mit Zitat antworten
Alt 30-06-2007, 12:09   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Äh, der Code ist etwas "länglich", du könntest ihn schöner, kürzer, und schneller machen, indem du einfach einmal am Anfang _root.itemset[_root.abschnitt] in ner lokalen Variable zwischenspeicherst:
PHP-Code:
var items _root.itemset[_root.abschnitt];

// ab hier einfach items statt dem ganzen _root.itemset[_root.abschnitt] verwenden 
Vielleicht versteht man dann auch besser, was dein Code wie macht
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)

Geändert von Janoscharlipp (30-06-2007 um 12:10 Uhr)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 30-06-2007, 12:22   #3 (permalink)
Rock'n'Bass
 
Benutzerbild von <sVkVmVit>
 
Registriert seit: Feb 2006
Ort: Hamburg
Beiträge: 202
ok thx, habs jetzt nochmal ohne die Kommentare oben und mit items satt _root.itemset[_root.abschnitt] formuliert.

Ich hoffe das bringt mehr Übersicht für alle. (Erläuternde Kommentare zum Code findet ihr ja immer noch im Code des ersten Eintrags)

Der Fehler ist bestimmt ganz einfach, aber ich komm echt nicht drauf, wo der stecken könnte..

Code:
stop();



itemset = [[["testitem",160,240],["testitem",160,210],["testitem",160,180],["testitem",50,50],["testitem",50,80]]];



function itemsverteilen() {
	
	items = _root.itemset[_root.abschnitt]
	
	for (i=0; i<=items.length - 1; i++){
		if (items[i][0] != "kein"){
			_root.areale.areal0.attachMovie(items[i][0], items[i][0]+i, i);
			_root.areale.areal0[items[i][0]+i]._x = items[i][1];
			_root.areale.areal0[items[i][0]+i]._y = items[i][2];
			}
		}
	
	}



abschnitt = 0;
itemsverteilen();



// (an dieser Stelle steht noch eine Funktion für die Bewegung der Spielfigur)



for (j=0; j<=items.length - 1; j++){
			if (_root.char.hitTest(_root.areale.areal0[items[i][0]+j])){
				_root.areale.areal0[items[i][0]+j].removeMovieClip();
				items[j][0] = "kein";
				}
			}

Hier zur Veranschulichung, wie das ganze so in etwa ausschaut:
http://freenet-homepage.de/nr_portfo...earb5_hmmm.swf
__________________
==>remix.nin.com<==
//
Life Is Too Short For Boring Music!
Fantasie ist die einzige Waffe gegen die Wirklichkeit.

Geändert von <sVkVmVit> (30-06-2007 um 13:05 Uhr)
<sVkVmVit> ist offline   Mit Zitat antworten
Alt 02-07-2007, 13:03   #4 (permalink)
Rock'n'Bass
 
Benutzerbild von <sVkVmVit>
 
Registriert seit: Feb 2006
Ort: Hamburg
Beiträge: 202
Es muss doch jemanden geben, der diesen kleinen Fehler entdeckt, der sich in den Code eingeschlichen hat..
Ich wäre euch echt sehr dankbar.
__________________
==>remix.nin.com<==
//
Life Is Too Short For Boring Music!
Fantasie ist die einzige Waffe gegen die Wirklichkeit.

Geändert von <sVkVmVit> (02-07-2007 um 13:05 Uhr)
<sVkVmVit> ist offline   Mit Zitat antworten
Alt 02-07-2007, 13:42   #5 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Wie läuft das denn ab? Ganz am Anfang steht ein stop(); demnach, sollte der Code doch nur einmal am Anfang ausgeführt werden, und dann nie wieder? Oder fehlt da noch irgendwo was?
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 03-07-2007, 09:34   #6 (permalink)
Rock'n'Bass
 
Benutzerbild von <sVkVmVit>
 
Registriert seit: Feb 2006
Ort: Hamburg
Beiträge: 202
Danke dir für die kleine aber feine Hilfe Code-Verbesserungshilfe. Habe den Fehler nun selbst gefunden und beseitigt.
Zu deiner Frage mit stop(); : Sorry, hab ich vergeesen zu erwähnen. Die for-Schleife zur Kollisionsabfrage befindet sich natürlich innerhalb einer onEnterFrame-Funktion (, in derselben, in der auch die Spielfigur-Bewegung per Tastatur-Abfragen geregelt wird).

Und hier nun die richtige Version dieser for-Schleife (die Variable j wahr in diesem Fall vollkommen sinnlos, hab jetzt alle j zu i gemacht und es funktioniert!):

Code:
for (i=0; i<=items.length - 1; i++){
			if (_root.char.hitTest(_root.areale.areal0[items[i][0]+i])){
				_root.areale.areal0[items[i][0]+i].removeMovieClip();
				items[i][0] = "kein";
				}
			}
Und hier der Link zum Testgame, diesmal mit Items zum einsammeln :
Testgame
__________________
==>remix.nin.com<==
//
Life Is Too Short For Boring Music!
Fantasie ist die einzige Waffe gegen die Wirklichkeit.

Geändert von <sVkVmVit> (03-07-2007 um 09:44 Uhr)
<sVkVmVit> 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:18 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele