У меня есть апплет для маленькой игры, над которым мы с другом работаем для нашего урока информатики. Мы пытаемся создать меню, которое открывается в начале апплета, затем через 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 секунды и обновлять фактический экран меню с той же скоростью, я получаю сообщение, но окно апплета просто белое.