Logik Problem

  • Hi Jungens,

    wer schonmal nen Shooter programmiert hat, sollte auch schon vor dem Problem gestanden haben.

    Ich habe nen Gewehr, das mit einer bestimmten Schussrate schießt, wenn ich die Feuerntaste gedrückt halte.

    Der Spieler soll aber nicht durch ständiges klicken der Feuerntaste, diese Schussrate überlisten können.

    Wie setze ich das um?

    Ich hab ne Lösung gefunden, aber ist nicht wirklich befriedigend. Ich hab nen Zeitfenster(Timer) eingebaut, das die SchussFunktion bei Taste Loslassen deaktiviert für eine kurze Zeit. Aber dann durch ständiges Drücken feuert der Char garnicht mehr, weil er immer wieder dieses Zeitfenster aufruft. Ich hätte aber dann gerne, dass dann die beabsichtigte Schussrate auch funtkioniert.

  • Du könntest zum Beispiel noch eine boolsche Variable als Sperrvariable nutzen, damit das Event halt nicht ständig aufgerufen wird.


    Oder du baust in das Spiel halt ein, dass sie bei falschem Gebrauch blockiert und erst wieder mit ein paar Handgriffen und dem Verlust eines Schusses wieder hergestellt werden muss, so als Strafe halt. Also, dass du dann vom Spieler auch spieltechnisch das Event zurücksetzt.

  • Du könntest zum Beispiel noch eine boolsche Variable als Sperrvariable nutzen, damit das Event halt nicht ständig aufgerufen wird.


    Oder du baust in das Spiel halt ein, dass sie bei falschem Gebrauch blockiert und erst wieder mit ein paar Handgriffen und dem Verlust eines Schusses wieder hergestellt werden muss, so als Strafe halt. Also, dass du dann vom Spieler auch spieltechnisch das Event zurücksetzt.

    Diese boolsche Sperrvariable hab ich ja gemacht. Wie schon beschrieben, Problem dabei ist aber, dass überhaupt nicht mehr gefeuert wird, wenn man schnell dauernt klickt. Stattdessen soll ja die normale Feuerrate abfeuern. Wie kriegt man das hin?

  • Du musst sie nach Abschluss des Events halt auch wieder freigeben.


    Also nehmen wir mal an sie heißt bCanFire oder so, also ist auf true, wenn der Spieler feuern kann und auf false, wenn er es nicht kann. Dann musst du nach Ablauf des Timers sie natürlich wieder auf true setzen.

  • Du musst sie nach Abschluss des Events halt auch wieder freigeben.


    Also nehmen wir mal an sie heißt bCanFire oder so, also ist auf true, wenn der Spieler feuern kann und auf false, wenn er es nicht kann. Dann musst du nach Ablauf des Timers sie natürlich wieder auf true setzen.

    hab ich, hab ich. Die Sache ist, wenn der Spieler jetzt oft hintereinander schnell klickt, dann wird diese Sperrzeit genauso oft hintereinander ausgelöst. Dann kommt halt kein Schuss raus, außer der Spieler wartet diese Sperrzeit ab und drückt dann.

    Das ist aber nicht das Verhalten, das man aus Games kennt. Da kann man auch oft hintereinander schnell klicken, exakt die bestimmte Feuerrate kommt dann raus.

    • Offizieller Beitrag

    Das ist aber nicht das Verhalten, das man aus Games kennt. Da kann man auch oft hintereinander schnell klicken, exakt die bestimmte Feuerrate kommt dann raus.

    Ich hab das Gefühl dass dein Problem ein anders ist.

    Hast du einen Counter den du hochzählst wenn man die Feuertaste klickt?

    Eigentlich drückt man doch die Taste es kommt eine gewisse Anzahl an Schüssen zb pro Sekunde.

    Geht man von der Taste runter, kommen keine Schüsse mehr.


    Zeig mal dein Blueprint und erklär nochmal wie genau du dir das Schiessen vorstellst und wie der Schuss im Moment passiert.

  • Es ist eine Laserwaffe, die alle 0.3 Sekunden einen Schuss schießt, wenn man die Taste hält.


    Ich machs in C++


    ich übersetze es mal in Sprache



    Von Anfang an ist:

    "boolVariable2" ist gleich true




    In Funktion "LinksklickPressed"

    "boolVariable1" wird true

    Funktion "GeschossSpawnen" wird ausgeführt.


    in Funktion "GeschossSpawnen"

    Wenn "boolVariable1" ist true und "boolVariable2 ist true" dann...

    spawne das Geschoss mit Sound und Partikel etc...

    führe auch folgende Funktion: "GeschossSpawnen" aus mit einer 0.3Sek Verzögerung


    //Damit hätte ich schonmal ein automatisches Feuern mit einer 0.3Sek Feuerrate. Es geht nun weiter.


    In Funktion "LinksklickReleased"

    "boolVariable2" wird false

    führe auch folgende Funktion: "Delay" aus mit einer 0.2Sek Verzögerung


    in Funktion "Delay"

    "boolVariable2" wird true


    //Wenn ich nun die Taste loslasse, dann wird die "boolVariable2" false und er feuert nicht mehr. Nach 0.2 Sek wird die Variable automatisch wieder true.


    //So, das ist Stand der Dinge. Ich halte den FeuernKnopf, er feuert im Dauerfeuer alle 0.3 sek einen Schuss. Soweit so gut. Wenn ich jetzt allerdings oft auf und ab die Taste klicke, dann schießt er einmal und dann nicht mehr, weil ja immer wieder neu die 0.2sek Dauer, in der "boolVariable2" false ist, kein Schuss abgefeuert werden kann.

    Klar, kann ich im 0.2 Takt selber die Taste klicken, dann gehen wieder Schüsse raus.

    Ziel ist aber nun, dass selbst wenn ich schnell auf und ab klicke, die Schüsse rausgehauen werden, aber in der Feuerrate wie im automatischen Feuermodus.

    • Offizieller Beitrag

    Es ist eine Laserwaffe, die alle 0.3 Sekunden einen Schuss schießt, wenn man die Taste hält.


    Wenn ich dich richtig verstehe, ist dein Logik Problem dass du 0,3 Sekunden nachdem man die Taste gedrückt hat schießt.

    So kann man kann man die Taste auch nach einer Sekunde loslassen und die Taste erneut drücken. (Die Waffe schießt dann sofort und umgeht damit den Cooldown )


    Wie wäre es zb wenn du alle 0,3 Sekunden einen Boolean auf True setzt.

    Drückt man die Feuertaste, prüfst du ob der Boolean auf True ist wenn ja wird geschossen, wenn nicht, wird gewartet bis der Boolean auf True ist.

    Wenn geschossen wurde und der Timer größer als 0,3 ist, setzt du den Timer auf 0 zurück.


    Somit wird wirklich nur alle 0,3 Sekunden geschosssen und dass auch nur wenn der Player die Taste drückt und umgehen kann man den Timer so auch nicht mehr.

  • Viel zu kompliziert.


    Du hast eine Variable, einen Feuerevent und einen Cooldowntimer.


    Du drückst auf Feuer, Variable wird false, Cooldowntimer läuft und wenn der beendet ist, dann wird die variable wieder auf true gesetzt. Dafür eine If...Then Abfrage, bei False läuft die Aktion halt ins Leere.


    Wahlweise könntest du natürlich auch dafür sorgen, dass der Timer kein Timer für eine Pause ist, sondern halt von sich aus alle 0,3 Sekunden einen Schuss abfeuert, solange der Feuerbutton gedrückt ist, was das Ganze vereinfachen würde, da du dann keine Sperrvariable mehr benötigst.

  • Das Problem ist nicht, dass der Schuss erst nach 0.3 Sekunden kommt. Aber interessant ist trotzdem dein Ansatz, eine Dauerschleife zu nutzen, bei der alle 0.3 sekunden ein bool auf true gesetzt wird.

    Eine Art Cooldown, ich kann während dessen so oft klicken wie ich will, es passiert nichts, bis die 0.3 sek wieder um sind. Klingt genau richtig, was ich brauche. Jetzt ist die Frage, wie verwirkliche ich das in C++. Ich muss mal überlegen oder ich such im Netz nach Cooldown in C++. Ich glaub du hast mir geholfen, kann diese Cooldown Funktion eh später gebrauchen, Vielen Dank :thumbup: :)

  • Hey zusammen


    Du kannst es machen wie im alten Shooter Game example, oder das neue in der UE5 anschauen.


    Den Network part lasse ich mal aus.

    Und dann die berechnung beim Refire

    Gruss

    • Hilfreich

    In C++ ist das genau so einfach wie in BPs. Du hast deine Funktion, Buttonpressed, also den Feuerknopf, und darin hast du dann,


    Code
    If bCanFire == true
    
        {Alles was zum Feuern nötig ist;}

    Wie du deine Variable dann steuerst usw., ich würde da eine eigene Klasse bauen und entsprechende Funktionen reinbauen, mit Timer, ButtonPressed, Variablen usw. Dann kannst du es relativ gut steuern. Innerhalb derselben Klasse sind Variablen auch gut beherschbar etc.


    Cooldown war vielleicht auch der falsche Begriff, bezeichnet ja eigentlich die Zeit, in der eine Waffe überhitzt und wieder abkühlen muss bis sie wieder feuerbereit ist. Aber ich denke, du weißt was ich meine.


    Oder wie gesagt, du machst den 0,3 Sekunden Timer, den du auslöst, wenn die Taste gedrückt ist, das dürfte dann eigentlich auch nicht durch mehrfaches drücken umgehbar sein.