gpt4 book ai didi

java - 鼠标移动优化

转载 作者:行者123 更新时间:2023-11-29 04:03:50 24 4
gpt4 key购买 nike

我想要一款游戏,当鼠标到达窗口的外边缘时, View 会四处移动(类似于许多 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 究竟有多少开销?如果只需要沿着游戏窗口的边界进行检测,这种或类似的方法是否会更有效?

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

最佳答案

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

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

首先,我创建了一个名为 AutoScrollPane 的面板,它扩展了 JScollPane。即使它是一个 JScrollPane,您也可以隐藏滚动条。这使我能够利用在 map 上或类似 RTS 游戏中移动视口(viewport)的功能,就像您所说的那样。

其次,对于滚动区域,我实际上有 8 个:n、ne、e、se、s、sw、w 和 nw(即“北”、“东北”等),对角线允许对角线滚动。我将它们简单地实现为 Rectangles。它们没有绘制在屏幕上或任何其他东西上 - 我只是在我的类中实例化 8 个大小合适且坐标与窗口区域匹配的矩形。我实际上允许调整窗口大小,因此我会在必要时调整矩形的大小。

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

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

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

关于java - 鼠标移动优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1634815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com