Programmabläufe (Funktionen) gleichzeitig laufen lassen



  • Hallo liebe C++ Leutz,
    ich programmiere gerade ein Spiel. Space_Invaders, falls das noch jemand von euch kennt.
    Kleines Raumschiff unten und oben fallen monster runter welche man abschießen soll.

    Mein Problem:
    Ich möchte z.b. das Raumschiff nach rechts und links bewegen können und gleichzeitig dabei schießen können. Der Compiler arbeitet aber nur von oben nach unten alles ab. Ich kann das Raumschiff bewegen, aber wenn ich die Leertaste drücke, startet die Funktion schießen und erst wenn der Schuss abgefeuert wurde, kann ich das Raumschiff erneut bewegen.
    Wie kann ich das gleichzeitig ablaufen lassen? Ich habe gehört das man sowas mit clock() machen könnte. Ist da was dran. In meinem Programm habe ich clock() auch schon eingebaut, damit ich die Zeit zwischen den Funktionen (Programmabläufen) stoppen kann. Soviel zu dem Thema clock() kann ich schon, aber wie soll ich dann den Ablauf machen? Oder wisst ihr eine bessere Möglichkeit sowas zu machen?

    VG
    Chris



  • Einfachste Möglichkeit ist es, beim Drücken der Leertaste nur ein Projektil-Objekt zu starten, das du dann gemeinsam mit dem Spieler-Raumschiff und den Gegnern bewegst, bis es etwas trifft.

    (komplizierter wird es, wenn du mit Multithreading arbeitest)



  • aha ok.
    habe von Projektil-Objekt noch nichts gehört.
    kannst du mir da ein beispiel geben welches 2 sachen einfach gleichzeitig ausgibt?
    musst da nicht auf mein programm zurück kommen, das hab ich nur so geschrieben das ihr wisst was los ist ^^.
    vg
    chris



  • Zwei Ablaeufe gleichzeitig hinzubekommen ist in dem Sinne nur mit Threads moeglich. Da du aber sagst, dass "Projektil-Obejtk" dir nichts sagt, vermute ich, dass du noch nicht viel vom Klassenkonzept von C++ weisst. In dem Falle waere es noch etwas frueh fuer Threads und die Basics von C++ eventuell erstmal wichtiger. (Es sei denn du programmiert in C, wo es keine Klassen und Objekte gibt, dann waerst du allerdings im falschen Forum gelandet)



  • Ein "Projektil-Objekt" ist auch nichts gängiges - das soll einfach nur das von dir abgefeuerte Projektil darstellen.

    OK, mal ein Beispiel - bezogen auf deinen Ursprungsbeitrag:

    class game_object
    {
      int x,y;
    public:
      virtual void update() = 0;//aktualisiert die Position
      int getx() {return x;}
      int gety() {return y;}
      ...
    };
    
    class enemy : public game_object
    {
      //nötige Operationen für die gegnersichen Schiffe
    };
    
    class player : public game_object
    {
      //das Raumschiff des Spielers
    };
    
    class projektil : public game_object
    {
      //ein einzelner "Schuss" des Spielers
    };
    
    vector<game_object*> gamedata;
    //ein player und ausreichend enemy reinpacken
    while(!dead)
    {
      switch(getch()
      {
      case ' ':
        gamedata.push_back(projektil(...));//Projektil anlegen und speichern
      ...
      }
      for(size_t i=0;i<gamedata.size();++i)
      {
        gamedata[i].update();
        //hier auch Auswertungen für Kollisionen einbauen und ggf Objekte löschen
      }
    }
    


  • ja ich programmiere in c++!
    danke für die antworten. wenn das wirklich die einfachste möglichkeit ist, werde ich mich damit mal auseinandersetzen.
    danke und vg chris



  • Das entscheidende ist wohl nicht das Projektil-Objekt, sondern dass du dein Spiel in kleine Zeitschritte unterteilst, die du dann hintereinander simulierst. In jedem Schritt bewegen sich die Gegner ein kleines Stück, dein Schuß bewegt sich ein Stück, Eingaben werden ausgewertet usw.
    Mit Multithreading hättest du den Nachteil, dass das zeitliche Verhalten untereinander nicht fest ist, du hättest also einen nichtdeterministischen Spielablauf.



  • also zurzeit arbeite ich noch mit funktionen. aber das sind ja auch externe kleine programme die im Hauptprogramm aufgerufen werden. mein problem ist halt nur wenn ich eine funktion aufrufe, muss ich warten bis diese fertig ist und kann nicht gleichzeitig was anderes machen.z.b. funktion Punkte läuft unten mit, gleichzeitig kann ich schießen und mich bewegen und die gegner fallen runter.
    ich versuche jetzt erstmal alles in klassen zu schreiben. und mal gucken ob ich es dann irgendwie hin bekomme
    vg
    chris



  • Eine echte Parallelität gibt es bei Anwendungen, die auf einem Prozessor laufen, sowieso nicht, die Anweisungen laufen immer nacheinander ab (auch mit Threads).
    Nur für den Anwender (Spieler) kommt es ihm dann so vor, als ob es gleichzeitig stattfinden würde (da die Prozessoren heute einfach viel zu schnell sind - früher mit Lochkarten da konnte man wenigstens noch zuschauen).

    Ob du Funktionen oder Klassenmethoden verwendest, spielt hierbei keine Rolle, sondern du mußt einfach jede Funktion so gestalten, daß sie nur eine geringe Laufzeit hat (z.B. eine Bewegung ausführen, einen Wert anzeigen, eine Taste abfragen).



  • hi,
    also ich habe mein Programm in eine Klasse und Methoden umgewandelt und würde gerne jetzt anfangen und mir Threads aneignen. Ich benutze Borland C++ und würde gerne wissen wo ich multithreading aktivieren kann. Ich habe gelesen das es aktiv sein muss, aber ich weiß nicht wo und wie man das aktiv schaltet. Ansonsten habe ich die Bibliothek "process.h" in mein Programmm eingebunden.
    Könnt ihr mir vielleicht helfen?

    void multi(void *dummy);

    int main()
    {
    _beginthread(multi, 0, NULL);
    }

    void multi(void *dummy)
    {
    cout<<"Hallo";
    _endthread();
    }



  • ich bin mir ziemlich sicher, dass das original keine zwei threads brauchte.



  • Multithreading ist ein ganz eigenes Konzept der Programmierung. Und da würde ich (v.a. als Einsteiger) nichts eigenes schreiben, sondern mich auf vorhandene Bibliotheken berufen.

    Nur als Info für deine Spielidee: mit einer simplen Schleife, die alle Schritte nacheinander absteuert (Spieler-Aktion, Spieler-Bewegung, Schuss-Animation, Kollisionserkennung, Feind-Bewegung etc) bist du immer noch auf der sicheren Seite und Geschwindigkeitsmässig spürst du das gar nicht. Da sollten wohl immer noch einige Dutzend bis Hunderte Iterationen der Schleife möglich sein (neudeutsch: Frames, sofern es auf dem Schirm dargestellt wird)



  • Ich würde gerade einem Einsteiger der noch nicht weiss wie man parallele Abläufe ohne Threads programmiert empfehlen sicht erstmal garnicht mit Threads zu beschäftigen.
    Ist auch mit bestehenden Libs kompliziert genug.


Anmelden zum Antworten