我试图通过尝试编程2D图形游戏来拓宽OOP技能。使用Java的swing实用程序。
现在我到目前为止是:4个通用类,一个抽象类,一个接口和一个KeyListener类。 (别担心,目前这是一场非常小的比赛)。
在4个通用类中,主类将另外两个类设置为其中的对象。这两个对象是我的图形和我的游戏状态。 Gamestate依次设置其中最后剩下的对象(玩家)。
我遇到的问题是,当我最初完成所有操作时,玩家可以移动(通过keyPressed)从键盘读取输入的方式意味着玩家将稍微向前猛拉,然后以连续动作运行。这正是如果你按住键盘上的一个字母键,在一串字母开始形成之前出现一个字母的方式。
所以我想:"哦,它是如此明显。我应该尝试用布尔值来解决这个问题,这样当一个键掉下来时我就得到了布尔值= true'。而且我会在一个循环中出现一些代码,其中包含用于移动玩家的条件语句"。
这是我被困的地方。因为我无法弄清楚怎么做才能进入这个循环而不会干扰'我的节目。在尝试中,我已经运行了我的程序并且一无所获。该程序挂起,因为它已经在循环中并且还没有提起摆动窗口。我有一种感觉答案是与线程相关的(实现可运行的),但我处于这样一个新的领域,我想要一个正确和好的'这样做的方法。
所以我认为对于各种答案来说这是一个非常开放的问题。你(你有没有)解决这类问题?
---编辑*
以下是所有要求的源文件。 https://www.dropbox.com/sh/f4diy7qtzh4xkem/AABUkM415PrRK1hu35TVkBo2a
常规课程:主要,窗口,游戏状态,机器人。 接口:运动 摘要:GameVisualiser 听众:ArrowPress
原谅一些评论。
答案 0 :(得分:0)
我建议使用线程,它允许你同时运行两个东西(在你绘制游戏和处理这些输入的情况下)。如果你将玩家的位置设为公开,你应该能够创建一个处理输入的线程并在该位置写入并让主线程(显示游戏的线程)读取该位置。您需要的所有信息都在oracle docs page。
答案 1 :(得分:0)
嗯,你没有详细说明你正在制作什么样的游戏。
无论如何,很容易猜出你的问题是什么。您仅直接响应某种输入事件(您提到的KeyListener)推进您的游戏状态。这种纯粹的输入事件驱动架构适用于仅响应用户输入(例如简单的卡片或棋盘游戏)的事情的游戏。
但似乎您希望在没有用户输入(例如,在KeyDown和KeyUp事件之间)的位置推进您的游戏状态。在这种情况下,您将需要通常所谓的游戏循环,其中游戏实际上正在不断更新游戏状态(通常以固定的时间间隔)。
您有两种选择:
a。)使用多线程,这对于初学者来说具有陡峭的学习曲线,但非常灵活。
b。)以固定费率人为地生成一个事件以提升你的游戏状态(这也将使用引擎盖下的线程,但你不需要处理细节):
看一下java.swing.Timer类。您创建一个Timer实例,它定期触发(假设每32毫秒,大约每秒30次)。计时器会定期生成一个事件(您将监听器附加到计时器以获得事件通知)。您现在将所有游戏状态更改为该动作事件。这会将您的游戏从输入事件驱动转换为刻度事件驱动游戏,让您有机会根据需要在每个刻度线上提升游戏状态。
在你的KeyListener中,你只需更新&#34的标志;向#34;方向移动,实际的移动将在计时器的tick事件中完成。
你现在获得不稳定运动的原因可能是你依赖于KeyTyped事件,这是由挥动人工生成的 - 按下按键时的一个事件,然后是一些延迟,最后是在最初的延迟之后使用密钥重复率(在系统首选项中设置)触发事件,直到释放密钥。这不太适合游戏,你最好处理KeyPressed和KeyReleased事件,这些事件反映了用户在键盘上真正做的事情。
接近a。)线程基本上做同样的事情,更自由,一切都在你的控制之下 - 但还有更多的陷阱需要注意,比如并发和竞争条件。