Java-апплет показывает белый экран несмотря на выполнение кода для отображения меню - PullRequest
0 голосов
/ 20 апреля 2019

У меня есть апплет для маленькой игры, над которым мы с другом работаем для нашего урока информатики. Мы пытаемся создать меню, которое открывается в начале апплета, затем через 1 секунду появляется экран выбора класса. Однако через одну секунду экран просто становится белым, но выводит оператор печати, назначенный для сигнала загрузки экрана выбора класса, я не уверен, почему это происходит, и хотел бы решить эту проблему.

Я попытался поместить код для отображения экрана выбора класса в другом потоке, чтобы ничто иное не сдерживало его при запуске, однако это ничего не изменило. Я также удостоверился, что условия для показа экрана верны, и чтобы он показывался каждые 0,2 секунды, но, похоже, ничего не работает. Я попытался заставить код работать в конструкторе для персонажа, и он должен запускаться один раз, он запускается один раз, но проблема с его выполнением один раз заключается в том, что он сразу же выходит из меню и переходит к следующему этапу игры для без причины.

import java.awt.*;
import java.applet.*;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.util.*;

public class FinalProjectTest extends Applet implements KeyListener, Runnable, MouseListener
{
   int xCoord = 50;
   int yCoord = 600;
   int moveScale = 20;
   int xSize = 20;
   int ySize = 20;

   int leftWall = 0;
   int rightWall = 1000;
   int topWall = 0;
   int bottomWall = 650;
   public volatile Graphics graphics;
   boolean isInMenu = false;
   boolean firstRun = true;
   boolean drawMap = true;

   int hostileAmount = 1000;

   Character P1;

   @Override
   public void init()
   {
      addKeyListener(this);
      addMouseListener( this );
   }

   public void Looper(Graphics g)
   {
      drawPlayer(g);

      // Enemy 1
      HostileObject enemy = new HostileObject(100, 250);
      enemy.CreateHostile(g);
   }

   public void paint(Graphics g)
   {
      if (firstRun)
      {
         firstRun = false;
         isInMenu = true;
         System.out.println("Character Created");
         P1 = new Character(g);
      }
      if (!isInMenu && !firstRun)
      {
         System.out.println("Game has begun!");
         Map1 firstMap = new Map1(g);
         Looper(g);
      }
   }

   public void drawPlayer(Graphics g)
   {
      g.setColor(Util.black);
      g.fillRect(xCoord - xSize, yCoord - ySize, xSize, ySize);
   }

   public void MovePlayer(int x, int y)
   {
      if (CheckPosition(xCoord + x, yCoord + y))
      {
         xCoord += x;
         yCoord += y;
      }
   }

   public boolean CheckPosition(int x, int y)
   {
      if (WallCheck1(x,y) && WallCheck2(x,y) && CheckBorders(x, y))
      {
         return true;
      }
      else
         return false;
   }

   public boolean CheckBorders(int x, int y)
   {
      if (y + ySize <= bottomWall && y - ySize >= topWall && x - xSize >= leftWall && x + xSize <= rightWall)
      {
         return true;
      }
      else
         return false; 
   }

   public boolean WallCheck1(int x, int y)
   {
      if ((y - ySize >= Map1.wall1y1 || y + ySize <= Map1.wall1y2 + 20) || x - xSize >= Map1.wall1x2)
      {
         return true;
      }
      else
         return false; 
   }
   public boolean WallCheck2(int x, int y)
   {
      if ((y - ySize >= Map1.wall2y1 || y + ySize <= Map1.wall2y2 + 20) || x - xSize <= Map1.wall2x2)
      {
         return true;
      }
      else
         return false;
   }

   boolean keyIsHeld;
   char moveChar;

   public void keyReleased( KeyEvent e )
   {
      keyIsHeld = false;
      moveChar = ' ';
   }
   public void keyTyped( KeyEvent e ) { }

