IntelliJ Idea在从bash调用java时并不总是按预期运行我的代码
我正在学习建立一个游戏 然而,当我从IntelliJ Idea运行代码时,有时它不会呈现,有时会呈现。 这不是渲染。 这是渲染 然后我试着用一个终端来运行它,它每次都能正常运行。 为什么? 这是我的配置 java在这里 `IntelliJ Idea在从bash调用java时并不总是按预期运行我的代码,java,intellij-idea,Java,Intellij Idea,我正在学习建立一个游戏 然而,当我从IntelliJ Idea运行代码时,有时它不会呈现,有时会呈现。 这不是渲染。 这是渲染 然后我试着用一个终端来运行它,它每次都能正常运行。 为什么? 这是我的配置 java在这里 ` package com.tutorial.main; 导入java.awt.*; 导入java.awt.image.BufferStrategy; 导入java.util.Random; 公共类游戏扩展画布实现可运行{ 私有静态最终长serialVersionUID=156
package com.tutorial.main;
导入java.awt.*;
导入java.awt.image.BufferStrategy;
导入java.util.Random;
公共类游戏扩展画布实现可运行{
私有静态最终长serialVersionUID=1569537827497786082L;
公共静态最终整数宽度=640,高度=宽度/12*9;
私有线程;
私有布尔运行=false;
私人经办人;
私有随机r;
公共游戏(){
handler=新的handler();
新窗口(宽度、高度,“让我们构建一个游戏吧!”,此窗口);
r=新随机数();
对于(int i=0;i<50;i++){
handler.addObject(新播放器(r.nextInt(宽度)、r.nextInt(高度)、ID.Player));
}
//addObject(新玩家(200200,ID.Player));
}
公共同步的void start(){
线程=新线程(此);
thread.start();
运行=真;
}
公共同步无效停止(){
试一试{
thread.join();
运行=错误;
}捕获(例外e){
e、 printStackTrace();
}
}
公开募捐{
long lastTime=System.nanoTime();
双amountOfTicks=60.0;
双ns=1000000000/个;
双增量=0;
长定时器=System.currentTimeMillis();
int帧=0;
(跑步时){
long now=System.nanoTime();
增量+=(现在-上次)/ns;
上次=现在;
而(增量>=1){
勾选();
三角洲--;
}
如果(正在运行)
render();
frames++;
if(System.currentTimeMillis()-计时器>1000){
定时器+=1000;
系统输出打印项次(“FPS:+帧);
帧=0;
}
}
停止();
}
私人空白勾号(){
handler.tick();
}
私有void render(){
BufferStrategy bs=this.getBufferStrategy();
如果(bs==null){
这一战略(3);
回来
}
Graphics g=bs.getDrawGraphics();
g、 设置颜色(颜色为黑色);
g、 fillRect(0,0,宽度,高度);
handler.render(g);
g、 处置();
b.show();
}
公共静态void main(字符串[]args){
新游戏();
}
}
`
一些更新: 我在macOS High Sierra 10.13.1上使用了Oracle的JavaSE9JDK 我试图使用Eclipse,但问题有时会出现,但不是那么频繁 我还尝试使用OpenJDK1.7构建和运行源代码。问题仍然存在,但变得不太常见
我在Windows10上使用OpenJDK1.8进行了尝试,但该错误从未出现。我自己找到了原因。这是macOS High Sierra和Java AWT包的错误! JavaAWT是一个不推荐使用的软件包,macOS不太支持它 因此,在画布渲染不好时正确显示帧的原因是代码使用JavaSwing包创建窗口(JFrame),而画布来自AWT 后来我尝试了awt的一些其他特性,例如java.awt.event.KeyEvent,但有时也会失败
因此,我认为最好的解决方案是停止在macOS上使用java awt包。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参见:如何创建。使用链接改进您的问题-不要通过评论添加更多信息。谢谢@GhostCat使用评论中的
[edit]
快捷方式创建链接,而不是说“edit”。@AndyTurner整洁的一个,谢谢。马上更新我的自动文本@幽灵猫谢谢你的建议!这是我第一次问问题。
package com.tutorial.main;
import java.awt.*;
import java.awt.image.BufferStrategy;
import java.util.Random;
public class Game extends Canvas implements Runnable {
private static final long serialVersionUID = 1569537827497786082L;
public static final int WIDTH = 640, HEIGHT = WIDTH / 12 * 9;
private Thread thread;
private Boolean running = false;
private Handler handler;
private Random r;
public Game() {
handler = new Handler();
new Window(WIDTH, HEIGHT, "Let's Build a Game!", this);
r = new Random();
for (int i = 0; i < 50; i++) {
handler.addObject(new Player(r.nextInt(WIDTH), r.nextInt(HEIGHT), ID.Player));
}
// handler.addObject(new Player(200, 200, ID.Player));
}
public synchronized void start() {
thread = new Thread(this);
thread.start();
running = true;
}
public synchronized void stop() {
try {
thread.join();
running = false;
}catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
long lastTime = System.nanoTime();
double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
long timer = System.currentTimeMillis();
int frames = 0;
while(running){
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
while (delta >= 1) {
tick();
delta--;
}
if(running)
render();
frames++;
if (System.currentTimeMillis() - timer > 1000) {
timer += 1000;
System.out.println("FPS: " + frames);
frames = 0;
}
}
stop();
}
private void tick() {
handler.tick();
}
private void render() {
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
this.createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, WIDTH, HEIGHT);
handler.render(g);
g.dispose();
bs.show();
}
public static void main(String[] args) {
new Game();
}
}