如何处理对象的鼠标悬停[Allegro5 / C ++]

问题描述 投票:0回答:1

我希望能够将对象注册/取消注册到列表中,并检查鼠标是否悬停在它们上方以显示工具提示。但是我一开始就磕磕绊绊。

我将使用:al_get_pixelal_unmap_rgba来检索每个像素的alpha,并确定它是否足够可见,当用鼠标悬停在它上面时它被计为命中。

我遇到的主要问题是如何最好地存储这个单独的“hitmap”以及对生成它的对象的引用;由于许多不同大小的不同类型对象(如struct)可能需要生成hitmaps。我希望我可以做类似于检查复杂对象是否“扩展”基础对象,但我不知道如何在c ++中实现这一点。

PS;我知道我可以为每个对象创建一个屏幕大小的数组,但我这样做主要是为了最大化效率。我会制作动态大小的数组,但......

c++ hover mouse allegro5
1个回答
0
投票

al_get_pixel可以工作,但即使你锁定了所有的位图,它也会非常慢,除非你使用像拾取缓冲区这样的东西。基本思想是使用不同的颜色id渲染每个对象上的每个交互区域。这意味着您需要两次绘制场景,一次正常,一次绘制颜色。然后,当您需要回读鼠标位置时,可以使用拾取缓冲区读取单个像素并获取其颜色ID。

您可能还想尝试不同的碰撞检测方法,例如边界框,边界圆或其他易于碰撞检测的形状。

还有第三种选择,即像素完美碰撞。它涉及从所有对象中制作1bpp蒙版,然后检查它们之间的碰撞。

© www.soinside.com 2019 - 2024. All rights reserved.