Hier ersteinmal der Code:
int ep = 0;
int epforlvlup = 15;
int epget = 3;
this.ep = ep + epget;
richTextBox1.AppendText("Der Gegner wurde besiegt!\r\n\n");
label3.Text = "Gegner Leben: 0/100";
label4.Text = "Erfahrungspunkte:" + ep + "/" + epforlvlup + "\r\n\n";
this.progressBar1.Maximum = epforlvlup;
this.progressBar1.Value = ep;
if (ep >= epforlvlup || ep>epforlvlup)
{
stufe++;
//epforlvlup++;
this.epforlvlup = epforlvlup * 25 / 100 + epforlvlup;
this.ep = 0;
richTextBox1.AppendText("Herzlichen Glückwunsch, ihr seid eine Stufe aufgestiegen!\r\n\n");
this.progressBar1.Maximum = epforlvlup;
this.progressBar1.Value = 0;
}
Mein Problem ist nun folgendes:
Ich habe diesen Code in einen Button geschrieben, wenn ich drauf drücke, werden EP berechnet und dann in der Progressbar angezeigt. Wenn ep ≥ epforlvlup ist, dann wir einem Laben die Stufe erhöht. Funktioniert ganz gut, aber ab Stufe 3 gibt es ein Problem. Von Stufe 3 bis Stufe 4 werden 22 EP benötigt, das geht bis 21/22 EP gut, dann kommt mein Problem.
Wenn jetzt die nächsten EP gut geschrieben werden, steht der Zähler quasi auf 24/22 und in diesem Moment schmiert die Progressbar ab, weil progressBar1.Value = ep.
Fehlermeldung:
Der Fehler lautet: ArgumentOutOfRangeExeption wurde niciht behandelt. Der Wert 24 ist für Value ungültig. Value sollte zwischen 'minimum' und 'maximum' liegen.
Parametername: Value
Ich habe schon vieles versucht. Was ich aber eigentlich will ist, dass die Progressbar sich einfach auf = setzt und die überschüssigen EP anschließend in der "neuen" progessbar nach dem Levlup anzeigt.
Es soll also einfach weiterlaufen und die überschüssigen EP dann anzeigen.
Ich hoffe, dass ihr versteht was ich meine.^^
Mfg, Gorgomir.
Hallo Gorgomir,
also das Problem ist einfach dass du der Progressbar einen zu großen Wert mitgibst.
D.h. du gibst 24 mit wobei das Maximum 22 ist.
Zeig einfach in der Progressbar die 22 an und den Rest zeigst du in deiner zweiten Progressbar an.
Kurz gesagt musst du einfach abfragen ob dein EP größer als das Maximum der Progressbar ist. Wenn es das ist, dann zeigst du das Maximum in der Progressbar an. Ziehst das Maximum vom EP Wert ab und zeigst den Rest in der zweiten Progressbar an
Grüße
Michael
Hi, deine Lösung ist logisch, aber leider nicht die die ich suche.
Ich möchte, dass die Progressbar, dass was zuviel ist erst speichert, dann ein lvl durch führt und sich leert und den Überhscuss anschließend anzeigt, alles in der selben progressbar.
Kurz gesagt: die progressbar soll sich wie die EP Leiste in WOW verhalten.
Mfg, Gorgomir.
EDIT: Habe noch ein Bild von dem Ganzen angehängt.
Die Standard-Progressbar von Windows Forms kann keine Überlappung und keiner Überfüllung. Das alles hättest Du aber auch einfach der Fehlermeldung entnehmen können und in der Dokumentation nachlesen.
Du kannst nicht erwarten, dass Dein Wille und Wunsch und Erwartung überall umgesetzt ist. Das musst Du in diesem Fall einfach selbst umsetzen.
Entweder Du schreibst Dir ein eigenes Control oder suchst Dir irgendwelche Bibliotheken, die das können.
Andere Möglichkeit:
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Problem gelöst und zwar habe ich folgendes gemacht: this.progressBar1.Value = ep&epforlvlup; statt this.progressBar1.Value = ep;
Jetzt machts was ich will.^^
Mfg, Gorgomir.
Hallo Gorgomir,
progressBar1.Value = ep&epforlvlup;
ist Unsinn. Das ist eine Bitweise verUNDung. Das mag bei bestimmten Zahlen dazu führen, dass höchstens Maximum gesetzt wird, bei anderen Zahlen kann völliger Unsinn herauskommen.
Mit progressBar1.Value = Math.Min (ep, epforlvlup);
wird ein Schuh daraus.
Wenn der ProgressBar nach einem kurzen Moment auf den Wert nach dem LevelUp springen soll, verwende einen System.Windows.Forms.Timer. Thread.Sleep oder ähnliches scheidet aus, wie du in [FAQ] Warum blockiert mein GUI? nachlesen kannst.
Insgesamt fällt deine Frage aber unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1. Die grundsätzliche Benutzung von Controls setzen wir als bekannt voraus.
herbivore