Canvas画布默认坐标原点是左上角
|
package com.one.graphics01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class BallGameDemo {
Frame f=new Frame("弹球游戏");
private final int TABLIE_WIDTH=400;//桌面大小,即画布大小
private final int TABLIE_HEIGHT=400;
private final int BAT_WIDTH=60;//小球大小
private final int BAT_HEIGHT=20;
private final int BALL_SIZE=16;
private int ballX =300;//小球起始坐标
private int ballY =0;
private int batX =300; //球拍起始坐标
private final int BAT_Y=340;
private int ballSpeedX =5;//小球的速度,即小球的运动轨迹
private int ballSpeedY =5;
private boolean isOver=false;//初始定义游戏是否结束:运行中(未结束)
private Timer timer;//声明一个定时器
//Canvas只是用来画画面
private class myCanvas extends Canvas{
@Override
public void paint(Graphics g) {
if (isOver){
//over
g.setColor(Color.RED);
//Font(String name, int style, int size)
// 创建指定名称的一个新的 Font,样式和大小
g.setFont(new Font("over",Font.BOLD,30));
/*drawString(String str, int x, int y)
使用指定的字符串绘制的文本,使用此图形上下文的当前字体和颜色。*/
g.drawString("Over",150,200);
}else{
g.setColor(Color.CYAN );
g.fillOval(ballX, ballY,BALL_SIZE,BALL_SIZE);
g.setColor(Color.MAGENTA);
g.fillRect(batX,BAT_Y,BAT_WIDTH,BAT_HEIGHT);
}
}
}
myCanvas c=new myCanvas();
private void game() {
//创建一个键盘监听器
KeyListener key = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT) {//按键盘上的<-,即球拍向左移
if (batX > 0) {//不能让球拍移出画布外
batX -= 20;//移多少可以自己定
}
} else if (keyCode == KeyEvent.VK_RIGHT) {//按键盘上的->,即球拍向右移
if (batX < TABLIE_WIDTH - BAT_WIDTH) {
batX += 20;
}
}
}
};
f.addKeyListener(key);//给Frame Canvas 注册监听器
c.addKeyListener(key);
ActionListener al=new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (ballX <0|| ballX >=TABLIE_WIDTH-BALL_SIZE){
ballSpeedX = -ballSpeedX;//碰到边缘后返回
}
if(ballY <0|| ballY >BAT_Y-BALL_SIZE&& ballX > batX && ballX <= batX +BAT_WIDTH){
// 小球超过桌面上边缘 || 小球坐标超过球拍上表面 并且小球处于球拍宽度之内 小球反向即小球碰到球拍反弹
ballSpeedY = -ballSpeedY;//碰到边缘后返回
}
if (ballY >BAT_Y-BALL_SIZE&& (ballX < batX || ballX > batX +BAT_WIDTH) ){
// 没接住球 不要忘了这个小括号--> (ballX<batX||ballX>batX+BAT_WIDTH)
//即游戏结束
timer.stop();//关闭定时器
isOver=true;//修改游戏状态:结束
c.repaint();//重绘画面
}
// 修正小球坐标
ballX += ballSpeedX;
ballY += ballSpeedY;
c.repaint();
}
};
timer =new Timer(100,al);
timer.start();//启动定时器,即开始游戏
f.addWindowListener(new WindowAdapter() {//关闭按钮
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
c.setPreferredSize(new Dimension( TABLIE_WIDTH, TABLIE_HEIGHT));//设置画布大小
f.add(c);//将画布放入Frame(窗口)中
f.pack();
f.setVisible(true);//窗口可见
}
public static void main(String[] args) {
new BallGameDemo().game();//运行game
}
}