   public void keyPressed( KeyEvent a )
   {
      char c = a.getKeyChar();
      if ( c == 'w' )
      {
         moveChar = 'w';
         keyIsHeld = true;
      }
      else if ( c == 'a')
      {
         moveChar = 'a';
         keyIsHeld = true;
      }
      else if ( c == 's')
      {
         moveChar = 's';
         keyIsHeld = true;
      }
      else if ( c == 'd')
      {
         moveChar = 'd';
         keyIsHeld = true;
      }
   }

   public void mouseClicked(MouseEvent e)
   {
      int x = e.getX();
      int y = e.getY();
      if (isInMenu && P1.ClassID == 0)
      {
         if (x < 500 && y > 100 && y < 375)
         {
            P1.ClassID = 1;
            isInMenu = false;
            System.out.println(P1.Pseudo + " has chosen class: Warrior!");
         }
         if (x < 500 && y >= 375)
         {
            P1.ClassID = 3;
            isInMenu = false;
            System.out.println(P1.Pseudo + " has chosen class: UO3!");
         }
         if (x >= 500 && y > 100 && y < 375)
         {
            P1.ClassID = 2;
            isInMenu = false;
            System.out.println(P1.Pseudo + " has chosen class: Thief!");
         }
         if (x >= 500 && y >= 375)
         {
            P1.ClassID = 4;
            isInMenu = false;
            System.out.println(P1.Pseudo + " has chosen class: Mage!");
         }
         repaint();
      }
   }
   public void mouseEntered(MouseEvent e){}
   public void mouseExited(MouseEvent e) {}
   public void mousePressed(MouseEvent e) {}
   public void mouseReleased(MouseEvent e) {}
   public boolean mouseDown(Event e, int x, int y){return true;}

   public void run()
   {
      while (!isInMenu || !firstRun)
      {
         if (moveChar == 'w')
         {
            MovePlayer(0, -moveScale);
         }
         else if (moveChar == 'a')
         {
            MovePlayer(-moveScale, 0);
         }
         else if (moveChar == 's')
         {
            MovePlayer(0, moveScale);
         }
         else if (moveChar == 'd')
         {
            MovePlayer(moveScale, 0);
         }
         Util.wait(200);
         repaint();
      }
   } 

   Thread moveThread;
   Graphics g;
   boolean increaseDecrease = false;

   public void SetUpGraphics(Graphics graphics)
   {
      g = graphics;
   }

   public void start ()
   {
      if (moveThread == null)
      {
         moveThread = new Thread(this);
         moveThread.start();
      }
   }

}

class Map1 extends FinalProjectTest
{
   protected static int wall1x1 = 0;
   protected static int wall1y1 = 500;
   protected static int wall1x2 = 810;
   protected static int wall1y2 = 440;

   protected static int wall2x1 = 1000;
   protected static int wall2y1 = 200;
   protected static int wall2x2 = 190;
   protected static int wall2y2 = 140;
   public Map1(Graphics g)
   {
      Walls wall1 = new Walls(g, wall1x1, wall1y1, wall1x2, wall1y2);
      Walls wall2 = new Walls(g, wall2x1, wall2y1, wall2x2, wall2y2);
   }
}

class HostileObject
{
   private int startPosX, startPosY;
   private int xSize = 35;
   private int ySize = 35;
   public int health = 100;

   public HostileObject(int x, int y)
   {
      startPosX = x;
      startPosY = y;
   }

   public void CreateHostile(Graphics g)
   {
      g.setColor(Util.black);
      //Util.fillRect(g ,startPosX,startPosY,xSize,ySize);
   }
}

class Walls
{
   private static int wallCount = 2;

   public Walls(Graphics g, int x1, int y1, int x2, int y2)
   {
      Util.fillRect(g, x1, y1, x2, y2);
   }
}



class Character extends FinalProjectTest implements MouseListener, Runnable
{
   protected int ClassID = 0;
   protected int PlayerID = 0;
   protected int GP = 100;
   protected String Pseudo = "Muritor";
   protected boolean DebuggingMode = false;
   protected Graphics menuGraphics;
   Thread startMenuThread;

