日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

仿雷电——飞机大战类游戏Ⅰ

發(fā)布時間:2024/1/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 仿雷电——飞机大战类游戏Ⅰ 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • 第一階段:游戲界面的繪畫及圖片加載
      • 1.添加背景圖片
  • 第二階段:使用多線程讓動畫動起來
  • 第三階段:鍵盤操控飛機(jī)
  • 第四階段:炮彈和飛機(jī)碰撞,爆炸
  • 第五階段:顯示分?jǐn)?shù)

簡介

我們仿照 QQ游戲“”雷電這個風(fēng)靡全球的游戲,來把所有知識點串接起來了
多線程用來實現(xiàn)動畫效果、容器實現(xiàn)對于多發(fā)炮彈的存取和處理、常用類等等的應(yīng)用。
但跟隨本文只能做出雷電的雛形,但你可以在這個基礎(chǔ)上改造出屬于你的“雷電”
這是最后效果圖:

第一階段:游戲界面的繪畫及圖片加載

游戲開發(fā)中,圖片加載是最常見的技術(shù)。我們在此處使用ImageIO類實現(xiàn)圖片加載,并且為了代碼的復(fù)用,將圖片加載的方法封裝到GameUtil工具類中,便于我們以后直接調(diào)用。

? 我們要先將項目用到的圖片拷貝到項目的src下面,我們可以建立新的文件夾images存放所有圖片

1.添加背景圖片

方法1:通過在JFrame中添加一個JPanel,背景圖片放在JPanel上來實現(xiàn)

方法2:我們用JLayeredPane,JLayeredPane 為 JFC/Swing 容器添加了深度,允許組件在需要時互相重疊。Integer 對象指定容器中每個組件的深度,其中編號較高的組件位于其他組件之上。常用的幾個層如下圖:

之前我再添加背景圖片時一貫使用絕對路徑,每次添加修改極為麻煩,本次我們學(xué)習(xí)如何使用相對路徑,首先通過GameUtil.class.getClaaaLoader().getResource來獲得資源的根目錄,從而獲取相對位置

paint會被自動被調(diào)用,g相當(dāng)于一只畫筆

代碼如下: /*** 2019年9月21日*/ package Thunder;import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyListener; import java.util.ArrayList;import javax.swing.JFrame;/*** 飛機(jī)大戰(zhàn)雛形:可以發(fā)炮彈,但是沒有解決連發(fā)炮彈的問題* * 之后有兩個方向:畫面上有很多炮彈,控制飛機(jī)移動躲避炮彈* 或者經(jīng)典的雷電游戲,擊落敵機(jī)** 2019年9月21日*/ public class GameUI extends JFrame {// 將背景和飛機(jī)圖片定義為成員變量Image background = GameUtil.getImage("images/back3.jpg");Image planeImg = GameUtil.getImage("images/plane1.png");Image shootImg = GameUtil.getImage("images/shoot1.png");public static int UIWidth = 1000;public static int UIHeigh = 1000;//ArrayList<Shell> shellList = new ArrayList<Shell>(); Plane plane1 = new Plane(planeImg,200,200,2,100,100);Shell shoot1 = new Shell(shootImg, 237,170,2,25,35);public void GFrame() {this.setTitle("雷電");this.setSize(UIWidth, UIHeigh);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);this.addKeyListener(plane1);this.addKeyListener(shoot1);this.setVisible(true);//啟動線程PaintThread pt =new PaintThread();pt.start();}// paint方法作用是:畫出整個窗口及內(nèi)部內(nèi)容。被系統(tǒng)自動調(diào)用。public void paint(Graphics g) {g.drawImage(background, 0, 0, 1000, 1000, null);plane1.drawMySelf(g);shoot1.drawMySelf(g);}// 定義內(nèi)部類class PaintThread extends Thread {// 重寫public void run() {while (true) {repaint();// 重畫try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}}}}//雙緩沖解決閃爍private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(500,500);//這是游戲窗口的寬度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);} // 主方法public static void main(String[] args) {// 類里面調(diào)用窗體GameUI gu = new GameUI();gu.GFrame();}}

【要點】:

1.繼承Frame類,畫出窗口
2. 了解坐標(biāo)系,窗口坐標(biāo)以左上角為(0,0)點
3. 物體就是矩形,物體的位置就是所在矩形左上角頂點的坐標(biāo)
4. 窗口關(guān)閉,居中等我們需要自己添加功能,如下

在JFrame中我們可以這樣寫: drawframe.setDefaultCloseOperation(3);//關(guān)閉時程序結(jié)束 drawframe.setLocationRelativeTo(null); 但在Frame中,我們需要 / 增加關(guān)閉窗口監(jiān)聽,這樣用戶點擊右上角關(guān)閉圖標(biāo),可以關(guān)閉游戲程�?this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});

第二階段:使用多線程讓動畫動起來

第三階段:鍵盤操控飛機(jī)

第四階段:炮彈和飛機(jī)碰撞,爆炸

第五階段:顯示分?jǐn)?shù)

