簡體   English   中英

盡管運行代碼顯示菜單,Java小程序仍顯示白屏

[英]Java applet shows white screen despite running code to display the menu

我有一個小游戲的小程序,我和一個朋友正在為我們的計算機科學課做工。 我們試圖使一個菜單在小程序的開頭打開,然后在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

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

我不了解您,但是當我編譯您的代碼時,我得到了

注意:... / FinalProjectTest.java使用或覆蓋不推薦使用的API。 注意:有關詳細信息,請使用-Xlint:deprecation重新編譯。

因此,如果啟用了編譯器標志,則會得到...

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中刪除了小程序,這是非常重要的時間。

實際上,當我運行代碼時,我得到:

警告:不建議使用Applet API和AppletViewer。

問題二

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 {

為什么CharacterFinalProjectTest擴展? 它甚至沒有添加到任何可以繪畫的容器中...哦,親愛的...

回答...

重新開始。

不,認真地,放棄您所做的一切,然后重新開始。 這次從閱讀(和理解)開始...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM