Panel + Window = Lebensbalken?! [GER]

Posted By: strudi1986

Panel + Window = Lebensbalken?! [GER] - 05/10/10 01:03

Hallo, bin neu hier und probiere seit einigen Tagen etwas mit der Gratis Version von Gamestudio herum.

Ich habe es schon geschafft, eigenständig ein halbwegs vernünftiges Playerscript zu schreiben, was auch einigermaßen nach meinen Vorstellungen funktioniert. Es ist zwar nicht das allerbeste, aber es tut das was es machen soll. wink

Derzeit beschäftige ich mich mit den Panels und Windows und was nicht alles dazu gehört. Aber ich schaffe es nicht, einen einfachen bzw normalen Lebensbalken, wie sie in den meisten Spielen auch anzutreffen sind, einzufügen.

Ich habe eine Panel definiert, mit einer 200px breiten Bitmap als Hintergrund. Darin werden 2 Balken dargestellt. Der obere Balken soll die Lebensanzeige werden.

Mein Gedankengang war folgender: Ich erstelle im Panel ein Window, dass ebenfalls 200px darstellen soll. Dieses Window bzw die Grafik soll auf der X-Achse verschoben werden. Dazu habe ich vor dem Panel noch eine Variable "player_health" mit dem Wert 100 definiert.

Da der Balken 200px breit ist, dachte ich mir, dass die Lebensanzeige die doppelte Breite, also 400px haben muss. 200px rot, 200px schwarz - schwarz soll nicht gesehen werden also habe ich das OVERLAY Flag auch gesetzt.

Wenn ich aber die Grafik dann in der Windows Definition einfüge, und das Level starte, dann stimmt die Position der Grafik mit dem festgesetzten Wert von 100 nicht überein.

Ich möchte nämlich, dass sich die Grafik bei Lebensverlust nach links verschiebt, sprich, dass die rechte Seite des Balkens dann durchsichtig (schwarz = OVERLAY) wird.

Hat vielleicht jemand einen Rat für mich? Auf was muss ich bei den Pixelangaben im Window und beim erstellen der Grafik dann achten? Irgendwie komme ich mit den Pixelangaben bzw mit den Größenverhltnissen nicht klar. Ich probiere nun schon ein paar Stunden, aber ich komme nicht zu dem Ergebnis, das ich gerne hätte. Durch das lite-c Tutorial wurde ich leider auch nicht schlauer.

Würde ich freuen, wenn mir jemand helfen kann!

Danke,

lg
strudi
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 01:23

Hallo Strudi,

willkommen im Gamestudio Forum. Deine Überlegungen sind doch alle gut und richtig. Wenn Du die Variable auf 100 setzt, dann sollte die Position deines Schwarz/Rot Balkens genau in der Mitte sein. Bei 200 sollte er komplett schwarz sein und bei 0 sollte alles rot sein. Die Variable, die Du in der Window-Definition angibst, definiert quasi die Pixelposition, bei der zu zeichnen angefangen wird. Sprich: wenn Deine Variable 100 ist, dann werden ab dem 100. Pixel alle folgenden 200 Pixel (also bis 300) auch auf den Bildschirm gemalt.

Wenn Du von Gesundheit (0-100) auf die Pixelposition schliessen willst, dann kannst Du das wie folgt umrechnen:

Position = 200 - (Gesundheit * 2);

Wenns noch nicht klappt, dann nicht verzweifeln. Poste doch einfach mal den Code, den Du geschrieben hast.
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 01:48

Hi,

ich bedanke mich recht herzlich. Jetzt versteh ich wie es funktioniert und es funktioniert auch! wink

Es war anscheinend die ganze Zeit richtig, nur die Werte haben mich irritiert. Ich bin nämlich die ganze Zeit davon ausgegangen, dass die Variable die ich fälschlicherweise als "player_health" definiert habe, auch das Leben der Spielfigur wiederspiegeln. Deshalb bin ich nicht auf einen Nenner mit der Balkenanzeige gekommen. Vielen Dank nochmals dafür.

Die Umrechnung für die Leben, gehört dann aber ins Playerscript oder?

Schreibe nämlich das Playerscript und die Paneldefinitionen in seperate Dateien.

Danke nochmals,

lg
strudi
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 13:14

Hallo Strudi,

das ist Geschmacksache. Ich würde eher argumentieren, dass die Umrechnung in die Datei mit der Panel Definition gehört, denn es geht hier ja um die Visualisierung eines Wertes. Spielt ja aber unterm Strich keine Rolle.

Gruß,
Uhrwerk
Posted By: Tempelbauer

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 13:26

wo wir grad beim thema code-dateien sind:
gibts das limit von max. 40 dateien noch? oder wurde das mit A7 abgeschafft?
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 13:26

Hi!

Habe versucht die Umrechnung einzubauen, aber es funktioniert nicht. Der Balken verschiebt sich nicht, wenn die Variable mit den Lebenspunkten geändert wird.

Hier mal der Code wie ich es gemacht habe:

