Zerstörungszeit > umrechnungen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zerstörungszeit > umrechnungen

    Hallo Leute! Habe wiedermal ein klitzekleines Problem einer Umrechnung dass ich einfach nicht auf die Reihe bekomme.

    Ich habe mir ja auch einen Script geschreiben mit dem Ich z.b: das abbauen von Materialien mit verschiedenen Items in unterschiedlichen Zeiten bewältigen kann.
    Damit es für mich bei der Balance am einfachsten wird habe ich einfach die Methode der STEP-Zähung genutzt.
    Gutes Beispiel:
    Eine Holzschaufel braucht zum aubbauen von erde z.B: 50 Steps. Eine Steinschaufel hingegen 35.

    Jedes Step wird eine Variable hochgezählt. Wenn sie diesen "grenzwert" erreicht, ist das Abbauen vollbracht.

    Alles funktioniert soweit so gut, jedoch wenn ich WÄHREND des Abbauens das Item wächsel, haut es mein komplettes System auf.
    Ihr kennt das ja alle bei Minecraft: Ihr baut Stein mit der Hand ab. Wechselt ihr nun auf eine Spitzhacke, läuft alles viel schneller. Dabei übernimmt der Geschnwindichkeits-Boost den "Abbaustatus" des Blocks und verschnellert ihn, sodass die Letzten Abbausekunden verkürzt werden.
    Beim wechseln von der Spittzhacke in die Hand hingegen,verlangsamt sich der Abbau wodurch die Abbaudauer bis zum ende hin verlängert wird.

    Mein Problem: Wie Rechne ich das um?

    Nehmen wir z.B: Stein:
    Stein zum Abbauen mit Spitzhacke: 60 Steps.
    Wir haben mit der Spitzhacke schon 20 Steps abgebaut.

    (100/60) * 20 = 1,6 *20 = 33. > Wir haben den Block zu 33% abgebaut.
    Nun wechseln wir ja zur Hand. ein Steinblock dauert zum Abbauen (mit der Hand) 90 Steps.


    Wie soll ich da genau vorgehen um mein Ziel zu erreichen?

    Das Problem ist für mich (mathematisch gesehen) recht komplex. Ich habe den halben Tag darüber nachgedacht (mit allenmöglichen Rechnungen) und bin zu keinem festen Punkt gekommen wie ich das (wie in Minecraft) lösen könnte.
    Mittlerweile habe ich schon Kopfschmerzen davon. -.-

    Wäre über jede Hilfe dankbar.


    sry falls das Problem zu unverständlich ist. Ich bin mittlerweile sellber dermaßen fertig, dass ich keine Ahnung habe wie ich das Problem selber beschreiben/definieren soll...
  • ich versteh nicht ganz, wie du es machst, aber ich würde den blöcken je eine abbauzeit geben (z.B. Erde=50, Stein=100);
    und bei verschiedenen Werkzeugen pro Step verschiedene werte abziehen (z.B. Hand 1 pro Step, Spitzhacke 4 pro Step, kann natürlich je nach block variabel sein) und wenn dann der Wert des Blockes 0 erreicht hat wird er zerstört.

    im Beispiel:
    Erde - Hand = 50 Steps Stein - Hand = 100 Steps
    Erde - Hacke = 13 Steps Stein - Hacke = 25 Steps

    Wenn du es schon so machst versteh ich dein Problem nicht, und wenn nicht, versteh ich nicht, warum nicht :D.


    Edit: Ahh, ich habe verstanden. Du speicherst für jede Block - Werkzeug Kombination eine Abbauzeit. Ich würde wie oben beschrieben für jeden Block eine festen Abbauwert speichern und den Werkzeugen dann verschiedene abbaugeschwindigkeiten geben. dann musst du auch nichts umrechnen.
  • Jeder Block hat eine egiene Abbauzeit in 'Steps und jedes Item hat auch einen eigenen Wert der die Abbaugeschwindichkeit beeinträchtigt.
    Dies funktioniert aber so, dass die Items die DAUER des Abbaus beeinträchtig.
    (z.b: wir die Abbauzeit um 1/3 verkürzt.)

    Während des Abbaus wird immer +1 gerechnet bis der Wert erreicht wurde. Das einzige was immer Variabel istder Wert, den die +1 Rechnung jedes Steps, erreichen muss.

    Das Funktioniert ja alles Prima. Das einzige Problem ist nur das, wenn das Item WÄHEND des Abbaus geändert wird.
    Dann ändert sich während des Abbaus ja die "Abbauzeit".

    Und genau DAS ist das Problem. Stell dir vor Erde kann man mit ieiner Diamantschaufel in nur 20 Steps abbauen. Mit der Hand in z.B: 50 Steps.

    Nun bauen wir mit der Hand 25 Steps ab. > Wir haben den Abbau der Erde zu 50% abgeschlossen.
    Jetzt wechseln wir plötzlich zur Diamantschaufel > Die benötigt nur 20 Steps.

    Was passiert? Da wir schon 25 Steps abgebaut haben, glaubt nun das Spiel, dass wir den Abbau abgeschlossen haben. (da nun nur 20 steps benötigt werden.)
    Dies stimmt aber nicht! > Der Abbau muss ja weiter ablaufen. Blos nur mit einem höheren Tempo.

    Versteht ihr das Problem?
  • Wenn Du es so machen willst wäre die Lösung eigentlich

    GML-Quellcode

    1. Abbaufortschritt=Altedauer/Fortschritt*Neuedauer


    wobei die Altedauer der Grenzwert ist, bei dem das letzte Item fertig wäre und Neuedauer der Grenzwert des aktuellen Items.

    Wenn Du für jede Block - Item Kombination einen eigenen Wert speicherst (was logisch wäre, da man mit einer Schaufel schneller Erde, aber langsamer Stein als mit einer Spitzhacke abbauen kann), würde ich es so wie in meinem letzten Post beschrieben machen:

    Jeder Block hat einen festen Grenzwert gespeichert, wenn der überschritten wird, wird der Block zerstört. (Das Skript sollte aber in das Playerobjekt, damit das nicht jeder Block separat überprüfen muss).
    Und dann haben die Werkzeuge je nach Block verschiedene Abbaugeschwindigkeiten:

    GML-Quellcode

    1. if(Item==Schaufel) {
    2. switch(Block) {
    3. case Erde: Abbau+=5; break;
    4. case Stein: Abbau+=1; break;
    5. case ...:
    6. }
    7. }


    Ok, mir ist (während ich das geschrieben habe) aufgefallen, dass man so ein bisschen mehr angeben muss. Aber dafür spart man sich das Umrechnen und ich glaube das es nicht so einfach ist, die Abbaudauer des letzen Items zu überprüfen (was aber ganz von deinem bisherigen Code abhängt).

    Ich denke, wenn du dir ein Skript wie Abbau(Item,Block) schreibst ist die zweite Variante deutlich übersichtlicher.
  • @ Henrik1235:
    Das ist durchaus wahr, aber bei einem Spiel sollte man eher darauf achten was für den Spieler angenehmer ist als auf die "Realität" zurückzugreifen.
    Obwohl das auch kein so übler gedanke ist... wenn ich das Problem nicht lösen kann, muss ich abwägen was wichtiger ist. Dieses "schmankerl" nun doch über umwege einzubauen (und mir das Leben schwer zu machen.)
    oder ich belasse das leichte Balancing, dafür aber wird nach dem Wechsel des Items der Fortschritt zurückgesetzt.

    @ Chaus Creator:

    Abbaufortschritt=Altedauer/Fortschritt*Neuedauer

    Stimmt nicht ganz:
    z.B: Altedauer = 60, Fortschritt = 20, NeueDauer = 50;
    60/20 = 3, 3*50 = 150.

    Jeder Block hat einen festen Grenzwert gespeichert, wenn der überschritten wird, wird der Block zerstört. (Das Skript sollte aber in das Playerobjekt, damit das nicht jeder Block separat überprüfen muss).
    Und dann haben die Werkzeuge je nach Block verschiedene Abbaugeschwindigkeiten:

    GML-Quellcode

    1. if(Item==Schaufel) {
    2. switch(Block) {
    3. case Erde: Abbau+=5; break;
    4. case Stein: Abbau+=1; break;
    5. case ...:
    6. }
    7. }


    Das mit der Überprüfung von der alten und neuen Dauer ist für mic hgarkein Problem. Ebenso die Überprüfung der Blöcke wurde so desingt dass es keine robleme macht. (Ich könnte den Skript in jedes x-beliebige Objekt packen und es würde trotzdem funktionieren.) Mach dir da um die Blockabfrage oder existenz der Werte keine Sorge. Mir geht es rein um das "Anpassen" des Abbaufortschritts an die neue Abbauzeit.
    (Dem Script wird kein Objekt, sondern eine Block-ID Übergeben die vorher ganz einfach ausgelesen wurde...)

    Falls du die Minecraft BETA zocken kannst, probiere es selbst aus. Baue mit einem Item einen Block ab und wächsel währenddessen auf ein anderes Item.

    Das was du mir da Vorschlägst ist meiner Ansicht nach nicht schlecht, ABER:
    Ich wollte NUR die eigentliche Abbauzeit veränderbar halten. NICHT die Abbaugeschwindichkeit.
    Wieso? Ganz einfach: Aus balancing gründen. Wenn ich nur eine Variable ändern (und das ist die Zeit) sehe ich immer auf einem Blick wie lange ein Block mit dem entsprechenden Item zum Abbauen braucht.
    Dies macht es für mich umso leichter schnell Werte zu ändern und sie an andere Blöcke anzupassen.

    (beim wechsel vo neine Holz spitzhacke auf eine Steinerne, spiel ich einfach mit der Halbierung der Werte:
    z.B: Holzspitzhacke abbaudauer = 50; Steinspitzhacke abbaudauer = Holzspizhacke Abbaudauer/1.5 ,etc...)

    Wenn ich hingegen die Abbaugeschwindichkeit noch änderbar halte, muss ich mir zu jedem Block immer ausrechnen wie lange die Abbaugeschwindichkeit wirklich dauert.

    Oder funktioniert das was ich vorhabe aus Mathematischen gründen nicht?
    Wenn ich zB: die Abbauzeit immer gleich halten würde, aber die Abbaugeschwindichkeit variabel halten würde (Prozentuelles abbauen wie Hellfish es gesagt hat) würde mein Problem sich eigentlich in Luft auflösen.
    Jedoch wäre das Balancing hier umständlicher da ich jedesmal Berechnen müsste wie lange der Abbau nun wirklich dauert. X(

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von LEWA ()

  • Hab zwar nicht ganz genau verstanden was Du willst, aber vielleicht hilft Dir das ja weiter:

    AlteDauer : NeueDauer = AlterFortschritt : NeuerFortschritt

    daraus folgt (Innenglied mal Innenglied durch fehlendes Außenglied):

    NeuerFortschritt = (NeuDauer * AlterFortschritt) / AlteDauer
    NeuerFortschritt = (50 * 20) / 60
    NeuerFortschritt = 16,6

    Ich würd es ähnlich machen wie Chaos Creator und die Dauer mehr als Energie sehen:
    Die Abbaudauer des Blocks in eine Variable übernehmen und dann einfach, je nach Werkzeug mehr oder weniger abziehn, bis der Block schließlich fertig ist. Wenn Dir die Zeit wichtig ist, kannst Du ja den room_speed mit einbeziehen. Wenn Du z.B. den Standart-room_speed auf 60 gestellt hast einfach die Abbaudauer mit room_speed/60 multiplizieren.

    Bsp.:
    room_speed = 60
    Abbaudauer = 60 * (60 / 60) = 60 * 1 = 60 ...sieht momentan blöde aus, ich weiß :P

    room_speed = 120
    Abbaudauer = 60 * (120 / 60) = 60 * 2 = 120
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick
  • Jup, ich habs mittlerweile schon.^^

    Jedoch komme ich nach und nach ins grübeln ob dieser "Übergang" doch nicht kleinere Probleme mit sich ziehen wird... (Hat mit anderen Funktionen des Spiels zu tun.)
    Aber danke Leute! Meine Fragen wurden somit beantwortet.

    Ich könnte euch alle ganz doll drücken. XD

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()