太阳系模型_飞机游戏JAVA084-097

2024-09-03 14:48

本文主要是介绍太阳系模型_飞机游戏JAVA084-097,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来源:http://www.bjsxt.com/
1、S01E084-087太阳系模型实操

package com.test.util;/*** 游戏中关于窗口大小的常量*/
public class Constant {public static final int GAME_WIDTH = 500;public static final int GAME_HEIGHT = 500;
}
//
package com.test.util;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;import javax.imageio.ImageIO;/*** 游戏开发中常用的工具类(比如:加载图片等方法)*/
public class GameUtil {private GameUtil() {}   //工具类通常会将构造方法私有,直接调用static方法public static Image getImage(String path) {URL url = GameUtil.class.getClassLoader().getResource(path);BufferedImage img = null;try {img = ImageIO.read(url);} catch (IOException e) {e.printStackTrace();}return img;}
}

package com.test.util;import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** 游戏窗口类*/
public class MyFrame extends Frame {    //GUI编程:AWT,SWING等//参考http://www.cnblogs.com/S-E-P/archive/2010/01/27/2045076.html@Overridepublic void update(Graphics g) {//覆盖update方法,截取默认的调用过程//创建图形缓冲区Image imageBuffer = createImage(this.getWidth(),this.getHeight());Graphics graImage = imageBuffer.getGraphics();//获取图形缓冲区的图形上下文paint(graImage);//用paint方法中编写的绘图过程对图形缓冲区绘图graImage.dispose();//释放图形上下文资源g.drawImage(imageBuffer,0,0,this);//将图形缓冲区绘制到屏幕上}/*** 加载窗口*/public void launchFrame() {setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口大小setLocation(100,100);//窗口位置setVisible(true);//默认不可见new PaintThread().start();//启动重画线程addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {//点击右上角"X"退出System.exit(0);}});}/*** 定义一个重画窗口的线程类*/class PaintThread extends Thread {@Overridepublic void run() {while(true) {repaint();try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

package com.test.plane;import java.awt.Color;
import java.awt.Graphics;import com.test.util.Constant;public class Bullet extends GameObject{public Bullet(){degree = Math.random() * Math.PI * 2;x = Constant.GAME_WIDTH/2;y = Constant.GAME_HEIGHT/2;width = 10;height =10;}public void draw(Graphics g){Color c = g.getColor();g.setColor(Color.YELLOW);g.fillOval((int)x, (int)y, (int)width, (int)height);x += speed * Math.cos(degree);y += speed * Math.sin(degree);if(x < 0 || x > Constant.GAME_WIDTH - width){degree = Math.PI - degree;}if(y < 30 || y > Constant.GAME_HEIGHT - height){degree = -degree;}g.setColor(c);}
}
/
package com.test.plane;import java.awt.Graphics;
import java.awt.Image;import com.test.util.GameUtil;/*** 爆炸类*/
public class Explode {double x,y;int count;static Image[] imags = new Image[16];static{for (int i = 0; i < 16; i++) {imags[i] = GameUtil.getImage("images/explode/e" + (i + 1) + ".gif");imags[i].getWidth(null);//懒加载,要加上此代码才会马上加载图片}}public Explode(double x,double y){this.x = x;this.y = y;}public void draw(Graphics g){if(count < 16){g.drawImage(imags[count], (int)x, (int)y, null);count++;}}
}
///
package com.test.plane;import java.awt.Image;
import java.awt.Rectangle;public class GameObject {Image img;double x,y;int speed = 3;double width,height;double degree;public Rectangle getRect(){//碰撞检测中用到的矩形框return new Rectangle((int)x, (int)y, (int)width, (int)height);}
}
///
package com.test.plane;import java.awt.Graphics;
import java.awt.event.KeyEvent;import com.test.util.GameUtil;public class Plane extends GameObject{private boolean left,right,up,down; private boolean live = true;public Plane(){}public Plane(String imgpath, double x, double y) {this.img = GameUtil.getImage(imgpath);this.width = img.getWidth(null);this.height = img.getHeight(null);this.x = x;this.y = y;}public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}/*** 画图和移动* @param g*/public void draw(Graphics g){if(live){g.drawImage(img, (int)x, (int)y, null);move();}}/*** 移动图片*/public void move(){if(left){x -= speed;}if(right){x += speed;}if(up){y -= speed;}if(down){y += speed;}}/*** 根据按键设置相应方向的布尔值为ture* @param e*/public void setDirectionTrue(KeyEvent e){switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:left = true;break;case KeyEvent.VK_UP:up = true;break;case KeyEvent.VK_RIGHT:right = true;break;case KeyEvent.VK_DOWN:down = true;break;default:break;}}/*** 根据按键设置相应方向的布尔值为false* @param e*/public void setDirectionFalse(KeyEvent e){switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:left = false;break;case KeyEvent.VK_UP:up = false;break;case KeyEvent.VK_RIGHT:right = false;break;case KeyEvent.VK_DOWN:down = false;break;default:break;}}
}
//
package com.test.plane;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;import com.test.util.GameUtil;
import com.test.util.MyFrame;public class PlaneGameFrame extends MyFrame{Image bg = GameUtil.getImage("images/bg.jpg");Plane p = new Plane("images/plane.png", 50, 50);ArrayList bulletList = new ArrayList();//暂不加泛型Date startTime,endTime;Explode bao;public void paint(Graphics g){g.drawImage(bg, 0, 0, null);p.draw(g);for (int i = 0; i < bulletList.size(); i++) {Bullet b = (Bullet) bulletList.get(i);b.draw(g);//检测跟飞机的碰撞boolean peng = b.getRect().intersects(p.getRect());if (peng){p.setLive(false);//飞机死掉if(bao == null){endTime = new Date();//游戏结束bao = new Explode(p.x,p.y);//最好用容器来处理,以后再优化}bao.draw(g);break;//碰撞一下}}if(!p.isLive()){int period = (int)((endTime.getTime() - startTime.getTime())/1000);//获取毫秒时间/1000printInfo(g,"时间:" + period + "秒",20,120,150,Color.WHITE);switch (period/10) {case 0://不足10秒case 1:printInfo(g,"菜鸟!",50,100,100,Color.WHITE);              break;case 2:printInfo(g,"小鸟!",50,100,100,Color.WHITE);      case 3:printInfo(g,"大鸟!",50,100,100,Color.YELLOW); case 4:printInfo(g,"鸟王",50,100,100,Color.YELLOW);  default:printInfo(g,"鸟人!",50,100,100,Color.WHITE);  break;}}}/*** 飞机死掉,在窗口上打印信息* @param g* @param str* @param size* @param x* @param y* @param color*/public void printInfo(Graphics g,String str,int size,int x,int y,Color color){Font font = new Font("宋体", Font.BOLD, size);g.setFont(font);Color c = g.getColor();g.setColor(color);      g.drawString(str, x, y);g.setColor(c);}//定义为内部类,方便使用外部类的普通属性class KeyMonitor extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {//System.out.println("按下:" + e.getKeyCode());p.setDirectionTrue(e);}@Overridepublic void keyReleased(KeyEvent e) {//System.out.println("释放:" + e.getKeyCode());p.setDirectionFalse(e);}}@Overridepublic void launchFrame() {super.launchFrame();addKeyListener(new KeyMonitor());//增加键盘的监听//生成一堆字弹for (int i = 0; i < 25; i++) {Bullet b = new Bullet();bulletList.add(b);}startTime = new Date();//游戏开始}public static void main(String[] args) {new PlaneGameFrame().launchFrame();}
}

2、S01E088-097飞机游戏实操

package com.test.util;/*** 游戏中关于窗口大小的常量*/
public class Constant {public static final int GAME_WIDTH = 800;public static final int GAME_HEIGHT = 600;
}

package com.test.util;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;import javax.imageio.ImageIO;/*** 游戏开发中常用的工具类(比如:加载图片等方法)*/
public class GameUtil {private GameUtil() {}   //工具类通常会将构造方法私有,直接调用static方法public static Image getImage(String path) {URL url = GameUtil.class.getClassLoader().getResource(path);BufferedImage img = null;try {img = ImageIO.read(url);} catch (IOException e) {e.printStackTrace();}return img;}
}
//
package com.test.util;import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;/*** 游戏窗口类*/
public class MyFrame extends Frame {    //GUI编程:AWT,SWING等//参考http://www.cnblogs.com/S-E-P/archive/2010/01/27/2045076.html@Overridepublic void update(Graphics g) {//覆盖update方法,截取默认的调用过程//创建图形缓冲区Image imageBuffer = createImage(this.getWidth(),this.getHeight());Graphics graImage = imageBuffer.getGraphics();//获取图形缓冲区的图形上下文paint(graImage);//用paint方法中编写的绘图过程对图形缓冲区绘图graImage.dispose();//释放图形上下文资源g.drawImage(imageBuffer,0,0,this);//将图形缓冲区绘制到屏幕上}/*** 加载窗口*/public void launchFrame() {setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口大小setLocation(100,100);//窗口位置setVisible(true);//默认不可见new PaintThread().start();//启动重画线程addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {//点击右上角"X"退出System.exit(0);}});}/*** 定义一个重画窗口的线程类*/class PaintThread extends Thread {@Overridepublic void run() {while(true) {repaint();try {Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();}}}}
}

package com.test.solar;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;import com.test.util.GameUtil;public class Planet extends Star{//除了图片、坐标。行星还沿着某个椭圆运行:长轴、短轴、速度(角度的增量)、角度。绕着某个Stars飞。double longAxis;//椭圆的长轴double shortAxis;//椭圆的短轴double speed;//飞行的速度double degree;Star center;boolean isSatellite;@Overridepublic void draw(Graphics g) {super.draw(g);//调用父类方法,优化代码结构move();if(!isSatellite){drawTrace(g);}}public void move(){//沿着椭圆轨迹飞行x = (center.x + center.width/2) + longAxis * Math.cos(degree) - this.width/2;y = (center.y + center.height/2) + shortAxis * Math.sin(degree) - this.height/2;degree += speed;}public void drawTrace(Graphics g){double ovalX,ovalY,ovalWidth,ovalHeight;ovalX = (center.x + center.width/2) - longAxis;ovalY = (center.y + center.height/2) -shortAxis;ovalWidth = longAxis * 2;ovalHeight = shortAxis * 2;Color c = g.getColor();g.setColor(Color.blue);g.drawOval((int)ovalX, (int)ovalY, (int)ovalWidth, (int)ovalHeight);g.setColor(c);}//一开始都放在同一水平线上,通过Star可计算x,ypublic Planet(Star center, String imgpath, double longAxis,double shortAxis, double speed) {super(GameUtil.getImage(imgpath));this.center = center;this.x = (center.x + center.width/2) + longAxis - this.width/2;//计算出xthis.y = (center.y + center.height/2) - this.height/2;this.longAxis = longAxis;this.shortAxis = shortAxis;this.speed = speed;}//一开始都放在同一水平线上,通过Star可计算x,ypublic Planet(Star center, String imgpath, double longAxis,double shortAxis, double speed,boolean isSatellite) {this(center, imgpath, longAxis, shortAxis, speed);this.isSatellite = isSatellite;}public Planet(Image img, double x, double y) {super(img, x, y);}public Planet(String imgpath, double x, double y) {super(imgpath, x, y);}
}
///
package com.test.solar;import java.awt.Graphics;
import java.awt.Image;import com.test.util.GameUtil;public class Star {Image img;double x,y;int width,height;public void draw(Graphics g){g.drawImage(img, (int)x, (int)y, null);}public Star(){} public Star(Image img){this.img = img;this.width = img.getWidth(null);this.height = img.getHeight(null);}public Star(Image img,double x,double y){//传图片this(img);//构造器调用,优化代码结构this.x = x;this.y = y;}public Star(String imgpath,double x,double y){//传路径this(GameUtil.getImage(imgpath),x,y);//构造器调用,优化代码结构}
}
/
package com.test.solar;import java.awt.Graphics;
import java.awt.Image;import com.test.util.Constant;
import com.test.util.GameUtil;
import com.test.util.MyFrame;/*** 太阳系的主窗口,以后再研究窗口闪烁问题*/
public class SolarFrame extends MyFrame{Image bg = GameUtil.getImage("images/bg.jpg");Star sun = new Star("images/sun.jpg", Constant.GAME_WIDTH/2, Constant.GAME_HEIGHT/2);Planet earth = new Planet(sun, "images/earth.jpg", 150, 100, 0.1);Planet moon = new Planet(earth, "images/moon.jpg", 30, 20, 0.2,true);Planet mars = new Planet(sun, "images/mars.jpg", 200, 130, 0.2);public void paint(Graphics g){g.drawImage(bg, 0, 0, null);sun.draw(g);earth.draw(g);moon.draw(g);mars.draw(g);}public static void main(String[] args){new SolarFrame().launchFrame();}
}

这篇关于太阳系模型_飞机游戏JAVA084-097的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133265

相关文章

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot整合mybatisPlus实现批量插入并获取ID详解

《SpringBoot整合mybatisPlus实现批量插入并获取ID详解》这篇文章主要为大家详细介绍了SpringBoot如何整合mybatisPlus实现批量插入并获取ID,文中的示例代码讲解详细... 目录【1】saveBATch(一万条数据总耗时:2478ms)【2】集合方式foreach(一万条数

IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤及问题解决

《IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决》:本文主要介绍IntelliJIDEA中配置SpringMVC环境的详细步骤及问题解决,本文分步骤结合实例给大... 目录步骤 1:创建 Maven Web 项目步骤 2:添加 Spring MVC 依赖1、保存后执行2、将新的依赖