安装鼠标导致 Dosbox 出现段错误
Installing mouse causes segment fault in Dosbox
我正在使用 Allegro4 制作一个支持 DOS 上的 GUI 的简单程序。
为了实现鼠标操作,我创建了一个形状对象来显示鼠标的当前信息。
Allegro提供了很多有用的全局变量,如mouse_x、mouse_y、mouse_b等,这些只有在通过以下代码安装鼠标驱动后才能使用。
install_mouse();
这是我的 MousePointerObjectClass。
class MousePointerObject : public GameObject {
public:
MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent = nullptr, std::string res = "");
virtual void preupdate();
virtual void collides(GameObject &other);
void notCollides(GameObject &other);
private:
int pressed_;
int released_;
friend class Scene;
};
MousePointerObject::MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent, std::string res)
: GameObject (scene, parent)
{
setRenderer(new MousePointerRenderer(res + "/renderer"));
setCollider(new PointCollider({0, 0}));
}
void MousePointerObject::preupdate()
{
place(Vector<float>(mouse_x, mouse_y));
static int held_buttons = 0;
int changed = mouse_b ^ held_buttons;
pressed_ = changed & mouse_b;
released_ = changed & ~mouse_b;
held_buttons = mouse_b;
}
void MousePointerObject::collides(GameObject &other)
{
if (pressed_ > 0)
other.mouseDown(pressed_);
if (released_ > 0)
other.mouseUp(released_, true);
other.mouse_inside_ = true;
}
void MousePointerObject::notCollides(GameObject &other)
{
other.mouse_inside_ = false;
if (released_ > 0)
other.mouseUp(released_, false);
}
我使用 DJGPP 在 Ubuntu 上交叉编译了这个程序,它在 Ubuntu 和 Real Dos 上运行良好,没有任何冲突。
但是当它在 Dosbox 或 Dosbox-x 上是 运行 时,它会导致段错误。
无论鼠标指针是否显示在屏幕上,一旦调用install_mouse(),当我移动鼠标指针时Dosbox 意外退出。
我费了好大劲才解决这个问题,但它们根本不起作用。
任何建议将不胜感激。
原因是我在这个程序中使用的引擎。它曾经使用大量 CPU 和 RAM。经过优化后 CPU 和 RAM 占用率大幅下降,在 Dosbox 中也能正常运行。
但是还是很慢,所以我还在继续优化引擎。
我正在使用 Allegro4 制作一个支持 DOS 上的 GUI 的简单程序。 为了实现鼠标操作,我创建了一个形状对象来显示鼠标的当前信息。 Allegro提供了很多有用的全局变量,如mouse_x、mouse_y、mouse_b等,这些只有在通过以下代码安装鼠标驱动后才能使用。
install_mouse();
这是我的 MousePointerObjectClass。
class MousePointerObject : public GameObject {
public:
MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent = nullptr, std::string res = "");
virtual void preupdate();
virtual void collides(GameObject &other);
void notCollides(GameObject &other);
private:
int pressed_;
int released_;
friend class Scene;
};
MousePointerObject::MousePointerObject(Scene *scene, std::shared_ptr<GameObject> parent, std::string res)
: GameObject (scene, parent)
{
setRenderer(new MousePointerRenderer(res + "/renderer"));
setCollider(new PointCollider({0, 0}));
}
void MousePointerObject::preupdate()
{
place(Vector<float>(mouse_x, mouse_y));
static int held_buttons = 0;
int changed = mouse_b ^ held_buttons;
pressed_ = changed & mouse_b;
released_ = changed & ~mouse_b;
held_buttons = mouse_b;
}
void MousePointerObject::collides(GameObject &other)
{
if (pressed_ > 0)
other.mouseDown(pressed_);
if (released_ > 0)
other.mouseUp(released_, true);
other.mouse_inside_ = true;
}
void MousePointerObject::notCollides(GameObject &other)
{
other.mouse_inside_ = false;
if (released_ > 0)
other.mouseUp(released_, false);
}
我使用 DJGPP 在 Ubuntu 上交叉编译了这个程序,它在 Ubuntu 和 Real Dos 上运行良好,没有任何冲突。 但是当它在 Dosbox 或 Dosbox-x 上是 运行 时,它会导致段错误。 无论鼠标指针是否显示在屏幕上,一旦调用install_mouse(),当我移动鼠标指针时Dosbox 意外退出。 我费了好大劲才解决这个问题,但它们根本不起作用。
任何建议将不胜感激。
原因是我在这个程序中使用的引擎。它曾经使用大量 CPU 和 RAM。经过优化后 CPU 和 RAM 占用率大幅下降,在 Dosbox 中也能正常运行。 但是还是很慢,所以我还在继续优化引擎。