項目結(jié)構(gòu)如圖:

所有代碼:

/*** 2019年9月21日*/ package Thunder;import java.awt.Graphics; import java.awt.Image;import javax.swing.JFrame;/*** ** 2019年9月21日*/ public class GameUI extends JFrame {// 將背景和飛機(jī)圖片定義為成員變量Image background = GameUtil.getImage("images/back3.jpg");Image planeImg = GameUtil.getImage("images/plane1.png");public static int UIWidth = 1000;public static int UIHeigh = 1000;Plane plane1 = new Plane(planeImg,200,200,2,100,100);public void GFrame() {this.setTitle("雷電");this.setSize(UIWidth, UIHeigh);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(3);//添加監(jiān)聽器//Listener li = new Listener();//this.addKeyListener(li);this.addKeyListener(plane1);this.setVisible(true);//啟動線程PaintThread pt =new PaintThread();pt.start();}// paint方法作用是:畫出整個窗口及內(nèi)部內(nèi)容。被系統(tǒng)自動調(diào)用。public void paint(Graphics g) {g.drawImage(background, 0, 0, 1000, 1000, null);plane1.drawMySelf(g);}// 定義內(nèi)部類class PaintThread extends Thread {// 重寫public void run() {while (true) {repaint();// 重畫try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}}}}//雙緩沖解決閃爍private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(500,500);//這是游戲窗口的寬度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);} // 主方法public static void main(String[] args) {// 類里面調(diào)用窗體GameUI gu = new GameUI();gu.GFrame();}} package Thunder;import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL;import javax.imageio.ImageIO;/*** GameUtil類:加載圖片代碼*GameUtil獲得程序運(yùn)行類加載器,加載資源的根目錄,* 2019年9月22日*/ public class GameUtil {//工具類一般將構(gòu)造器私有化public GameUtil() {}public static Image getImage(String path){BufferedImage bi = null;try {URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}} /*** 2019年9月22日*/ package Thunder;import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle;/*** 游戲中所有物體的父類** 2019年9月22日*/ public class GameObject {Image img; //該物體對應(yīng)的圖片對象double x,y; //該物體的坐標(biāo)int speed; //該物體的運(yùn)行速度int width,height; //該物體所在矩形區(qū)域的寬度和高度public void drawMySelf(Graphics g){g.drawImage(img, (int)x, (int)y, (int)width, (int)height, null);}public GameObject(Image img, double x, double y) {this.img = img;this.x = x;this.y = y;if(img!=null){this.width = img.getWidth(null);this.height = img.getHeight(null);}}public GameObject(Image img, double x, double y, int width,int height) {this.img = img;this.x = x;this.y = y;this.width = width;this.height = height;}public GameObject(Image img, double x, double y, int speed, int width,int height) {this.img = img;this.x = x;//這只是構(gòu)造方法初始化化時的值,并不能作為約束this.y = y;this.speed = speed;this.width = width;this.height = height;}public GameObject() {}/*** 返回物體對應(yīng)矩形區(qū)域,便于后續(xù)在碰撞檢測中使用* @return*/public Rectangle getRect(){return new Rectangle((int)x,(int) y, width, height);} } package Thunder;import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;/*** ** 2019年9月22日*/ public class Plane extends GameObject implements KeyListener {boolean left, right, up, down,shoot;boolean live = true;public void drawMySelf(Graphics g) {super.drawMySelf(g);// 這里可移動,但是下面不行,應(yīng)該是判斷的問題this.x+=2;System.out.println("此時的坐標(biāo)"+x);//System.out.println(left);if (left) {System.out.println("此時的坐標(biāo)"+x);x -= speed;if(x<=0){x=0;}}if (right) {x += speed;if(x>=900){x=900;}}if (up) {y -= speed;if(y<=10){y=10;}}if (down) {y += speed;if(y>=900){y=900;}}}public Plane(Image img, double x, double y, int speed, int width, int height) {super(img, x, y,width, height);//System.out.println("有被重畫");//this.speed = speed;}public void keyTyped(KeyEvent e) {}public void keyPressed(KeyEvent e) {System.out.println(e.getKeyCode());int key = e.getKeyCode();switch (key) {case 37:left = true;break;case 38:up = true;break;case 39:right = true;break;case 40:down = true;break;case 32:shoot = true;break;default:break;}}public void keyReleased(KeyEvent e) {//System.out.println(e.getKeyCode());int key = e.getKeyCode();switch (key) {case 37:left = false;break;case 38:up = false;break;case 39:right = false;break;case 40:down = false;break;case 32:shoot = true;break;default:break;}} }

我原來打算共享飛機(jī)坐標(biāo),這樣就可以將子彈和飛機(jī)關(guān)聯(lián)起來,但是這個語句導(dǎo)致 飛機(jī)完全不能動,因為坐標(biāo)與圖片沒有關(guān)聯(lián)了,重繪只畫了一次

該怎么把子彈放入數(shù)組列表中呢?
現(xiàn)在子彈是一個新的類,而且有構(gòu)造器,得隨著飛機(jī)移動,但是
應(yīng)該直接放入監(jiān)聽就可以了,點一下,延遲幾秒,畫一個。

現(xiàn)在到這個方向有兩種結(jié)果可以走:
第一種:屏幕隨機(jī)生成炮彈,我們控制飛機(jī)去躲避,生存時間越長,得分越高
第二鐘:和游戲雷電一樣,對面有敵機(jī),我們在躲避敵機(jī)炮彈的同時擊落敵機(jī),獲取分?jǐn)?shù)。
在炮彈的任意角度飛行時,如果觸碰到邊界就反轉(zhuǎn)角度,模擬碰撞效果。
同時為了效果美觀,我們需要在一些細(xì)節(jié)上注意:例如碰撞邊界時要減去球 的直徑,碰撞標(biāo)題欄時需要減去標(biāo)題欄的寬度。
但是一個炮彈遠(yuǎn)遠(yuǎn)不夠,我們希望增大一些挑戰(zhàn)難度,有很多炮彈,就可以用到數(shù)組了。
分為三步:
1)定義數(shù)組
2)初始化五十個炮彈
3)畫出炮彈

