Allegro: RAM fährt bis auf 2 GB



  • Hallo,
    also ich habe mich seit Gestern von der Konsole verabschiedet und verwende Allegro.
    Als ich meiner Terrain Sidescrolling verpasst habe und ich compilierte,
    fuhr mein RAM bis auf 100%.

    Da ich in Sachen Bitmaps & co noch neu bin weiss ich nicht, was der Fehler sein könnte. 😕 😕

    Wäre für jede Hilfe dankbar! 😃

    MfG Zero

    #include <allegro.h>
    
    #define WHITE makecol(255, 255, 255)
    #define max(a, b) (((a) > (b)) ? (a): (b))
    #define min(a, b) (((a) < (b)) ? (a): (b))
    
    void init();
    void deinit();
    void clrscr(BITMAP* Screen, int delay);
    int hitTest(int xmin1, int ymin1, BITMAP *sprite1, int xmin2, int ymin2, BITMAP *sprite2);
    int hitTest2(int xmin1, int ymin1, int xmax1, int ymax1, BITMAP *sprite1, int xmin2, int ymin2, BITMAP *sprite2);
    
    void bridge(int xpos, int ypos, BITMAP* target, int rotation) {
         if(rotation<=-64) {
            rotation=-64;
            }
         BITMAP* tile_bridge = load_bitmap("img\\bridge.bmp", NULL); // B:25 H:600 M:30
         BITMAP* bufferBr = create_bitmap(700, 700);
         clear_to_color(bufferBr,makecol(255, 0, 255));
         rotate_sprite(bufferBr, tile_bridge, 600, 0, itofix(rotation));
         draw_sprite(target, bufferBr, xpos, ypos);
    }
    
    int main() {
    	init();
    
        BITMAP* buffer = create_bitmap(900, 500); // Buffer (Stage)
        BITMAP* tank = load_bitmap("img\\tank.bmp", NULL); // Tankies
        BITMAP* turrent = load_bitmap("img\\turrent.bmp", NULL); 
        BITMAP* terrain = create_bitmap(900, 500);
    
        //Tiles
        BITMAP* tile_terrain = load_bitmap("img\\terrain.bmp", NULL); //   B:500 H:200
        BITMAP* tile_terEnd = load_bitmap("img\\terrainend.bmp", NULL); // B:200 H:200
    
        int xpos=0, ypos=0, bridge1=0;
        float gravity=0.4, yspeed=15, aGrav=0.1, rotation=0, xspeed=0, aVel=0.1;
    
    	while (!key[KEY_ESC]) {
            //Vars
            int mousey=125+mouse_y/5+64; 
            bridge1--;
    
            //Terrain
            BITMAP* terrain = create_bitmap(900, 500);
            clear_to_color(terrain,makecol(255, 0, 255));
            draw_sprite(terrain, tile_terrain, xpos, 300);
            draw_sprite(terrain, tile_terEnd, xpos+500, 300);
    
            draw_sprite_h_flip(terrain, tile_terEnd, xpos+1000, 300);
            draw_sprite(terrain, tile_terrain, xpos+1200, 300);
    
            //Screen  
            blit(buffer, screen, 0, 0, 0, 0, 900, 500);
            clrscr(buffer,10);
    
            set_trans_blender(255, 255, 255, 255);
            bridge(xpos+400,11,terrain,bridge1);
            //Physics
            if(!hitTest(300, ypos, tank, xpos, 0, terrain)) {
                gravity=0.4;
            }
            if(hitTest(300, ypos-6, tank, xpos, 0, terrain)) {
                gravity=0;
                yspeed=0;
                ypos--;
            }
            yspeed+=aGrav;
            ypos+=gravity*yspeed;
    
            if (key[KEY_D]) { 
                xspeed+=aVel;
                xpos-=1.1*xspeed; 
            } else if (key[KEY_A]) {
                xspeed+=aVel;
                xpos+=1.1*xspeed; 
            } else {
                xspeed-=0.1;
            }
            if(xspeed>=3) {
                   xspeed=3;
            } 
            if(xspeed<=0) {
                   xspeed=0;
            }
    
            masked_blit(terrain, buffer, 0, 0, 0, 0, terrain->w, terrain->h);
    
            rotate_sprite(buffer, turrent, 330, ypos+10, itofix(mousey));
            rotate_sprite(buffer, tank, 300, ypos, itofix(rotation));
            textprintf_ex(buffer, font, 10, 10, makecol(0, 0, 0), -1, "m: %i",mousey); 
    	}
    
    	deinit();
        destroy_bitmap(tank);
    	destroy_bitmap(turrent);
    	destroy_bitmap(terrain);
    	destroy_bitmap(tile_terrain);
    	destroy_bitmap(tile_terEnd);
    	destroy_bitmap(buffer);
    
    	return 0;
    }
    END_OF_MAIN()
    
    void init() {
    	int depth, res;
    	allegro_init();
    	depth = desktop_color_depth();
    	if (depth == 0) depth = 32;
    	set_color_depth(depth);
    	res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 900, 500, 0, 0);
    	if (res != 0) {
    		allegro_message(allegro_error);
    		exit(-1);
    	}
    
    	install_timer();
    	install_keyboard();
    	install_mouse();
    	/* add other initializations here */
    
    	install_sound(DIGI_AUTODETECT, MIDI_AUTODETECT, NULL);
    }
    
    void deinit() {
    	clear_keybuf();
    }
    
    int hitTest(int xmin1, int ymin1, BITMAP *sprite1, int xmin2, int ymin2, BITMAP *sprite2) {
      int xmax1 = xmin1 + sprite1->w, ymax1 = ymin1 + sprite1->h;
      int xmax2 = xmin2 + sprite2->w, ymax2 = ymin2 + sprite2->h;
      int xmin = max(xmin1, xmin2);
      int ymin = max(ymin1, ymin2);
      int xmax = min(xmax1, xmax2);
      int ymax = min(ymax1, ymax2);
      if (xmax <= xmin || ymax <= ymin) { return 0; }
      int mask1 = bitmap_mask_color(sprite1);
      int mask2 = bitmap_mask_color(sprite2);
      for (int y = ymin; y < ymax; y++) {
        for (int x = xmin; x < xmax; x++) {
          int x1 = x - xmin1, y1 = y - ymin1;
          int x2 = x - xmin2, y2 = y - ymin2;
          int color1 = getpixel(sprite1, x1, y1);
          int color2 = getpixel(sprite2, x2, y2);
          if (color1 != mask1 && color2 != mask2) { return 1; }
        }
      }
      return 0;
    }
    
    int hitTest2(int xmin1, int ymin1, int xmax1, int ymax1, BITMAP *sprite1, int xmin2, int ymin2, BITMAP *sprite2) {
      int xmax2 = xmin2 + sprite2->w, ymax2 = ymin2 + sprite2->h;
      int xmin = max(xmin1, xmin2);
      int ymin = max(ymin1, ymin2);
      int xmax = min(xmax1, xmax2);
      int ymax = min(ymax1, ymax2);
      if (xmax <= xmin || ymax <= ymin) { return 0; }
      int mask1 = bitmap_mask_color(sprite1);
      int mask2 = bitmap_mask_color(sprite2);
      for (int y = ymin; y < ymax; y++) {
        for (int x = xmin; x < xmax; x++) {
          int x1 = x - xmin1, y1 = y - ymin1;
          int x2 = x - xmin2, y2 = y - ymin2;
          int color1 = getpixel(sprite1, x1, y1);
          int color2 = getpixel(sprite2, x2, y2);
          if (color1 != mask1 && color2 != mask2) { return 1; }
        }
      }
      return 0;
    }
    
    void clrscr(BITMAP* Screen, int delay) {
         rest(delay);
         clear_to_color(Screen,WHITE);
    }
    


  • du erstellst in der while schleife jedes mal das bitmap terrain, gibst aber nur einmal am ende des programms ein terrain frei.



  • Hast recht, habs verbessert aber hat leider nicht viel gebracht... 😕
    EDIT: da stimmte was mit der Funktion Bridge was nicht... gleicher Fehler, ausgebessert!

    THX an alle!



  • in der funktion bridge haste dasselbe Problem 🙄



  • Thx nochmal!!! 😃 😃 😃
    Hoffentlich werd ich mal mit meinen Game fertig....


Anmelden zum Antworten