制作一個簡單的飛機大戰
注意!!!!!,圖片素材在我的資源里有,
下面代碼排序,非先后順序,請看清楚類名
Airplane類
package Flyplane;
public class Airplane extends FlyingObject implements Enemy{
private int yspeed=2;
public Airplane() {
image=ShootGame.airplane;
width=image.getWidth();
height=image.getHeight();
x=(int) (Math.random()*(ShootGame.WIDTH-this.width));
y=-this.height;
// x=100;
//y=100;
}
public int getScore() {
return 5;
}
public void step() {
y+=yspeed;
}
public boolean outOfBounds(){
return this.y>=ShootGame.HEIGHT;
}
}
Award類
package Flyplane;
public interface Award {
public int DOUBLE_FIRE=0;//雙倍攻擊 double fire
public int LIFE=1;//生命
//獲取獎勵,0型別或者1型別
public int getType();
}
Bee類
package Flyplane;
import java.util.Random;
public class Bee extends FlyingObject implements Award{
//走路步數
private int xSpeed=1;
private int ySpeed=2;
//獲取的獎勵
private int awardType;
//蜜蜂顯示方法
public Bee() {
image=ShootGame.bee;//圖
width=image.getWidth();//寬
height=image.getHeight();//高
y=-height;//長為y長度減去圖
Random rand=new Random();//設亂數
x=rand.nextInt(ShootGame.WIDTH-this.width);//總寬-圖寬,隨即移動
awardType=rand.nextInt(2);//隨機獲得獎勵
// y=200;
// x=100;
}
public void step() {
x+=xSpeed;
y+=ySpeed;
if(x>=ShootGame.WIDTH-this.width) {
xSpeed=-1;
}
if(x<=0) {
xSpeed=1;
}
}
public boolean outOfBounds(){
return this.y>=ShootGame.HEIGHT; //蜜蜂的y>=螢屏的高,即為越界
}
public int getType(){
return awardType; //回傳獎勵型別
}
}
bullet類
package Flyplane;
import Flyplane.ShootGame;
public class Bullet extends FlyingObject {
private int speed=3;
public Bullet(int x,int y) {
image=ShootGame.bullet;
this.x=x;
this.y=y;
}
public void step() {
y-=speed;
}
public boolean outOfBounds(){
return this.y<=-this.height; //子彈的y<=負的子彈的高,即為越界
}
}
enemy介面
package Flyplane;
//敵方分數
public interface Enemy{
public int getScore();
}
Flyingobject類
package Flyplane;
import java.awt.image.BufferedImage;
public abstract class FlyingObject {
protected int x;
protected int y;
protected int width;
protected int height;
protected BufferedImage image;
public int getX() {
return x;
}
public void setX(int x) {
this.x=x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public BufferedImage getImage() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
public abstract void step();
public abstract boolean outOfBounds();
public boolean shootBy(Bullet bullet) {
int x=bullet.x;
int y=bullet.y;
return this.x<x&&x<this.x+width&&this.y<y&&y<this.y+height;
}
}
Hero類
package Flyplane;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Timer;
public class Hero extends FlyingObject {
private int life;//生命
private int doubleFire;//火力
private BufferedImage[] images= {};//圖片切換陣列
private int index=0;
public Hero() {
image=ShootGame.hero0;
width = image.getWidth(); //寬
height = image.getHeight(); //高
x=150;
y=400;
life=3;
doubleFire=0;
images=new BufferedImage[] {ShootGame.hero0,ShootGame.hero1};
}
public void step() {
if(images.length>0) {
image=images[index++/10%images.length];
}
}
//發射
public Bullet[] shoot() {
int xStep=this.width/4;
int yStep=20;
if(doubleFire>0) {
Bullet[] bs=new Bullet[2];
bs[0]=new Bullet(this.x+1*xStep,this.y-yStep);
bs[1]=new Bullet(this.x+3*xStep,this.y-yStep);
doubleFire-=2;
return bs;
}else {
Bullet[] bs=new Bullet[1];
bs[0] = new Bullet(this.x+2*xStep,this.y-yStep);
return bs;
}
}
public void addDoubleFire() {
doubleFire+= 40;
}
public void addLife(){
life++; //命數增1
}
public int getLife(){
return life; //回傳命數
}
public boolean outOfBounds(){
return false; //永不越界
}
public void subtractLife(){
life--;
}
public void setDoubleFire(int doubleFire) {
this.doubleFire = doubleFire;
}
public boolean hit(FlyingObject other){
int x1 = other.x-this.width/2; //x1:敵人的x-1/2英雄機的寬
int x2 = other.x+other.width+this.width/2; //x2:敵人的x+敵人的寬+1/2英雄機的寬
int y1 = other.y-this.height/2; //y1:敵人的y-1/2英雄機的高
int y2 = other.y+other.height+this.height/2; //y2:敵人的y+敵人的高+1/2英雄機的高
int x = this.x+this.width/2; //x:英雄機的x+1/2英雄機的寬
int y = this.y+this.height/2; //y:英雄機的y+1/2英雄機的高
return x>x1 && x<x2
&&
y>y1 && y<y2; //x在x1和x2之間,并且,y在y1和y2之間,即為撞上了
}
public void moveTo(int x,int y){
this.x = x - this.width/2; //英雄機的x:滑鼠的x-1/2英雄機的寬
this.y = y - this.height/2; //英雄機的y:滑鼠的y-1/2英雄機的高
}
}
Shootgame類
package Flyplane;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
//主程式類
public class ShootGame extends JPanel{
public static final int WIDTH = 800; //視窗寬
public static final int HEIGHT = 1000; //視窗高
public static BufferedImage background; //背景圖
public static BufferedImage start; //啟動圖
public static BufferedImage pause; //暫停圖
public static BufferedImage gameover; //游戲結束圖
public static BufferedImage airplane; //敵機
public static BufferedImage bee; //小蜜蜂
public static BufferedImage bullet; //子彈
public static BufferedImage hero0; //英雄機0
public static BufferedImage hero1; //英雄機1
private Hero hero = new Hero(); //英雄機物件
private FlyingObject[] flyings = {}; //敵人(敵機+小蜜蜂)陣列
private Bullet[] bullets = {}; //子彈陣列
private Timer timer; //定時器
private int intervel = 1000/100; //時間間隔(毫秒)
private int score = 0; //玩家的得分
private int state;
public static final int START = 0; //啟動狀態
public static final int RUNNING = 1; //運行狀態
public static final int PAUSE = 2; //暫停狀態
public static final int GAME_OVER = 3; //游戲結束狀態
public ShootGame(){
// flyings = new FlyingObject[2];
// flyings[0] = new Airplane();
// flyings[1] = new Bee();
// bullets = new Bullet[1];
// bullets[0] = new Bullet(150,180);
}
static{ //加載圖片
try{
background = ImageIO.read(ShootGame.class.getResource("background.png"));
start = ImageIO.read(ShootGame.class.getResource("start.png"));
pause = ImageIO.read(ShootGame.class.getResource("pause.png"));
gameover = ImageIO.read(ShootGame.class.getResource("gameover.png"));
airplane = ImageIO.read(ShootGame.class.getResource("airplane.png"));
bee = ImageIO.read(ShootGame.class.getResource("bee.png"));
bullet = ImageIO.read(ShootGame.class.getResource("bullet.png"));
hero0 = ImageIO.read(ShootGame.class.getResource("hero0.png"));
hero1 = ImageIO.read(ShootGame.class.getResource("hero1.png"));
}catch(Exception e){
e.printStackTrace();
}
}
/** 重寫paint() g:畫筆*/
public void paint(Graphics g){
g.drawImage(background,0,0,null); //畫背景圖
paintHero(g); //畫英雄機
paintFlyingObjects(g); //畫敵人(敵機+小蜜蜂)
paintBullets(g); //畫子彈
paintScore(g); //畫分數
paintState(g); //畫狀態
}
/** 畫英雄機物件 */
public void paintHero(Graphics g){
g.drawImage(hero.image,hero.x,hero.y,null); //畫物件
}
/** 畫敵人(敵機+小蜜蜂)物件 */
public void paintFlyingObjects(Graphics g){
for(int i=0;i<flyings.length;i++){ //遍歷敵人(敵機+小蜜蜂)陣列
FlyingObject f = flyings[i]; //獲取每一個敵人
g.drawImage(f.image,f.x,f.y,null); //畫敵人物件
}
}
/** 畫子彈物件 */
public void paintBullets(Graphics g){
for(int i=0;i<bullets.length;i++){ //遍歷子彈陣列
Bullet b = bullets[i]; //獲取每一個子彈
g.drawImage(b.image,b.x,b.y,null); //畫子彈物件
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Fly"); //創建一個Jframe物件
ShootGame game = new ShootGame(); //創建一個JPanel物件
frame.add(game); //將面板添加到框架中
frame.setSize(WIDTH, HEIGHT); //設定視窗大小
frame.setAlwaysOnTop(true); //設定總是在最上面
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //設定默認關閉操作(視窗關閉時退出程式)
frame.setLocationRelativeTo(null); //設定居中顯示
frame.setVisible(true); //1.設定視窗可見 2.盡快呼叫paint()
game.action(); //啟動執行
}
/** 隨機生成飛行物 */
public FlyingObject nextOne(){
Random rand = new Random(); //創建亂數物件
int type = rand.nextInt(20); //生成0到19之間的亂數
if(type==0){ //為0時回傳蜜蜂物件
return new Bee();
}else{ //為1到19時回傳敵機物件
return new Airplane();
}
}
int flyEnteredIndex = 0; //敵人入場計數
/** 敵人(敵機+小蜜蜂)入場 */
public void enterAction(){ //10毫秒走一次
flyEnteredIndex++; //每10毫秒增1
if(flyEnteredIndex%40==0){ //400(10*40)毫秒走一次
FlyingObject obj = nextOne(); //獲取敵人(敵機+小蜜蜂)物件
flyings = Arrays.copyOf(flyings,flyings.length+1); //擴容(擴大一個容量)
flyings[flyings.length-1] = obj; //將敵人物件賦值給陣列的最后一個元素
}
}
/** 飛行物走一步 */
public void stepAction(){ //10毫秒走一次
hero.step(); //英雄機走一步
for(int i=0;i<flyings.length;i++){ //遍歷所有敵人
flyings[i].step(); //每個敵人走一步
}
for(int i=0;i<bullets.length;i++){ //遍歷所有子彈
bullets[i].step(); //每個子彈走一步
}
}
/** 啟動程式的執行 */
public void action(){
MouseAdapter l = new MouseAdapter(){ //創建偵聽器物件
/** 滑鼠移動事件 */
public void mouseMoved(MouseEvent e){
if(state==RUNNING){ //運行狀態時執行
int x = e.getX(); //獲取滑鼠的x坐標
int y = e.getY(); //獲取滑鼠的y坐標
hero.moveTo(x, y); //英雄機隨著滑鼠動
}
}
/** 滑鼠點擊事件 */
public void mouseClicked(MouseEvent e){
switch(state){ //不同狀態時點擊后有不同的反應
case START: //啟動狀態時
state = RUNNING; //當前狀態變為運行狀態
break;
case GAME_OVER: //游戲結束狀態時
score = 0; //清理現場
hero = new Hero();
flyings = new FlyingObject[0];
bullets = new Bullet[0];
state = START; //當前狀態變為啟動狀態
break;
}
}
/** 滑鼠移出事件 */
public void mouseExited(MouseEvent e){
if(state==RUNNING){ //運行狀態時
state=PAUSE; //當前狀態改為暫停狀態
}
}
/** 滑鼠移入事件 */
public void mouseEntered(MouseEvent e){
if(state==PAUSE){ //暫停狀態時
state=RUNNING; //當前狀態改為運行狀態
}
}
};
this.addMouseListener(l); //處理滑鼠操作事件
this.addMouseMotionListener(l); //處理滑鼠滑動操作
timer = new Timer(); //創建定時器物件
timer.schedule(new TimerTask(){
public void run(){ //10毫秒走一次--定時干的那個事
if(state==RUNNING){ //運行狀態時執行
enterAction(); //敵人(敵機+小蜜蜂)入場
stepAction(); //飛行物走一步
shootAction(); //英雄機發射子彈--子彈入場
bangAction(); //子彈與敵人的碰撞
outOfBoundsAction(); //洗掉越界的飛行物
checkGameOverAction(); //檢測游戲是否結束
}
repaint(); //重畫,呼叫paint()
}
},intervel,intervel);
}
int shootIndex = 0; //射擊計數
/** 英雄機發射子彈(子彈入場) */
public void shootAction(){ //10毫秒走一次
shootIndex++; //每10毫秒增1
if(shootIndex%30==0){ //每300(10*30)毫秒走一次
Bullet[] bs = hero.shoot(); //獲取英雄機發射出來的子彈
bullets = Arrays.copyOf(bullets, bullets.length+bs.length); //擴容(bs有幾個元素就擴大幾個容量)
System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length); //陣列的追加(將bs追加到bullets陣列中)
}
}
/** 所有子彈與所有敵人撞 */
public void bangAction(){ //10毫秒走一次
for(int i=0;i<bullets.length;i++){ //遍歷所有子彈
Bullet b = bullets[i]; //獲取每一個子彈
bang(b); //一個子彈與所有敵人撞
}
}
/** 一個子彈與所有敵人撞 */
public void bang(Bullet b){
int index = -1; //被撞敵人的下標
for(int i=0;i<flyings.length;i++){ //遍歷所有敵人
FlyingObject f = flyings[i]; //獲取每一個敵人
if(f.shootBy(b)){ //撞上了
index = i; //記錄被撞敵人的下標
break; //其余敵人不再比較
}
}
if(index != -1){ //有撞上的
FlyingObject one = flyings[index]; //獲取被撞的敵人物件
if(one instanceof Enemy){ //若被撞物件是敵人
Enemy e = (Enemy)one; //將被撞物件強轉為敵人
score += e.getScore(); //累加分數
}
if(one instanceof Award){ //若被撞物件是獎勵
Award a = (Award)one; //將被撞物件強轉為獎勵
int type = a.getType(); //獲取獎勵型別
switch(type){ //根據type的不同取值獲取相應的獎勵
case Award.DOUBLE_FIRE: //獎勵型別為火力時
hero.addDoubleFire(); //英雄機增火力
break;
case Award.LIFE: //獎勵型別為命時
hero.addLife(); //英雄機增命
break;
}
}
//交換被撞敵人物件與陣列中的最后一個元素
FlyingObject t = flyings[index];
flyings[index] = flyings[flyings.length-1];
flyings[flyings.length-1] = t;
//縮容(去掉最后一個元素,即:被撞敵人物件)
flyings = Arrays.copyOf(flyings, flyings.length-1);
}
}
/** 畫分數 */
public void paintScore(Graphics g){
int x = 10;
int y = 25;
Font font = new Font(Font.SANS_SERIF,Font.BOLD,14);
g.setColor(new Color(0x3A3B3B)); //設定顏色(純紅)
g.setFont(font); //設定樣式(字體:SANS_SERIF,樣式:加粗,字號:24)
g.drawString("SCORE: "+score,x,y); //畫分
y+=20;
g.drawString("LIFE: "+hero.getLife(),x,y); //畫命
}
/** 洗掉越界的飛行物 */
public void outOfBoundsAction(){
int index = 0; //1.不越界敵人陣列下標 2.不越界敵人個數
FlyingObject[] flyingLives = new FlyingObject[flyings.length]; //不越界敵人陣列
for(int i=0;i<flyings.length;i++){ //遍歷所有敵人
FlyingObject f = flyings[i]; //獲取每一個敵人
if(!f.outOfBounds()){ //不越界
flyingLives[index] = f; //將不越界敵人添加到不越界敵人陣列中
index++; //1.下標增一 2.不越界敵人個數增一
}
}
flyings = Arrays.copyOf(flyingLives, index); //將不越界敵人復制到flyings陣列中,index為flyings的新長度
index = 0; //1.下標歸零 2.不越界個數歸零
Bullet[] bulletLives = new Bullet[bullets.length]; //不越界子彈陣列
for(int i=0;i<bullets.length;i++){ //遍歷所有子彈
Bullet b = bullets[i]; //獲取每一個子彈
if(!b.outOfBounds()){ //不越界
bulletLives[index] = b; //將不越界子彈添加到不越界子彈陣列中
index++; //1.下標增一 2.不越界子彈個數增一
}
}
bullets = Arrays.copyOf(bulletLives, index); //將不越界敵人復制到bullets陣列中,index為bullets的新長度
}
/** 判斷游戲是否結束 回傳true表示游戲結束 */
public boolean isGameOver(){
for(int i=0;i<flyings.length;i++){ //遍歷所有敵人
FlyingObject f = flyings[i]; //獲取每一個敵人
if(hero.hit(f)){ //撞上了
hero.subtractLife(); //英雄機減命
hero.setDoubleFire(0); //英雄機清火力
//交換被撞敵人與陣列的最后一個元素
FlyingObject t = flyings[i];
flyings[i] = flyings[flyings.length-1];
flyings[flyings.length-1] = t;
//縮容(去掉最后一個元素,即:被撞的敵人物件)
flyings = Arrays.copyOf(flyings,flyings.length-1);
}
}
return hero.getLife()<=0; //命數<=0,即為游戲結束
}
/** 檢測游戲是否結束 */
public void checkGameOverAction(){
if(isGameOver()){ //游戲結束時
state = GAME_OVER; //當前狀態改為游戲結束狀態
}
}
/** 畫狀態 */
public void paintState(Graphics g){
switch(state){ //根據當前狀態畫不同的圖
case START: //啟動狀態時畫啟動圖
g.drawImage(start,0,0,null);
break;
case PAUSE: //暫停狀態時畫暫停圖
g.drawImage(pause,0,0,null);
break;
case GAME_OVER: //游戲結束狀態時畫游戲結束圖
g.drawImage(gameover,0,0,null);
break;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/232101.html
標籤:其他
