RE: Kleines Raumschiff Spiel



  • 😃 sorry wegen doppelpost aber das muss jetzt sein:

    erstmal möchte ich allen danken die mirgeholfen haben..
    heute möchte ich anfängern zeigen wie man ein einfaches Raumschiff spiel schreibt
    es ist zwar mom noch verbugt aber es laüft einigermaßen

    ihr benötigt nur noch 4 bilder:

    bild1.bmp -> space ship
    bild2.bmp -> laser.bmp
    title1.bmp -> title
    bild4.bmp -> feind
    ...
    hier der code

    #include <allegro.h>
    #include <winalleg.h>
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    volatile bool Close = false;
    volatile bool done = false;
    
    void Handler() {Close = true;}
    void Handler2() {done = true;}
    
    void game_ini();
    void title();
    void load_cache();
    
    BITMAP *bild1;
    BITMAP *bild2;
    BITMAP *bild3;
    BITMAP *bild4;
    
    BITMAP *buffer;
    
    int shoot_ini = 0;
    
    int ship_x = 300;
    int ship_y = 300;
    
    int shoot_x = ship_x;
    int shoot_y = ship_y;
    
    int enemy_x;
    int enemy_y;
    
    int title_ini = 1;
    int enemy_ini = 1;
    int counter =0;
    char score[]= {"score"};
    
    int main()
    {
    
     allegro_init();
     install_keyboard();
     install_mouse();
     set_color_depth(16);
     set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0);
     set_window_title("Star-Battle 1.0");
    
     //-------------------------------------------//
    
     load_cache();
     title();
    
     while (!Close)
     {  
      game_ini();
     }
    
    }
    END_OF_MAIN();
    
    void load_cache()
    {
     buffer = create_bitmap(SCREEN_W, SCREEN_H);
     bild1 = load_bitmap("data\\bmp\\bild1.bmp",NULL);
     bild2 = load_bitmap("data\\bmp\\bild2.bmp",NULL);
     bild3 = load_bitmap("data\\bmp\\title1.bmp",NULL);
     bild4 = load_bitmap("data\\bmp\\bild4.bmp",NULL);
    
    }
    
    void title()
    {
      if (title_ini = 1)
      {            
       draw_sprite(screen,bild3,150,100);
       textprintf_ex(screen, font, 300, 500, makecol(255, 255, 255), makecol(0, 0, 0), "Press Enter to Start");              
       Sleep(3000);
       title_ini = 0;
      }
    
    }
    
    void zufall()
    {
     srand(time(0));
     enemy_x = rand() % 400 + 1;;
     enemy_y = rand() % 400 + 1;;
    }
    
    int BildKollision(BITMAP* bild2,int shoot_x, int shoot_y, BITMAP* bild4,int enemy_x, int enemy_y)
    {
        if(shoot_x>=(enemy_x+bild2->w) || shoot_y>=(enemy_y+bild2->h) || enemy_x>=(shoot_x+bild4->w) || enemy_y>=(shoot_y+bild4->h)) return 0;
        else                                                                                 return -1;
    }
    
    void game_ini()
    {
    
     while(!done)
     {
      zufall();      // change the pos auto
    
      clear(buffer);
    
      if(title_ini == 0)
      {
      draw_sprite(buffer,bild1,ship_x,ship_y);
      textprintf_ex(buffer, font, 0, 0, makecol(255, 255, 255), -1, "Score: %d",counter);
    
      if (shoot_ini == 1)
      {
       draw_sprite(buffer,bild2,shoot_x,shoot_y);
       shoot_y--;
      }
    
      if(enemy_ini = 1)
      {
    
       draw_sprite(buffer,bild4,enemy_x,enemy_y);
    
       enemy_ini = 0;
       }
    
      if(BildKollision(bild2,shoot_x,shoot_y,bild4,enemy_x,enemy_y))
      {
       counter++;
       shoot_ini = 1;
      }
    
      if(shoot_y == 20)
      {         
       Handler2(); // close while loop
      }
      } // title = 0 loop
    
      blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);
    
      //-------------------------------------------//
    
      if(key[KEY_LEFT])
      {
       ship_x--;
      }
    
      if(key[KEY_RIGHT])
      {
       ship_x++;
      }
    
      if(key[KEY_UP])
      {
       ship_y--;
      }
    
      if(key[KEY_DOWN])
      {
       ship_y++;
      }
    
      if(key[KEY_SPACE] and shoot_ini == 0) // shoot
      {
       shoot_ini = 1;
    
      }
    
      if(key[KEY_ESC]) // shoot
      {
       Handler();
       Handler2();  // close while-loop
      }
    
     }
     ///////////////////////////////////////////////////////
    
     shoot_ini = 0;        // reset int
     shoot_x = ship_x;     // reset x
     shoot_y = ship_y;     // reset y
    
     ///////////////////////////////////////////////////////
    
     done = false;
    
    }
    

    ich hoffe es gefällt euch - seit bitte nicht sauer, ist mein allller erstes
    games welches ich jeh mit c++ gemacht habe

    hier der komplette download
    http://www.file-upload.net/download-3390618/game.rar.html



  • star_rock_games schrieb:

    c++

    Ich seh nur C.
    Spaß beiseite, ich gucks mir später mal an 😃



  • Das ist tatsächlich nur C.
    Würdest du das in C++ machen, bräuchtest du nicht die 2 dutzend Globalen Variablen, welche man vermeiden sollte.



  • Cloppy schrieb:

    C++

    LOL. Brauchen tut man die auch in C nicht 🙄



  • Schon, aber bei C++ liegt es auf der Hand 😉



  • Cloppy schrieb:

    Schon, aber bei C++ liegt es auf der Hand 😉

    gääääääääh
    wuss?



  • "Man braucht keine globalen Variablen" ist echt das coolste Argument für C++ das ich je gehört hab 😃



  • Definitiv kein C, er ist eben noch ein Anfänger...



  • Hab mal ne frage an dich star_rock_games:

    diese libary "winalleg.h" find ich nicht. ich hab allegro 5 und die undeklarierten befehle kann ich nur mit "gl_ext.h" deklarieren. doch beim debugging gibt es mindestens 50 fehlermeldungen; z.b. "GLclampf" nicht deklariert ist, oder "GLenum"...

    wie hast du das gemacht?

    tortorios



  • hat sich schon erledigt, danke. das problem war, dass ich allegro 5 habe und die befehle noch von allegro 4 sind ^^



  • sry für den dripple post! ich wollte nicht extra ein thread aufmachen, deswegen frag ich hier:

    ich benutze allegro 4 und wenn ich die libary inlcude und nichtmal einen code schreibe(!), gibt es fehlermeldungen.

    #include <allegro.h>
    #include <winalleg.h>
    
    int main()
    {
    
    }
    

    //fehlermeldung
    error C4716: '_mangled_main': Muss einen Wert zurückgeben

    ich hab auch schon "return 0;" in den code eingesetzt, doch dann kommen wieder fehler

    #include <allegro.h>
    #include <winalleg.h>
    
    int main()
    {
        return 0;
    }
    

    //fehlermeldung
    error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".
    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.



  • - du muss am ende

    END_OF_MAIN();

    eingeben 😉 warum weis ich auch nicht ^^

    und ich benutzte allegro 4.2.2, weil es die einzigste version ist
    die man in dev c++ runterladen kann OHNE fehlermeldungen

    okey man könnte jetzt erst alles runterladen und einzelnd einlinken aber ich war zu faul ...



  • sry das ich erst jetzt wieder antworte.
    wenn ich

    END_OF_MAIN()
    

    schreibe kommen nochmehr fehlermeldungen, und ich verstehe noch weniger.

    #include <allegro.h>
    #include <winalleg.h>
    
    int main()
    {
    	return 0;
    }
    END_OF_MAIN()
    

    Fehlermeldung:

    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp___WinMain" in Funktion "_WinMain@16".

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.



  • Semikolon hinter END_OF_MAIN() vergessen?

    Scheint mir ein bisschen dubios zu sein, mit dem "END_OF_MAIN". Bist du dir sicher, dass du auch eine Windows-Anwendung erstellst und nicht etwa eine Konsolenanwendung?



  • hat sich schon erledigt, danke.
    nun hab ich wieder ein neues problem und weiß wieder nicht wo ich danach suchen soll :D.

    ich hab allegro 5 und möchte einfach nur einen wert ausgeben:

    #include <allegro5\allegro.h>
    #include <iostream>
    
    int main()
    {
    	int izahl = 500;
    
    	while(1)
    	{
    		if(ALLEGRO_KEY_UP)
    		{
    			izahl++;
    		}
    
    		if(ALLEGRO_KEY_DOWN)
    		{
    			izahl--;
    		}
    
    		cout << izahl;
    
    		Sleep(50);
    	}
    }
    

    so, nur kann ich leider kein "cout" verwenden; warum weiß ich nicht. ich will nur die anzahl von "izahl" irgendwie ausgeben. hat jemand ne andere lösung?



  • cout liegt im Namensbereich std .

    Das gehört zu den Grundlagen.



  • Läuft Allegro wirklich in der Konsole? Ich dachte, dass man damit auch komplexere Dinge zeichnen kann...



  • Jochen S. schrieb:

    Läuft Allegro wirklich in der Konsole?

    Natürlich nicht!



  • EOutOfResources schrieb:

    Jochen S. schrieb:

    Läuft Allegro wirklich in der Konsole?

    Natürlich nicht!

    Dann ist cout fehl am Platze. Es sei denn, er programmiert eine Konsolenanwendung. Dann ist aber Allegro fehl am Platze.



  • Jochen S. schrieb:

    Dann ist cout fehl am Platze. Es sei denn, er programmiert eine Konsolenanwendung. Dann ist aber Allegro fehl am Platze.

    So manches Spiel hat eine Konsole und ein Fenster...


Log in to reply