SpaceInvaders



  • Hi alle zusammen.
    Ich bin zur Zeit dabei mit Dev-C++ eine version von 'Spaceinvaders' zu übungszwecken zu programmieren.
    Mein probem ist folgendes: 😕
    Ich habe nach einen Tutorial ein 'Snake-Spiel' gemacht. (http://www.cprogrammingreference.com/Tutorials/Games_Programming/Snake.php)
    Mit dem wissen dass ich durch dieses Tutorial bekommen habe wollte ich nun ein Spaceinvaders machen. Ich habe ein Schiff gezeichnet, es bewegt sich, und das auch in die richtung welche man vorgibt mit den Pfeiltasten. Auserdem schießt es ein 'Projektiel' (bestehend aus einem Pixel) ab wenn man die Pfeiltaste 'nach unten' drückt. Jedoch bleibt das Schiff die ganze Zeit während das Projektil fliegt am gleichen fleck, man kann es nicht bewegen, und so bleibt es. Das Schiff bewegt sich zwar wieder nachdem das Projektil am bildschirmrand angekommen ist, aber man kann es nichtmehr steuern.

    Hier mein Kompletter Code:

    #include <graphics.h>
    #include <stdio.h>
    
    #define LEFT 1
    #define RIGHT 2
    #define SPACE 3
    
    int s, score;
    int gamedelay;
    
    struct ship_data{
           int x;
           int y;
           int dir;
           int shoot;
    }ship;
    
    void initscreen ()
    {
         ship.x=250;
         ship.y=470;
         int i;
         char scorestring[100];
         setcolor(4);
         line(10,10,10,480);
         line(10,480,490,480);
         line(490,480,490,10);
         line(10,10,490,10);
         sprintf (scorestring, "Score : %d", score);
         outtextxy(10,485,scorestring);
         setcolor (2);
         line(ship.x-4,ship.y,ship.x+4,ship.y);
         line(ship.x-4,ship.y,ship.x-4,ship.y+8);
         line(ship.x+4,ship.y,ship.x+4,ship.y+8);
         line(ship.x-4,ship.y+8,ship.x+4,ship.y+8);
         line(ship.x,ship.y,ship.x,ship.y+8);
    }
    
    void userinput2 ()
    {
         char input2;
         if (kbhit ())
         {
                   input2 = getch ();
                   if (input2 == 80) {ship.shoot = 1;}
                   if (ship.shoot == 1){
                      int j;
                      j = ship.y;
                      do{
                         putpixel (ship.x,j+1,16);
                         putpixel (ship.x,j,15);
                         delay(5);
                         j--;
                      }while (j>10);
                      ship.shoot = 0;
                   }
         }
    }
    
    void userinput ()
    {
      char input;
      if (kbhit ())
       {
        input = getch ();           
         if (input == 75) input = LEFT;               
         if (input == 77) input = RIGHT;
         if (input == 32) input = SPACE;
       }
    
         if (input == LEFT)
            {
              ship.dir = LEFT;
            } 
         if (input == RIGHT)
            {
              ship.dir = RIGHT;
            }
    
    }
    
    void shootprojectile ()
    {
    
    }
    
    void moveship ()               
    {
     setcolor(16);
     line(ship.x-4,ship.y,ship.x+4,ship.y);
     line(ship.x-4,ship.y,ship.x-4,ship.y+8);
     line(ship.x+4,ship.y,ship.x+4,ship.y+8);
     line(ship.x-4,ship.y+8,ship.x+4,ship.y+8);
     line(ship.x,ship.y,ship.x,ship.y+8);
     if (ship.dir == LEFT)
      {
       ship.x --;
       ship.x --;
       ship.x --; 
       ship.x --;
       ship.x --;
       s = ship.x-4;
       if (s<10)
       {
          ship.x = 485;
       }
      }
     if (ship.dir == RIGHT) 
      {
       ship.x ++;
       ship.x ++;
       ship.x ++; 
       ship.x ++;
       ship.x ++;
       s = ship.x+4;
       if (s>490)
       {
          ship.x = 15;
       }
    
      }
      setcolor(2);
     line(ship.x-4,ship.y,ship.x+4,ship.y);
     line(ship.x-4,ship.y,ship.x-4,ship.y+8);
     line(ship.x+4,ship.y,ship.x+4,ship.y+8);
     line(ship.x-4,ship.y+8,ship.x+4,ship.y+8);
     line(ship.x,ship.y,ship.x,ship.y+8);
    }
    
    void gameengine ()
    {
     while (1) 
      {
           moveship();
           shootprojectile();
           userinput();
           userinput2();
           delay(200);
      }
    }
    
    void initgamedata ()
    {
       int i;
       ship.x = 200;
       ship.y = 200;
       ship.dir = RIGHT;
       score = 0;
       ship.shoot = 0;
       gamedelay = 1000;   
    }
    
    int main ()
    {
      initwindow(500, 500,"Shooter 1.0"); 
      initgamedata ();
      initscreen ();
      gameengine ();
      getch (); 
      closegraph (); 
      return 0;
    }
    

    Ich bin bei jeder art von hilfe froh, außer sie besteht darin mich unterbelichtet zu nennem. xD





  • Gut gemeint, thx, aber ihc programmiere auch noch nicht so lange und kann mit dem queellcode nichts anfangen. Außerdem hat die Person ja ein ganz anderes problem, mein Problem ist ja dass es nciht gleich zeitig schießt udn steuerbar ist.



  • 4pokalyptik schrieb:

    Gut gemeint, thx, aber ihc programmiere auch noch nicht so lange und kann mit dem queellcode nichts anfangen. Außerdem hat die Person ja ein ganz anderes problem, mein Problem ist ja dass es nciht gleich zeitig schießt udn steuerbar ist.

    seine geschosse fliegen aber gleichzeitig zum steuern, sogar mehrere, wenn ich mich recht erinnere.



  • Du hast recht, aber wie gesagt bin ich noch nicht lange am programmieren und habe keine Ahnung wie der code zu verstehen ist. Schon allein was 'klass' ist wei0 ich nicht. Aus diesem Grund wäre es mir lieber wenn man mir erklären könnte wie ich meinen code zum laufen bringe.
    Soweit ich das Verstehe ist bei ihm das problem das der gameengine immer wartet bis die aufgerufenen voids fertig abgelaufen sind. Weiß also jemand eine möglich keit das zu umgehen?

    PS: Trotzdem THX @ Volkard



  • hallo 4pokalyptik,
    wenn man bei dir die Pfeiltaste nach oben drückt, feuerst du ein Schuss ab. Du bleibst aber solange in der Schleife bis der Schuss den Bildschirmrand erreicht hat. Und solange du in der Schleife bist, die den Schuss zeichnet und bewegt, kann dein Spiel keine anderen Inputs, wie zum Beispiel die Bewegung des Schiffes, vom User entgegennehmen und ausführen.

    Ich würde ein struct für den Schuss schreiben und dort ein Flag setzten und die Korrdinaten angeben, sobald er abgefeuert wurde. Dann würde ich eine Funktion in regelmäßigen Abständen oder mit der vergangenen Zeit aufrufen, die da den Schuss bewegt. Dannach würde ich den Schuss erst zeichnen.

    So in etwa:

    struct shoot_data{
           int x;
           int y;
           bool shoot;
    }shoot;
    
    void userinput2 ()
    {
         char input2;
         if (kbhit ())
         {
                   input2 = getch ();
                   if (input2 == 80) 
                   {
                      shoot.shoot = true;
                      shoot.x = ship.x;
                      shoot.y = ship.y;
                   }
         }
    }
    
    void bewegen() //alle x Sekunden aufrufen
    {
        shoot.y--;
        if(shoot.y>10) shoot.shoot = false;
    }
    
    void zeichnen()
    {
            putpixel (shoot.x,shoot.y+1,16);
            putpixel (shoot.x,shoot.y,15);
    } 
    
    void gameengine ()
    {
     while (1)
      {
           moveship();
           shootprojectile();
           userinput();
           userinput2();
           if(shoot.shoot == true)
           {
               bewegen();
               zeichnen();
           }
           delay(200);
      }
    }
    

    mfg liggi



  • Thx fürden code. Gute Idee. Nur leider tut sie nicht. Ich hab den code eingetipp, nun kann man das Schiff garnichtmehr steuern und die Projektile bewegen sich nicht weiter als genau 1 Pixel über den x-Punkt des Schiffes. Danke für die Hilfe trotzdem ihc werd versuchen den Fehler zu finden, Hilfe jeodch weiterhin jederzeit willkommen.

    MFG 4po


Anmelden zum Antworten