BallApplet.java
上传用户:mgrzxhaci
上传日期:2009-12-20
资源大小:18k
文件大小:10k
源码类别:

其他游戏

开发平台:

Java

  1. package breakout;
  2. import java.awt.*;
  3. import java.awt.event.*;
  4. import java.applet.*;
  5. import javax.swing.*;
  6. import java.awt.event.KeyEvent;
  7. import java.net.URL;
  8. /**
  9.  * <p>Title: </p>
  10.  * <p>Description: </p>
  11.  * <p>Copyright: Copyright (c) 2004</p>
  12.  * <p>Company: </p>
  13.  * @author not attributable
  14.  * @version 1.0
  15.  */
  16. public class BallApplet extends JApplet implements Runnable{
  17.   private boolean isStandalone = false;
  18.   //设置字体
  19.   Font largefont = new Font("Helvetica",Font.BOLD,24);
  20.   Font smallfont = new Font("Helvetica",Font.BOLD,14);
  21.   Dimension d;
  22.   FontMetrics fmsmall,fmlarge;//设置字符缓冲
  23.   Graphics goff;
  24.   Image img;
  25.   Thread theThread;           //定义小球的线程
  26.   boolean ingame = false;     //判断游戏是否在玩
  27.   int score,                  //游戏得分
  28.       ballx,                  //小球的x位置
  29.       bally,                  //小球的y位置
  30.       batpos,                 //球拍的位置
  31.       batdpos = 0,
  32.       balldx=0,
  33.       balldy = 0,
  34.       dxval,
  35.       ballsleft,
  36.       count;
  37.   boolean showtitle = true;    //显示题目
  38.   boolean[] showbrick;         //显示砖块
  39.   int bricksperline;           //每行的砖块数
  40.   final int borderwidth = 5,
  41.       batwidth = 20,
  42.       ballsize = 5,            //球的大小
  43.       batheight = 5,           //球拍的宽度
  44.       scoreheight = 20,        //得分区域宽度
  45.       screendelay = 300,
  46.       brickwidth =15,          //砖块的厚度
  47.       brickheight = 8,         //砖块的宽度
  48.       brickspace = 2,
  49.       backcol = 0x102040,      //背景颜色
  50.       numlines = 4,            //行数
  51.       startline = 32;          //开始的行
  52.   AudioClip au;
  53.   public String getAppletInfo(){
  54.     return ("BreakBall");
  55.   }
  56.   //Construct the applet
  57.   public BallApplet() {
  58.   }
  59.   //Initialize the applet
  60.   public void init() {
  61.     try {
  62.       jbInit();
  63.     }
  64.     catch(Exception e) {
  65.       e.printStackTrace();
  66.     }
  67.     d= size();
  68.     bricksperline=(d.width-2*borderwidth)/(brickwidth + brickspace);
  69.     d.width = bricksperline * (brickwidth+ brickspace) + (2*borderwidth);
  70.     showbrick = new boolean[bricksperline*numlines];
  71.     GameInit();
  72.     try {
  73.           URL url = Class.forName("breakout.BallApplet").getResource("move.au");
  74.           au = getAudioClip(url);
  75.         }
  76.         catch (Exception e) {
  77.           e.printStackTrace();
  78.         }
  79.   }
  80.   //Component initialization
  81.   private void jbInit() throws Exception {
  82.     this.setSize(new Dimension(400,300));
  83.   }
  84.   //Main method
  85.   public static void main(String[] args) {
  86.     BallApplet applet = new BallApplet();
  87.     applet.isStandalone = true;
  88.     JFrame frame = new JFrame();
  89.     frame.setDefaultCloseOperation(3);
  90.     frame.setTitle("弹球");
  91.     frame.getContentPane().add(applet, BorderLayout.CENTER);
  92.     applet.init();
  93.     applet.start();
  94.     frame.setSize(400,320);
  95.     Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  96.     frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
  97.     frame.setVisible(true);
  98.     frame.setFocusable(true);
  99.     frame.requestFocus();
  100.   }
  101.   //static initializer for setting look & feel
  102.   private void GameInit() {
  103.     batpos = (d.width-batwidth)/2;
  104.     ballx = (d.width-ballsize)/2;
  105.     bally = (d.height-ballsize-scoreheight-2*borderwidth);
  106.     score = 0;
  107.     ballsleft = 100;
  108.     dxval = 2;
  109.     if(Math.random()<0.5) balldx = dxval;
  110.     else balldx = -dxval;
  111.       balldy = -dxval;
  112.     count =screendelay;
  113.     batdpos = 0;
  114.     InitBricks();
  115.   }
  116.   private void InitBricks() {
  117.     int i;
  118.     for(i = 0;i<numlines*bricksperline;i++){
  119.       showbrick[i] = true;
  120.     }
  121.   }
  122.   public void paint(Graphics g){
  123.     String s;
  124.     g.setFont(smallfont);
  125.     fmsmall = g.getFontMetrics();
  126.     g.setFont(largefont);
  127.     fmlarge = g.getFontMetrics();
  128.     if(goff == null && d.width>0 && d.height>0){
  129.       img = createImage(d.width,d.height);
  130.       goff = img.getGraphics();
  131.     }
  132.     if(goff == null || img == null)return ;
  133.     goff.setColor(new Color(backcol));
  134.     goff.fillRect(0,0,d.width,d.height);
  135.     if (ingame) {
  136.       playGame();
  137.     }
  138.     else {
  139.       ShowIntroScreen();
  140.     }
  141.     g.drawImage(img,0,0,this);
  142.   }
  143.   public void processKeyEvent(KeyEvent e){
  144.     int nKeyCode = e.getKeyChar();
  145.     //System.out.println(nKeyCode);
  146.     switch (nKeyCode) {
  147.       case 97:
  148.         batdpos = -3;
  149.         repaint();
  150.         break;
  151.       case 100:
  152.         batdpos = 3;
  153.         repaint();
  154.         break;
  155.       case 119:
  156.         stop();
  157.         au.play();
  158.         break;
  159.       case 115:
  160.         start();
  161.         au.play();
  162.         break;
  163.     }
  164.   }
  165.   private void ShowIntroScreen() {
  166.     MoveBall();
  167.     CheckBat();
  168.     CheckBricks();
  169.     BatDummyMove();
  170.     DrawPlayField();
  171.     DrawBricks();
  172.     ShowScore();
  173.     goff.setFont(largefont);
  174.     goff.setColor(new Color(96,128,255));
  175.     count--;
  176.     if(count <=0){
  177.       count =screendelay;showtitle =!showtitle;
  178.     }
  179.   }
  180.   public void DrawBricks() {
  181.     int i,j;
  182.     boolean nobricks = true;
  183.     int colordelta = 255/(numlines - 1);
  184.     for(j=0;j<numlines;j++){
  185.       for(i = 0; i< bricksperline; i++){
  186.         if(showbrick[j* bricksperline + i]){
  187.           nobricks = false;
  188.           goff.setColor(new Color(255,j*colordelta,255-j*colordelta));
  189.           goff.fillRect(borderwidth + i*(brickwidth + brickspace),
  190.                         startline + j*(brickheight+brickspace),
  191.                         brickwidth,
  192.                         brickheight);
  193.         }
  194.       }
  195.     }
  196.     if(nobricks){
  197.       InitBricks();
  198.       if(ingame)score+=100;
  199.     }
  200.   }
  201.   public void MoveBall() {
  202.     ballx += balldx;
  203.     bally += balldy;
  204.     if(bally <= borderwidth){
  205.       balldy =-balldy;
  206.       bally = borderwidth;
  207.     }
  208.     if(bally >=(d.height-ballsize-scoreheight)){
  209.       if(ingame){
  210.         ballsleft--;
  211.         if(ballsleft <= 0)ingame = false;
  212.       }
  213.       ballx = batpos + (batwidth - ballsize)/2;
  214.       bally = startline + numlines*(brickheight+brickspace);
  215.       balldy = dxval;
  216.       balldx = 0;
  217.     }
  218.     if(ballx >= (d.width-borderwidth-ballsize)){
  219.       balldx = -balldx;
  220.       ballx = d.width-borderwidth-ballsize;
  221.     }
  222.     if(ballx<= borderwidth){
  223.       balldx = -balldx;
  224.       ballx = borderwidth;
  225.     }
  226.   }
  227.   public void CheckBat() {
  228.     batpos += batdpos;
  229.     if(batpos < borderwidth)batpos = borderwidth;
  230.     else if (batpos >(d.width-borderwidth-batwidth))
  231.       batpos = (d.width-borderwidth - batwidth);
  232.     if(bally >= (d.height-scoreheight-2*borderwidth-ballsize) &&
  233.        bally<(d.height-scoreheight-2*borderwidth) &&
  234.        (ballx+ballsize) >= batpos &&
  235.        ballx <= (batpos + batwidth)){
  236.       bally = d.height-scoreheight-ballsize-borderwidth*2;
  237.       balldy = -dxval;
  238.       balldx = CheckBatBounce(balldx,ballx - batpos);
  239.     }
  240.   }
  241.   public void CheckBricks() {
  242.     int i,j,x,y;
  243.     int xspeed = balldx;
  244.     if(xspeed <0) xspeed =-xspeed;
  245.     int ydir = balldy;
  246.     if(bally <(startline - ballsize)||bally > (startline+numlines*(brickspace + brickheight)))
  247.       return;
  248.     for(j=0;j<numlines;j++){
  249.       for(i = 0;i<bricksperline;i++){
  250.         if(showbrick[j*bricksperline + i]){
  251.           y = startline + j*(brickspace + brickheight);
  252.           x = borderwidth + i* (brickspace + brickwidth);
  253.           if(bally >= (y - ballsize) && bally<(y+ brickheight)&&
  254.              ballx >= (x - ballsize) && ballx<(x+ brickwidth)){
  255.             showbrick[j*bricksperline + i] =false;
  256.             score +=(numlines-j);
  257.             au.play();
  258.             if(ballx >=(x-ballsize) && ballx<=(x-ballsize +3)){
  259.               //左边
  260.               balldx = -xspeed;
  261.             }else if(ballx <= (x+brickwidth -1) && ballx >= (x+ brickwidth -4)){
  262.               //右边
  263.               balldx = xspeed;
  264.             }
  265.             balldy = -ydir;
  266.           }
  267.         }
  268.       }
  269.     }
  270.   }
  271.   public void BatDummyMove() {
  272.   }
  273.   public void DrawPlayField() {
  274.     goff.setColor(Color.white);
  275.     goff.fillRect(0,0,d.width,borderwidth);
  276.     goff.fillRect(0,0,borderwidth,d.height);
  277.     goff.fillRect(d.width-borderwidth,0,borderwidth,d.height);
  278.     goff.fillRect(batpos,d.height-2*borderwidth-scoreheight,batwidth,batheight);
  279.     //goff.f
  280.     goff.fillRect(ballx,bally,ballsize,ballsize);
  281.   }
  282.   private void playGame() {
  283.     MoveBall();
  284.     CheckBat();
  285.     CheckBricks();
  286.     DrawPlayField();
  287.     DrawBricks();
  288.     ShowScore();
  289.   }
  290.   public int CheckBatBounce(int dy, int delta) {
  291.     int sign;
  292.     int stepsize,i = -ballsize,j =0;
  293.     stepsize=(ballsize + batwidth)/8;
  294.     if(dy>0)sign = 1;
  295.       else sign = -1;
  296.     while(i< batwidth && delta>i){
  297.       i += stepsize;
  298.       j++;
  299.     }
  300.     switch(j){
  301.       case 0:
  302.       case 1:
  303.         return -4;
  304.       case 2:
  305.         return -3;
  306.       case 7:
  307.         return 3;
  308.       case 3:
  309.       case 6:
  310.         return sign * 2;
  311.       case 4:
  312.       case 5:
  313.         return sign * 1;
  314.       default:
  315.         return 4;
  316.     }
  317.   }
  318.   public void ShowScore() {
  319.     String s;
  320.     goff.setFont(smallfont);
  321.     goff.setColor(Color.white);
  322.     s ="得分:"+score;
  323.     goff.drawString(s,40,d.height-5);
  324.     s ="生命:"+ballsleft;
  325.     goff.drawString(s,d.width-40-fmsmall.stringWidth(s),d.height-5);
  326.   }
  327.   public void run(){
  328.     ingame = true;
  329.     this.requestFocus();
  330.     long starttime;
  331.     Graphics g;
  332.     Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
  333.     g = getGraphics();
  334.      while (true){
  335.        starttime = System.currentTimeMillis();
  336.        try{
  337.          paint(g);
  338.          starttime += 20;
  339.          Thread.sleep(Math.max(0,starttime-System.currentTimeMillis()));
  340.        }catch(InterruptedException e){
  341.          break;
  342.        }
  343.      }
  344.   }
  345.   public void start(){
  346.     requestFocus();
  347.     if(theThread == null){
  348.       theThread = new Thread(this);
  349.       theThread.start();
  350.     }
  351.   }
  352.   public void stop(){
  353.     if(theThread != null){
  354.       theThread.stop();
  355.       theThread = null;
  356.     }
  357.   }
  358. }