传奇私服发布网_新开传奇网站发布_最全优秀单职业传奇私服发布平台_www.sf999.Com
新开传奇私服网站专注于服务广大新开传奇首区和复古传奇私服玩家,我们承诺全年无休,每天为您提供最新的新开传奇网站和传奇sf999信息。...
2025-01-03
Java太阳系小游戏分析和源码详解
更新时间:2015年08月10日 09:24:53 作者:
这篇文章主要对Java太阳系小游戏进行深入分析以及对应源码解释,进一步巩固了面向对象的知识,需要的朋友可以参考下
最近看了面向对象的一些知识,然后跟着老师的讲解做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下最近学的知识:
用到知识点:类的继承、方法的重载与重写、多态、封装等
分析:
1.需要加载图片、画图
2.建一个面板,主页面
3.行星类
效果图:
先看一下源码结构图:
现在逐步分析各个类的功能:
1)工具类-----util包中
--类 封装了游戏中用到的常量
--类 封装了游戏的图片加载功能
--类 封装了游戏面板的构造,用于各面板的父类
------之所以这样做,目的是为了封装数据,便于程序的扩充
.java
package util;
public class Constant {
public static final int GAME_WIDTH = 800;
public static final int GAME_HEIGHT = 600;
}
.java
package util;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 工具类(加载图片)
* @author long
*
*/
public class GameUtil {
private GameUtil(){ } //工具类通常将构造方法私有
public static Image getImage(String path){
URL u = GameUtil.class.getClassLoader().getResource(path);
BufferedImage img = null;
try {
img = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
}
.java
package util;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 游戏面板的父类
* @author long
*
*/
public class MyFrame extends JPanel{
/**
* 加载Frame的方法
*/
public void launchFrame(){
JFrame frame = new JFrame("MyGame");
frame.add(this);
frame.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
frame.setAlwaysOnTop(true); // 设置其总在最上
frame.setLocationRelativeTo(null); // 设置窗体初始位置
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
new PaintThread().start();
}
/**
* 定义一个重画窗口的线程类,是一个内部类
* @author dell
*
*/
class PaintThread extends Thread {
public void run(){
while(true){
repaint();
try {
Thread.sleep(40); //1s = 1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new MyFrame().launchFrame();
}
}
2)主要的事件处理类---solar包中
--类 行星类继承至Star类
--类 游戏主面板类继承至类
--Star类 星球类,各个星球的父类
--Test类 测试类,不需要说明
.java
package solar;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import util.GameUtil;
/**
* 行星类,继承至Star类
* @author long
*
*/
public class Planet extends Star{
//除了图片、坐标,行星沿着椭圆运行:长轴、短轴、移动速度、旋转角度。绕着某个star运行
double longAxis; //椭圆长轴
double shortAxis; //椭圆短轴
double speed; //飞行速度
double degree; //旋转角度
Star center; //围绕行星
public void draw(Graphics g){
//g.drawImage(img, (int)x, (int)y, null);
super.draw(g);
drawTrace(g);
move();
}
public void drawTrace(Graphics g){
double traceX,traceY,traceWidth,traceHeight;
traceX = (center.x+center.w/2)-longAxis;
traceY = (center.y+center.h/2)-shortAxis;
traceWidth = 2*longAxis;
traceHeight = 2*shortAxis;
Color c = g.getColor();
g.setColor(Color.blue);
g.drawOval((int)traceX, (int)traceY, (int)traceWidth, (int)traceHeight);
g.setColor(c);
}
public void move(){
//沿着椭圆轨迹飞行
x = center.x + longAxis * Math.cos(degree);
y = center.y + shortAxis * Math.sin(degree);
degree += speed;
}
public Planet(Image img,double x,double y){
super(img,x,y);
}
public Planet(String imgpath,double x,double y){
super(imgpath,x,y);
}
public Planet( Star center,Image img,double longAxis,
double shortAxis,double speed) {
super();
this.x = (center.x+center.w/2) + longAxis;
this.y = (center.y+center.h/2) + shortAxis;
this.img = img;
this.longAxis = longAxis;
this.shortAxis = shortAxis;
this.speed = speed;
this.center = center;
}
public Planet( Star center,String imgPath,double longAxis,
double shortAxis,double speed) {
this(center,GameUtil.getImage(imgPath),longAxis,shortAxis,speed);
}
}
.java
package solar;
import java.awt.Graphics;
import java.awt.Image;
import util.Constant;
import util.GameUtil;
import util.MyFrame;
public class SolarFrame extends MyFrame{
int width = Constant.GAME_WIDTH/2;
int height = Constant.GAME_HEIGHT/2;
Image bg=GameUtil.getImage("images/bg.png");
Star sun = new Star("images/sun.jpg",width,height);
Planet earth = new Planet(sun,"images/earth.png",100,60,0.1);
Planet mars = new Planet(sun,"images/mars.png",180,100,0.15);
@Override
public void paint(Graphics g) {
g.drawImage(bg, 0, 0, null);
sun.draw(g);
earth.draw(g);
mars.draw(g);
}
public static void main(String[] args) {
new SolarFrame().launchFrame();
}
}
Star.java
package solar;
import java.awt.Graphics;
import java.awt.Image;
import util.GameUtil;
public class Star {
public Image img;
public double x,y;
int w,h;
public void draw(Graphics g){
g.drawImage(img, (int)x, (int)y, null);
}
public Star(){
}
public Star(Image img){
this.img = img;
this.w = img.getWidth(null);
this.h = 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);
}
}
总结:该小游戏对代码的封装处理的比较好,便于程序的扩充,体现了面向对象的强大,不同的功能封装在不同的类与方法中,把类的公共的部分封装在父类中,提高代码的重用性。前期各个类写的过程中会有各种小问题与细节,但处理完这些后,后期想扩充行星的个数就比较简单了,new一个行星对象,然后画的面板上即可。面向对象水太深,这只是初步小涉猎,仍需继续努力专研!!!
以上就是Java太阳系小游戏分析和源码详解,希望对大家学习java语言有所帮助。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,请告知我们,本站将立刻删除涉嫌侵权内容。
相关文章
新开传奇私服网站专注于服务广大新开传奇首区和复古传奇私服玩家,我们承诺全年无休,每天为您提供最新的新开传奇网站和传奇sf999信息。...
2025-01-03
明确否认him存在,但是我们可以从一些蛛丝马迹中发现官方有说谎的可能性。就有细心的玩家,从这五个地方观察到了him存在,总共4个证据。...
2025-01-03
8条回答:【推荐答案】主公莫慌(手游)-新手奖励1.序列号:gsaq6617(官方)固定唯一,可重复激活无数新账号。2.奖励:3000绿钻,1000将魂,1紫将...
2025-01-03
网盘提取码: xawy帝国cms内核仿《新趣头条》娱乐游戏资讯网站源码,适合做电竞,娱乐,评测类的站点。利用模板改改可以轻松完成1个站点。不带安装教程...
2025-01-03
热评文章
2022年专属火龙之神途新版
1.80龙神合击传奇
1.76永恒小极品+5复古传奇
1.76双倍魔天大极品第三季单职业
1.76神梦传奇三职业
1.80聖统圣统合击三职业传奇