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....