private Frame frame = new Frame("d球小游戏");
//桌面宽度
private final int K=300;
//桌面高度
private final int G=400;
//球拍的高度和宽度
private final int QK=60;
private final int QG=20;
//球的大小
private final int Q=16;
//定义变量,纪录小球的坐标
private int ballx=120;
private int bally=20;
//定义变量,纪录小球在X和y 方向上分别移动的速度
private int speedy=10;
private int speedx=5;
//定义变量,纪录球拍的坐标 y坐标是固定不变的
private int racketx=120;
private final int rackety=340;
//定义变量,标识当前游戏是否结束
private boolean isover=false;
//声明一个定时器
private Timer timer;
2.定义一个类,继承canvas ,充当画布
private class mycanvas extends Canvas{
@Override
public void paint(Graphics g) {
//在这里绘制内容
if (isover) {
//游戏结束
g.setColor(Color.blue);
g.setFont(new Font("Time",Font.BOLD,30));
g.drawString("游戏结束",80,200);
}
else {
//游戏中
//绘制小球
g.setColor(Color.red);
g.fillOval(ballx, bally,Q,Q);
//绘制球拍
g.setColor(Color.pink);
g.fillRect(racketx, rackety,QK,QG);
}
}
}
3.进行视图的组装,游戏逻辑的控制
mycanvas drawarea = new mycanvas();
public void init() {
//视图的组装,游戏逻辑的控制
//完成球拍的坐标的变化
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int s = e.getKeyCode(); // 获取键盘的整数
if (s==KeyEvent.VK_LEFT) {
// <- 应该向左移动
if (racketx>0) {
racketx-=10;
}
}
if (s==KeyEvent.VK_RIGHT) {
// -> 应该向右移动
if (racketx<K-QK) {
racketx+=10;
}
}
}
};
//给frame 和 drawArea 设置监听器
frame.addKeyListener(listener);
drawarea.addKeyListener(listener);
4.小球的控制,以及最后的调用过程
// 小球坐标的控制
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//根据边界范围来修正运动
if (ballx<=0 || ballx>=(K-Q)) {
speedx=-speedx;
}
if (bally<=0 || (bally>rackety-Q && ballx>racketx && ballx<ballx+QK)) {
speedy=-speedy;
}
// 小球超出了球拍的范围 结束游戏
if (bally>rackety-Q &&(ballx<racketx || ballx>racketx+QK)) {
// 停止定时器
isover=true;
drawarea.repaint();
}
// 更新小球的坐标,重绘桌面
ballx+=speedx;
bally+=speedy;
//重绘界面
drawarea.repaint();
}
};
timer = new Timer(100,task);
timer.start();
drawarea.setPreferredSize(new Dimension(K,G));
frame.add(drawarea);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
d球小游戏 a = new d球小游戏();
a.init();
}
}
将上面的代码组装起来就是下面的代码
package demo38_awt_3;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.Timer;
public class d球小游戏 {
private Frame frame = new Frame("d球小游戏");
//桌面宽度
private final int K=300;
//桌面高度
private final int G=400;
//球拍的高度和宽度
private final int QK=60;
private final int QG=20;
//球的大小
private final int Q=16;
//定义变量,纪录小球的坐标
private int ballx=120;
private int bally=20;
//定义变量,纪录小球在X和y 方向上分别移动的速度
private int speedy=10;
private int speedx=5;
//定义变量,纪录球拍的坐标 y坐标是固定不变的
private int racketx=120;
private final int rackety=340;
//定义变量,标识当前游戏是否结束
private boolean isover=false;
//声明一个定时器
private Timer timer;
//定义一个类,继承canvas ,充当画布
private class mycanvas extends Canvas{
@Override
public void paint(Graphics g) {
//在这里绘制内容
if (isover) {
//游戏结束
g.setColor(Color.blue);
g.setFont(new Font("Time",Font.BOLD,30));
g.drawString("游戏结束",80,200);
}
else {
//游戏中
//绘制小球
g.setColor(Color.red);
g.fillOval(ballx, bally,Q,Q);
//绘制球拍
g.setColor(Color.pink);
g.fillRect(racketx, rackety,QK,QG);
}
}
}
//创建绘画区域
mycanvas drawarea = new mycanvas();
public void init() {
//视图的组装,游戏逻辑的控制
//完成球拍的坐标的变化
KeyListener listener = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int s = e.getKeyCode(); // 获取键盘的整数
if (s==KeyEvent.VK_LEFT) {
// <- 应该向左移动
if (racketx>0) {
racketx-=10;
}
}
if (s==KeyEvent.VK_RIGHT) {
// -> 应该向右移动
if (racketx<K-QK) {
racketx+=10;
}
}
}
};
//给frame 和 drawArea 设置监听器
frame.addKeyListener(listener);
drawarea.addKeyListener(listener);
// 小球坐标的控制
ActionListener task = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//根据边界范围来修正运动
if (ballx<=0 || ballx>=(K-Q)) {
speedx=-speedx;
}
if (bally<=0 || (bally>rackety-Q && ballx>racketx && ballx<ballx+QK)) {
speedy=-speedy;
}
// 小球超出了球拍的范围 结束游戏
if (bally>rackety-Q &&(ballx<racketx || ballx>racketx+QK)) {
// 停止定时器
isover=true;
drawarea.repaint();
}
// 更新小球的坐标,重绘桌面
ballx+=speedx;
bally+=speedy;
//重绘界面
drawarea.repaint();
}
};
timer = new Timer(100,task);
timer.start();
drawarea.setPreferredSize(new Dimension(K,G));
frame.add(drawarea);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
d球小游戏 a = new d球小游戏();
a.init();
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)