   public Character(Graphics g)
   {
      g.setColor(Util.black);
      Util.fillRect(g, 1, 1, 1000, 650);
      Util.drawButton(g, 1, 1, 1000, 100, "3 Floors", 2);
      Util.wait(1000);
      menuGraphics = g;
      startMenuThread = new Thread(this);
      startMenuThread.start();
   }

   public void run()
   {
      while (Thread.currentThread() == startMenuThread)
      {
         Util.fillRect(menuGraphics, 1, 1, 1000, 650);
         Util.drawButton(menuGraphics, 1, 1, 1000, 100, "Choose a Class", 2);
         Util.drawButton(menuGraphics, 1, 100, 500, 375, "Warrior", 1);
         Util.drawButton(menuGraphics, 501, 100, 1000, 375, "Thief", 1);
         Util.drawButton(menuGraphics, 1, 376, 500, 650, "UO3", 1);
         Util.drawButton(menuGraphics, 501, 376, 1000, 650, "Mage", 1);
         repaint();
         System.out.println("Menu loaded");
         Util.wait(200);
      }
   } 

   public static void ButtonSelection(Graphics g)
   {

   }
}



class Util
{
   static final Color black = Color.black;
   static final Color white = Color.white;

   public static void wait(int mil)
   {
      try
      {
         Thread.sleep((mil));
      }
      catch(InterruptedException ex)
      {
         Thread.currentThread().interrupt();
      }
   }

   public static void fillRect(Graphics g, int x1, int y1, int x2, int y2)
   {
      int widthPlaceholder = x2 - x1;
      int heightPlaceholder = y2 - y1;
      g.fillRect(x1,y1,widthPlaceholder,heightPlaceholder);
   }

   public static void drawButton(Graphics g, int x1, int y1, int x2, int y2, String title, int fontType)
   {
      g.setColor(Util.black);
      int widthPlaceholder = x2 - x1;
      int heightPlaceholder = y2 - y1;
      g.fillRect(x1,y1,widthPlaceholder,heightPlaceholder);
      g.setColor(Util.white);
      widthPlaceholder = x2 - x1;
      heightPlaceholder = y2 - y1;
      for (int k = 0; k < 3; k++)
      {
         g.drawRect(x1+k,y1+k,widthPlaceholder-k,heightPlaceholder-k);
      }
      switch(fontType)
      {
         case 1:
            Font characterCreateButton = new Font("SansSerif", Font.PLAIN, 75);
            g.setFont(characterCreateButton);
            g.drawString(title, x1+100, y1+100);
            break;
         case 2:
            Font characterCreateTitle = new Font("SansSerif", Font.BOLD, 100);
            g.setFont(characterCreateTitle);
            g.drawString(title, x1+25, y1+80);
            break;
         case 3:
            Font mainMenu = new Font("Arial", Font.ITALIC, 50);
            g.setFont(mainMenu);
            break;
      }
   }
}

Я ожидаю, что он будет говорить «Меню загружено» каждые 0,2 секунды и обновлять фактический экран меню с той же скоростью, я получаю сообщение, но окно апплета просто белое.

1 Ответ

1 голос
/ 20 апреля 2019

Задача № 1

