Реализация KeyListener
Одной из проблем может быть то, что вы реализовали только один из трех методов, необходимых для интерфейса java.awt.event.KeyListener
.Вы сделали keyPressed
, но пропустили keyTyped
и keyReleased
.
@Override
public void keyTyped ( KeyEvent e )
{
…
}
@Override
public void keyPressed ( KeyEvent e )
{
…
}
@Override
public void keyReleased ( KeyEvent e )
{
…
}
Импорт
Вам может потребоваться добавить явный import
для класса Color
, чтобы распознавать его константы.
import java.awt.Color;
Константы в Javaименуется все в верхнем регистре, по соглашению.Итак, Color.BLUE
.
Соглашения об именах
Не проблема компилятора или апплета, но вы должны следовать соглашениям об именах Java для других программистов, читающих ваш код.Так что boolean Game
должно начинаться со строчной буквы.Кроме того, логические значения часто называются с префиксом is
, поэтому boolean isGame
.Я подозреваю, что вы могли бы разработать более описательную формулировку.
Кстати, для краткости, сократить while ( isGame == true )
до while ( isGame )
.
Более серьезная проблема: эта переменная isGame
используется вваш цикл while
никогда не меняет своего состояния.Таким образом, ваш while
цикл бесконечен.
Запускается
После внесения указанных изменений я вижу запуск вашего апплета с использованием IntelliJ IDE и Java 8 ( Zulu JVM от Azul Systems) через AppletViewer версия приложения 1.0 на моем MacBook Pro с macOS Mojave.
![enter image description here](https://i.stack.imgur.com/esRnG.jpg)
Кстати, мне кажется, что выспит основной поток GUI с вашей строкой Thread.sleep(sleepTime);
Я не эксперт по апплетам или AWT, но, насколько я помню, вы должны никогда не спать в основном потоке GUI.
package work.basil.example;
public class PlayerShip
{
// instance variables - replace the example below with your own
public static final int SIZE = 20;
public int shipX;
public int shipY;
public int shipLeft;
public int shipRight;
public PlayerShip ( int canvasSize )
{
shipX = canvasSize / 2;
shipY = canvasSize * 3 / 4;
}
public void moveLeft ()
{
shipX -= 1;
}
public void moveRight ()
{
shipX += 1;
}
public int getLeftBound ()
{
int leftSide = Math.round( shipX - ( SIZE / 2 ) );
return ( leftSide );
}
public int getWidth ()
{
return SIZE;
}
public int getTopBound ()
{
int topSide = Math.round( shipY - ( SIZE / 2 ) );
return ( topSide );
}
public int getHeight ()
{
return SIZE;
}
}
… и…
package work.basil.example;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class Renderer extends JApplet implements KeyListener
{
public PlayerShip playerShip;
public static final int CANVAS_SIZE = 500;
public static final int FRAMES_PER_SECOND = 20;
public static final int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
public void initLevel ()
{
playerShip = new PlayerShip( CANVAS_SIZE );
}
public void paint ( Graphics g )
{
int sleep_time = 0;
int next_game_tick = 0;
long sleepTime;
boolean isGame = true;
long startTime = System.currentTimeMillis();
setSize( CANVAS_SIZE , CANVAS_SIZE );
while ( isGame )
{
initLevel();
int leftSide = playerShip.getLeftBound();
int width = playerShip.getWidth();
int topSide = playerShip.getTopBound();
int height = playerShip.getHeight();
g.setColor( Color.BLUE );
g.fillRect( 0 , 0 , CANVAS_SIZE , CANVAS_SIZE );
g.setColor( Color.ORANGE );
g.fillRect( leftSide , topSide , width , height );
long timeElapsed = System.currentTimeMillis() - startTime;
next_game_tick += SKIP_TICKS;
sleepTime = next_game_tick - timeElapsed;
try
{
Thread.sleep( sleepTime );
} catch ( InterruptedException ex )
{
Thread.currentThread().interrupt();
}
}
}
//----------| Override `java.awt.event.KeyListener` |------------------
@Override
public void keyPressed ( KeyEvent e )
{
if ( e.getKeyCode() == KeyEvent.VK_RIGHT )
{
playerShip.moveRight();
} else if ( e.getKeyCode() == KeyEvent.VK_LEFT )
{
playerShip.moveLeft();
}
repaint();
}
@Override
public void keyTyped ( KeyEvent e )
{
// No code needed here.
}
@Override
public void keyReleased ( KeyEvent e )
{
// No code needed here.
}
}
Я добавлю обязательное предостережение о том, что технология Java Applet постепенно прекращается разработчиками веб-браузеров, а также Oracle исообщество Java.Этот проект отлично подходит для обучения.Но для реальной работы вы, вероятно, захотите узнать о OpenJFX и использовании jlink для связывания среды выполнения Java.