Thema geschafft danke || 2D Game einmalig unsterblich bei berührung



  • Hey leute ich schreib immernoch an meinem 2D game und habe jetzt eingebaut das wenn der spieler einen bestimmten block berührt er einmal die berührung eines monsters überlebt.
    Jetzt aber das problem: das programm testet natürlich auch wirklich nur die erste Berührung da aber beim durchlaufen durch so ein Monster so ca 100 berührungen anfallen ist das ziemlich nutzlos^^

    hat jemand ne idee wie man das anders Lösen kann sprich nicht eine bestimmte anzahl berührung bei unverwundbarkeit einstellen es soll halt nur erreicht werden das man lebend durch 1 monster durchkommt.

    mfg friedrich



  • Bau einen Timer ein. Viele Spiele lösen es so, das man eine gewisse Zeit unsterblich ist. Je nach Sinn der Unsterblichkeit könntest du diesen Wert auf einige Sekunden bis Minuten, etc. setzen.



  • und welche funktion bietet sich zum timer setzen da so an?
    ich find hier aktuell nur welche die entweder komplett den cpu auslasten oder welche wie sowas

    bool onestep(int frequenzy)
    {
        EscapeCommFunction(COM1.hcom_port, SETBREAK);
        Sleep(1000/frequenzy/2);
        EscapeCommFunction(COM1.hcom_port, CLRBREAK);
        Sleep(1000/frequenzy/2);
    
        return true;
    }
    

    und das programm soll ja nicht schlafen der spieler soll ja noch laufen können



  • Ich weiß nicht, wie dein Programm aufgebaut ist, aber meines Wissens nach macht man das normalerweise so, dass man abwechselnd alle Game-Objekte updatet und dann das Fenster neu zeichnet.

    Du gibst dem Spieler einfach einen Member, der jeden Frame, also bei jedem Aufruf der "update"-Methode um 1 verringert wird.



  • Das Programm braucht dafür auch nicht anhalten. Letztendlich brauchst du nur die Anfangszeit zu speichern und dann an geeigneter Stelle (z.B. wenn eine Kollision eintritt) einfach nur überprüfen, ob die Differenz aus Endzeit und Anfangszeit okay ist.

    Wie du an die Zeit kommst hängt von verschiedenen Dingen ab, wie z.B. Betriebssystem und/oder verwendetes Grafikbibliothek.

    Unter Windows wäre z.B. die Windows-Funktion GetTickCount ein Anfang.



  • Wurstinator schrieb:

    Ich weiß nicht, wie dein Programm aufgebaut ist, aber meines Wissens nach macht man das normalerweise so, dass man abwechselnd alle Game-Objekte updatet und dann das Fenster neu zeichnet.

    Du gibst dem Spieler einfach einen Member, der jeden Frame, also bei jedem Aufruf der "update"-Methode um 1 verringert wird.

    Das funktioniert nur zuverlässig, wenn es eine Frame-Begrenzung gibt. Denn ein schneller Computer wird Update häufiger aufrufen können, als ein langsamer Computer.



  • @friedrich:
    Wenn der Spieler das Goodie bekommt, setzt du einfach ein Flag dass er es hat.

    Wenn der Spieler kollidiert, und das Flag gesetzt ist, löscht du das Flag, und startest einen "unverwundbar" Timer.

    Timer starten bedeutet in dem Fall, dass du dir die aktuelle "Game-Time" holst.
    Und "Game-Time" bedeutet dabei die Zeit die das Spiel gelaufen ist. Wobei "gelaufen" z.B. üblicherweise Zeitspannen nicht mit einschliesst, wo das Spiel auf "Pause" geschaltet war, oder ein Optionsdialog angezeigt wurde.

    Wenn der Spieler kollidiert, und das Flag nicht gesetzt ist, dann rechnest du dir aus, wieviel Zeit seit starten des "unverwundbar" Timers vergangen ist. D.h. du guckst in der Variable nach wo die Game-Time drinsteht, zu der der "unverwundbar" Timer gestartet wurde. Dann rechnest du die Differenz zur aktuellen Game-Time aus, und guckst, ob die vergangene Zeit kleiner als die "unverwundbar" Zeit ist.

    Wenn ja ignorierst du die Kollision, wenn nein muss der Spieler sterben.

    Das wäre eine Möglichkeit. Dabei stirbt der Spieler dann trotzdem, wenn er zu lange mit dem selben Monster kollidiert. Und er stirbt nicht, wenn er kurz hintereinander mit zwei verschiedenen Monstern kollidiert.

    Wäre also etwas anders als du willst, aber IMO sogar die bessere Lösung.

    ----

    Eine andere wäre, dass du jedem Monster/Gegner/Mob/... eine ID verpasst, und dir bei der ersten Kollision die Monster-ID merkst. Bei folgenden Kollisionen checkst du dann ob die Monster-ID gleich der ist die du dir gemerkt hast, und ignorierst die Kollision entsprechend (oder eben nicht).
    Wenn mal in einem Frame keine Kollision stattfindet, dann löscht du die gespeicherte Monster-ID.

    Somit gäbe es kein Timeout, und das "unverwundbar" würde auch wirklich nur für ein Monster gelten.

    Allerdings könnte es sein, dass der Spieler manchmal doch stirbt. Angenommen du verwendest eine recht "genaue" Kollisionserkennung, die die Form der Monster und des Spielers berücksichtigt. Dann könnte es sein, dass, während sich die Kollision "auflöst", in einem Frame keine Kollision erkannt wird, im nächsten aber doch wieder. In dem Fall würde der Spieler dann trotzdem sterben, was IMO auch nicht gut wäre.

    Natürlich könnte man hier wieder einen Timer verwenden, also die gespeicherte Monster-ID nicht sofort löschen, sondern erst wenn 2-3 Frames lang keine Kollision mehr mit dem Monster erkannt wurde.

    Wenn du für die Kollisionserkennung nur Kreise/Rechtecke verwendest, dann sollte das kein Problem sein. Es sei denn das Monster und/oder der Spieler können sehr schnell die Richtung wechseln.



  • @ jhkjhk: Diese Begrenzung sollte man meiner Meinung nach immer machen.
    Arbeitet man mit der reellen Zeit, kommt es zu Problemen, wenn man das Spiel pausiert.



  • friedrich schrieb:

    2D Game einmalig unsterblich bei berührung

    Wo kann ich das Game berühren und unsterblich zu werden?



  • Zeit klingt gut, du könntest aber auch für wirklich eine Berührung einstellen, dass eine durchgängige Berührung nicht schadet.

    D.h. bei der ersten Berührung mit der Unsterblichkeit fängst Du an zu blinken und alle weiteren Berührungen, die ohne Unterbrechung kommen, werden ebenfalls ignoriert.

    Nachteil ist, dass du nach kurzem Berühren des Monsters, Verlassen der Verbindung und erneutem Berühren natürlich direkt wieder anfällig bist. Man könnte für die Lücke eine Toleranz einbauen, aber wenn du das Monster jetzt verfolgst, bist Du gegen dieses ewig unsterblich.

    Summa summarum: Eine zeitliche Unsterblichkeit ist vermutlich cooler. Hol Dir den Stern! 🙂



  • Hey leute bin jetzt erst wieder nachhause gekommen ersteinmal Vieeelen dank für soviele vorallem so ausführliche antworten^^

    insgesamt werde ich jetzt die idee von hustbaer weiterverfolgen daher nochmal ein extra danke an dich^^

    mfg friedrich


Anmelden zum Antworten