當(dāng)使用Frame時,屏幕閃爍如圖:

當(dāng)使用JFrame解決屏幕閃爍問題時:

最后我們采用了frame+雙緩沖的技術(shù)來解決,解決效果如圖:

只需要把這段代碼放入界面的類中(任意位置即可)

//雙緩沖解決閃爍private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(1000,1000);//這是游戲窗口的寬度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}

在Jfram和frame切換中可能的報錯:

當(dāng)我們使用JFrame時可以調(diào)用這行語句關(guān)閉窗口
但是在Frame里面沒有,所以我們需要添加監(jiān)聽器

//this.setDefaultCloseOperation(3);//增加關(guān)閉窗口監(jiān)聽,這樣用戶點擊右上角關(guān)閉圖標(biāo),可以關(guān)閉游戲程序this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});

游戲中,多個元素是否碰到一起,實際上,通常是用“矩形檢測”原理實現(xiàn)的。 我們在前面提到,游戲中所有的物體都可以抽象成“矩形”,我們只需判斷兩個矩形是否相交即可。對于一些復(fù)雜的多邊形、不規(guī)則物體,實際上是將他分解成多個矩形,繼續(xù)進(jìn)行矩形檢測。

Java的API中,為我們提供了Rectangle類來表示矩形相關(guān)信息,并且提供了intersects()方法,直接判斷矩形是否相交。
我們使用GameObject里面的矩形檢測來判斷,飛機(jī)有,炮彈也有,這也是繼承的隱形好處.

爆炸圖片輪播:
圖片加載一次很耗費(fèi)資源,所以我們將他設(shè)為static,只初始化一次,之后直接用就可以,而不需要new了,
爆炸類如下

