C++ Allegro:移动窗口时程序崩溃

发布于 2024-12-13 20:29:30 字数 1873 浏览 0 评论 0原文

我已经构建了一个 C++ Allegro 地图编辑器。其中一个请求是要有一个日志,所以我将它放在控制台窗口中进行的每个动作...现在的问题是控制台窗口位于主窗口下方(使用 GFX_AUTODETECT_WINDOWED),但每当我尝试移动该窗口,它只会使程序崩溃。我需要能够移动它并将控制台窗口移动到地图编辑器并返回到地图编辑器。有人有什么想法吗???

这是我的代码的主要部分。

#include <allegro.h>
#include <string>
#include <sstream>
#include "Layout.h"
#include "System.h"
#include "Map.h"
#include <iostream>
#include <fstream>

using namespace std;

// Allegro Functions to stabilize speed
volatile long speed_counter = 0;              
void increment_speed_counter() // A function to increment the speed counter
{speed_counter++; }
END_OF_FUNCTION(increment_speed_counter); 

int main()
{
System system; // Initialising Allegro 
system.Setup();

Map map1; // Creating default map
map1.createMap(); 

BITMAP *buffer = create_bitmap(24,45); // Double buffering

LOCK_VARIABLE(speed_counter); //Used to set the timer - which regulates the game's
LOCK_FUNCTION(increment_speed_counter);//speed.
install_int_ex(increment_speed_counter, BPS_TO_TIMER(8));//Set our BP

/*game looop */
while( !key[KEY_ESC] )
{
        clear_bitmap(buffer); // Clear the contents of the buffer bitmap         
while(speed_counter > 0)
{
    if(mouse_b &1 ){ // On mouse click
          map1.catchMouseEvent(mouse_x, mouse_y);
          while(mouse_b & 1){}   
    }
    speed_counter --;
}
       rectfill(buffer,0,0,25,45,makecol(135,206,250));
       textprintf_ex(buffer, map1.getLayout().getFont(), 0, 0, makecol(255, 255, 255), -1,"%d", map1.getRowVal());
       textprintf_ex(buffer, map1.getLayout().getFont(), 0, 20, makecol(255, 255, 255), -1,"%d", map1.getColVal());

       blit(buffer, screen, 0, 0, 970, 50, 100, 50);     
}

/*Free memory after */
destroy_bitmap( buffer );   
return 0;
allegro_exit();
}
END_OF_MAIN();

此外,它确实会在不移动窗口的情况下自行随机崩溃。没有具体原因,只是随机崩溃。

有人有什么想法吗?

I Have built a C++ Allegro Map Editor. One of the requests was to have a log so I've put it in the console window for every move that is made... Problem now is that the console window is under the main window (Used GFX_AUTODETECT_WINDOWED), But whenever I try to move that window, it simply crashes the program.. I need to be able to move it and to move the console window to and come back to the map editor. Anybody has any ideas???

Here's the main of my code.

#include <allegro.h>
#include <string>
#include <sstream>
#include "Layout.h"
#include "System.h"
#include "Map.h"
#include <iostream>
#include <fstream>

using namespace std;

// Allegro Functions to stabilize speed
volatile long speed_counter = 0;              
void increment_speed_counter() // A function to increment the speed counter
{speed_counter++; }
END_OF_FUNCTION(increment_speed_counter); 

int main()
{
System system; // Initialising Allegro 
system.Setup();

Map map1; // Creating default map
map1.createMap(); 

BITMAP *buffer = create_bitmap(24,45); // Double buffering

LOCK_VARIABLE(speed_counter); //Used to set the timer - which regulates the game's
LOCK_FUNCTION(increment_speed_counter);//speed.
install_int_ex(increment_speed_counter, BPS_TO_TIMER(8));//Set our BP

/*game looop */
while( !key[KEY_ESC] )
{
        clear_bitmap(buffer); // Clear the contents of the buffer bitmap         
while(speed_counter > 0)
{
    if(mouse_b &1 ){ // On mouse click
          map1.catchMouseEvent(mouse_x, mouse_y);
          while(mouse_b & 1){}   
    }
    speed_counter --;
}
       rectfill(buffer,0,0,25,45,makecol(135,206,250));
       textprintf_ex(buffer, map1.getLayout().getFont(), 0, 0, makecol(255, 255, 255), -1,"%d", map1.getRowVal());
       textprintf_ex(buffer, map1.getLayout().getFont(), 0, 20, makecol(255, 255, 255), -1,"%d", map1.getColVal());

       blit(buffer, screen, 0, 0, 970, 50, 100, 50);     
}

/*Free memory after */
destroy_bitmap( buffer );   
return 0;
allegro_exit();
}
END_OF_MAIN();

Also, it does happen that it randomly crashes by itself without moving the window. There is not a specific reason, it just crashes at random times.

Any ideas someone?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

月下凄凉 2024-12-20 20:29:31

如果不查看所有代码,就不可能知道崩溃的原因或位置。如果您使用调试器,那么发生的事情应该是显而易见的。您应该响应返回代码。例如,当您加载或创建位图时,请确保它不是NULL

我不太确定你想用这么小的双缓冲区做什么。通常,您会创建一个与窗口大小相同的缓冲区。请注意,只有屏幕宽度是四的倍数时,Allegro 4 才能正常工作。另外,您应该调用 set_color_depth(desktop_color_depth()) (在设置图形模式之前)以获得最大兼容性。

Without seeing all of the code, it's impossible to know why or where it's crashing. If you use a debugger it should be obvious what's happening. You should be responding to return codes. e.g., When you load or create a bitmap, make sure it's not NULL.

I'm not really sure what you are trying to do with such a smaller double buffer. Typically you create a single buffer the same size as the window. Note that Allegro 4 will only work properly if the screen width is a multiple of four. Also, you should call set_color_depth(desktop_color_depth()) (before setting the graphics mode) for maximum compatibility.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文