Java applet无法正确绘制

时间:2011-04-01 16:28:12

标签: java swing applet

这是主要代码

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中的控制台输出

3 个答案:

答案 0 :(得分:3)

你不应该:

  1. 覆盖applet的paint()方法。通过覆盖JPanel的paintComponent()方法完成自定义绘制,然后将面板添加到applet。

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

答案 1 :(得分:2)

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

这意味着,你的keyPress和类似的事件驱动方法应该(可能间接通过调用其他方法)改变程序的某些内部状态(即我现在在哪个房间),然后调用{{1完成。

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

你正在做的是递归调用一些没有递归结束条件的方法,这会导致你观察到的StackOverflowError(这也是这个网站的同名)。


所以,这是一个响应用户输入的示例applet:

paint

当然,在你的游戏中你不想画一些颜色的矩形,但你会为你当前所在的房间调用正确的绘画方法。你的内部状态将包括房间,它会被改变按下右键时,其中一个房间。

答案 2 :(得分:1)

我发现的两个问题:

  1. paint()中,您可以绘制初始界面(“欢迎使用...”),也可以根据startbody()致电focus。您在startbody中执行的第一件事是space = enter = left = right = up = down = false;,即您“清除”所有“键”的值。这就是您的程序密钥没有任何效果的原因。你似乎在游戏的不同“地方”的所有方法中都这样做

  2. 您还将curloc重置为0.同样的问题。并且你不需要将curloc作为参数传递给不同的方法,因为它是一个实例变量,并且在代码中的任何地方都可以看到。