Code:
var player_health; //erhält den Wert im Playerscript, definierter Skill
var player_mana; //erhält den Wert im Playerscript, definierter Skill
var health_pos = 200 - (player_health*2);
var mana_pos = 200 - (player_mana*2);

PANEL* char_balken_pan =
{
	bmap = "charbalken.pcx";
	pos_x = 0;
	pos_y = 0;
	window = 111, 31, 200, 20, "playerhealth.pcx", health_pos, 0);
	window = 111, 54, 200, 20, "playermana.pcx", mana_pos, 0);
	digits(200, 37, 3, *, 1, player_health);
	digits(200, 60, 3, *, 1, player_mana);
	flags = SHOW | OVERLAY;
}



Die Wertübergabe vom Skill aus dem Playerscript an die Variable "player_health" bzw "player_mana" funktioniert einwandfrei. Jedoch verschiebt sich der Balken "health_pos" nicht wenn sich der Wert verändert.

Vielen Dank für die Hilfe!

lg
strudi
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 13:29

Du musst den Wert für healthpos natürlich jedes Frame neu berechnen. Zum Beispiel:
Code:
var player_health; //erhält den Wert im Playerscript, definierter Skill
var player_mana; //erhält den Wert im Playerscript, definierter Skill
var health_pos = 200 - (player_health*2);
var mana_pos = 200 - (player_mana*2);

PANEL* char_balken_pan =
{
	bmap = "charbalken.pcx";
	pos_x = 0;
	pos_y = 0;
	window = 111, 31, 200, 20, "playerhealth.pcx", health_pos, 0);
	window = 111, 54, 200, 20, "playermana.pcx", mana_pos, 0);
	digits(200, 37, 3, *, 1, player_health);
	digits(200, 60, 3, *, 1, player_mana);
	flags = SHOW | OVERLAY;
}

void char_balken_startup()
{
	while(1)
	{
		health_pos = 200 - (player_health*2);
		wait(1);
	}
}


Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 13:37

Super, funktioniert. Teilweise komm ich einfach nicht auf die Lösung des Problems, obwohl es doch so einfach wär. wink

Vielen Dank für die Hilfe.

lg strudi
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 17:12

Eine letzte Frage habe ich noch.

Wenn meine Lebenspunkte steigen, sei es in Form von einem LevelUp oder per neuer Ausrüstung, dann funktioniert diese Umrechnung für den Lebensbalken nicht mehr. Gibt es dafür eine einheitliche Lösung? Oder ist das etwas komplizierter?

Ich dachte mir, dass die Variable "player_health" die den Wert 100 bekommt, zustätzlich irgendwie in einer anderen Variable gespeichert werden muss und dort irgendwie in 100% umgewandelt werden muss. Und Wenn die Variable "player_health" zB den Wert 200 erhält, diese wiederum auch 100% ergeben. Liege ich mit dieser Annahme richtig, oder bin ich total auf dem Holzweg? wink

lg strudi
Posted By: Rei_Ayanami

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 17:44

Nutze für die Berechnung der Panel Position keine Startup function.

Diese erhöhen die Startup-Zeit und sind nur für Funktionen gedacht die im ersten Frame laufen müssen.

Streiche das _startup und starte die function vom player script aus wink
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 17:46

Fast. Ich würde einfach eine Variable max_healt anlegen, in der Du die maximal mögliche Lebensenergie speicherst. Dann ändert sich die Berechnung wie folgt:

health_pos = 200 - (player_health / max_health * 200);

EDIT:
@rei: Was soll das bringen? Die Anzahl an Funktionen, die der Scheduler handlen muss ist genau die gleiche?
Posted By: Widi

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 18:06

Jawohl, ob eine Funktion mit _startup oder von der main aufgerufen wird, spielt keine Rolle.
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 18:23

Vielen Dank, jedoch erziele ich nicht das gewünschte Ergebnis.

Der Balken sollte beim erreichen eines neuen Maximalwertes ebenfalls komplett rot sein. Und bei Lebensverlust, sollte er in den gleichen Schritten nach links rutschen.

Also bei Spielstart = Leben 100 --> Balken ist Rot
Bei Verlust von 10 Leben = Leben 90 --> Balken ist zu 90% Rot
LevelUp = 200 Leben (neue MaxWert) --> Balken ist wieder komplett Rot (100%)
Bei Verlust von 20 Leben = 180 Leben --> Balen ist zu 90% Rot

Aber ich bedanke mich recht herzlich für den Lösungsvorschlag, ich werde wieder mal eine Weile selbst versuchen, eine Lösung zu finden. Sonst lernt man ja nix! wink

Danke

lg
strudi
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 18:41

Wenn Du nicht das gewünschte Ergebnis bekommst, dann poste doch bitte nochmal deinen Code. Ich meine die Grundidee sollte richtig sein...
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 19:04

Ach Sorry, ich habe mich vertan. Es stimmt schon so wie du es oben gepostet hast. Sry mein Fehler.

Ich muss nur jetzt schauen, wie ich das am besten mache, damit ich den aktuellen max Wert von "player_health" an "max_health" übergebe.

Ich glaube ich habe irgendwo gerade einen Denkfehler drinnen.

Kann es sein das ich eine weitere Variable brauche? Denn mit folgenden Code bekomme ich nur die Prozentuale Lebensanzeige angezeigt:

Codeauszug aus Playerscript:

Code:
action my_player()
{
	camera_follow(me);
	
	my_player_move();
	
	player_one = me;
	
	my.PLAYER_HEALTH = 100;
	my.PLAYER_MANA = 100;
	player_health = my.PLAYER_HEALTH;
	player_mana = my.PLAYER_MANA;
	
	wait(1);
}





Code von gui.c
Code:
var max_health = 1000;
var player_health;
var health_pos = 200 - (player_health / max_health * 200);


PANEL* char_balken_pan =
{
	bmap = "charbalken.pcx";
	pos_x = 0;
	pos_y = 0;
	window = 111, 31, 200, 20, "playerhealth.pcx", health_pos, 0);
	digits(200, 37, 3, *, 1, player_health);
	flags = SHOW | OVERLAY;
}

void char_balken_startup()
{
	while(1)
	{
		health_pos = 200 - (player_health / max_health * 200);
	}
}



Wenn ich das Spiel starte, werden die 100 Leben angezeigt, also nur 10% des Balkens sind rot gefüllt.

Ich glaube dass ich eine weitere Variable brauche, wo "player_health" der aktuelle MaxWert ist und dieser Wert wird dann an "max_health" übergeben, oder? wink

Vielen Dank
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 19:53

Nein, dein Denkfehler ist woanders. Er steckt in der action my_player, und zwar in der vorletzten und vorvorletzten Zeile. Da muss noch was zusätzlich hin. Schau Dir im Vergleich mal char_balken_startup an. ;-)

P.S. Die zehn Prozent sind doch genau richtig. 100 von 1000 sind 10%...
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 20:12

Hm ja, die 10% sind korrekt, aber wir reden einander vorbei. wink
Ich schaffe es gerade nicht mein Problem richtig zu schildern hehe.

Ich möchte, dass die Variable "max_health" keinen fixen Wert hat. "max_health" sollte jeweils den aktuellen MaxWert von "player_health" haben.

zB:

player_health = 100 Leben (100%, Balken ist komplett rot)

Dann habe ich zB ein Level Up oder ich erhalte ein Item dass die Lebenspunkte sagen wir um 100 Punkte erhöht.

Demzufolge wäre dann "player_health" = 200 (=100%, Balken ist wieder komplett rot). Dann müsste der neue MaxWert an "max_health" übergeben werden.

Ich möchte damit erreichen, dass die Anzeige des Lebensbalken mit einem LevelUp etc. noch immer funktioniert, obwohl sich meine Lebenspunkte erhöht haben.

Ich hoffe jetzt ist es ein bisschen deutlicher, is irgendwie schwierig zu erklären wink

lg
Posted By: Uhrwerk

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 21:03

Genau davon rede ich auch. Wir sind uns glaube ich nur uneinig über die Benutzung der max_health Variablen.

Ich meinte das so: Der Anfangswert von max_health ist z.B. 100. Jetzt läuft Dein Spieler durch die Gegend, tötet ein paar Prinzessinen, findet das Benzin für die Kettensäge, rettet das Monster, oder was immer er auch tun muss um ein Level aufzusteigen. In diesem Moment setzt Du einfach max_health auf z.B. 110. Fertig. Wenn der Spieler durch den Level-Aufstieg auch noch gleich volle Gesundheit bekommen soll, dann setzt Du anschließend noch my.player_health (oder wie das bei Dir heisst) auf max_health. Dann zeigt der Balken immer die prozentuale Gesundheit des Spielers an. Richtig gedacht?
Posted By: strudi1986

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 21:10

Hm, ja genau!

Stimmt, mir war nicht ganz klar, wie ich die max_health Variable verwenden soll. Aber stimmt, ich habe das jetzt getestet und es funktioniert! wink Vielen Dank nochmals!

Tut mir leid, wegen den vielen Fragen und ungereimtheiten. ^^

lg strudi
Posted By: Widi

Re: Panel + Window = Lebensbalken?! [GER] - 05/10/10 21:19

Die Formel von Uhrwerk stimmt schon:

health_pos = 200 - (player_health / max_health * 200);

player_healt ist das momentane Leben deines Players.
max_healt ist das maximale Leben deines Players.

zum Beispiel:
player_healt = 90;
max_health = 100;
health_pos = 200 - (90 / 100 * 200); // = 20

player_healt = 40;
max_health = 100;
health_pos = 200 - (40 / 100 * 200); // = 120

player_healt = 90;
max_health = 200;
health_pos = 200 - (90 / 200 * 200); // = 110

player_healt = 180;
max_health = 200;
health_pos = 200 - (180 / 200 * 200); // = 20

Das ist einfache Mathematik. Solltest du schon beherrschen. Wird auch nicht einfacher bei Vectorberechnungen die du bei 3d brauchst

EDIT: Uups, ihr wart schneller...



© 2024 lite-C Forums