繁体   English   中英

Java Applet无法正确绘制

[英]Java applet not drawing correctly

这是主要代码

import java.awt.*;  

import javax.swing.*;  
import java.awt.event.*;  
import java.applet.Applet;  

import java.applet.*;  
import java.awt.image.*;  
import java.util.*;  
import java.net.*;  
public class AlcatrazBreakout extends JApplet implements KeyListener, FocusListener  {  
    int choice=0,curloc=0;  
    boolean focus = false;  
    boolean left=false, right=false, up=false, down=false, space=false, enter=false;  

    public double randNum(Graphics canvas)
    {
        double x;
        x=Math.random()*100;
        return x;
    }
    public void init()
    {

        addKeyListener(this);
        addFocusListener(this);
        play(getCodeBase(), "SpyHunter.mid");

    }
    public void paint(Graphics canvas)
    {
        clearScreen(canvas);

        canvas.setColor(Color.BLACK);  // Must do this so words will
                                       // display on the screen

         if (!focus)
         {
            canvas.setColor(Color.WHITE);
            canvas.drawString("Welcome to Alcatraz Breakout! The objective of the game is to escape Alcatraz.",10,10);
            canvas.drawString("Click the screen to begin the game.",10,30);
            return;
         }
         else if (focus)
         {
             startbody(canvas);
         }


     }
    public void showstats(Graphics canvas)
    {
        int hp=10,hpmax=10,defense=0,attack=0;
        canvas.drawString("HP: " + hp ,1750,10);
        canvas.drawString("/" + hpmax,1790,10);
        canvas.drawString("Attack: " + attack,1750,30);
        canvas.drawString("Defense: " + defense,1750,50);
    }
    public void startbody(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        showstats(canvas);
        canvas.drawString("You are in your cell.",0,10);
        canvas.drawString("Left: To the Training Room.",0,30);
        canvas.drawString("Right: To the Showers",0,50);
        curloc=0;
        makeMove(canvas,curloc, left,right,up,down);
        canvas.drawString(" "+curloc,0,70);
    }
    public void train(Graphics canvas)
    {
        System.out.println("You are at train");
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        showstats(canvas);
        canvas.drawString("You are in the training room.",0,10);
        canvas.drawString("Right: To your cell.",0,30);
        makeMove(canvas,curloc,left,right,up,down);

    }
    public void showers(Graphics canvas)
    {
        System.out.println("You are in the showers");
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        showstats(canvas);
        canvas.drawString("You are in the showers.",0,10);
        canvas.drawString("Left: To your cell.",0,30);
        curloc=1;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void cellBlockC(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("You are in CellBlock C", 0, 10);
        canvas.drawString("Left: Back to your cell",0,20);
        canvas.drawString("Up: to security room 1", 0, 40);
        curloc=2;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void SecRoom1(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in Secrity room 1.", 0, 10);
        canvas.drawString("Down: Back to Cell Block C",0,20);
        canvas.drawString("Up: Left to Guard Post", 0, 40);
        curloc=3;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void tunnel(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in Secrity room 1.", 0, 10);
        canvas.drawString("Down: Back to Cell Block C",0,20);
        canvas.drawString("Up: Left to Guard Post", 0, 40);
        curloc=7;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void guardPost(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in the Guard Post.", 0, 10);
        canvas.drawString("Left: to go to the Court Yard",0,20);
        canvas.drawString("Right: to go to Security room 1", 0, 40);
        canvas.drawString("Up: to go to Solitary Confinement",0,60);
        curloc=4;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void courtyard(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in the Court Yard", 0, 10);
        canvas.drawString("Down: to Security Room 2.",0,20);
        canvas.drawString("Up: To Guard Post", 0, 40);
        curloc=8;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void SecRoom2(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in Security Room 2.", 0, 10);
        canvas.drawString("Up: To the Court Yard", 0, 40);
        curloc=9;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void fight(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your at the Final Fight!!!", 0, 10);
        curloc=11;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void free(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("You Won!!!!", 0, 10);
        curloc=11;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void solitaryConfinement(Graphics canvas)
    {
        space=enter=left=right=up=down=false;
        clearScreen(canvas);
        canvas.setColor(Color.WHITE);
        canvas.drawString("Your in Solitary Confinement.", 0, 10);
        canvas.drawString("Down: Guard Post",0,20);
        curloc=5;
        makeMove(canvas,curloc, left,right,up,down);
    }
    public void makeMove(Graphics canvas,int curloc,boolean left, boolean right, boolean up, boolean down )
    {
        if (curloc==0)
        {
            if(left)
            {
                train(canvas);
                left=right=up=down=false;
            }
        }
    }
     public void delayGame(int numSecs)
     {
        int delayTime = 1000 * numSecs;
        long startDelay = System.currentTimeMillis();
        long endDelay = 0;

        while (endDelay - startDelay < delayTime)
        {
          endDelay = System.currentTimeMillis();
        }
     }
     public void clearScreen(Graphics g)
     {
        g.setColor(Color.BLACK);
        g.fillRect(0,0,5000,5000);
     }
     public void keyPressed(KeyEvent e)
     {
      int key = e.getKeyCode();


      if (key == KeyEvent.VK_LEFT)
      {
        left = true;
        repaint();
      }

      if (key == KeyEvent.VK_DOWN)
      {
        down = true;
        repaint();
      }

      if (key == KeyEvent.VK_RIGHT)
      {
        right = true;
        repaint();
      }

      if (key == KeyEvent.VK_UP)
      {
        up = true;
        repaint();
      }

      if (key == KeyEvent.VK_SPACE)
      {
        space = true;
        repaint();
      }

      if (key == KeyEvent.VK_ENTER)
      {
        enter = true;
        repaint();
      }

     }
     public void focusGained(FocusEvent evt) {focus=true; repaint();}
     public void focusLost(FocusEvent evt) {focus=false;}
     public void keyReleased(KeyEvent e){}
     public void keyTyped(KeyEvent e) {}
     public void restart(Graphics g){}

}  

因此,curloc的编号不会传递到makeMove中,并且程序键也无法正常工作。
谢谢
克里斯

编辑:

You are at train
[message repeated 1075 time]
You are at train
Exception in thread "AWT-EventQueue-1" java.lang.StackOverflowError
    at sun.nio.cs.SingleByteEncoder.encodeArrayLoop(Unknown Source)
    at sun.nio.cs.SingleByteEncoder.encodeLoop(Unknown Source)
    at java.nio.charset.CharsetEncoder.encode(Unknown Source)
    at sun.nio.cs.StreamEncoder.implWrite(Unknown Source)
    at sun.nio.cs.StreamEncoder.write(Unknown Source)
    at java.io.OutputStreamWriter.write(Unknown Source)
    at java.io.BufferedWriter.flushBuffer(Unknown Source)
    at java.io.PrintStream.write(Unknown Source)
    at java.io.PrintStream.print(Unknown Source)
    at java.io.PrintStream.println(Unknown Source)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:75)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)
    at AlcatrazBreakout.makeMove(AlcatrazBreakout.java:196)
    at AlcatrazBreakout.train(AlcatrazBreakout.java:81)

这是我在Eclipse中的控制台输出

你不应该:

  1. 重写applet的paint()方法。 通过重写JPanel的paintComponent()方法来完成自定义绘制,然后将面板添加到小程序中。

  2. 使用紧密循环来“延迟”游戏。 而是使用Swing计时器来安排游戏的下一步。

在AWT / Swing(或任何GUI)程序(包括applet)中,您必须将程序逻辑(即,在房间之间移动)与绘画分离。

这意味着,您的keyPress和类似的事件驱动方法应(可能通过调用其他方法间接地)更改程序的某些内部状态(即我现在所在的房间),然后调用repaint()并完成操作。

您的paint方法应查看状态,根据此状态绘制小程序,然后完成。

您正在执行的操作是从自身递归地调用某种方法而没有递归结束条件,这会导致您观察到StackOverflowError(这也是该网站的缩写)。


因此,这是一个小程序对用户输入作出反应的示例:

class ExampleApplet extends JApplet {

   /** our game state. */
   private int colorCode = 0;

   /**
    * This method will be called by the applet environment on loading the applet.
    */    
   public void init() {
      EventQueue.invokeLater(new Runnable() { public void run() {
         JApplet app = ExampleApplet.this;
         app.setContentPane(new Painter());
         app.addKeyListener(new Listener());
      }});
   }

   /**
    * An object of this class is registered as a key listener for our applet.
    * It changes the game state whenever a key is typed, and then invokes repaint().
    */
   class Listener extends KeyAdapter {
      public void keyTyped(KeyEvent e) {
         colorCode ++;
         repaint();
      }
   }

   /** This class is the contentPane of the applet, and responsible for the painting. */
   class Painter extends JPanel {

      private Color chooseColor() {
          switch(colorCode % 11) {
             case  0: return Color.WHITE;
             case  1: return Color.BLUE;
             case  2: return Color.YELLOW;
             case  3: return Color.RED;
             case  4: return Color.CYAN;
             case  5: return Color.LIGHT_GRAY;
             case  6: return Color.MAGENTA;
             case  7: return Color.GREEN;
             case  8: return Color.ORANGE;
             case  9: return Color.PINK;
             case 10: return Color.BLACK;
          }
          throw new IllegalStateException("colorCode is negative: " + colorCode);
      }

      /**
       * Paints the component dependent on the current state of the game.
       */
      public void paintComponent(Graphics g) {
         g.setColor(chooseColor());
         g.fillRectangle(0,0, getHeight(), getWidth());
      }
   }

}

当然,在您的游戏中,您不想绘制某种颜色的矩形,但是您将为当前所在的房间调用正确的绘画方法。您的内部状态将包括该房间,并且将其更改为以下一种:按下右键时,其他房间。

我发现了两个问题:

  1. paint()您可以绘制初始屏幕(“ Welcome to ...”),也可以根据focus调用startbody() startbody要做的第一件事是space = enter = left = right = up = down = false; startbody space = enter = left = right = up = down = false; 也就是说,您“清除”所有“键”的值。 这就是为什么您的程序键不起作用的原因。 您似乎在针对游戏中不同“位置”的所有方法中都这样做

  2. 您也将curloc重置为0。同样的问题。 而且,您不必真正将curloc作为不同方法的参数传递,因为它是一个实例变量,并且在代码中的任何地方都可见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM