日期:2014-05-20 浏览次数:21191 次
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Dimension;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.Timer;
import java.util.Random;
public class SwingPinball
{
// panel
private static final int TABLE_WIDTH = 480;
private static final int TABLE_HEIGHT = 640;
// plank
private static final int PLANK_WIDTH = 60;
private static final int PLANK_HEIGHT = 15;
private static final int PLANK_Y = 600;
// ball
private static final int BALL_2R = 15;
// Random plank & ball x,y
private Random rand = new Random();
private int nPlank_X = rand.nextInt(TABLE_WIDTH - PLANK_WIDTH);
private int nBall_X = rand.nextInt(TABLE_WIDTH - BALL_2R);
private int nBall_Y = BALL_2R;
// ball speed;
private int nBallSpeed_Y = 10;
private int nBallSpeed_X = (rand.nextInt() - 1) * nBallSpeed_Y;
private JFrame jfrmMain = new JFrame("Pinball");
private JMainPanel jPinball = new JMainPanel();
private Timer tmrTask = null;
private boolean isLose = false;
public void init()
{
jPinball.setPreferredSize(new Dimension(TABLE_WIDTH, TABLE_HEIGHT));
jPinball.setBackground(Color.WHITE);
jfrmMain.add(jPinball);
KeyAdapter LeftRightListener = new KeyAdapter()
{
public void keyPressed(KeyEvent ke)
{
if (ke.getKeyCode() == KeyEvent.VK_LEFT)
{
if (nPlank_X - 10 > 0)
{
nPlank_X -= 10;
}
else
{
nPlank_X = 0;
}
}
if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
{
if (nPlank_X + PLANK_WIDTH + 10 < TABLE_WIDTH)
{
nPlank_X += 10;
}
else
{
nPlank_X = TABLE_WIDTH - PLANK_WIDTH;
}
}
}
};
jPinball.addKeyListener(LeftRightListener);
jfrmMain.addKeyListener(LeftRightListener);
tmrTask = new Timer(100, new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
if (nBall_X == 0 || nBall_X == TABLE_WIDTH - BALL_2R)
{
nBallSpeed_X = -nBallSpeed_X;
}
if (nBall_Y <= 0 || (nBall_Y + BALL_2R >= PLANK_Y && nBall_X >= nPlank_X && nPlank_X + PLANK_WIDTH >= nBall_X))
{
nBallSpeed_Y = -nBallSpeed_Y;
}
if (nBall_Y + BALL_2R >= PLANK_Y && (nBall_X < nPlank_X || nPlank_X + PLANK_WIDTH < nBall_X))
{
tmrTask.stop();
isLose = true;
jPinball.repaint();
}
nBall_X += nBallSpeed_X;
nBall_Y += nBallSpeed_Y;
jPinball.repaint();
}
});
tmrTask.start();
jfrmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfrmMain.pack();
jfrmMain.setVisible(true);
}
class JMainPanel extends JPanel
{
public void paint(Graphics g)
{
if (isLose)
{
g.setColor(Color.RED);
g.setFont(new Font("Times", Font.BOLD, 32));
g.drawString("Game over", 50, 200);
}
else
{
g.setColor(Color.YELLOW);
g.fillOval(nBall_X, nBall_Y, BALL_2R, BALL_2R);
g.setColor(Color.GREEN);
g.fillRect(nPlank_X, PLANK_Y, PLANK_WIDTH, PLANK_HEIGHT);
}
}
}
public static void main(String[] args)
{
new SwingPinball().init();
}
}