一个打开火柴人游戏小游戏,有人知道叫什么吗?

这次我们就不讲那些什么大鱼吃小鱼或者是坦克,飞机大战之类的东西了,咱们搞一些其他的东西——相信大家都知道火柴人的游戏,火柴人的动作流利畅快,看起来很有打击感,我们就利用之前学的多线程搞一个这样的游戏出来,先给大家看看这个游戏的最终效果吧https://www.zhihu.com/video/1001919826717212672然后,我们来看看我们在这里面实现的功能吧1.火柴人的动态站立2.火柴人的左右移动3.火柴人的打击动作4.火柴人位于边界时代替的背景滚动5.怪物的定时出现和移动6.胜负判定的条件7.游戏开始的键位8.背景音乐的插入循环当然,你学会之后还可以自己再加入一些新的动作,如跳跃等等,那就看你自己了。首先我们要知道,我们这个游戏是使用了多线程的,所以还不清楚线程的同学可以先去了解一下多线程,还可以顺便看看我之前写的线程小游戏——弹球小游戏,了解一下大概的思路等等的,觉得还不错的就麻烦大家点一波关注和赞了,谢谢大家!好的接下来我们就进入正题了。在写所有程序的时候,我们必须先清楚我们要用到几个类,各个类分别的功能又是什么,这样才算准备齐全,我们先来看看我们要用到哪几个类1.BallMain 类:绘制窗口和线程的启动 2.BallListener:用于监听器和1线程函数,和数据的获取
3. Main:创建火柴人主角对象,实现移动,攻击等动作的图片4.Monster :创建怪物对象,实现移动
5.MonsterRun :2线程的具体函数,怪物的定时出现 6.Back :背景图片的滚动ok,那就开始吧先在BallMain里面创一个窗口,为了让游戏玩起来更佳,我们将它制作为全屏的mport javax.swing.*;
import java.awt.*;
public class BallMain extends JPanel {
private Graphics g;
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//得到屏幕的尺寸
public void Huaban() {
JFrame jf = new JFrame();
jf.setSize( screenSize.width ,screenSize.height );
jf.setTitle("火柴人勇者试炼");
//进程结束
jf.setDefaultCloseOperation(3);
//居中
jf.setLocationRelativeTo(null);
//设置背景色
jf.getContentPane().setBackground(Color.WHITE);
jf.setResizable(false);//设置窗口不可更改
jf.add(this, BorderLayout.CENTER);// 将面板添加到窗体上
jf.setVisible(true);//设置窗
口可见
BallListener bl = new BallListener(jf);//监听器实例
g=getGraphics();//获取画笔
bl.setG(g);
}
public static void main (String []args ){
BallMain bm=new BallMain();
bm.Huaban();
}
}这样,完成了一个全屏的窗口,并且在里面获取了画笔,用于接下来的画图操作然后我们来写下我们的主角吧,在此之前,因为我们的主角都是动态的,所以我是直接在网上寻找火柴人gif图,找到合适的背景透化的图下载下来,但是攻击的图要多做一些处理,因为我们是要按下攻击键后,火柴人要一直保持攻击状态,将所有的攻击图片都画完,,这个时候我们就要用到一些专门的gif工具,将我们从网上下载的gif图片分解处理一下。我用的是ScreenToGif,给一些图给大家看看,我们要做的就是将gif图片分解成一张一张的动作图并且另存起来如图所示然后我们在Main 里面用两个数组将左右动作的分解图都存起来,我们将这一操作放在Main类的初始化里面,这样就可以一开始启动就将图片加载出来了
{//初始化
for(int i=0;i<=51;i++){//将组件图附给图数组
ima4[i]=new ImageIcon("E:\\gif工具\\gif1的组件图\\右打斗 "+i+".png");
}
for (int i=0;i<=51;i++){
ima5[i]=new ImageIcon("E:\\gif工具\\gif2的组件图\\左打斗 "+i+".png");
}
}然后根据实际情况合理的设置我们的主角的长宽,在Main里面我们要实现火柴人打怪的操作,那么我们就需要一个储存了怪物的数列在这里,为了能让大家先理解,我先把Monster类的代码贴出来(同样怪物也是gif图)import javax.swing.*;
import java.awt.*;
import java.awt.image.ImageObserver;
import java.util.ArrayList;
public class Monster implements ImageObserver {//继承ImageObserver,需要用到图片
private
int x,y,xspeed;//出现的坐标及速度(随机)
private int monsterwidth=100*2,monsterheigth=150*2;
private Graphics g;
private ImageIcon gw=new ImageIcon("E:\\gif工具\\其他gif\\70c1d7c6f25a2f7e14760c4c4d9b632d.gif") ;//怪物图片
public int getX(){//将x传递到Main类里,用于火柴人于怪物之间的距离判断
return
x;
}
public Monster(int x, int y, int xspeed, Graphics g){//获取随机坐标
this.x=x;
this.y=y;
this.xspeed=xspeed;
this.g=g;
}
public void
Drawgw(Graphics g) {//画怪物图片
g.drawImage(gw.getImage(),x,y+215,monsterwidth,monsterheigth,null);
}
public void Move(){//移动
x+=xspeed;//x加速
if(x-25<=0
x>=1720){//碰到窗框反向
xspeed=-xspeed;//速度反向
}
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
return false;
}
}然后我们创立MonstrerRun类,用于Monster的定时出现import java.util.Random;
public class MonsterRun implements
Runnable {
int x;
private BallListener bl;
private Random random = new Random();//随机速度
public MonsterRun(BallListener bl) {
this.bl = bl;
}
public void run() {
while (bl.getStop()) {//bl.getStop()是监听器里面的线程是否继续执行的判断
System.out.println();
if (bl.getXstop()==true) {
try {
System.out.println("线程二执行");
x = random.nextInt(350) + 50;//随机x出现怪物
bl.monster(x);//将这个随机数值传进监听器的monster队列里面储存起来
Thread.sleep(3000);//睡眠3000毫秒
} catch (InterruptedException en) {
en.printStackTrace();
}
}
}
}
}接下来就是我们的背景Back了,由于我们要设置背景滚动,那我们只需将两张背景图片连在一起就行了import javax.swing.*;
import java.awt.*;
import java.awt.image.ImageObserver;
public class Back implements ImageObserver {
private int x,y;//背景起始坐标
private Graphics g;//画笔
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//得到屏幕的尺寸
private ImageIcon back = new ImageIcon("E:\\gif工具\\其他gif\\背景.png");//背景
public Back(int x,int y,Graphics g){
this.x =x;
this.y=y;
this.g=g;
}
public void setX(int x){
this.x=x;//传坐标,用于滚动操作
}
public void Backmove(){//背景移动
System.out.println(x+" ");
g.drawImage(back.getImage(),x,y,screenSize.width,screenSize.height,null);
g.drawImage(back.getImage(),x+screenSize.width,y,screenSize.width,screenSize.height,null);
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
return false;
}
}然后就是比较复杂的两个类了,先来BallListener类吧,在这里面的1线程里加入了背景 音乐,Java的音乐格式好像必须是waav无损格式才行,大家去网上下的时候尽量下载wav格式的就行了,如果找不到的话就用格式转换器吧,我用的是格式工厂import javax.swing.*;
import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.Random;
public class BallListener extends MouseAdapter implements KeyListener,Runnable{
private Graphics g;
private
boolean stop=true;//设置一开始线程开始
private boolean xstop=false;//暂停
private Monster monster;//创建怪物对象
private
int mainxspeed=0;//主角x速度
private
boolean right,left,j,k;//创立按键状态,记录组合键
private
ArrayList <Monster>list=new ArrayList<>();//创建队列记录顺序,设置为monster类型
private Random random= new Random();//随机速度
private int x,y;
private Main main=new Main(200,575,mainxspeed,g,list,this);//创一个主角火柴人
private Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//得到屏幕的尺寸
//缓冲带
private BufferedImage buffer;//缓冲带界面
private Graphics bg;//缓冲带画笔
private ImageIcon back = new ImageIcon("E:\\gif工具\\其他gif\\背景.png");//背景
public BallListener(JFrame jf){
buffer = new BufferedImage(jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_4BYTE_ABGR);//缓冲带界面
bg = buffer.getGraphics();//获取缓冲带画笔
}
public void setG(Graphics g) {
this.g = g;
}
public void setStop(boolean stop) {//需要判断是否通过试炼
this.stop = stop;
}
public boolean getStop(){ return stop;}
public
void setJ(boolean j){this.j=j;}
public void setK(boolean k){this.k=k;}
public boolean getXstop(){return xstop;}
public void mousePressed (MouseEvent e){
}
public void monster(int x){用于获取MonsterRun传过来的随机坐标和速度
monster = new Monster(x,200,random.nextInt(20) - 10, g, list);//速度范围1到10
list.add(monster);//添加到队列里面
if (list.size()==5){
JOptionPane.showMessageDialog(null, "抱歉,你没有阻止怪物破坏地球"); // 弹出窗口
stop=false;//停止线程
}
}
@Override
public void keyTyped(KeyEvent e){
}
@Override
public void keyPressed(KeyEvent e) {//组合键的实现
int Key = e.getKeyCode();//获取键盘
switch (Key) {
case
KeyEvent.VK_A: //向左箭
if (mainxspeed>=-16) {//设置最大速度
mainxspeed += -1;
main.setXspeed(mainxspeed);
left = true;//状态
main.setLeft(left);
}break;
case
KeyEvent.VK_D://向右键盘
if (mainxspeed<=16){
mainxspeed += 1;
main.setXspeed(mainxspeed);
right = true;//状态
main.setRight(right);
}
break;
case KeyEvent.VK_J:
j=true;
main.setJ(j);
break;
case KeyEvent.VK_K:
k=true;
main.setK(k);
break;
case KeyEvent.VK_SPACE://开始游戏
xstop=true;
break;
case
KeyEvent.VK_ENTER://重新开始
for (int i=0;i<list.size();i++){
list.remove(i);//将队列清空
}
main.setScore(0);//分数清零
xstop=false;//进入暂停界面
stop=true;//线程可执行
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
int Key = e.getKeyCode();//获取键盘
switch (Key) {
case
KeyEvent.VK_A: //向左箭
left = false;//状态
mainxspeed=0;
main.setXspeed(mainxspeed);
main.setLeft(left);
break;
case
KeyEvent.VK_D://向右键盘
right = false;//状态
mainxspeed=0;
main.setXspeed(mainxspeed);
main.setRight(right);
break;
default:
break;
}
}
@Override
public void run() {
try {//背景音乐,注意,是wav格式的!
f = new File("E:\\背景Music\\高梨康治 - 儀礼2.wav"); //绝对路径
uri = f.toURI();
url = uri.toURL(); //解析路径
} catch (MalformedURLException e) {
e.printStackTrace();
}
AudioClip aau;
aau = Applet.newAudioClip(url);
aau.loop();
//单曲循环
while (stop) {//多次执行线程,结束线程
if (xstop==false) {//暂停线程(这个画面为暂停画面,即一开头的开始界面)
g.drawImage(back.getImage(), main.getBackx(), y, screenSize.width, screenSize.height, null);
g.drawImage(back.getImage(),main.getBackx()+screenSize.width,y,screenSize.width,screenSize.height,null);
}else {
try {
System.out.println("线程一执行");
main.Sweepmain(bg);//擦痕迹
main.mainmove();//主角的移动
main.Drawmain(bg);//画主角
for (int i = 0; i < list.size(); i++) {
Monster monster = list.get(i);// 取出怪物
monster.Move();//怪物的移动
monster.Drawgw(bg);//画怪物
}
g.drawImage(buffer, 0, 0, null);//将缓冲带的画面画出来
Thread.sleep(80);//睡眠80毫秒
} catch (InterruptedException en) {
en.printStackTrace();
}
}
}
}
}然后,就是Main类,采用键盘按下后确定状态的方式mport javax.swing.*;
import java.awt.*;
import java.awt.image.ImageObserver;
;
import java.util.ArrayList;
public class Main implements ImageObserver {
private
int picture=0;//图片数
private
int x,y,xspeed;
private int attackwidth=150*2,attackheigth=200*2;
private int runwidth=100*2,runheigth=150*2;
private int standwidth=75*2,standheigth=100*2;
private Graphics g;
private ArrayList list;
private
int score=0;
private BallListener bl;//监听器对象,用于传递是否结束线程
private Back back;//背景对象
private
boolean right,left,j,k;//创立按键状态记录传过来的状态
private
int backx=-800;//背景坐标
private ImageIcon im=new ImageIcon("E:\\gif工具\\其他gif\\630b17b28bcdc4ba20a787f7e54885ee.gif") ;//主角站立图片
private ImageIcon im2=new ImageIcon("E:\\gif工具\\其他gif\\4068c0599d6b165f4149717e1272fedf1.gif") ;//主角右移动图片
private ImageIcon im3=new ImageIcon("E:\\gif工具\\其他gif\\4068c0599d6b165f4149717e1272fedf.gif") ;//主角左移动图片
private ImageIcon [] ima4=new ImageIcon[52];//创立you图片数组
private ImageIcon[] ima5=new ImageIcon[52];//左的
{//初始化
for(int i=0;i<=51;i++){//将组件图附给图数组
ima4[i]=new ImageIcon("E:\\gif工具\\gif1的组件图\\右打斗 "+i+".png");
}
for (int i=0;i<=51;i++){
ima5[i]=new ImageIcon("E:\\gif工具\\gif2的组件图\\左打斗 "+i+".png");
}
}
public Main(int x, int y, int xspeed, Graphics g, ArrayList list,BallListener bl){
this.x=x;
this.y=y;
this.xspeed=xspeed;
this.g=g;
this.list =list;
this.bl=bl;
}
public void setRight(boolean right){//传递向右状态
this.right =right;
}
public
void setLeft(boolean left){//左状态
this.left =left;
}
public void setJ(boolean j){
this.j=j;
}
public
void setK(boolean k){this.k=k;}
public void setXspeed(int xspeed){
this.xspeed=xspeed;
}
public int getBackx(){return backx;}
public void setScore(int score){this.score=score;}
public void Drawmain(Graphics g)
{//画主角
try {
g.setColor(Color.BLACK);//
g.drawString("击杀6个怪物即可过关,不能让怪物数超过5个!",0,75);
g.drawString("现存怪物数目"+list.size(),0,50);
g.drawString("已击杀怪物数目 " + score, 0, 25);
if (right) {
g.drawImage(im2.getImage(), x, y - 150, runwidth, runheigth, null);
} else if (left) {
g.drawImage(im3.getImage(), x, y - 150, runwidth, runheigth, null);
} else if (j) {//左攻击键时
g.drawImage(ima4[picture].getImage(), x - 160, y - 230, attackwidth, attackheigth, null);
picture++;//自加图pain
while (picture == 51) {画完最后一张动作图时,将状态解除
j = false;
bl.setJ(false);
picture = 0;
}//音效
} else if (k) {
g.drawImage(ima5[picture].getImage(), x+40, y - 230, attackwidth, attackheigth, null);
picture++;//自加
while (picture == 51) {
k = false;
bl.setK(false);
picture = 0;
}//音效
} else {
g.drawImage(im.getImage(), x, y-100, standwidth, standheigth, null);
}
}catch (Exception e) {
e.printStackTrace();
}
}
public
void Sweepmain(Graphics g){//擦除主角
back =new Back(backx,0,g);
if (x<=25
x>=1720) {//此时火柴人主角到达边界,移动改用背景反向滚动的方式
backx += -xspeed;
if(backx>=-40){
backx=-40;
back.setX(backx);//传坐标
}else if(backx<=-2000){
backx=-2000;
back.setX(backx);//传坐标
} else {
back.setX(backx);//传坐标
}
back.Backmove();
}else {
back.Backmove();
}
}
public void mainmove() {
x += xspeed;//x加速
if (x - 25 <= 0
x >= 400) {
if (x - 25 <= 0) {//碰到窗框反向
x = 25;
}
if (x >= 1720) {
x = 1720;
}
}
//解决小怪的方法
for (int i = 0; i < list.size(); i++) {
Monster monster = (Monster) list.get(i);//取出怪物
int xx =this.x - monster.getX();//距离
if((j&&xx<=100&&xx>=0)
(k&&xx<=0&&xx>=-100)){
list.remove(i);//移除怪物
score++;//击杀数加一
}
if(score==5){//击杀数目达到5的时候
JOptionPane.showMessageDialog(null, "恭喜通过勇者第一试炼"); // 弹出窗口
bl.setStop(false);
}
}
}
@Override
public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) {
return false;
}
}好的,就这样,一个简单的火柴人的动作游戏就完成了,如果你自己想继续完善也是不错的,比如加入怪物的攻击属性,火柴人的血量等等.........觉得写的还行的麻烦点一波关注和赞!谢谢大家!虽然是很久之前的小项目,当时写的也很粗糙,但最近也有朋友找我想了解完整的代码,于是我这里就把这个小游戏代码传一下,有兴趣的可以下载继续完善(背景音乐找不到了,有兴趣的朋友可以自己添加吧)。链接:https://pan.baidu.com/s/17nnlfbfvu0x6kwTP2vlKVA 提取码:1234永久有效
火柴人类型的手游都非常火爆,玩家们都被火柴人简约的外形吸引到了,火柴人游戏一般玩法都是爽快又硬核的,那么有趣的火柴人游戏前五名都是什么?下文就是受欢迎的火柴人类游戏大全,文章里收录了目前名气最大的五个火柴人游戏,你也来看看这五个火柴人题材的手游介绍吧。1、《火柴人射击英雄》这是款超爽的射击题材火柴人手游,玩家的任务就是控制火柴人拿着枪械武器击败敌人,每一关都有着不同的地形和掩体,玩家需要借助地形的优势将敌人一一射杀,获得胜利后可以花钱解锁更强悍的枪械武器。这款火柴人枪战游戏以简单的射击方式吸引了玩家,多样化的武器和装甲系统令人眼前一亮,超爽的枪战画面也会让你乐在其中。2、《火柴人联盟2》火柴人联盟2是款深受用户喜欢的格斗类横版游戏,重金属乐的BGM更将游戏气氛营造得极其热血,独特的剪映画风也给大家带来了与众不同的战斗体验,海量的火柴人形象也让玩家很感兴趣,游戏中特殊的战斗系统和打造武器的机制更加耐玩,随着版本的更新还加入了宠物系统和符文石,多样化元素的加入也让本款游戏更有趣味。3、《火柴人战争》这款手游以2D画风和独特的视角将大家带入了火柴人的世界,巨大的火柴人世界观让玩家们赞美不已,游戏地图中耸立着许多火柴人国家,玩家也是其中一个火柴人国家的领导者,需要操控自己的火柴人部队跟其他阵营展开战斗。这款手游中还有恐怖的僵尸火柴人部队,多样化的火柴人兵种给了玩家自由组合的机会。4、《逗斗火柴人》这是款画风超级魔性的联机火柴人战斗游戏,滑稽的战斗场面和千奇百怪的武器相得益彰,你甚至可以拿鸡毛掸子和马桶搋子攻击对手。游戏里提供了二十多种不同的战场地图供你挑战,随机生成的武器也增加了游戏的趣味性。这款火柴人游戏有着自由编辑地图的设定,地图中的一切战斗规则也由你说了算,快来加入火柴人之间的热血格斗吧!5、《火柴人觉醒》这款游戏中高颜值的火柴人形象颠覆了大家的认知,每一个火柴人都穿着霸气的外骨骼装甲,通过装甲可以释放破坏力惊人的技能,这样让本作的战斗画面无比耀眼。本作多元化的游戏模式也深深吸引了玩家,你可以通过战斗获得强大的装备安装在火柴人的身上,持续不断地提升火柴人的战斗能力。以上介绍的就是受欢迎的火柴人类游戏大全了,相信你也知道哪个火柴人游戏适合你了吧,其实好玩的火柴人游戏多不胜数,小编介绍的都是名气稍大而且很有趣的火柴人手游。

我要回帖

更多关于 打开火柴人游戏 的文章

 

随机推荐