弹球游戏分步解析(三)——滑块动起来
看过弹球游戏分步解析(一)、弹球游戏分步解析(二)的朋友应该知道,弹球游戏做到这一步可以实现小球在界面上“飞”了,不过既然是游戏,就要让玩家跟程序互动,没有互动就不能称之为游戏。
接下来我们就给我们的一个游戏添加一个滑块,用鼠标控制滑块横向移动,让滑块碰撞小球使其弹回。
做到控制滑块横向移动就需要使用鼠标监听器——MouseMotionListener来记录鼠标坐标,根据鼠标坐标位置来绘出滑块,移动时,部分朋友使用repant()的方法来删除原位置的滑块,可是这样做的结果是,滑块一直在闪,接下来我会介绍另一种方法来绘制滑块,这样滑块在移动的过程中就不会闪了;
和小球一样,先要建一个滑块类:
文件名:BandThread
package jumpingBall;
import java.awt.Graphics;
import javax.swing.JPanel;
publicclass BandThread extends Thread {
privateint length;
privateint width;
privateintx;
privateinty;
privateintxlast;
privateintylast;
private JPanel jp;
private Graphics g;
public BandThread(JPanel jp,int x,int y){
this.jp = jp;
g =jp.getGraphics();
this.x = x;
this.y = y;
}
publicvoid run(){
this.drawBand();
this.clearBand();
}
publicvoid drawBand(){
g.fillRect(x, 500, 100, 10);
}
publicvoid clearBand(){//擦掉滑块运动路线上多余的滑块,用与背景色一致的滑块覆盖
if(xlast!= x){
g.setColor(jp.getBackground());//获取滑块背景色
g.fillRect(0, 500, x, 10);//覆盖左边
g.fillRect(x+100, 500,jp.getWidth()-x-100,10 );//覆盖右边
}
}
}
加监听器:
文件名:bandListener
package jumpingBall;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import javax.swing.JPanel;
public class banLlistener implements MouseMotionListener {
private int x;
private int y;
private JPanel jp;
private Graphics g;
public banLlistener(JPanel jp){
this.jp = jp;
this.g = jp.getGraphics();
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
x = e.getX();
y = e.getY();
Date.xband = x;
Date.yband = y;
BandThread band = new BandThread(jp,x,y);
band.start();
}
}
监听器所加位置:
文件名:BallThread
package jumpingBall;
import java.awt.Color;
import java.awt.Graphics;
import java.util.List;
import java.util.Random;
import javax.swing.JPanel;
public class BallThread extends Thread {
private static final int North = 1;//用四个整形的数据代表四个方向
private static final int West = 2;
private static final int South = 3;
private static final int East = 4;
private int Xdirection = West;//记录小球在X轴上的方向
private int Ydirection = North;//记录小球在y轴上的方向
private int radios;//半径
private Color color;//颜色
private int Xspeed;//x方向速度
private int Yspeed;//y方向速度
private int X;//当前位置x
private int Y;//当前位置y
private int LastX;//最后位置x
private int LastY;//最后位置y
private int xband;
private int yband;
private JPanel jp;//面板
private Graphics g;//画布
private boolean pauseFlag = false;//暂停标志(默认值否)
private boolean stopFlag = false;//停止标志(false——表示存在)
private boolean beread = false;//是否被储存在文件里过(默认值否)
public BallThread(JPanel jp){
this.jp = jp;
this.g = jp.getGraphics();
}
public void run(){
banLlistener band =new banLlistener(jp);//定义滑块
jp.addMouseMotionListener(band);//给滑块加入鼠标监听器
if(beread==false){//如果没有被储存在文件里过
this.setprivate();//方法作用:随机生成它的部分属性
}
while(true){//永真表示球会一直运动
try{
sleep(30);
}catch(InterruptedException e){
e.printStackTrace();
}
if(stopFlag==true){//如果停止标示为true,停止该线程
clearBall();
return;
}
if(pauseFlag==true){//如果暂停标示为真,跳过之后的步骤进入下次循环
continue;
}
this.clearBall();//清除原来位置的小球
this.move();//小球运动
this.drawBall();//在新的位置画出小球
}
}
public void clearBall(){//清除小球
Color color = jp.getBackground();//
g.setColor(color);//
g.fillOval(X, Y, radios*2, radios*2);//用背景色,填充之前小球的印记
}
public void drawBall(){
g.setColor(color);//
g.fillOval(X, Y, radios*2, radios*2);
}
public void setprivate(){//设置小球属性
Random random = new Random();//随机
radios = 10+random.nextInt(10);//半径
color =new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255));//颜色
Xspeed = 2 + random.nextInt(10);//x方向速度
Yspeed = 2+random.nextInt(10);//y方向速度
}
public void exit(boolean flag){//设置停止标示
stopFlag = flag;
}
public void setpause(boolean flag){//设置暂停标示
pauseFlag = flag;
}
public void move(){
switch(Xdirection){//对于x方向
case 2:X = X - Xspeed;break;//如果小球的运动方向向西,X值减小
case 4:X = X + Xspeed;break;//如果小球的运动方向向东,X值增大
}
switch(Ydirection){//对于y方向
case 1:Y = Y - Yspeed;break;//如果小球的运动方向向北,Y值减小
case 3:Y = Y + Yspeed;break;//如果小球的运动方向向难,Y值增大
}
//如果碰到边界,方向改变
if(X<0+radios*2){
Xdirection = 4;
}
if(X>jp.getWidth()-radios*2){
Xdirection = 2;
}
if(Y<0+radios*2){
Ydirection = 3;
}
//如果掉到下面,该小球线程结束
if(Y>jp.getHeight()-radios*2){
//Ydirection = 1;
BallThread ball = new BallThread(jp);
this.exit(true);
for(int i = 0;i<Date.allBall.size();i++){
ball=Date.allBall.get(i);
if(X == ball.X&&Y == ball.Y){
Date.allBall.remove(i);
}
}
}
//如果碰到滑块,弹回
if(Y<500+radios/2&&Y>490-radios*2&&X>=Date.xband&&X<=(Date.xband+100)){
Ydirection = 1;
}
}
……………………………………
(之后的代码见弹球游戏分步解析(二))
相关推荐
弹球游戏源代码 博文链接:https://448230305.iteye.com/blog/1911942
自己写的弹球游戏,用C语言,WIN32框架,学习游戏编写思路,核心代码,非常简洁
Scratch创意编程——弹球游戏 学历案.pdf
iPhone弹球游戏源代码
java弹球游戏java弹球游戏java弹球游戏 java弹球游戏java弹球游戏java弹球游戏 java弹球游戏java弹球游戏java弹球游戏 java弹球游戏java弹球游戏java弹球游戏 java弹球游戏java弹球游戏java弹球游戏 java弹球游戏...
本资源是山东大学软件学院图形学课程设计实验二
vs环境下简单的弹球游戏,利用opencv,对手为简单人工智能
弹球游戏弹球游戏弹球游戏弹球游戏弹球游戏弹球游戏弹球游戏弹球游戏
游戏分为三个等级——简单,中等,困难。 其中,简单对应一个球,速度设置为30,即对应线程暂停30/1000秒; 中等对应两个球,速度设置为40,即对应线程暂停40/1000秒; 困难对应两个球,速度设置为30,即对应线程...
VC++小游戏 弹球游戏 bricks
HTML5弹球游戏 HTML5游戏代码实现
三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)三体.sb3(弹球游戏)...
scratch 简单弹球游戏
少儿scratch编程项目源代码文件案例素材-经典弹球游戏.zip
python 弹球小游戏,可沿任意方向运动,颜色也可根据自己喜好改
C语言的 弹球游戏 A和 D是 控制键
Microsoft Visual Basic 6.0编写的弹球游戏
oc中的弹球游戏
弹球游戏 弹球游戏的源文件和头文件 射击游戏 小球打砖块