Запуск: апплет не инициализирован ошибка. Как мне решить эту проблему? - PullRequest
0 голосов
/ 14 марта 2019

Я пытался сделать апплет как проект для школы, но столкнулся с этой ошибкой, которую я никогда раньше не видел. Любой совет будет очень кстати, я боролся часами безрезультатно. Кроме того, это мой первый большой проект на Java, поэтому любые другие советы, касающиеся кодирования и стиля, приветствуются. Моя IDE - blueJ, и я запустил ее в средстве просмотра апплетов, если это имеет значение. Приветствия!

import java.awt.*;
import javax.swing.*;
import java.lang.*;
import java.util.*;
import java.awt.event.*;

public abstract 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);
    }
    @Override 
    public void keyPressed(KeyEvent e){
        if (e.getKeyCode()== KeyEvent.VK_RIGHT){
            playerShip.moveRight();
        }
        else if (e.getKeyCode()== KeyEvent.VK_LEFT){
            playerShip.moveLeft();
        }
        repaint();
    }
    public void paint(Graphics g){
        int sleep_time = 0;
        int next_game_tick = 0;
        long sleepTime;
        boolean Game= true;
        long startTime= System.currentTimeMillis();
        setSize(CANVAS_SIZE, CANVAS_SIZE);
        while(Game== true){
            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();
            }

        }

    }

}

Редактировать: Здесь также класс игрока

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;
    }

}

1 Ответ

1 голос
/ 14 марта 2019

Реализация 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

Кстати, мне кажется, что выспит основной поток 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.

...