java飞机大战源代码

合集下载

豪华版飞机大战系列(六)--附源代码

豪华版飞机大战系列(六)--附源代码

豪华版飞机⼤战系列(六)--附源代码最后⼀篇讲⼀下游戏中的主要逻辑推断,在上⾯的⼯作都做充分准备后,游戏主要逻辑将变得特别清晰,接下来你会看到全部的逻辑都是那么的清晰⾃然,由于前⾯已经做好了充分的准备⼯作,这⾥仅仅是整合了前⾯的⼯作,略微增加了⼀些游戏推断元素。

同⼀时候源代码会在⽂章最后给出链接地址,源代码托管在github上,全部的东西都是开源免费的,在如今的⼤环境下。

开源才是王道,分享才⼲双赢,我始终认为这是对的。

你有⼀种思想我有⼀种思想,交流分享后我们都有了两种思想,何乐⽽不为呢。

好了,回归正题。

游戏主要推断逻辑都在GameScene场景中,当中包含了GameLayer层。

在层中进⾏游戏的逻辑推断。

来看⼀下GameScene.h的内容:#include "cocos2d.h"#include "PlaneLayer.h"#include "BulletSprite.h"#include "EnemyLayer.h"USING_NS_CC;class GameLayer: public cocos2d::Layer {public://创建GameLayer层所属的场景static cocos2d::Scene* createScene();virtual bool init();//在onEnter运⾏完毕之后调⽤此函数virtual void onEnterTransitionDidFinish();CREATE_FUNC(GameLayer);public://依据每帧来更新游戏void gameUpdate(float dt);//⼦弹碰撞检測bool bulletCollisionEnemy(Sprite* pBullet);//飞机碰撞检測bool enemyCollisionPlane();//menu回调函数void menuCloseCallback(cocos2d::Ref* pSender);public:PlaneLayer *planeLayer;//飞机层BulletSprite *bulletSprite;//⼦弹层EnemyLayer *enemyLayer;//敌机层int getRand(int start, int end);//获取从start到end的随机数};不做太多解释,直接看各个函数的详细实现,GameScene.cpp#include "GameScene.h"/*** 创建场景,并加⼊GameLayer层*/cocos2d::Scene* GameLayer::createScene() {auto scene = Scene::create();auto layer = GameLayer::create();scene->addChild(layer);return scene;}bool GameLayer::init() {if (!Layer::init()) {return false;}this->setTouchEnabled(true);//设置层中可触摸点击Size winSize = Director::getInstance()->getWinSize();/*** 随即载⼊背景图⽚,*/char buff[15];int id = getRand(1, 5);//返回1~5之间的随机数sprintf(buff, "img_bg_%d.jpg", id);auto over = Sprite::create(buff);over->setPosition(Point(winSize.width / 2, winSize.height / 2));this->addChild(over);return true;}/*** 返回从start到end的随机整数*/int GameLayer::getRand(int start, int end) {struct timeval tv;gettimeofday(&tv, NULL);unsigned long int rand_seed = _sec * 1000 + _usec / 1000;//随机数种⼦srand(rand_seed);float i = CCRANDOM_0_1() * (end - start + 1) + start;return (int) i;}/*** 在onEnter函数之后调⽤* 功能:创建飞机、⼦弹、敌机并加⼊到层中*/void GameLayer::onEnterTransitionDidFinish() {planeLayer = PlaneLayer::create();this->addChild(planeLayer);bulletSprite = BulletSprite::create();this->addChild(bulletSprite);enemyLayer = EnemyLayer::create();this->addChild(enemyLayer);//设置每帧时都调⽤gameUpdate函数this->schedule(schedule_selector(GameLayer::gameUpdate));//加⼊menu,并设置回调函数Size visibleSize = Director::getInstance()->getVisibleSize();Point origin = Director::getInstance()->getVisibleOrigin();auto closeItem = MenuItemImage::create("CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(GameLayer::menuCloseCallback, this));closeItem->setPosition(Point(origin.x + visibleSize.width- closeItem->getContentSize().width / 2,origin.y + closeItem->getContentSize().height / 2));auto menu = Menu::create(closeItem, NULL);menu->setPosition(Point::ZERO);this->addChild(menu, 1);}/*** menu的回调函数*/void GameLayer::menuCloseCallback(Ref* pSender) {#if (CC_TARGET_PLATFORM == CC_PLATFORM_WP8) || (CC_TARGET_PLATFORM == CC_PLATFORM_WINRT) MessageBox("You pressed the close button. Windows Store Apps do not implement a close button.","Alert");return;#endifDirector::getInstance()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)exit(0);#endif}/*** ⼦弹和敌机碰撞检測函数*/bool GameLayer::bulletCollisionEnemy(Sprite* pBullet) {//遍历场景中的全部敌机,看⼦弹是否和敌机的包装矩形有重叠for (auto& eEnemy : enemyLayer->vecEnemy) {EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;//推断矩形是否有重叠if (pBullet->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())) {if (1 == pEnemySprite->getLife()) {pEnemySprite->loseLife();enemyLayer->blowupEnemy(pEnemySprite);} else {pEnemySprite->loseLife();}//有重叠则移除⼦弹bulletSprite->removeBullet(pBullet);return true;}}return false;}/*** 在每帧时都进⾏游戏逻辑检測,* 检測⼦弹和敌机是否有碰撞* 检測主⾓飞机和敌机是否有碰撞*/void GameLayer::gameUpdate(float dt) {bool bMoveButt = false;for (auto& eButtle : bulletSprite->vecBullet) {Sprite* pBullet = (Sprite*) eButtle;bMoveButt = bulletCollisionEnemy(pBullet);if (bMoveButt) {return;}}enemyCollisionPlane();}/*** 敌机和主⾓飞机是否有碰撞* 遍历全部敌机进⾏检測*/bool GameLayer::enemyCollisionPlane() {Sprite* pPlane = (Sprite*) planeLayer->getChildByTag(AIRPLANE);for (auto& eEnemy : enemyLayer->vecEnemy) {EnemySprite* pEnemySprite = (EnemySprite*) eEnemy;if (pPlane->boundingBox().intersectsRect(pEnemySprite->getBoundingBox())&& pEnemySprite->getLife() > 0) {//TODO,DO WHAT YOU WANT// this->unscheduleAllSelectors();// this->bulletLayer->StopBulletShoot();// this->planeLayer->blowUp();return true;}}return false;}在各个关键的地⽅都有详细凝视,了解引擎的都应该能够看明确的。

javascript飞机大战完整代码

javascript飞机大战完整代码

