如何运用java程序设计创建移动图形(碰撞检测)
在上一节的教程中,如何运用java程序设计认识了运动的控制,那么现在我们在深入去制作,那么就是对于碰撞检测吧。
在游戏中判断物体是否碰撞到其他物体,是一个非常重要的知识点,例如子弹碰到飞机,小球碰到墙壁,贪吃蛇碰到障碍物等。
阅读课本碰撞检测部分,碰撞检测主要靠判断两个物体,是否有重叠部分来进行。
下面我们用一个运动过程中,碰到墙壁会反弹的例子,来说明碰撞检测的方法。
我们可以将上一节课的MyPanel改成下面的代码,可以实现小球碰到墙壁时反弹:
import java.awt.*;
import java.awt.image.*;
import java.util.*;
public class MyPanel extends Panel implements Runnable {
private int x;
private int y;
private int dx,dy;
private int diameter;
private int width;
private int height;
private Image im;
private Graphics dbg;
public MyPanel() {
x=50;
y=50;
dx=10;dy=10;
diameter=50;
width=300;
height=200;
setPreferredSize(new Dimension(width, height));//设置组件的大小
}
public void gamePaint() { //前屏绘制
Graphics g;
try {
g = this.getGraphics(); //获取当前屏幕的Graphics对象
if (g != null && im != null) {
g.drawImage(im, 0, 0, null);//将图像缓冲区中的内容复制到前屏缓冲区,显示出来
}
g.dispose();//释放当前屏幕的Graphics对象
} catch (Exception e) {
}
}
public void gameRender() { //离屏绘制
if (im == null) {
im = createImage(width, height);
if (im == null) {
System.out.println("im is null");
} else {
dbg = im.getGraphics();
}
}
dbg.setColor(Color.WHITE);
dbg.fillRect(0, 0, width, height);//用底色矩形填充画版,擦去图案
dbg.setColor(Color.blue);
dbg.fillOval(x, y, diameter, diameter); //画出椭圆
}
public void gameUpdate() { //更新游戏逻辑
x=x+dx;
y=y+dy;
if((x<0)||(x>width-diameter)){
dx=-dx;
}
if((y<0)||(y>height-diameter)){
dy=-dy;
}
}
public void run() {
while(true){
gameUpdate();
gameRender();
gamePaint();
//以下我们用一个延时函数代替空循环来延时,sleep(10)中的数字代表延时毫秒,数字越小越快
try {
Thread.sleep(200);} //括号里面的10代表10毫秒,也就是0.001秒,可以该成你需要的时间
catch (InterruptedException e) {
e.printStackTrace();}
}
}
}
温馨提醒大家:注意,(最好分步骤实现,先实现水平方向方画出两条直线,让小球左右反弹,再实现画四条直线,斜向反弹)。
最后给大家一个练习,让大家可以在原基础上进行游戏的修改,并且学会如何去运用与修改。
练习5:能否在上题的基础加上一个红色小球,让一蓝一红两个小球在窗口中弹动,如果两个小球相互碰到,就反弹开.(自己先试一下,做不出再参考”两小球碰撞.doc”)
小编结语:大家在学完了如何运用JAVA程序设计创建移动图形(碰撞检测),大家有什么感想呢?希望大家能够好好学习程序设计,这对于我们以后的生活是非常有用的。
¥299.00
¥29.00
¥399.00
¥498.00