纪念自己编写的第一个java小游戏,飞翔小鸟

游戏应用 专栏收录该内容
1 篇文章 0 订阅

我是一名Java初学者

这是我写的第一个小游戏,特此纪念下

--------------------------------------------------------

效果图:



-------------------------------------------------------------------------------------------------------

package BirdGame;
/**
 * 1.找对象定义属性
 * 2.为4个类 BirdGame,Ground,Colunm,Bird分别添加构造方法,初始化属性变量
 * 3.设置窗口框架:编写BirdGame类中的main方法,设置窗口大小,居中,设置关闭按钮,和设置窗口可见
 * 4.绘制界面:在BirdGame类中重写print()方法
 * 5.写类的运动方法step();在birdgame类中写action方法,在main方法中启用action方法
 * 6.实现鼠标事件控制小鸟能点击上升
 * 7.实现记分,画分
 * 8.写鸟类的碰撞方法检测(鸟碰地面和鸟碰撞柱子)显示游戏结束
 * 9.实现游戏状态:开始,结束,重新开始
 */
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;//java.awt 包含用于创建用户界面和绘制图形图像的所有类。
import java.io.IOException;
import java.util.Random;


import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;//BirdGame 继承 Jpanel 屏面






public class BirdGame extends JPanel {
Bird bird;
Ground ground;
Column column1,column2;//有上下两根柱子
BufferedImage background;
int score;//记分

/**游戏状态*/
// boolean gameOver;
int state;
public static final int START = 0;
public static final int RUNNING = 1;
public static final int GAME_OVER=2;

BufferedImage startImage;
BufferedImage gameOverImage; 


/**为该类添加构造方法,初始化属性变量*/
public BirdGame() throws Exception{
state =START;
// gameOver=false;
startImage = ImageIO.read(getClass().getResource("start.png"));
gameOverImage=ImageIO.read(getClass().getResource("gameover.png"));
score=0;
bird = new Bird();
ground = new Ground();
column1 = new Column(1);
column2 = new Column(2);
background = ImageIO.read(getClass().getResource("bg.png"));
}

/**重写print()方法用于为对象类贴图上去*/
public void paint(Graphics g){ //paint:画图,Graphics:图示符
g.drawImage(background,0,0,null);//用graphics绘制的draw的方法绘制时,默认绘制起点坐标为0,0
g.drawImage(column1.image,column1.x-column1.width/2,column1.y-column1.heigth/2,null);
g.drawImage(column2.image,column2.x-column2.width/2,column2.y-column2.heigth/2,null);
g.drawImage(ground.image,ground.x,ground.y,null);
g.drawImage(bird.image, bird.x-bird.width/2,bird.y-bird.heigth/2,null);

// Graphics2D g2=(Graphics2D) g;
// g2.rotate(-bird.alpha,bird.x,bird.y);
// g2.rotate(bird.alpha,bird.x,bird.y);

//在paint方法中绘制分数算法
Font f = new Font(Font.SANS_SERIF,Font.BOLD,20);//设置字体,粗细,大小
g.setColor(Color.WHITE);
g.setFont(f);
g.drawString("score:"+score,20,50);//画分数

//添加游戏结束状态代码
// if (gameOver) {
// g.drawImage(gameOverImage, 0,0,null);
// }
switch (state) {
case START:
g.drawImage(startImage,0,0,null);
break;
case GAME_OVER:
g.drawImage(gameOverImage,0,0,null);
break;
}

}

/**启动软件的方法main */
public static void main(String[] args) throws Exception {
JFrame frame = new JFrame();//画游戏窗口的类
BirdGame game = new BirdGame();
frame.add(game);
frame.setSize(440,670);
frame.setLocationRelativeTo(null);//框架.设置 位置 相对应的 设置窗体初始位置(居中)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置 默认的 关闭 操作
frame.setVisible(true);//设置 可见的

game.action();
}

/**在BirdGame中添加Action方法(运动方法)*/
public void action() throws Exception{
MouseAdapter l = new MouseAdapter(){ //鼠标注册事件监听 
public void mousePressed(MouseEvent e){ //定义鼠标按下时执行的方法
bird.flappy();
try{
switch (state) {
case GAME_OVER:
column1 = new Column(1);
column2 = new Column(2);
bird = new Bird();
score = 0;
state=START;
break;
case START:
state=RUNNING;
case RUNNING:
bird.flappy();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
};
addMouseListener(l);//将L挂接到当前面板(game)上




while(true){
// if(!gameOver){
// ground.step();
// column1.step();
// column2.step();
// bird.step();
// }
// if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
// gameOver=true;
// }
//
// //记分逻辑
// if(bird.x==column1.x || bird.x == column2.x){
// score++;
// }
switch (state) {
case START:
ground.step();
break;
case RUNNING:
column1.step();
column2.step();
ground.step();
bird.step();
//记分
if(bird.x==column1.x || bird.x == column2.x){
score++;
}
if (bird.hit(ground) || bird.hit(column1) || bird.hit(column2)) {
state = GAME_OVER;
}
break;
}

repaint();//重画
Thread.sleep(1000/80);
}
}



}




/**对象:地面Ground*/
class Ground{
/**定义属性*/
BufferedImage image;//该image属性是地面Gound类贴图
int x,y;
int width;
int heigth;
/**为该类添加构造方法,初始化属性*/
public Ground() throws Exception{
image = ImageIO.read(getClass().getResource("ground.png"));
width = image.getWidth();
heigth = image.getHeight();
x = 0;
y = 500;
}
/**地面类的移动方法*/
public void step(){
x--;
if ( x == -109 ) {
x=0;
}
}

}




/**对象:柱子Column*/
class Column {
/**定义属性*/
BufferedImage image;//柱子Column 贴图
int x,y;
int width,heigth;
int gap;//两柱子间隙(上下)
int distance;//两柱子距离(左右)
/**为该类添加构造方法,初始化属性变量*/
Random random = new Random();
public Column(int n) throws Exception{ //为Column类编写带参数的构造方法。构造器:初始化数据,n代表第几个柱子
image=ImageIO.read(getClass().getResource("column.png"));
width = image.getWidth();
heigth = image.getHeight();
gap = 144;//柱子上下间距
distance = 245;//柱子左右间距
x = 550+(n-1)*distance;
y = random.nextInt(218)+132;
}
/**柱子类的移动方法*/ 
public void step(){
x--;
if (x==-width/2) {
x=distance*2-width/2;
y=random.nextInt(218)+132;
}
}
}




/**对象:鸟bird*/
class Bird{
//定义属性
BufferedImage image;
int x,y;
int width,heigth;
int size;//鸟的大小用于碰撞检测

//在bird类中添加属性,计算鸟的位置
double g;//重力加速度
double t;//两次位置的间隔时间
double v0;//初始上抛速度
double speed;//当前上抛速度
double s;//经过时间t后的位移
double alpha;//鸟的倾斜度

/**为该类添加构造方法,初始化属性变量*/
public Bird() throws Exception{
image = ImageIO.read(getClass().getResource("bird.png"));
width = image.getWidth();
heigth = image.getHeight();
x = 132;
y = 280;
size = 40;
//为计算鸟的位置的属性初始化
g=4; //重力加速度
v0=20; //初始上抛速度
t=0.25; //两次位置的间隔时间
speed= v0;   //当前上抛速度
s=0; //经过时间t后的位移
alpha=0; //鸟的倾斜度
}
/**小鸟类的移动方法*/
public void step(){
double v0=speed;
s=v0*t+g*t*t/2;//计算上抛运动位移
y=y-(int)s;//计算鸟的坐标位置
double v = v0-g*t;//计算下次的速度
speed=v;
// alpha=Math.atan(s/8);
}

public void flappy(){//重新设置初始速度,重新向上飞。
speed=v0;
}

//检测鸟碰撞地面的方法
public boolean hit(Ground ground){
boolean hit = y+size/2>ground.y;
if (hit) {
y = ground.y-size/2;//鸟放到地面上
// alpha=-3.14159/2;
}
return hit;
}
//检测鸟碰撞柱子的方法
public boolean hit(Column column){
if (x>column.x-column.width/2-size/2 && x<column.x+column.width/2+size/2) {//检测是否在柱子之间
if (y>column.y-column.gap/2+size/2 && y<column.y+column.gap/2-size/2) {//检测是否在缝隙之中
return false;
}
return true;
}
return false;
}

}












































  • 12
    点赞
  • 7
    评论
  • 61
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

一、 本课题的研究意义 如今,游戏风行的程度,是第一台电子游戏机的研制者诺兰?布什纳尔先生始料不及的。在全世界最大的城市,直至最小的村庄,从纽约最辉煌的游乐场,到高加索最小的乡镇儿童娱乐点,在千家万户,正在进行着千千万万这样的“战斗”,伴随着无数成功与失败,兴奋与懊丧。游戏机带来了一个全球性的疯狂症,其他任何娱乐与之相比都望尘莫及。然而,究竟是什么原因使游戏机如此风行呢? 在回顾了游戏机发展简史之后,我们不难悟出,技术进步在游戏机发展过程中起到了极大的促进作用。但是,技术进步绝不是游戏机风行的唯一因素。随着终端设备开发能力的加强,作为娱乐终端的游戏也得到了很大程度的发展。这也加速了游戏在全球风行程度,所以对于游戏的研究和设计具有很重要的意义,这也是本课题研究的意义所在。 用java语言来设计一个游戏,不同于现在的大型网络游戏和手机游戏,也不同于其他的小型的单机控制程序,它对游戏编写者对java语言特点认知、语法运用、工作模式、面向对象的理解的把握都提出了更高的要求,特别是在游戏运行当中对外部按键的处理,各子程序的调用流程,先后顺序等码的复杂程度也都是一般程序不能比的。可以这样说,能完整的编出游戏,并可以稳定运行,会让我们对游戏一个更深刻的认识;对游戏编写的难度有一个更切身的理解;对自己的编程能力及逻辑思维能力有一个很大的提高;再一次看到了java语言的面向对象性、动态性、高性能性,相信对java语言的学习也不无帮助。 二、课题的国内外开发动态 随着人们生活质量的不断提高以及个人电脑和网络的普及,人们的业余生活质量要求也在不段提高,选择一款好玩、精美、画面、品质优良的休闲游戏已经成为一种流行的休闲方式。可以说在人们的日常生活中,除了工作,学习,玩一款自己喜欢的游戏正在成为一种时尚。所以,开发一款大家都比较喜欢的,高品质的休闲游戏,将会收到人们的普遍欢迎。让人们在工作学习之余,享受游戏的快乐,也是一款游戏真正成功的意义。Java是一种简单的,面向对象的,分布式的,健壮的,安全的,可移植的,性能很优异的语言。Java是休闲互动游戏开发的先导语言,使用java作为开发工具,是一种很理性的选择。 三、课题的基本内容 这是一款十分变态虐心的休闲游戏游戏主打像素风格,粗看画面十分简陋,,游戏中玩家需要点击屏幕操作一只小鸟在类似《超级马里奥》的绿色管道改变的数字中穿行,游戏的方式是飞翔小鸟带数字和2048游戏的结合体,要是不幸小鸟带的数字碰到不对应的数字障碍,或者不点击屏幕就直接Game Over。游戏里对小鸟的触碰判定非常严格,只要稍微节奏慢少许或者快了一点就会结束。由于游湖完全没有道具辅助,很多时候开局连第一个障碍也过不了就不得不重来。虽然只是一款小游戏,玩法也不特别,不过却抓住了玩家输不起的心理,用超高难度吸引玩家来挑战。 四、拟需要解决的主要问题 飞翔小鸟+2048小游戏开发的技术难点主要两个方面:一是界面的布局;二是游戏数据的安排。游戏很注重玩家的感受,所以界面的布局很重要,其次数据的显示在一个游戏的玩耍中也很重要,合理规划设计,开发出让玩家享受的游戏。正确理解实际运行中玩家的感受,解决游戏中模块的科学划分与结构组织,更好更快的开发设计游戏。 五、课题设计的实现方案 (1)本游戏开发语言的选 飞翔小鸟游戏以纯java语言来开发编写Java是由Sun Microsystems公司推出的Java面向对象程序设计语言(以下简称Java语言)和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。Java最初被称为Oak,是1991年为消费类电子产品的嵌入式芯片而设计的。1995年更名为Java,并重新设计用于开发Internet应用程序。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态Web、Internet计算。从此,Java被广泛接受并推动了Web的迅速发展,常用的浏览器均支持Javaapplet。另一方面,Java技术也不断更新。Java自面世后就非常流行,发展迅速,对C++语言形成有力冲击。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 (2)本游戏开发工具的选择 飞翔小鸟游戏使用的开发工具是一个开放源代码的、基于Java的可扩展开发平台eclipse来开发实现。Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。Eclips
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值