javascript飞机⼤战完整代码<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title><style>*{margin:0;padding:0;}.game{position:relative;width: 320px;height: 568px;margin: 50px auto;background: url('image/bg.png');}.game>img,.score,.life{position: absolute;}.score{top: 20px;}.life{right: 0;top: 20px;}.life{width:60px;}.life img{float: left;}</style></head><body><div class="game"><div class="score">得分:0</div><div class="life"><img src="image/heart.png" alt=""><img src="image/heart.png" alt=""><img src="image/heart.png" alt=""></div></div></body></html><script src="js/engine.js"></script><script src="js/bullet.js"></script><script src="js/hero.js"></script><script src="js/enemy.js"></script><script src="js/allEnemy.js"></script>引擎/*游戏引擎*/var Engine = {//刚开始的游戏状态gameStatus:false,//所以敌机enemy:{},//⼦弹bullet:{},//得分scroe:0,//背景图⽚game:document.querySelector('.game'),//页⾯得分textScroe:document.querySelector('.score'),//初始化init:function(){this.gameStart();},//游戏开始gameStart:function(){var _this = this;//点击图⽚的时候判断游戏状态this.game.onclick = function(){if(!_this.gameStatus){_this.gameStatus = true;//移动移动_this.bgMove();}},//背景移动bgMove:function(){var y=0;var _this = this;this.bgTimer = setInterval(function(){y+=2;_this.game.style['background-position-y']=y+'px';},50)},createPlane:function(){//创建敌机和英雄机Hero.init();//创建敌机this.createTimer = setInterval(function(){var num = parseInt(Math.random()*15)+1;switch (num) {case 1:case 3:case 5:case 7:case 9:new SmallEnemy().init();break;case 2:case 4:case 6:new MiddleEnemy().init();case 8:case 12:new LargeEnemy().init();}},500)},//所有敌机和⼦弹都要动handleMove:function(){var _this=this;this.moveTimer = setInterval(function(){//创建所有⼦弹for(var i in _this.bullet){_this.bullet[i].move()}//c创建所有敌机动for(var i in _this.enemy){_this.enemy[i].move()}},30)},//碰撞检测isCompact:function(obj1,obj2){var l1 = obj1.offsetLeft>obj2.offsetLeft+obj2.offsetWidth; var l2 = obj2.offsetLeft>obj1.offsetLeft+obj1.offsetWidth; var t1 = obj1.offsetTop>obj2.offsetTop+obj2.offsetHeight; var t2 = obj2.offsetTop>obj1.offsetTop+obj1.offsetHeight; if(l1||l2||t1||t2){return false;}else{return true;}},//更新得分updateScroe:function(scroe){this.scroe+=scroe;this.textScroe.innerHTML="分数"+this.scroe;},gameOver:function(){//停⽌创建敌机clearInterval(this.createTimer);//⼦弹停⽌clearInterval(this.moveTimer);}};/*英雄机:因为英雄机只有⼀辆所以不需要⽤构造函数*/var Hero = {//初始图⽚self:null,//初始leftleft:0,//初始toptop:0,//⽣命值life:3,//加载进来的图和爆照的图imgs:['image/hero.gif','image/hero-bang.gif'],//获得到⾃⼰的红星allHero:document.querySelectorAll('.life>img'),//初始化init:function(){//创建⼀个元素var img = document.createElement('img');//将图⽚路径赋值给它img.src=this.imgs[0];//插⼊到game中Engine.game.appendChild(img);//赋值给英雄机的初始图⽚this.self = img;//当图⽚加载完成以后获取图⽚的⾼度和宽度var _this = this;//在函数⾥⾯this的指向会改变,所以我们提前报存下来img.onload = function(){//因为上⾯的属性有this.left所以我们应该和图⽚⼀样赋值给它_this.left = (Engine.game.offsetWidth-img.offsetWidth)/2;//英雄机的left中⼼点等于(game的宽度-英雄机的宽度)除以2 _this.top = Engine.game.offsetHeight-img.offsetHeight;img.style.left = _this.left+'px';img.style.top = _this.top+'px';//初始化的时候调⽤move_this.move();_this.shoot();};},//⿏标移动的时候英雄机也要移动move:function(){//类似于放⼤镜var _this = this;document.onmousemove = function(e){var e = e||event;var l = e.clientX - Engine.game.offsetLeft - _this.self.offsetWidth/2;var t = e.clientY - Engine.game.offsetTop - _this.self.offsetHeight/2;//边界处理var lmax = Engine.game.offsetWidth-_this.self.offsetWidth;//最⼤边界var bmax = Engine.game.offsetHeight-_this.self.offsetHeight;//最⼤边界l = l < 0 ? 0 : (l > lmax ? lmax : l);t = t < 0 ? 0 : (t > bmax ? bmax : t);//赋值_this.self.style.left = l+'px';_this.self.style.top = t+'px';//更新left top_this.left = l;_this.top = t;}},//发⼦弹shoot:function(){//每隔100毫秒发⼀次⼦弹var _this = this;this.shootTimer = setInterval(function(){var l = _this.left+_this.self.offsetWidth/2new Bullet(l,_this.top).init();},100)},bang:function(){var img = document.createElement('img');img.src = this.imgs[1];img.style.left = this.left+'px';img.style.top = this.top+'px';Engine.game.appendChild(img)setTimeout(function(){img.remove();this.life--;this.allHero = document.querySelectorAll('.life img');this.allHero[0].remove();console.log(this.allHeart,this.allHero[0])if(this.life<=0){this.destroy();}},destroy:function(){this.self.remove();this.bang();clearInterval(this.shootTimer);//游戏结束this.gameOver();}}//在游戏没开始的时候不能出现英雄机和⼦弹所以要放在引擎⾥⾯//Hero.init();敌机类/*创建敌机:*/function Enemy(blood,speed,imgs,scroe){//敌机leftthis.left = 0;//敌机topthis.top = 0;//敌机⾎量this.blood = blood;//敌机速度this.speed = speed;//敌机图⽚集合this.imgs = imgs;//爆炸前和爆炸后//分数this.scroe = scroe;}Enemy.prototype = {constructor:Enemy,init:function(){//创建⼀个元素var img = document.createElement('img');//将图⽚路径赋值给它img.src=this.imgs[0];//插⼊到game中Engine.game.appendChild(img);//赋值给敌机的初始图⽚this.self = img;//当图⽚加载完成以后获取图⽚的⾼度和宽度var _this = this;//在函数⾥⾯this的指向会改变,所以我们提前报存下来 img.onload = function(){_this.left = parseInt(Math.random()*(320-img.offsetWidth));_this.top = -img.offsetHeight;img.style.left = _this.left+'px';img.style.top = _this.top+'px';};//⽣成敌机编号并放⼊引擎的bullet中this.id = Math.random();Engine.enemy[this.id]=this;},//⼦弹移动,定时器都交给引擎去做move:function(){this.top+=this.speed;this.self.style.top = this.top+'px';//越界判断if(this.top>568+this.self.offsetWidth){this.destroy();}//判断与英雄机相撞if(Engine.isCompact(this.self,Hero.self)){//⾃⼰销毁this.destroy();//英雄机var img = document.createElement('img');img.src = this.imgs[1];img.style.left = this.left+'px';img.style.top = this.top+'px';Engine.game.appendChild(img)setTimeout(function(){img.remove();},1000)},destroy:function(){//销毁//从页⾯⼩时this.self.remove();this.bang();//统计得分Engine.updateScroe(this.scroe);//从内存消失delete Engine.enemy[this.id];}}⼤中⼩机器/*创建所有类型的飞机*/function SmallEnemy(){var s = parseInt(Math.random()*3+3);Enemy.call(this,1,s,['image/enemy1.png','image/enemy1-bang.gif'],10)}SmallEnemy.prototype = {constructor: SmallEnemy,__proto__: Enemy.prototype};function MiddleEnemy(){var s = parseInt(Math.random()*3+2);Enemy.call(this,5,s,['image/enemy2.png','image/enemy2-bang.gif'],20)}MiddleEnemy.prototype = {constructor:MiddleEnemy,__proto__:Enemy.prototype}function LargeEnemy(){var s = parseInt(Math.random()*2+1);Enemy.call(this,10,s,['image/enemy3.png','image/enemy3-bang.gif'],50)}LargeEnemy.prototype = {constructor:LargeEnemy,__proto__:Enemy.prototype}⼦弹/*创建⼦弹:因为⼦弹不是只创建⼀个所以要⽤构造函数注意⼀点:⼦弹发射的位置应该是英雄机的正中央的位置,所以需要传点东西进来*/function Bullet(l,t){this.l = l;//保留⼀下传进来的lthis.t = t;//保留⼀下创进来的t//初始图⽚this.self = null;//⼦弹初始leftthis.left = 0;//⼦弹初始topthis.top = 0;//⼦弹的速度this.speed = 2;//⼦弹编号因为在引擎⾥⾯有⼀个专门存放⼦弹的对象,所以我们要给每⼀个⼦弹⽣成编号 this.id = '';}Bullet.prototype = {constructor:Bullet,init:function(){//创建⼀个元素var img = document.createElement('img');Engine.game.appendChild(img);//赋值给⼦弹的初始图⽚this.self = img;//当图⽚加载完成以后获取图⽚的⾼度和宽度var _this = this;//在函数⾥⾯this的指向会改变,所以我们提前报存下来 img.onload = function(){//因为上⾯的属性有this.left所以我们应该和图⽚⼀样赋值给它_this.left = _this.l-_this.self.offsetWidth/2;_this.top = _this.t-_this.self.offsetHeight;img.style.left = _this.left+'px';img.style.top = _this.top+'px';};//⽣成⼦弹编号并放⼊引擎的bullet中this.id = Math.random();Engine.bullet[this.id]=this;},//⼦弹移动,定时器都交给引擎去做move:function(){this.top-=2;this.self.style.top = this.top+'px';//越界判断if(this.top<=-this.self.offsetHeight){this.destroy();}//是否与敌机碰撞for(i in Engine.enemy){if(Engine.isCompact(this.self,Engine.enemy[i].self)){//⼦弹销毁this.destroy();//敌机销毁Engine.enemy[i].blood--;if(Engine.enemy[i].blood<=0){Engine.enemy[i].destroy();}}}},destroy:function(){//销毁//从页⾯⼩时this.self.remove();//从内存消失delete Engine.bullet[this.id];}}。

java实现飞机游戏代码

java实现飞机游戏代码

java实现飞机游戏代码本⽂实例为⼤家分享了java实现飞机游戏的具体代码,供⼤家参考,具体内容如下MyGameFrame类:主要的调⽤类package sc.wh.game;import javax.swing.JFrame;import java.awt.Color;import java.awt.Font;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import sc.wh.game.*;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.util.Date;public class MyGameFrame extends Frame {// 调⽤⼯具类的getImage⽅法加载图⽚对象Image planeImg = GameUtil.getImage("images/plane.png");Image bg = GameUtil.getImage("images/bg.jpg");// 创建飞机,设置初始位置Plane plane = new Plane(planeImg,250,250);// 创建炮弹组Shell shells[] = new Shell[50];// 设置爆炸效果类的对象的引⽤Explode bao;// 游戏开始时间Date startTime = new Date();// 游戏结束时间Date endTime;// 游戏进⾏的时间int period;// 记录爆炸效果显⽰的图⽚int BaoCount = 0;// 在窗⼝画图⽅法,由repaint⽅法⾃动调⽤@Overridepublic void paint(Graphics g) { // 会⾃动被调⽤,g相当于⼀⽀画笔Color c = g.getColor();// 画背景g.drawImage(bg,0,0,null);// 调⽤飞机类的画图⽅法并画飞机plane.drawSelf(g);// 画炮弹组中的炮弹for (int i=0;i<shells.length;i++) {// 调⽤炮弹对象的draw⽅法shells[i].draw(g);// 获取炮弹所在矩形位置并调⽤intersects判断两矩形是否相交boolean peng = shells[i].getRect().intersects(plane.getRect());if(peng) {// 如果相交则设置飞机存活状态为falseplane.live = false;// 如果bao对象没有初始化过则才初始化if(bao == null) {bao = new Explode(plane.x, plane.y);endTime = new Date();period = (int)(endTime.getTime() - startTime.getTime())/1000;}if(BaoCount <= 15) {// 调⽤爆炸效果显⽰类的画图⽅法,每次调⽤只画⼀张图bao.draw(g);BaoCount++;}}// 如果飞机未存活则显⽰游戏时间if(!plane.live) {// 创建字体对象Font f = new Font("宋体",Font.BOLD,50);// 设置字体g.setFont(f);// 设置字体颜⾊g.setColor(Color.RED);// 显⽰游戏结束时间g.drawString("游戏时间:" + period + "秒", 100, 250);}}g.setColor(c);}// 继承Thread线程类class PaintThread extends Thread{// 线程开始后会⾃动调⽤run⽅法@Overridepublic void run() {while (true) {// 调⽤repaint窗⼝画图⽅法,此⽅法会⾃动调⽤paint⽅法repaint();try {// 控制⼀秒25次在窗⼝画图的⽅法Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}}// 创建键盘检测内部类,并继承键盘监听类class KeyMonitor extends KeyAdapter{// 检测键盘按下事件,调⽤飞机类对应的⽅法@Overridepublic void keyPressed(KeyEvent e) {// KeyEvent键盘检测类plane.addDirection(e);}// 检测键盘释放事件,调⽤飞机类对应的⽅法@Overridepublic void keyReleased(KeyEvent e) {plane.minusDirection(e);}}// 双缓冲解决闪烁private Image offScreenImage = null;public void update(Graphics g) {if(offScreenImage == null)offScreenImage = this.createImage(Constants.WIDTH,Constants.HEIGHT);//这是游戏窗⼝的宽度和⾼度 Graphics gOff = offScreenImage.getGraphics();paint(gOff);g.drawImage(offScreenImage, 0, 0, null);}public void launchFrame(){// 标题this.setTitle("game fly");// 窗⼝默认不可见this.setVisible(true);// 窗⼝⼤⼩this.setSize(Constants.WIDTH,Constants.HEIGHT);// 窗⼝距离左上⾓的坐标位置this.setLocation(300,300);//增加关闭窗⼝监听,这样⽤户点击右上⾓关闭图标,可以关闭游戏程序this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e){System.exit(0);}});// 创建在窗⼝中画图线程并调⽤new PaintThread().start();// 将KeyMonitor类的对象加⼊键盘监控检测,对应的事件会⾃动调⽤此类对应的⽅法addKeyListener(new KeyMonitor());// 创建炮弹,加⼊炮弹数组for(int i=0;i<shells.length;i++) {shells[i] = new Shell();}}public static void main(String[] args) {MyGameFrame f = new MyGameFrame();// 调⽤画窗⼝⽅法unchFrame();}}⼯具类(⽤来获取图⽚对象):package sc.wh.game;import java.awt.Image;import java.awt.image.BufferedImage;import java.io.IOException;import .URL;import javax.imageio.ImageIO;public class GameUtil {// ⼯具类最好将构造器私有化。

飞机大战 java 源代码

飞机大战 java  源代码

package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Plane {Image feijiImage = null;int x = 300;int y = 700;int lifeCount=5;public Plane() {try {feijiImage = ImageIO.read(Plane.class.getClassLoader().getResourceAsStream("images/feiji.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画飞机图片g.drawImage(feijiImage, x, y, null);//飞机移动this.move();// 血条if(lifeCount>0){g.setColor(Color.WHITE);g.fillRect(20, 80, 100, 10);g.setColor(Color.red);g.fillRect(20, 80, (100/5)*lifeCount, 10);g.setColor(Color.blue);g.setFont(new Font("幼圆", Font.BOLD, 30));g.drawString("Score:"+Play01.count, 20, 60);}}public void move(){if(isUP && !isDown && !isLeft && !isRight){//上y=y-5;}else if(!isUP && isDown && !isLeft && !isRight){ //下y=y+5;}else if(!isUP && !isDown && isLeft && !isRight){ //左x=x-5;}else if(!isUP && !isDown && !isLeft && isRight){ //右x=x+5;}else if(isUP && !isDown && isLeft && !isRight){ //左上x=x-5;y=y-5;}else if(!isUP && isDown && isLeft && !isRight){ //左下x=x-5;y=y+5;}else if(isUP && !isDown && !isLeft && isRight){ //右上x=x+5;y=y-5;}else if(!isUP && isDown && !isLeft && isRight){ //右下x=x+5;y=y+5;}}boolean isUP = false;boolean isDown = false;boolean isLeft = false;boolean isRight = false;// 摁下public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {isRight=true;} else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {isLeft=true;} else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {isUP=true;} else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) { isDown=true;}}// 放开public void keyReleased(KeyEvent e) {int keyCode = e.getKeyCode();if (keyCode == KeyEvent.VK_RIGHT || keyCode == KeyEvent.VK_D) {isRight=false;} else if (keyCode == KeyEvent.VK_LEFT || keyCode == KeyEvent.VK_A) {isLeft=false;} else if (keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_W) {isUP=false;} else if (keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_S) { isDown=false;}}public Rectangle getRectangle(){return new Rectangle(x,y,feijiImage.getWidth(null),feijiImage.getHeight(null));}}package com;public class PlaneStatus {public static int roleNum = 1;public static int playStatus = 0;// 0 游戏开始前 1 第一关-1 游戏结束}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Power {Image PowerImage = null;int x = 20;int y = 0;public Power() {this.x=(int)(Math.random()*540)+20;try {PowerImage = ImageIO.read(Gift.class.getClassLoader().getResourceAsStream("images/power.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画血瓶图片g.drawImage(PowerImage, x, y, null);//血瓶移动y++;}public Rectangle getRectangle(){return new Rectangle(x,y,PowerImage.getWidth(null),PowerImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.util.ArrayList;import java.util.List;import javax.imageio.ImageIO;// 第一关public class Play01 {static int count=0;Image bgImage = null;// 战机Plane plane = new Plane();// 战机子弹List<MyZiDan> mzds = new ArrayList<MyZiDan>();// 敌机List<Diji> dijis = new ArrayList<Diji>();// 敌机子弹//List<DijiZiDan> dijizidans = new ArrayList<DijiZiDan>();// 血瓶List<Gift> gifts = new ArrayList<Gift>();List<Power> powers = new ArrayList<Power>();public Play01() {try {bgImage = ImageIO.read(Play01.class.getClassLoader().getResourceAsStream("images/bg_01.jpg"));} catch (IOException e) {e.printStackTrace();}}int bgY1 = 0;int bgY2 = -600;int fireTime = 0;boolean flag=false;public void draw(Graphics g) {// 画背景图片g.drawImage(bgImage, 0, bgY1, null);bgY1 += 5;if (bgY1 <= 600) {bgY1 = 0;}g.drawImage(bgImage, 0, bgY2, null);bgY2 += 5;if (bgY2 >= 0) {bgY2 = -600;}// 清理战机子弹for (int i = 0; i < mzds.size(); i++) {MyZiDan myZidan = mzds.get(i);if (myZidan.x > 800) {mzds.remove(i);}}// 添加子弹if (isFire1 == true && flag==false) {if (fireTime % 8 == 0) {mzds.add(new MyZiDan(plane.x + 25, plane.y + 0));}fireTime++;}if (isFire1== true && flag==true) {if (fireTime % 4 == 0) {mzds.add(new MyZiDan(plane.x +8, plane.y +0));mzds.add(new MyZiDan(plane.x +52, plane.y +0));}fireTime++;}// 画战机子弹for (int i = 0; i < mzds.size(); i++) {MyZiDan myZidan = mzds.get(i);myZidan.draw(g);}// 清理敌机for (int i = 0; i < dijis.size(); i++) {Diji dj = dijis.get(i);if (dj.x < -100) {dijis.remove(i);}}// 抽奖:添加敌机if ((int) (Math.random() * 20) == 5) {dijis.add(new Diji());}// 抽奖:添加血瓶if ((int) (Math.random() * 1000) == 5) {gifts.add(new Gift());}for (int i = 0; i < gifts.size(); i++) {Gift gift = gifts.get(i);gift.draw(g);}//// 抽奖:添加powerif ((int) (Math.random() * 1000) == 5) {powers.add(new Power());}for (int i = 0; i < powers.size(); i++) {Power power = powers.get(i);power.draw(g);}// 画敌机for (int i = 0; i < dijis.size(); i++) {Diji dj = dijis.get(i);dj.draw(g);}// 画飞机plane.draw(g);// 判断战机相撞for (int i = 0; i < dijis.size(); i++) {// 先得到每一个敌机Diji dj = dijis.get(i);Rectangle r1 = dj.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {dijis.remove(i);plane.lifeCount = plane.lifeCount - 1;if(plane.lifeCount>0)flag=false;if(plane.lifeCount<1){ PlaneStatus.playStatus=-1; }}// 判断战机和血瓶相撞for (int i = 0; i < gifts.size(); i++) {// 先得到每一个血瓶Gift gift = gifts.get(i);Rectangle r1 = gift.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {gifts.remove(i);if (plane.lifeCount <5) {plane.lifeCount = plane.lifeCount + 1;}}}//// 判断战机和Power相撞for (int i = 0; i < powers.size(); i++) {// 先得到每一个powerPower power = powers.get(i);Rectangle r1 = power.getRectangle();Rectangle r2 = plane.getRectangle();if (r1.intersects(r2)) {powers.remove(i);flag=true;}}// 判断敌机在中弹for (int i = 0; i < mzds.size(); i++) {// 得到每个战机子弹MyZiDan myzidan = mzds.get(i);Rectangle r1 = myzidan.getRectangle();for (int j = 0; j < dijis.size(); j++) {// 每一个敌机Diji diji = dijis.get(j);Rectangle r2 = diji.getRectangle();if (r1.intersects(r2)) {mzds.remove(i);dijis.remove(j);count++;}}}boolean isFire1 = false;boolean isFire2 = false;public void keyPressed(KeyEvent e) {plane.keyPressed(e);if (e.getKeyCode() == KeyEvent.VK_J) {isFire1 = true;}/*if (e.getKeyCode() == KeyEvent.VK_K) {isFire2 = true;}*/}public void keyReleased(KeyEvent e) {plane.keyReleased(e);if (e.getKeyCode() == KeyEvent.VK_J) {isFire1 = false;fireTime = 0;}/*if (e.getKeyCode() == KeyEvent.VK_K) {isFire2 = false;fireTime = 0;}*/if( e.getKeyCode()==KeyEvent.VK_P){for(int i=0;i<dijis.size();i++)dijis.remove(i);}}}package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;// 游戏结束public class Over {Image obg=null;Image ng=null;public Over() {try {obg = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/obg.jpg"));ng = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/ng.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g){g.drawImage(obg, 0, 0, null);g.drawImage(ng, 120,100, null);g.setColor(Color.black);g.setFont(new Font("幼圆", Font.BOLD, 40));g.drawString("游戏结束啦!",200 ,600 );}public void keyPressed(KeyEvent e) {}public void keyReleased(KeyEvent e) {}}package com;import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import javax.swing.JFrame;public class MainFrame extends JFrame {Before before =new Before();Play01 play01 = new Play01();Over over = new Over();public MainFrame() {//设置标题this.setTitle(" 让子弹飞一会~"); //设置大小this.setSize(600, 800);//定位居中this.setLocationRelativeTo(null);//添加关闭操作this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //禁止重置大小zthis.setResizable(false);//添加键盘监听器//KeyListener --> KeyAdapterthis.addKeyListener(new KeyAdapter(){@Overridepublic void keyPressed(KeyEvent e) {if(PlaneStatus.playStatus == 0){before.keyPressed(e);}else if(PlaneStatus.playStatus ==1){play01.keyPressed(e);}else if(PlaneStatus.playStatus==-1){over.keyPressed(e);}}@Overridepublic void keyReleased(KeyEvent e) {if(PlaneStatus.playStatus == 0){before.keyReleased(e);}else if(PlaneStatus.playStatus ==1){play01.keyReleased(e);}else if(PlaneStatus.playStatus==-1){over.keyReleased(e);}}});//启动一个线程:每隔20 毫秒执行一次new Thread(){public void run(){while(true){MainFrame.this.repaint();try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}}}}.start();//显示this.setVisible(true);}Image bufferImage =null;//这个方法也是20毫秒执行一次public void paint(Graphics g){if(bufferImage==null){bufferImage = this.createImage(600, 800);}Graphics g4Image = bufferImage.getGraphics();g4Image.setColor(Color.BLACK);g4Image.fillRect(0, 0, 600, 800);this.draw(g4Image);g.drawImage(bufferImage, 0, 0, null);}public void draw(Graphics g){if(PlaneStatus.playStatus == 0){before.draw(g);}else if(PlaneStatus.playStatus ==1){play01.draw(g);}else if(PlaneStatus.playStatus==-1){over.draw(g);}}public static void main(String[] args) {new MainFrame();}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.io.IOException;import javax.imageio.ImageIO;public class MyZiDan {Image zidanImage = null;int x ;int y ;public MyZiDan(int x,int y) {this.x=x;this.y=y;try {zidanImage = ImageIO.read(MyZiDan.class.getClassLoader().getResourceAsStream("images/zidan.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画我军子弹图片g.drawImage(zidanImage, x, y, null);//我的飞机子弹移动速度y-=20;}public Rectangle getRectangle(){return new Rectangle(x,y,zidanImage.getWidth(null),zidanImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Diji {Image dijiImage = null;int y = -20;int x = 10;//20 ~ 760int r;public Diji() {this.x=(int)(Math.random()*540)+40;try {r = (int)(Math.random()*3)+1;dijiImage = ImageIO.read(Diji.class.getClassLoader().getResourceAsStream("images/diji_"+r+".png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画敌机图片g.drawImage(dijiImage, x, y, null);//敌机移动if(r==1){y+=4;}else if(r==2){y+=4;}else if(r==3){y+=7;}}public Rectangle getRectangle(){return new Rectangle(x,y,dijiImage.getWidth(null),dijiImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;public class Gift {Image GiftImage = null;int x = 20;int y = 0;public Gift() {this.x=(int)(Math.random()*540)+20;try {GiftImage = ImageIO.read(Gift.class.getClassLoader().getResourceAsStream("images/blood.png"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画血瓶图片g.drawImage(GiftImage, x, y, null);//血瓶移动y++;}public Rectangle getRectangle(){return new Rectangle(x,y,GiftImage.getWidth(null),GiftImage.getHeight(null));}}package com;import java.awt.Graphics;import java.awt.Image;import java.awt.Rectangle;import java.io.IOException;import javax.imageio.ImageIO;public class DijiZiDan {Image zidanImage = null;int x ;int y ;int fangxiang =0;public DijiZiDan(int x,int y) {this.x=x;this.y=y;fangxiang = (int)(Math.random()*5);//0 ~ 7try {zidanImage = ImageIO.read(DijiZiDan.class.getClassLoader().getResourceAsStream("images/dijizidan.jpg"));} catch (IOException e) {e.printStackTrace();}}public void draw(Graphics g) {//画敌机子弹图片g.drawImage(zidanImage, x, y, null);//移动this.move();}public void move(){if(fangxiang==0){//下y=y+2;}else if(fangxiang==1){//左x=x-2;}else if(fangxiang==2){//右x=x+2;}else if(fangxiang==3){//左下x=x-2;y=y+2;}else if(fangxiang==4){//右下x=x+2;y=y+2;}}public Rectangle getRectangle(){return new Rectangle(x,y,zidanImage.getWidth(null),zidanImage.getHeight(null));}}package com;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyEvent;import java.io.IOException;import javax.imageio.ImageIO;// 游戏开始之前public class Before {Image bg=null;Image wfeiji=null;Image kdiji1=null;Image kdiji2=null;Image kdiji3=null;public Before() {try {bg = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/bg.jpg"));wfeiji = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/feiji_1.png"));kdiji1 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_01.png"));kdiji2 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_02.png"));kdiji3 = ImageIO.read(Before.class.getClassLoader().getResourceAsStream("images/kdiji_03.png"));} catch (IOException e) {e.printStackTrace();}}int time=0;public void draw(Graphics g){if(PlaneStatus.roleNum==1){// 画妹妹g.drawImage(bg, 0, 0, null);g.drawImage(wfeiji, 260, 600, null);g.drawImage(kdiji1, 200, 50, null);g.drawImage(kdiji1, 400, 50, null);g.drawImage(kdiji1, 150, 480, null);g.drawImage(kdiji1, 400, 480, null);g.drawImage(kdiji2, 100, 200, null);g.drawImage(kdiji2, 300, 100, null);g.drawImage(kdiji2, 480, 200, null);g.drawImage(kdiji3, 300, 300, null);g.drawImage(kdiji3, 70, 400, null);g.drawImage(kdiji3, 510, 400, null);}//画回车符time++;g.setColor(Color.YELLOW);g.setFont(new Font("幼圆", Font.BOLD, 30));if(time<=10){g.drawString("[Enter]>>", 50, 750);}else if(time<=20){g.drawString("[Enter] >>", 50, 750);}else if(time<=30){g.drawString("[Enter] >>", 50, 750);if(time==30){time=0;}}}public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if(keyCode == KeyEvent.VK_ENTER){PlaneStatus.playStatus=1;}if(keyCode ==KeyEvent.VK_LEFT ||keyCode==KeyEvent.VK_RIGHT ){ PlaneStatus.roleNum = 3-PlaneStatus.roleNum;//1~2 互换}}public void keyReleased(KeyEvent e) {}}。

基于Java的飞机大战游戏开发

基于Java的飞机大战游戏开发

毕业设计(论文)题目基于Java的飞机大战游戏开发飞机大战是电脑游戏发展史中早期最为经典的游戏之一,无论是在电脑端、移动端、还是游戏机上,都能见到与飞机相关的射击类游戏。

不过,最初常见的飞机大战游戏是二维平面上的,并且大多以黑白的形式出现,而如今,在电脑上,不仅机型多,而且五颜六色,3D视觉冲击强。

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击,Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有了全球最大的开发者专业社群。

在全球云计算和移动互联网的产业环境下,Java更具备了显着优势和广阔前景。

因此,本论文主要阐述以面向对象的程序开发语言Java及Eclipse为开发工具的飞机大战游戏。

首先简要介绍课题的研究背景、目的及意义,Java的发展历程、当前国内外的发展现状。

然后介绍Eclipse平台开发环境及环境搭建,最后讲述了基于Java飞机大战游戏功能的实现。

其功能模块如下:主界面模块,Hero模块,Enemy模块,Bullet 的类模块,检测子弹与敌机碰撞模块检测,相信其基于Java的飞机大战游戏将会受到更大的欢迎。

关键词:飞机大战,游戏,Java ,EclipsPlane War is the one of the most classic games in the early history of the development of computer games. We can always see aircraft-related shooting game whether it is on a computer teminal or mobile terminal. However, the first common plane war game is a two-dimensional plane, and mostly appears in the form of black and white, but now, on the computer, not just models and more colorful, 3D strong visual impact.Java is very popular with developers since it appeared, formed the powerful shock for the rapid evelopment of the C++ language. Java technology has excellent versatility, efficiency, platform portability, and security and is widely used in personal PC, data center, game consoles, scientific supercomputers, cell phones and the Internet. What’s more, Java has the world's largest developer of professional community. In the global cloud computing and mobile Internet industry environment, Java has more significant advantages and broad prospects.Therefore, this paper describes the development of object-oriented programming language Java and Eclipse development tools for aircraft war game. Firstly, it introduces research background, purpose and meaning, and telled Java development process and the current development status at home and abroad. Then introduces the Eclipse platform development environment and built environment, and finally tells the Java-based aircraft war game features implementation. Its function modules are as follows: the main interface module,Hero module,Enemy module,Bullet module, and the detection module detecting a collision with the enemy bullets. We believes its Java-based aircraft war game would be welcomedgreater.KeyWords: lightning,Game,Java,Eclipse目录前言项目背景90年代的我们,对小时候的一些经典街机游戏肯定是印象深刻,像“飞机大战”、“超级玛丽”、“坦克大战”等,这些游戏伴随了我们童年,怀旧经典,常温这写经典的游戏,我选择了“飞机大战”作为设计的项目。

飞机大战源代码

飞机大战源代码
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void run() {
// TODO Auto-generated method stub
break;
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_D)
{
x=x+7;
}
if(e.getKeyCode()==KeyEvent.VK_A){
x=x-7;
}
if(e.getKeyCode()==KeyEvent.VK_W){
import javax.swing.*;
public class TakGame extends JFrame {
MyPanel mp=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
TakGame tg=new TakGame();
g.drawImage(im, x,y, 60,50, this);
break;
case 1:
Image im1=Toolkit.getDefaultToolkit().
getImage(Panel.class.getResource("/tk.PNG"));

飞机大战JAVA程序设计报告

飞机大战JAVA程序设计报告

飞机⼤战JAVA程序设计报告中国地质⼤学长城学院Java 程序设计题⽬基于Java的打飞机游戏设计与实现系别信息⼯程系专业计算机科学与技术学⽣姓名马辉学号041120101指导教师⽥⽟龙2015 年 6 ⽉18 ⽇基于Java的打飞机游戏设计与实现1、软件运⾏所需要的软硬件环境本系统是以Windows系统为操作平台,⽤Java编程语⾔来实现本系统所需功能的。

本机器的配置如下:处理器:AMD A4 或英特尔同级别处理器主频:1.2Hz以上内存:1G以上硬盘:HHD 50G或更⾼采⽤的主要技术和软件编程语⾔:Java开发环境:windows7开发软件:Eclipse 3.72、软件开发环境配置JA V A_HOME = F:\JA V A\jdkPATH = % JA V A_HOME%\bin;%JA V A_HOME%\lib;%JA V A_HOME%\jre\lib; CLASSPATH = %JA V A_HOME%\lib;%JA V A_HOME%\jre\lib;3、软件功能框图4、软件所实现的截图5、主要功能部分的源代码import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Random;import java.util.Vector;import javax.swing.JOptionPane;import javax.swing.Timer;public class Controller extends KeyAdapter{public static Vector bangs = new Vector();public static Vector ebullets = new Vector();public static Vector pbullets = new Vector();public static Vector eplanes = new Vector();public static PPlane pplane = new PPlane();private GamePanel gamePanel;private Random random = new Random();public static int baoZhaNum;public Controller(Vector bang,Vector ebullet,Vector pbullet, Vector eplane,PPlane pplane,GamePanel gamePanel) { super(); this.bangs = bang;this.ebullets = ebullet;this.pbullets = pbullet;this.eplanes = eplane;this.pplane = pplane;this.gamePanel = gamePanel;//使⽤定时器每隔⼀秒为每⼀个敌机产⽣⼀个⼦弹Timer timer = new Timer(1000, new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubfor(int i=0;i < eplanes.size();i++){EBullet ebullet = new EBullet(eplanes.elementAt(i).x, eplanes.elementAt(i).y,8,2);ebullets.add(ebullet);}}});timer.start(); //声明定时器之后就开启定时器}@Overridepublic void keyPressed(KeyEvent e) { // TODO Auto-generated method stub switch (e.getKeyCode()){case KeyEvent.VK_UP:PPlane.UP = true;break;case KeyEvent.VK_DOWN: PPlane.DOWN = true;break;case KeyEvent.VK_LEFT: PPlane.LEFT = true;break;case KeyEvent.VK_RIGHT: PPlane.RIGHT = true;break;case KeyEvent.VK_X:PPlane.isFired = true;break;}}@Overridepublic void keyReleased(KeyEvent e) { // TODO Auto-generated method stub switch (e.getKeyCode()){case KeyEvent.VK_UP:PPlane.UP = false;break;case KeyEvent.VK_DOWN: PPlane.DOWN = false;break;case KeyEvent.VK_LEFT: PPlane.LEFT = false;break;case KeyEvent.VK_RIGHT:PPlane.RIGHT = false;break;case KeyEvent.VK_X:PPlane.isFired = false;}}public void StartRun(){new Thread(){public void run(){int count = 0; //通过count控制⼦弹避免连续按发送键时⼦弹连成线while(true){//本机移动pplane.pplaneMove();//添加本机⼦弹if(PPlane.isFired && count%5==0){PBullet pbullet1 = new PBullet(pplane.x+65, pplane.y+50, 8, 15); pbullets.add(pbullet1);PBullet pbullet2 = new PBullet(pplane.x+50, pplane.y+50, 8, 15); pbullets.add(pbullet2);PBullet pbullet3 = new PBullet(pplane.x+35, pplane.y+50, 8, 15); pbullets.add(pbullet3);PBullet pbullet4 = new PBullet(pplane.x+20, pplane.y+50, 8, 15); pbullets.add(pbullet4);}count++;//让本机⼦弹移动并判断是否打中敌机for(int i=0;i < pbullets.size();i++){pbullets.elementAt(i).bulletMove();int index = pbullets.elementAt(i).isPbulletHitEplane();if(index != -1) //不等于-1 证明打中了并产⽣爆炸{Bang bang = new Bang(pbullets.elementAt(i).x,pbullets.elementAt(i).y,30,30);bangs.add(bang);baoZhaNum++;eplanes.remove(index);}}//判断本机⼦弹出界就移除for(int i=0;i < pbullets.size();i++){if(pbullets.elementAt(i).y <= 0){pbullets.remove(i);//System.out.println("⼦弹移除");}}//添加敌机if(eplanes.size() < Global.ENEMY_NUMBER){int x = random.nextInt(Global.FRAME_WIDTH);int y = -30;EPlane eplane = new EPlane(x, y, 30, 30);eplanes.add(eplane);}//让敌机移动并且判断出界for(int i=0;i < eplanes.size();i++){eplanes.elementAt(i).eplaneMove();if(eplanes.elementAt(i).y >= Global.FRAME_HEIGHT){ eplanes.remove(i);}}//让敌机⼦弹移动并将超过边界的敌机⼦弹移除for(int i=0;i < ebullets.size();i++){ ebullets.elementAt(i).bulletMove();if(ebullets.elementAt(i).isEBulletHitPPlane()){ebullets.elementAt(i).isUsed = true;PPlane.life -= 2;}if(ebullets.elementAt(i).y >= Global.FRAME_HEIGHT){ ebullets.remove(i);}}for(int i=0;i < bangs.size();i++){if(bangs.elementAt(i).isBang == true){bangs.remove(i);}}try {sleep(30);} catch (InterruptedException e) {e.printStackTrace();}JudgeLife();gamePanel.display(bangs, ebullets, pbullets, eplanes, pplane);}}}.start();}public void JudgeLife(){if(!pplane.isAlive()){int result = JOptionPane.showConfirmDialog(gamePanel,"继续重玩?","提⽰",JOptionPane.YES_OPTION);if(result==0){newGame();}else{System.exit(0);}}}public void newGame(){bangs.clear(); //重玩必须将⼀切对象都清空ebullets.clear();pbullets.clear();eplanes.clear();pplane = new PPlane(250, 400, 100, 100);baoZhaNum = 0;pplane.life = 100; //不重置⽣命值在进⾏JudgeLife判断会⼀直出现是否重玩的对话框PPlane.DOWN = false; //重新开始游戏之后必须重置所有的静态变量否则会保存上⼀次的静态变量值运动和发射⼦弹PPlane.UP = false;PPlane.LEFT = false;PPlane.RIGHT = false;PPlane.isFired = false;}}public class PBullet extends Bullet{private Image img; //保存⼦弹的图⽚private JPanel jpanel;public JPanel getJpanel() {return jpanel;}public void setJpanel(JPanel jpanel) {this.jpanel = jpanel;}public PBullet(int x, int y, int width, int heigth) {super(x, y, width, heigth);img = new ImageIcon("Image/fire.png").getImage();// TODO Auto-generated constructor stub}public void bulletMove() {// TODO Auto-generated method stubthis.y-=20; //⼦弹的速度⼀定要⼤于飞机的速度否则⼦弹会出现在飞机后⾯}public void drawMe(Graphics g) {// TODO Auto-generated method stubg.drawImage(img, x, y, width, heigth, jpanel);}//在本机⼦弹判断是否打中敌机public int isPbulletHitEplane(){for(int j=0;j < Controller.eplanes.size();j++){Rectangle recPbullet = new Rectangle(x,y,width,heigth);Rectangle recEplane = new Rectangle(Controller.eplanes.elementAt(j).x, Controller.eplanes.elementAt(j).y,Controller.eplanes.elementAt(j).w, Controller.eplanes.elementAt(j).h);if(recPbullet.intersects(recEplane)) //判断矩形重叠{return j;}}return -1;}}6、总结JA V A和Eclipse是⼀款⾮常好的开发语⾔和平台,类的建⽴使编程相对明朗,不同的组件很明确的摆在那,对于头脑不灵活的⼈来说真的是⼀款⾮常清晰明了的开发软件,通过这⼀段时间的JA V A程序开发,我感觉到尽管的是不同的语⾔和平台,开发程序⼀样需要动脑和努⼒,每⼀款软件或者游戏都不是⼀朝⼀⼣能制作出的,都需要⼤量的构思和编程,最后还有繁琐的检查⼯作,通过这次接触JA V A我今后会更努⼒的学习它。

javafx+fxgl引擎做的一款飞机大战

javafx+fxgl引擎做的一款飞机大战

javafx+fxgl引擎做的⼀款飞机⼤战先放效果图:1,javafx和fxgl介绍javafx类似awt,swing,是⼀个图形化界⾯的库。

(似乎都喜欢采⽤mvc模式,把界⾯和其它东西分开来写)外国⼈写的⼀个游戏引擎,其实就是把javafx的⼀些东西整理封装了起来,但封装也有坏处,,⽤起来不怎么灵活,⽹上也搜不到⽤法(。

还是作者提供的api⽂档我看不懂)。

导⼊jar包就能使⽤了。

2,fxgl⾥的⼀些东西分析(1)还是要在主代码⾥继承⼀个类(fxgl的作者封装成了GameApplication),然后再main函数⾥调⽤launch(args);(2)键盘输⼊ fxgl的⽅法是重写⽗类的initInput函数,然后在理添加⾏为与对应键盘绑定就⾏了1 getInput().addAction(new UserAction("Shoot") {2 @Override3protected void onAction() {4 playerComponent.shoot();5 }6 }, MouseButton.PRIMARY);(3)实体机制将游戏⾥的元素(玩家,⼦弹,敌⼈,爆炸效果等)都看成⼀个实体加上不同的组件,也就是先建⽴⼀个实体,然后往⾥⾯加组件,或者配置外观等return Entities.builder().type(SpaceRunnerType.PLAYER).from(data).viewFromNodeWithBBox(FXGL.getAssetLoader().loadTexture("sprite_player.png", 40, 40)).with(new CollidableComponent(true), new ParticleComponent(emitter)).with(new PlayerComponent()).build();(4)加载声⾳,图⽚等资源这⾥需要按照规定,⽐如图⽚放于assets/textures中,在代码中则不需要设置⽂件路径。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
g.setColor(Color.blue);
g.setFont(new Font("幼圆",Font.BOLD, 30));
g.drawString("Score:"+Play01.count, 20, 60);
}
}
//
public void move(){ if(isUP&& !isDown&& !isLeft&& !isRight){ 上 y=y-5; }else if(!isUP&&isDown&& !isLeft&& !isRight){
}
package com;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Rectangle;
importjava.awt.event.KeyEvent;
importjava.util.ArrayList; importjava.util.List;
importjava.io.IOException;
importjavax.imageio.ImageIO;
public class Power {
ImagePowerImage= null;
intx = 20;
inty = 0;
public Power() {
this.x=(int)(Math.random()*540)+20;
右下
x=x+5;
y=y+5;
} // // // // // // //
}booleanisUP= false;booleanisDown= false;booleanisLeft= false;booleanisRight= false; // 摁下 public voidkeyPressed(KeyEvente) {
bgY1=0;}g.drawImage(bgIm;dijis.add(newDiji());}//;}//判断战机和血瓶相撞for(inti=0;i;}}booleanisFire1=false; b;packagecom;;importjava.awt.Color;;importjava.awt.Font;;importjava.awt.Graphics;;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Rectangle;
importjava.awt.event.KeyEvent;
importjava.io.IOException;
dijis.add(newDiji()); } // 抽奖:添加血瓶if ((int) (Math.random() * 1000) == 5) {gifts.add(new Gift()); } for (inti= 0;i<gifts.size();i++) { Giftgift=gifts.get(i);gift.draw(g); } // // 抽奖:添加power if ((int) (Math.random() * 1000) == 5) {powers.add(new Power()); } for (inti= 0;i<powers.size();i++) { Powerpower=powers.get(i);power.draw(g); } // 画敌机 for (inti= 0;i<dijis.size();i++) {Dijidj=dijis.get(i);dj.draw(g); } //画飞机plane.draw(g); // 判断战机相撞 for (inti= 0;i<dijis.size();i++) { // 先得到每一个敌机Dijidj=dijis.get(i); Rectangle r1 =dj.getRectangle(); Rectangle r2 =plane.getRectangle(); if (r1.intersects(r2)) {dijis.remove(i);plane.lifeCount=plane.lifeCount- 1; if(plane.lifeCount>0) flag=false; if(plane.lifeCount<1){PlaneStatus.playStatus=-1; }
importjavax.imageio.ImageIO;pu源自lic class Play01 {
staticintcount=0;
ImagebgImage= null;
//战机Planeplane= new Plane(); //战机子弹List<MyZiDan>mzds= newArrayList<MyZiDan>(); //敌机List<Diji>dijis= newArrayList<Diji>(); //敌机子弹//List<DijiZiDan>dijizidans= newArrayList<DijiZiDan>(); //血瓶List<Gift> gifts = newArrayList<Gift>(); List<Power> powers = newArrayList<Power>(); public Play01() { try {bgImage=ImageIO.read(Play01.class.getClassLoader() .getResourceAsStream("images/bg_01.jpg")); } catch (IOExceptione) {e.printStackTrace(); } }intbgY1 = 0;intbgY2 = -600;intfireTime= 0;booleanflag=false; public void draw(Graphics g) { //画背景图片g.drawImage(bgImage, 0,bgY1, null); bgY1 += 5;
importjavax.imageio.ImageIO;
public class Plane {
ImagefeijiImage= null;
intx = 300;
inty = 700;
intlifeCount=5;
public Plane() {
try {
feijiImage=ImageIO.read(Plane.class.getClassLoader()
//画血瓶图片
g.drawImage(PowerImage, x, y, null);
//血瓶移动
y++;
}
public RectanglegetRectangle(){
return new Rectangle(x,y,PowerImage.getWidth(null),PowerImage.getHeight(null)); }
左上
x=x-5;
y=y-5;
}else if(!isUP&&isDown&&isLeft&& !isRight){
左下
x=x-5;
y=y+5;
}else if(isUP&& !isDown&& !isLeft&&isRight){
右上
x=x+5;
y=y-5;
}else if(!isUP&&isDown&& !isLeft&&isRight){
bgY1 = 0; }g.drawImage(bgImage, 0, bgY2, null); bgY2 += 5; if (bgY2 >= 0) { bgY2 = -600; } // 清理战机子弹 for (inti= 0;i<mzds.size();i++) {MyZiDanmyZidan=mzds.get(i); if (myZidan.x> 800) {mzds.remove(i); } } // 添加子弹 if (isFire1 == true && flag==false) { if (fireTime% 8 == 0) {mzds.add(newMyZiDan(plane.x+ 25,plane.y+ 0)); }fireTime++; } if (isFire1== true && flag==true) { if (fireTime% 4 == 0) { }mzds.add(newMyZiDan(plane.x+8,plane.y+0));mzds.add(newMyZiDan(plane.x+52,plane.y+0)); }fireTime++; // 画战机子弹 for (inti= 0;i<mzds.size();i++) {MyZiDanmyZidan=mzds.get(i);myZidan.draw(g); } // 清理敌机 for (inti= 0;i<dijis.size();i++) {Dijidj=dijis.get(i); if (dj.x< -100) {dijis.remove(i); } } // 抽奖:添加敌机
// 放开
public voidkeyReleased(KeyEvente) {
相关文档
最新文档