package Thunder_two;import java.awt.Graphics; import java.awt.Image; /*** * **/ public class Explode {double x,y;static Image[] imgs = new Image[16];static {for(int i=0;i<16;i++){imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");imgs[i].getWidth(null);}}int count;public void draw(Graphics g){if(count<=15){g.drawImage(imgs[count], (int)x, (int)y, null);count++;}}public Explode(double x,double y){this.x = x;this.y = y;} }

到這一步,雷電游戲的雛形大概就完成了,但是我們卻少了最重要的獎勵機(jī)制,玩家不知道自己的得分,自然也不會有興趣繼續(xù)挑戰(zhàn)了,所有我們加入時間類,在玩家死亡之后,在屏幕上顯示獲得的分?jǐn)?shù)。
先定義兩個成員變量
Date startTime = new Date(); //游戲起始時刻
Date endTime; //游戲結(jié)束時刻
如果飛機(jī)死亡,調(diào)用顯示的方法

if(!plane.live){if(endTime==null){endTime = new Date();}int period = (int)((endTime.getTime()-startTime.getTime())/1000);printInfo(g, "時間:"+period+"秒", 50, 120, 260, Color.white);} //顯示的方法 public void printInfo(Graphics g,String str,int size,int x,int y,Color color){Color c = g.getColor();g.setColor(color);Font f = new Font("宋體",Font.BOLD,size);g.setFont(f);g.drawString(str,x,y);g.setColor(c);}

至此,雷電小游戲的第一個方向就完成了,但大家也許還有點意猶未盡呢吧!這和我們兒時玩的雷電差距太大了吧,下一篇文章中,我們就來開發(fā)自動發(fā)射+擊落敵機(jī)的部分,翹首以待吧。

以下是雷電Ⅰ的全部代碼
項目結(jié)構(gòu)如圖:

package Thunder_one;import java.awt.Graphics; import java.awt.Image; /*** * **/ public class Explode {double x,y;static Image[] imgs = new Image[16];static {for(int i=0;i<16;i++){imgs[i] = GameUtil.getImage("images/explode/e"+(i+1)+".gif");imgs[i].getWidth(null);}}int count;public void draw(Graphics g){if(count<=15){g.drawImage(imgs[count], (int)x, (int)y, null);count++;}}public Explode(double x,double y){this.x = x;this.y = y;} } /*** 2019年9月22日*/ package Thunder_one;import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle;/*** 游戲中所有物體的父類** 2019年9月22日*/ public class GameObject {Image img; //該物體對應(yīng)的圖片對象double x,y; //該物體的坐標(biāo)int speed; //該物體的運(yùn)行速度int width,height; //該物體所在矩形區(qū)域的寬度和高度public void drawMySelf(Graphics g){g.drawImage(img, (int)x, (int)y, (int)width, (int)height, null);}public GameObject(Image img, double x, double y) {this.img = img;this.x = x;this.y = y;if(img!=null){this.width = img.getWidth(null);this.height = img.getHeight(null);}}public GameObject(Image img, double x, double y, int width,int height) {this.img = img;this.x = x;this.y = y;this.width = width;this.height = height;}public GameObject(Image img, double x, double y, int speed, int width,int height) {this.img = img;this.x = x;//這只是構(gòu)造方法初始化化時的值,并不能作為約束this.y = y;this.speed = speed;this.width = width;this.height = height;}public GameObject() {}/*** 返回物體對應(yīng)矩形區(qū)域,便于后續(xù)在碰撞檢測中使用* @return*/public Rectangle getRect(){return new Rectangle((int)x,(int) y, width, height);} } package Thunder_one;import java.awt.Color; import java.awt.Font; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import javax.swing.Timer; import javax.swing.JFrame; import javax.swing.JLabel;/*** :雷電第一個版本:* 屏幕有很多隨機(jī)生成的炮彈,我們需要控制飛機(jī)來躲避炮彈* 存活時間越長,得分越高** */ public class GameUI extends Frame {Date startTime = new Date(); // 游戲起始時刻Date endTime; // 游戲結(jié)束時刻private int score = 0;// �?獲分�?// 界面寬和�?public static int UIWidth = 1000;public static int UIHeigh = 1000;// 炮彈的數(shù)量int ShellNum = 20;// 飛機(jī)的速度int PlSpeed = 20;// 將背景和飛機(jī)圖片定義為成員變量Image background = GameUtil.getImage("images/back3.jpg");Image planeImg = GameUtil.getImage("images/plane1.png");Image shootImg = GameUtil.getImage("images/shoot1.png");Plane plane1 = new Plane(planeImg, 500, 800, PlSpeed, 100, 100);// 炮彈的數(shù)�?Shell[] shellArr = new Shell[ShellNum];// 創(chuàng)建爆炸對象Explode bao;// 爆炸的輪播圖Image[] imgs = new Image[16];// 主界面public void GFrame() {this.setTitle("雷電");this.setSize(UIWidth, UIHeigh);this.setLocationRelativeTo(null);// 增加關(guān)閉窗口監(jiān)聽,這樣用戶點擊右上角關(guān)閉圖標(biāo),可以關(guān)閉游戲程�?this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});this.addKeyListener(plane1);// 初始化,生成炮彈for (int i = 0; i < ShellNum; i++) {shellArr[i] = new Shell();}this.setVisible(true);// 啟動線程PaintThread pt = new PaintThread();pt.start();}// paint方法作用是:畫出整個窗口及內(nèi)部內(nèi)容�被系統(tǒng)自動調(diào)用�public void paint(Graphics g) {g.drawImage(background, 0, 0, 1000, 1000, null);plane1.drawMySelf(g);// 畫出容器中所有的子彈for (int i = 0; i < shellArr.length; i++) {shellArr[i].draw(g);// 檢測碰撞boolean peng = shellArr[i].getRect().intersects(plane1.getRect());if (peng) {plane1.live = false;// 飛機(jī)死掉endTime = new Date();if (bao == null) {bao = new Explode(plane1.x, plane1.y);}bao.draw(g);}}if (!plane1.live) {if (endTime == null) {endTime = new Date();}int period = (int) ((endTime.getTime() - startTime.getTime()) / 1000);printInfo(g, "您的得分為:" + period + "�?", 50, 120, 260, Color.white);}}// �?後計�?public void printInfo(Graphics g, String str, int size, int x, int y, Color color) {Color c = g.getColor();g.setColor(color);Font f = new Font("宋體", Font.BOLD, size);g.setFont(f);g.drawString(str, x, y);g.setColor(c);}// 定義內(nèi)部�?class PaintThread extends Thread {// 重寫public void run() {while (true) {repaint();// 重畫try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}}}}// 雙緩沖解決閃�?private Image offScreenImage = null;public void update(Graphics g) {if (offScreenImage == null)offScreenImage = this.createImage(1000, 1000);// 這是游戲窗口的寬度和高度Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}// 主方�?public static void main(String[] args) {// 類里面調(diào)用窗�?GameUI gu = new GameUI();gu.GFrame();} } package Thunder_one;import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL;import javax.imageio.ImageIO;/*** GameUtil類:加載圖片代碼*GameUtil獲得程序運(yùn)行類加載器,加載資源的根目錄,* 2019年9月22日*/ public class GameUtil {//工具類一般將構(gòu)造器私有化public GameUtil() {}public static Image getImage(String path){BufferedImage bi = null;try {URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}} package Thunder_one;import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;/*** ** 2019年9月22日*/ public class Plane extends GameObject implements KeyListener {boolean left, right, up, down, shoot;boolean live = true;public void drawMySelf(Graphics g) {if(live){super.drawMySelf(g);// 這里可移動,但是下面不行,應(yīng)該是判斷的問題// this.x+=2;// System.out.println(left);if (left) {x -= speed;if (x <= 0) {x = 0;}}if (right) {x += speed;if (x >= 900) {x = 900;}}if (up) {y -= speed;if (y <= 10) {y = 10;}}if (down) {y += speed;if (y >= 900) {y = 900;}}}}public Plane(Image img, double x, double y, int speed, int width, int height) {super(img, x, y, width, height);this.speed = speed;}public void keyTyped(KeyEvent e) {}public void keyPressed(KeyEvent e) {//System.out.println(e.getKeyCode());int key = e.getKeyCode();switch (key) {case 37:left = true;break;case 38:up = true;break;case 39:right = true;break;case 40:down = true;break;default:break;}}public void keyReleased(KeyEvent e) {// System.out.println(e.getKeyCode());int key = e.getKeyCode();switch (key) {case 37:left = false;break;case 38:up = false;break;case 39:right = false;break;case 40:down = false;break;default:break;}} } /*** 2019年9月26日*/ package Thunder_one;import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.util.Random;import Thunder.GameUtil;/*** ** 2019年9月26日*/ public class Shell extends GameObject{double degree;Random ra = new Random();public Shell(){degree = Math.random()*Math.PI*2;x = ra.nextInt(700)+250;y = ra.nextInt(700)+150;width = ra.nextInt(15)+10;height = ra.nextInt(15)+10;speed = ra.nextInt(3)+2;}public void draw(Graphics g){//將外部傳入對象g的狀態(tài)保存好Color c = g.getColor();g.setColor(Color.yellow);Image shootImg = GameUtil.getImage("images/shoot1.png");g.drawImage(shootImg, (int)x, (int)y, width, height, null);//g.fillOval((int)x, (int)y, width, height);//炮彈沿著任意角度飛行x += speed*Math.cos(degree);y += speed*Math.sin(degree);//如下代碼,用來實現(xiàn)碰到邊界,炮彈反彈回來(原理和打臺球游戲一樣)if(y>GameUI.UIHeigh-height||y<40){degree = -degree;}if(x<0||x>GameUI.UIWidth-width){degree = Math.PI-degree;}//返回給外部,變回以前的顏色//g.setColor(c);}}

總結(jié)

以上是生活随笔為你收集整理的仿雷电——飞机大战类游戏Ⅰ的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区精品在线 | 浮力影院草草 | 日本四级电影 | 毛片导航 | 黄色一级免费网站 | 久久精品国产精品亚洲 | 天堂资源网 | 国产av剧情一区 | 日韩成人影视 | 朴银狐电影中文在线看 | 小萝莉末成年一区二区 | 99精品成人 | 日本色呦呦 | 福利电影一区 | 免费观看黄一级视频 | 日日操网 | 亚洲成人a v | 青青久久av北条麻妃黑人 | 免费成人深夜夜视频 | 黄色喷水视频 | 国产精品无码午夜福利 | 在线日韩三级 | 成年人国产 | 亚洲av毛片 | 欢乐谷在线观看免费播放高清 | 亚洲精品乱码久久久久久蜜桃图片 | 人妻无码中文字幕免费视频蜜桃 | 狠狠久久久 | 精品中文字幕一区二区三区 | 女同vk | 亚洲国产精品久久久久久6q | 日本午夜免费福利视频 | 日韩在线观看第一页 | 91精品啪在线观看国产 | 久久爱成人 | 美女扒开腿让男生捅 | 天天躁日日躁狠狠躁喷水 | 艳妇臀荡乳欲伦交换在线看 | 久久激情综合 | 免费观看视频在线观看 | 欧美日韩一区二区区 | 无码国产精品一区二区免费式直播 | 日本天堂免费a | 爱爱网站视频 | 精品二区在线 | 欧美成人午夜精品久久久 | 性高湖久久久久久久久免费 | 久久久999成人| 日韩在线欧美 | va在线播放| 国产又色又爽无遮挡免费 | 亚洲啪啪网 | 色噜噜在线观看 | 中文在线字幕观看 | 久久久久人妻一道无码AV | 另类小说色综合 | 色一情一乱一乱一区91av | 国产男女视频 | 免费在线观看av的网站 | 天天躁日日躁狠狠躁欧美 | www.桃色av嫩草.com | 午夜精品99| 69av导航 | 国产传媒在线播放 | 欧美色老头old∨ideo | 老司机成人在线 | 亚洲美女偷拍 | 美女让男生桶 | 欧美视频在线看 | 欧美日韩片 | 久久午夜影视 | 国产裸体美女永久免费无遮挡 | 日韩av在线网站 | 麻豆精品国产传媒av | 99精品国产免费 | 伊人久久久久久久久久久 | 国产精品一区二区免费看 | 欧美日韩69 | 97精品人妻麻豆一区二区 | 精国产品一区二区三区a片 国产精品第一 | 2018av| 国语对白久久 | 黄色av播放 | 日韩精品极品视频免费观看 | 在线观看免费高清视频 | 国产视频第一页 | 日本少妇裸体做爰高潮片 | 黑人大群体交免费视频 | 久久9久久 | 天天干天天草天天射 | 一区二区三区四区久久 | 狠狠干狠狠插 | 伊人夜夜| 久久久国产高清 | 久久久亚洲综合 | 美日韩成人av | 天堂在线91 | 久久综合影院 | 超能一家人电影免费喜剧在线观看 |