鼠标移动优化

时间:2009-10-28 02:13:20

标签: java optimization mouse

我希望有一个游戏,当鼠标到达窗口的外边缘时,视图会移动(类似于许多RTS游戏)。我已经读过使用MouseMotionListener时会有很大的开销。

是否有一种方法可以在游戏窗口(JPanel)中设置第二个透明组件,不会影响游戏,但是当鼠标通过MouseAdapter.mouseEntered()/ mouseExited()离开内部组件时会注册?

boolean mouseOnScreen;
boolean mouseWithinInnerComponent; //is (10 <= mouse.x <= screenWidth - 10) && (10 <= mouse.y <= screenHeight)

if(mouseOnScreen && !mouseWithinInnerComponent)
{
    //do something...
}

我不知道如何确定哪个屏幕边界被交叉而不必在角落处重叠四个上述组件以形成屏幕周围的边界,这可以检测鼠标是否在任何边缘或角落。我认为这相当昂贵(在运行游戏时必须检查每个组件)......

boolean mouseOnScreen;
boolean mouseWithinTopComponent; //is (0 <= mouse.y <= 10)
boolean mouseWithinBottomComponent; //is (screenHeight - 10 <= mouse.y <= screenHeight)
boolean mouseWithinLeftComponent; //is (0 <= mouse.x <= 10)
boolean mouseWithinRightComponent; //is (screenWidth - 10 <= mouse.x <= screenWidth)

if(mouseOnScreen)
{
    if(!mouseWithinBottomComponent)
    {
        //move view up
    }
    if(!mouseWithinTopComponent)
    {
        //move view down
    }
    if(!mouseWithinLeftComponent)
    {
        //move view right
    }
    if(!mouseWithinRightComponent)
    {
        //move view left
    }
}

MouseMotionListener究竟有多少开销?如果仅需要沿着游戏窗口的边界进行检测,这个或类似的方法可能会更有效吗?

注意:这将用于窗口模式以及可能的全屏应用。

3 个答案:

答案 0 :(得分:2)

我认为Martin Fowler认为,过早优化是软件开发中所有邪恶的根源。为什么不尝试使用MouseMotionListener,只考虑优化,如果发现它会影响游戏的性能。

答案 1 :(得分:2)

我使用MouseMotionListener实现了您需要的相同功能。我不确定为什么你认为它会增加开销...如果你添加一个并简单地询问它的每个方法打印到控制台(这很慢)并移动你的鼠标,你会发现它很漂亮从用户的角度来看。

我的实现包含4个主要部分:滚动窗格,矩形区域,计时器和MouseMotionListener

首先,我创建了一个名为AutoScrollPane的面板,扩展了JScollPane。即使它是JScrollPane,您也可以隐藏滚动条。这允许我利用功能在地图上移动视口或类似于RTS游戏中的类似视频。

其次,对于滚动区域,我实际上有8:n,ne,e,se,s,sw,w和nw(即“北”,东北“等),对角线允许对角线滚动。我简单地将它们实现为Rectangle s。它们不是在屏幕上绘制的,也不是任何东西 - 我只是在我的类中实例化8个矩形,并且坐标与窗口的区域相匹配。我实际上允许我要调整大小的窗口,所以如果需要,我会调整矩形的大小。

第三,我有一个可以打开和关闭的计时器。当它打开时,每个“tick”都会生成Runnable。此Runnable's作业是将面板的视口在适当的方向上滚动一定距离。每个Runnable都会传递给Swing事件队列。

最后,我有MouseMotionListener。它的工作是拦截鼠标进入,退出和移动事件。每次收到事件时,它都会检查当前鼠标位置以及它是否与其中一个矩形相交。根据哪个矩形,它选择滚动方向。它会跟踪鼠标是否在上一个事件的滚动区域中。根据这些信息,它知道它是应该开始滚动,停止滚动,还是只是让正在发生的事情继续下去。如果鼠标移出窗格,我希望滚动停止,因此使用exit / enter事件。无论如何,要开始滚动,听众会保存滚动的方向和距离并告诉计时器启动。当需要停止滚动时(例如当鼠标退出滚动区域时),它会告诉计时器停止。

为平滑滚动选择合适的计时器粒度和滚动距离需要一段时间,但它确实可以正常工作。我希望这个大纲能提供一些帮助。

答案 2 :(得分:0)

MouseMotionListener没有任何问题当您阅读有关开销时,它可能是一个特定的例子

你可以用任何编程语言做的任何事都可以做错或做错。

如果你注意你在听众身上所做的一切都应该没问题