炮弹类基本设计
实现思想:
-
炮弹为实心黄色椭圆
-
炮弹方向随机,遇到边界反弹
实现逻辑:
-
在窗口的某一个位置随机生成一个炮弹
-
方向也是随机的
-
遇到边界以后就会反弹弹回来---要有角度
-
左、右边界
-
左:x < 0,右:x > 窗口宽度
-
-
上、下边界
-
上:y < 0,下:y > 窗口宽度
-
-
这时候发现窗口的高度和宽度是常量,所以设计一个常量类
-
package com.lucifer.game;
/**
* 存放常量的类
* @author Lucifer
*/
public class Constant {
public static final int GAME_WIDTH = 600;
public static final int GAME_HEIGHT = 600;
}
-
-
角度是一个随机的值---大小在0~2PI之间
示例代码:
package com.lucifer.game;
import java.awt.*;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 炮弹类
* @author Lucifer
*/
public class Shell extends GameObject{
/*继承之后增加我们自己的属性*/
double degree; //这是一个角度变量
/*构造方法构造一个随机数*/
public Shell(){
x = 200; //这里的x,y继承了GameObject类,所以是double类型的数
y = 200; //所以下面用到x,y的时候要进行强制转型
width = 10;
height = 10;
speed = 3;
/*希望是一个随机的值,希望生成随机角度*/
degree = Math.random() * Math.PI * 2;
}
/*将炮弹画出*/
public void draw(Graphics g){
/*黄色、实心、圆,三个条件*/
Color c = g.getColor(); //先保存原来的颜色
/*将颜色设置为黄色*/
g.setColor(Color.YELLOW);
/*填充一个炮弹*/
g.fillOval((int)x,(int)y,width,height);
/*修改x,y的坐标,按照所想的方向去移动,利用初中三角函数来表示*/
//想让炮弹沿任意角度飞行
x += speed * Math.cos(degree); //x轴长度
y += speed * Math.sin(degree); //y轴长度
/*
进行实心点反弹的判定
*/
if (x < 0 || x > Constant.GAME_WIDTH - width){
degree = Math.PI - degree; //反射的算法,如果根据延长线做y轴的翻转
}
if (y < 30 || y > Constant.GAME_HEIGHT - height){
degree = - degree; //反射的算法,按照纵坐标进行反转
}
g.setColor(c); //将原先的颜色归还
}
}
/*画出实心炮弹*/
shell.draw(g); //传入参数g
产生一堆炮弹
实现思路:数组、容器
-
先创建数组,定义数组的大小
-
利用循环生成50个炮弹---遍历数组
-
在利用循环画出50个炮弹---遍历数组
实例:
创建数组、利用遍历的方法生成50发炮弹
/*
用数组实现多炮弹
窗口刚画的时候就给他生成50发炮弹
*/
Scanner scn = new Scanner(System.in); //监听键盘输入数
int n = scn.nextInt(); //将输入的数赋值与变量n
Shell[] shells = new Shell[n]; //shell数组的声明,给玩家想要多少发
利用遍历的方法画出50发炮弹
//利用遍历的方法画出n发炮弹
for (int i =0; i < shells.length; i++){
shells[i].draw(g);
}