- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
因此,当我运行此代码时,我的 JFrame 变得无响应。我设法将其追溯到 gameLoop() 下的 while 循环。无论使用在其中调用 Thread.sleep() 的延迟(1000/FRAMERATE),它都不会允许按键或鼠标监听器完成其工作。
完整代码如下,问题存在于 gameLoop()
package me.LemmingsGame;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
public class Game extends JFrame implements KeyListener, MouseListener{
private World wrld;//reference to current world
private WorldFile loader=null;//world data
private int gateCounter;
private int width,height; //width and height of level
private int mx,my;
private int tool = Lemming.CLIMB;
private Image dbImage; private Graphics dbg; //backbuffer
private Image [] sprites;//all images used in game
private Lemming[] lemmings; //array of all Lemmings in level
private int nextLem;//next Lemming to be received from Gate class
private int running;//state of game
private static final int FRAMERATE=180;//assigned framerate
public Game(WorldFile loader){
super("Lemmings");
setLocation(50,40);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
width=3+loader.x*10;height=29+loader.y*10;
loadImages();
lemmings=new Lemming[loader.noLemmings*loader.gates().length];
setSize(width,height);
setVisible(true);
addMouseListener(this);
addKeyListener(this);
this.loader=loader;
running=2;
dbImage= createImage(width,height);
dbg=dbImage.getGraphics();
wrld=new World(loader,createImage(width,height), sprites, this);
gameLoop();
}
public void loadImages(){
sprites=new Image[2];
sprites[0]=new ImageIcon("Resources/toolbar.png").getImage();
sprites[1]=new ImageIcon("Resources/selector.png").getImage();
}
public static void delay(long len){
try{
Thread.sleep(len);
}catch(InterruptedException e){
System.out.println(e);
}
}
public void moveLemmings(){
if(nextLem>0)
for(int i = 0;i<nextLem;i++)
lemmings[i].cycle();
}
public void gameLoop(){
wrld.openGates();
while(running>0){
delay(1000/FRAMERATE);
if(running==2){
gateCounter++;
if(gateCounter>FRAMERATE*2){
wrld.cycleGates();
gateCounter=0;
}
moveLemmings();
if(nextLem>0)
wrld.checkPositions(lemmings,nextLem);
}
repaint();
//paint(getGraphics());
}
}
public void paint(Graphics g){
if(wrld!=null){
dbg.setColor(Color.BLACK);
dbg.fillRect(0, 0, width, height);
wrld.draw(dbg);
if(nextLem>0)
for(int i=0;i<nextLem;i++){
lemmings[i].draw(dbg);
}
dbg.drawImage(sprites[0],0,0,null);
dbg.drawImage(sprites[1],tool-3*39,0,null);
g.drawImage(dbImage,3,29,this);
}
}
public void addLemming(Lemming lemmy) {
lemmings[nextLem]=lemmy;
lemmy.spawn();
nextLem++;
}
public void goal(){
running=0;
dispose();
new Menu();
}
public void fail(){
running=0;
dispose();
new Menu();
}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void keyTyped(KeyEvent e) {}
public void mousePressed(MouseEvent e) {
System.out.println("boop");
mx=e.getX();
my=e.getY();
if(my<40)
if(mx<40)
tool=Lemming.CLIMB;
else if(mx>39&&mx<=39*2)
tool=Lemming.CHUTE;
}
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}
public void keyPressed(KeyEvent e) {
System.out.println("boop2");
}
public void keyReleased(KeyEvent e) {
}
}
如果重要的话,程序从这里开始并转到 Game 类
package me.LemmingsGame;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;
public class Menu extends JFrame implements ActionListener{
/**
*
*/
private static final long serialVersionUID = -1448646591011984524L;
private JComboBox worldList;
private JButton launch, worldEditor;
private String [] worldPaths;
private String [] worldNames;
private int currentWorld;
public Menu(){
super("Lemmings! By: Jordan and Seth");
this.setLocation(new Point(550,400));
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
File listDir[] = new File("./Worlds").listFiles();
int x=0;
for (int i = 0; i < listDir.length; i++)
if (listDir[i].isDirectory())
x++;
worldPaths=new String[x];
worldNames=new String[x];
x=0;
for (int i = 0; i < listDir.length; i++)
if (listDir[i].isDirectory()){
worldPaths[x]=listDir[i].getPath().substring(2);
worldNames[x]=worldPaths[x].substring(7);
x++;
}
worldList=new JComboBox(worldNames);
worldList.addActionListener(this);
worldEditor=new JButton("Open World Editor");
worldEditor.addActionListener(this);
launch = new JButton("Play");
launch.addActionListener(this);
Container cp = getContentPane();
cp.setLayout(new FlowLayout());
cp.add(worldEditor);
cp.add(worldList);
cp.add(launch);
pack();
setVisible(true);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==worldEditor){
dispose();
new MapEditor();
}else if(e.getSource()==launch){
dispose();
try {
new Game(new WorldFile(worldPaths[currentWorld]));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}else if(e.getSource()==worldList){
currentWorld=worldList.getSelectedIndex();
}
}
public static void main(String [] args){
new Menu();
}
}
可能无关紧要,但这是 github 存储库的插件 https://github.com/cybnetsurfe3011/Lemmings-Computer-Science/
最佳答案
您正在主线程中执行Thread.sleep()
,在本例中是 EDT(事件调度程序线程)。该线程负责绘制图形并监听事件。通过执行 Thread.sleep() ,您实际上是在暂停它,从而不允许它完成它的工作。
您似乎想定期刷新 GUI(至少我是这么猜测的)。如果是这种情况,您将需要将逻辑移动到一个新的单独线程,然后从您将生成的线程中调用您需要的更新方法。要使更改可见,您需要使用 SwingUtilities.invokeLater() 再次调用事件调度程序线程。方法。
关于java - 带延迟的 while 循环使 JFrame 无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10974673/
运行 PostgreSQL(7.4 和 8.x),我认为这是可行的,但现在我遇到了错误。 我可以单独运行查询,它工作得很好,但如果我使用 UNION 或 UNION ALL,它会抛出错误。 这个错误:
我试图为我的应用程序创建一个导航,使用抽屉导航我的 fragment 之一(HomeFragment)有一个 ViewPager,可容纳 3 个 fragment (Bundy Clock、Annou
以我目前正在开发的应用为例: - 它有一个包含多个项目的抽屉导航;现在有两个项目让我感兴趣,我将它们称为 X 和 Y。 X 和 Y 都在单击时显示包含 x 元素或 y 元素列表的 fragment 选
我有一个形状为 (370,275,210) 的 NumPy 数组,我想将其重新整形为 (275,210,370)。我将如何在 Python 中实现这一点? 370是波段数,275是行数,210是图像包
我们如何与被子 UIViewController 阻止的父 UIViewController(具有按钮)交互。显然,触摸事件不会通过子 Nib 。 (启用用户交互) 注意:我正在加载默认和自定义 NI
我是 Jpa 新手,我想执行过程 我的代码如下 private static final String PERSISTENCE_UNIT_NAME = "todos"; private static
与安装了 LAMP 的 GCE 相比,选择与 Google Cloud SQL 链接的 GCE 实例有哪些优势? 我确定 GCE 是可扩展的,但是安装在其上的 mysql 数据库的可扩展性如何? 使用
这个问题在这里已经有了答案: Value receiver vs. pointer receiver (3 个答案) 关闭 3 年前。 我刚接触 golang。只是想了解为 Calc 类型声明的两种
我不小心按了一个快捷键,一个非常漂亮的断线出现在日期上。 有点像 # 23 Jun 2010 -------------------- 有人知道有问题的快捷方式吗?? (我在 mac 上工作!) 在
我正在Scala中编写正则表达式 val regex = "^foo.*$".r 这很好,但是如果我想做 var x = "foo" val regex = s"""^$x.*$""".r 现在我们有
以下 XML 文档在技术上是否相同? James Dean 19 和: James Dean 19 最佳答案 这两个文档在语义上是相同的。在 X
我在对数据帧列表运行稳健的线性回归模型(使用 MASS 库中的 rlm)时遇到问题。 可重现的示例: var1 <- c(1:100) var2 <- var1*var1 df1 <- data.f
好的,我有一个自定义数字键盘,可以在标签(numberField)中将数字显示为 0.00,现在我需要它显示 $0.00。 NSString *digit = sender.currentTitle;
在基于文档的应用程序中,使用 XIB 文件,创建新窗口时其行为是: 根据最后一个事件的位置进行定位和调整大小 window 。 如果最后一个事件窗口仍然可见,则新窗口 窗口应该是级联的,这样它就不会直
我想使用参数进行查询,如下所示: SELECT * FROM MATABLE WHERE MT_ID IN (368134, 181956) 所以我考虑一下 SELECT * FROM MATABLE
我遇到一些性能问题。 我有一个大约有 200 万行的表。 CREATE TABLE [dbo].[M8]( [M8_ID] [int] IDENTITY(1,1) NOT NULL,
我在 jquery 中的按键功能遇到问题。我不知道为什么按键功能不起作用。我已经使用了正确的 key 代码。在我的函数中有 2 个代码,其中包含 2 个事件键,按一个键表示 (+) 代码 107 和(
我想显示音频波形,我得到了此代码,它需要.raw音频输入并显示音频波形,但是当我放入.3gp,.mp3音频时,我得到白噪声,有人可以帮助我如何使其按需与.3gp一起使用使用.3gp音频运行它。 Inp
我无法让 stristr 函数返回真值,我相信这是因为我的搜索中有一个 $ 字符。 当我这样做时: var_dump($nopricecart); 完整的 $nopricecart 值是 $0 ,我得
如果我有这样的循环: for(int i=0;i O(n) 次。所以do some执行了O(n)次。如果做某事是线性时间,那么代码片段的复杂度是O(n^2)。 关于algorithm - 带 If 语
我是一名优秀的程序员,十分优秀!