public class FinalProjectTest extends Applet implements KeyListener, Runnable, MouseListener {

Я не знаю о вас, но когда я компилирую ваш код, я получаю

Примечание: ... / FinalProjectTest.java использует или отменяет устаревший API. Примечание: Перекомпилируйте с -Xlint: не рекомендуется для подробностей.

Итак, если я включу флаг компилятора, я получу ...

Compiling 1 source file to .../build/classes
.../FinalProjectTest.java:18: warning: [deprecation] Applet in java.applet has been deprecated
public class FinalProjectTest extends Applet implements KeyListener, Runnable, MouseListener {
.../FinalProjectTest.java:179: warning: [deprecation] mouseDown(Event,int,int) in Component has been deprecated
    public boolean mouseDown(Event e, int x, int y) {
                   ^
.../FinalProjectTest.java:179: warning: [deprecation] Event in java.awt has been deprecated
    public boolean mouseDown(Event e, int x, int y) {
                             ^
3 warnings

Это должно вызывать тревогу.

Апплеты активно устарели и просто больше не поддерживаются, и, как полагают, были удалены в последних версиях API, серьезно пора двигаться дальше.

На самом деле, когда я запускаю код, я получаю:

Предупреждение: API апплета и AppletViewer устарели.

Задача № 2

public void paint(Graphics g) {
    if (firstRun) {
        firstRun = false;
        isInMenu = true;
        System.out.println("Character Created");
        P1 = new Character(g);
    }
    if (!isInMenu && !firstRun) {
        System.out.println("Game has begun!");
        Map1 firstMap = new Map1(g);
        Looper(g);
    }
}

Живопись должна рисовать состояние, а не принимать логические решения или менять состояние, на самом деле, что еще больше беспокоит, так это ...

P1 = new Character(g);

Вы никогда не должны поддерживать ссылку на Graphics контекст, который вы не создали сами. Система рисования в AWT / Swing использует общий контекст, поэтому все компоненты будут использовать один и тот же Graphics контекст, также нет гарантии, что контекст будет одинаковым между циклами рисования.

Это также подчеркивает, что вы не понимаете, как работает система рисования в AWT / Swing.

Начните с Выполнение пользовательской рисования и Рисование в AWT и Swing для получения более подробной информации о том, как рисование действительно работает и как с ним работать

Задача ♾

Ладно, с этого момента все остальное просто накапливается на основе вышесказанного, бесконечно усугубляет плохую ситуацию, например ...

    public void run() {
        while (Thread.currentThread() == startMenuThread) {
            Util.fillRect(menuGraphics, 1, 1, 1000, 650);
            Util.drawButton(menuGraphics, 1, 1, 1000, 100, "Choose a Class", 2);
            Util.drawButton(menuGraphics, 1, 100, 500, 375, "Warrior", 1);
            Util.drawButton(menuGraphics, 501, 100, 1000, 375, "Thief", 1);
            Util.drawButton(menuGraphics, 1, 376, 500, 650, "UO3", 1);
            Util.drawButton(menuGraphics, 501, 376, 1000, 650, "Mage", 1);
            repaint();
            System.out.println("Menu loaded");
            Util.wait(200);
        }
    }

Это "может" показаться нормальным, но если вы понимаете, как рисование, вы поймете, что вызов repaint сработает, и раскраска пройдет, и вы вызовете paint снова и ... подождите, подождите. ..

class Character extends FinalProjectTest implements MouseListener, Runnable {

Почему Character простирается от FinalProjectTest ?? Его даже не добавляют ни в один контейнер, который может его покрасить ... о боже ...

Ответ ...

Начать заново.

Нет, серьезно, выбросьте то, что вы сделали, и начните заново. На этот раз начните с чтения (и понимания) ...

  • Основные ОО проектные концепции «разделения ответственности». Вместо того, чтобы объединить всю вашу логику в один метод, разделите ответственность каждой части вашей программы на их собственный класс (ы). Меню должно быть одним, отдельным компонентом, игровой холст должен быть отдельным, отдельным компонентом, тогда у вас должен быть «контроллер», который может, основываясь на обратной связи от этих компонентов (через шаблон наблюдателя ) решить, когда каждый должен быть показан (и как).
  • Model-View-Controller (который сливается с предыдущим комментарием)
  • Выполнение пользовательской живописи и Рисование в AWT и Swing
  • Как использовать привязки клавиш , потому что KeyListener здесь не очень хороший выбор
  • Параллелизм в Swing , потому что Swing, как и большинство сред с графическим интерфейсом, не является потоковым и однопоточным, и вы должны знать, как с ним обращаться.
  • Как сделать фреймы (главное окно) , потому что апплеты мертвы
  • Как использовать CardLayout , поскольку это поможет сделать вашу жизнь проще
  • Использовать JavaFX. По крайней мере, вы должны использовать Swing, но если вы можете, используйте JavaFX
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...