`
旭冬冬
  • 浏览: 12898 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

线程游戏-冒险岛开发总结

阅读更多
线程游戏之冒险岛
因为小时候超爱玩小霸王游戏的冒险岛,所以在选择线程游戏开发时就自然而然的选择做冒险岛。那么下面我就带你一起走进我的代码世界吧~
首先必须得有一个游戏界面,这就需要用到Swing组件基本代码如下:
this.setTitle("Gamev1.1");
    this.setSize(800,600);
    this.setLayout(new FlowLayout());//流式布局
    this.setLocationRelativeTo(null);//居中
      this.setResizable(false);//不可改变大小
       this.setDefaultCloseOperation(3);
  final JPanel Gamepanel = new JPanel() {
  public void paint(Graphics g) {
  super.paint(g);
  g.drawImage(image.getImage(),player.Speedcount,0, null);
  // 重绘角色
  g.drawImage(player.image.getImage(),player.x, player.y, null);
  //重绘怪物
  for (int i= 0; i <monitors.size(); i++) {
  MonitorThread monitor =monitors.get(i);
  g.drawImage(monitor.image.getImage(),monitor.x, monitor.y, null);
  }
 
  }

  };
  // 获取画布
      Gamepanel.setPreferredSize(new Dimension(800,600));
      Gamepanel.setBackground(Color.white);
构造了基本的界面之后呢,就需要给人物和怪物设置他们的各种属性以及他们的技能啦。
人物类和怪物类分别用两个线程类来表示。代码如下:
人物类:
//人物角色的线程
public class PlayerThread extends Thread {
// 人物属性
public double HP = 200;// 人物血量
public double MP = 100;// 魔量
public double power = 50;// 力量
public String name;// 姓名
ArrayList<MonitorThread> monitors;// 怪物队列
ArrayList<ImageIcon> location = new ArrayList<ImageIcon>();// 人物的位置图像
ArrayList<ImageIcon> skill = new ArrayList<ImageIcon>();// 人物技能用队列保存
// 人物起始坐标
public int x =15;
public int y =400;
// 任务移动的速度
public int Speedx = 0;
public int upSpeedx = 0;
public int upSpeedy = 0;
public int Speedy = 0;
public int Speedcount = 0;
public boolean isjump = false;// 是否可以跳跃
public boolean isright = false;// 是否可以向右
public boolean isleft = false;// 是否可以向左
public boolean isaddmonitor = false;// 是否加怪
public JPanel Gamepanel;
public ImageIcon image;

public void init() {
// 给人物位置队列加入图片
ImageIcon left = new ImageIcon("人物图片/left.png");
ImageIcon right = new ImageIcon("人物图片/right.png");
ImageIcon leftrun = new ImageIcon("人物图片/leftrun.gif");
ImageIcon rightrun = new ImageIcon("人物图片/rightrun.gif");
ImageIcon upjumpleft = new ImageIcon("人物图片/upjumpleft.png");
ImageIcon upjumpright = new ImageIcon("人物图片/upjumpright.png");
location.add(left);
location.add(right);
location.add(leftrun);
location.add(rightrun);
location.add(upjumpleft);
location.add(upjumpright);
this.image = location.get(1);
// 给人物技能队列加入图片
ImageIcon fightleft = new ImageIcon("人物图片/fightleft.png");
ImageIcon fightright = new ImageIcon("人物图片/fightright.png");
ImageIcon upfightleft = new ImageIcon("人物图片/upfightleft.png");
ImageIcon upfightright = new ImageIcon("人物图片/upfightright.png");
skill.add(fightleft);
skill.add(fightright);
skill.add(upfightleft);
skill.add(upfightright);
}

public void getmonitors(ArrayList<MonitorThread> monitors) {
this.monitors = monitors;
}

public void getPanel(JPanel Gamepanel) {
this.Gamepanel = Gamepanel;
}

// 用构造方法来初始化人物数据
public PlayerThread() {
this.name = "风之殇";
init();// 初始化数据
}

public void run() {// 重写它的run方法
while (true) {
if(isaddmonitor){//先判断是否加怪
for(int i=0;i<5;i++){//加5个怪
MonitorThread monitor=new MonitorThread();
monitor.getplayer(this);
monitors.add(monitor);//加到怪物队列中去
}
isaddmonitor=false;//将状态改为false
}
//判断Speedcount的值
if(Speedcount<=-211&&Speedcount>=-210){
isaddmonitor=true;
}
if (isleft && !isjump) {// 如果向左
this.image = this.location.get(2);// 设置要画的图片为人物向左跑得图片
System.out.println("x=" + x);
if (x > 0) {
this.x += this.Speedx;
y = 400;
this.upSpeedx = 0;
}
if(this.Speedcount<0){
this.Speedcount -= this.Speedx;
}
} else if (isright && !isjump) {// 如果向右
this.image = this.location.get(3);// 设置要画的图片为人物跑得图片
if (x < 350) {
this.x += this.Speedx;
y = 400;
this.upSpeedx = 0;
}
if(this.Speedcount>-4000){
if(x>=350){
Speedx=2;
}
this.Speedcount -= this.Speedx;
}
}

while (this.isjump) {
for (int i = 0; i < 200; i++) {// 跳上去
this.y += this.Speedy;
this.x += this.upSpeedx;
try {
  Thread.sleep(2);
}catch (Exception ef) {
ef.printStackTrace();
}
}
for (int i = 0; i < 200; i++) {// 落下来
this.y -= this.Speedy;
this.x += this.upSpeedx;
try {
Thread.sleep(2);
} catch (Exception ef) {
ef.printStackTrace();
}
}
this.image = this.location.get(1);
this.Speedy = 0;
this.Speedx = 0;
this.upSpeedx = 0;
this.isjump = false;
}
if (monitors.size() > 0) {
for (int i = 0; i < monitors.size(); i++) {// 判断
while (Math.abs(this.x - monitors.get(i).x) < 50
&& (this.image == skill.get(0) || this.image == skill
.get(1))) {
monitors.get(i).HP -= this.power;
System.out.println("怪物的血:" + monitors.get(i).HP);
if (monitors.get(i).HP <= 0) {
System.out.println("怪物挂掉了+++");
monitors.remove(i);// 清除队列对象
break;
}
}
}
}
// System.out.println("+++++++"+Speedcount);
try {
Thread.sleep(5);
} catch (Exception ef) {
ef.printStackTrace();

}
}
}

public void fight() {// 战斗方法

}
}
怪物类:
//怪物线程
public class MonitorThread extends Thread{
  //怪物属性
public double HP=0;//怪物血量
public double MP=0;//魔量
public double power=0;//力量
public String name;//姓名
PlayerThread player;//传入角色
ArrayList<ImageIcon>monitorimage=new ArrayList<ImageIcon>();//怪物的图像
//怪物起始坐标
public int x=5;
public int y=410;
//任务移动的速度
public int Speedx=1;
public int Speedy=1;
public ImageIcon image;//怪物当前图片
Random rand=new Random();//创建随机对象
public void getplayer(PlayerThread player){
this.player=player;
}
public void init(){
ImageIcon pig=new ImageIcon("动态图/pig.gif");
ImageIcon pig1=new ImageIcon("动态图/pig1.gif");
ImageIcon pig2=new ImageIcon("动态图/pig2.gif");
ImageIcon red=new ImageIcon("动态图/red蜗牛.gif");
ImageIcon blue=new ImageIcon("动态图/蓝蜗牛.gif");
ImageIcon mogu=new ImageIcon("动态图/蘑菇.gif");
ImageIcon tree=new ImageIcon("动态图/木妖.gif");
ImageIcon woniuboss=new ImageIcon("动态图/蜗牛boss.gif");
ImageIcon moguboss=new ImageIcon("动态图/蘑菇boss.gif");
monitorimage.add(pig);
monitorimage.add(pig1);
monitorimage.add(pig2);
monitorimage.add(red);
monitorimage.add(blue);
monitorimage.add(mogu);
monitorimage.add(tree);
monitorimage.add(woniuboss);
monitorimage.add(moguboss);
//随机下标
int x=rand.nextInt(7);
image=monitorimage.get(x);
}
//用构造方法来初始化怪物数据
public MonitorThread(){
this.HP=80;
this.MP=50;
this.power=5;
this.name="小怪物";
this.x=rand.nextInt(500)+10;//随机
init();//初始化数据
}
public void run(){//重写它的run方法
while (true){
if(player!=null){
//判断人物在怪物的哪边
   while(Math.abs(this.x-player.x)<100&&this.x<player.x){//在人物的左边,一直前进,直到到达那里
      this.Speedx=5;//速度设为1
       this.x+=this.Speedx;
      }
   while(Math.abs(this.x-player.x)<100&&this.x>player.x){//在人物的右边,就像
   this.Speedx=-5;
   this.x+=this.Speedx;
   }
   this.Speedx=5;//速度设为1
       this.x-=this.Speedx;
//    while(this.y>player.y){//在人物的下边,就像上
//    this.Speedy=-1;
//        this.y+=this.Speedy;
//    }
//    while(this.y<player.y){//在人物的上边,就像下
//    this.Speedy=1;
//        this.y+=this.Speedy;
//    }
   while(Math.abs(this.x-player.x)<10){//当两者坐标相等时,就战斗
    try {
Thread.sleep(50);
} catch (Exception ef) {
ef.printStackTrace();
}
player.HP-=this.power;
   while(player.HP<=0){//清除那个对象
   break;
   }
   }

}
try {
Thread.sleep(1000);
} catch (Exception ef) {
ef.printStackTrace();

}
}
}
}

接下来呢,就需要设置键盘监听器,用于人物按下指定的键来施放技能了。。
代码:
//键盘监听器,用来控制人物的动作,与技能
public class KeyListener extends KeyAdapter{
PlayerThread player;
JPanel Gamepanel;
public KeyListener(PlayerThread player){
this.player=player;
}
public void keyPressed(KeyEvent e) {//压向键盘时的指令
//先判断队列是否为空
int code=e.getKeyCode();//得到敲击得到的键盘指令
if(player!=null){//不为空
//如果为左右运动,再判断次数
if(code==37){//左边
      player.Speedx=-1;//速度加快1
      player.upSpeedx=-1;
      player.isleft=true;//向左的状态为true
    }
if(code==39){//右边
     player.Speedx=1;//速度加快1
     player.upSpeedx=1;
     player.isright=true;//向右的状态为true
}
// if(code==38){//如果为上
//    player.Speedy-=1;
// }
// if(code==40){//如果为下,就用当前图片
//    player.Speedy+=1;
// }
if(code==67){//如果为跳跃键c就用跳跃键
if(player.image==player.location.get(0)||player.image==player.location.get(2))
{
player.image=player.location.get(4);
player.Speedy=-1;//速度改为1
player.isjump=true;//将状态改为true
}
if(player.image==player.location.get(1)||player.image==player.location.get(3))
{
player.image=player.location.get(5);
player.Speedy=-1;
player.isjump=true;//将状态改为true
}
}
if(code==88){//如果为攻击键x,就调用攻击的图片
//先判断当前图片
if(player.image==player.location.get(0)||player.image==player.location.get(2)){
player.image=player.skill.get(0);//攻击图片
player.y=350;
System.out.println("调用了打的方法");
}
if(player.image==player.location.get(1)||player.image==player.location.get(3)){//如果为向优走的图片,则调用向右攻击
player.image=player.skill.get(1);//攻击图片
player.y=350;
System.out.println("调用了打的方法");
}
if(player.image==player.location.get(4)){//如果为跳跃的图片,就调用空中攻击的图片
player.image=player.skill.get(2);
System.out.println("调用了打的方法");
}
if(player.image==player.location.get(5)){//如果为跳跃的图片,就调用空中攻击的图片
player.image=player.skill.get(3);
System.out.println("调用了打的方法");
}
 
  }
}
}
public void keyReleased(KeyEvent e) {//释放时
int code=e.getKeyCode();//得到敲击得到的键盘指令
if(player!=null){//不为空
if(player.image==player.location.get(2)){
    player.Speedx=0;
    player.Speedy=0;
    player.image=player.location.get(0);
    player.isleft=false;
}
if(player.image==player.location.get(3)){
player.Speedx=0;
player.Speedy=0;
player.image=player.location.get(1);
player.isright=false;
}
if(player.image==player.skill.get(0)){//向左攻击
   player.image=player.image=player.location.get(0);
   player.y = 325;
   player.Speedx=0;
   player.upSpeedx=0;
   player.Speedy=0;
}
if(player.image==player.skill.get(1)){//向右攻击
   player.image=player.image=player.location.get(1);
   player.y = 325;
   player.Speedx=0;
   player.upSpeedx=0;
   player.Speedy=0;
}
}
}
}
基本设置弄好之后,就需要将怪物与人物显示在游戏界面中了,这是最关键的一步
代码如下:
//初始化人物对象
         player = new PlayerThread();
player.getmonitors(monitors);
player.start();
MonitorThread monitor= new MonitorThread();
  monitor.getplayer(player);
  monitors.add(monitor);// 将怪物对象装入队列
这样每一步都有具体的方法来实现,一个简单的线程游戏就完成了。。
分享到:
评论

相关推荐

    一线海079源码_冒险岛079_冒险岛一线海_冒险岛源码_冒险岛_冒险岛服务端_源码.zip

    标题中的“一线海079源码_冒险岛079_冒险岛一线海_冒险岛源码_冒险岛_冒险岛服务端_源码.zip”表明这是一个与网络游戏《冒险岛》相关的源代码包,特别提到了“一线海079”版本。这可能是指游戏的一个特定更新或版本...

    一线海079源码_冒险岛079_冒险岛一线海_冒险岛源码_冒险岛_冒险岛服务端.zip

    《冒险岛》是一款深受玩家喜爱的2D横版卷轴式网络游戏,自2004年发布以来,凭借其独特的游戏设计和丰富的角色扮演元素,吸引了大量的游戏玩家。"一线海079源码"指的是这款游戏中的一次更新版本,079是版本号,通常...

    岁月最新源码_冒险岛源码_冒险岛_冒险岛源码_岁月冒险岛端源码_岁月冒险岛079

    【标签】所包含的关键词进一步确认了源码的主题,"冒险岛源码"、"冒险岛"、"岁月冒险岛端源码"、"岁月冒险岛079",这些都是游戏开发和版本相关的术语,暗示着这个源码是针对"冒险岛"游戏的特定服务器实现。...

    冒险岛 096 游戏服务端

    本篇文章将聚焦于冒险岛096版本的游戏服务端,通过分析其Java源码,深入探讨Java在游戏开发中的应用和技术细节。 首先,我们要理解游戏服务端的主要职责。游戏服务端是连接客户端(玩家)和游戏世界的数据桥梁,...

    大恒-双相机开发-C#-多线程-项目开源

    《大恒双相机开发-C#-多线程项目开源解析》 在当今信息化时代,高效、稳定的图像处理系统成为许多领域不可或缺的技术支持。本项目"大恒-双相机开发-C#-多线程"正是这样的一个实例,它利用C#语言进行编程,实现了对...

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt ...微软.Net开发中的多线程编程总结.txt 线程中的参数传递.txt

    嵌入式实时操作系统的多线程计算--基于ThreadX和ARM--随书光盘(自己备份)

    Express Logic's ThreadX for Win32 Demo Using Visual C/C++ This demo program is intended for use with the book titled "Real-Time Embedded Multithreading: Using ThreadX and ARM" by Edward L....

    人工智能-项目实践-多线程-多线程爬虫-抓取淘宝商品详情页URL.zip

    人工智能-项目实践-多线程-多线程爬虫--抓取淘宝商品详情页URL 本项目是一个Java编写的多线程爬虫系统。此系统与我之前开发的ip-proxy-pools-regularly结合使用,共抓取了淘宝近3000个页面,从中解析到了近9万的...

    冒险岛私服083完美源码

    对于想要深入了解游戏开发或者运营私人服务器的人来说,掌握《冒险岛私服083完美源码》中的这些知识点是至关重要的。然而,值得注意的是,私自运营游戏服务器可能违反游戏公司的服务条款,因此在实际操作前应确保...

    操作系统实验-----MFC线程--购票系统演示

    操作系统实验中的“MFC线程--购票系统演示”是一个典型的多线程编程示例,它主要涉及了C++编程语言中的Microsoft Foundation Classes (MFC)库,以及操作系统层面的线程管理和线程同步概念。MFC是微软提供的一套面向...

    JAVA游戏编程之二----j2me MIDlet 手机游戏入门开发--扫雷(3)-带线程--仿windows扫雷

    增加绘图,线程,时间等,使得游戏更好玩了,代码400行,比较适合初学者,可读性强,有详尽的代码注释。 数字键1标红旗,不确定,取消标记。方向键,数字键2468,控制光标上下左右移动!

    冒险岛067源码

    "冒险岛067源码"是一套与游戏《冒险岛》相关的编程资源,它包含了游戏服务器端的源代码以及可能的库文件。这个资源对于那些想要深入理解游戏后端工作原理、进行游戏开发或者想要自建服务器的开发者来说极具价值。在...

    冒险岛游戏java源码

    【冒险岛游戏java源码】是一个专为编程爱好者和游戏开发者提供的开源项目,它涵盖了网络游戏开发中的多个核心模块。这个项目使用Java编程语言编写,旨在帮助开发者深入理解网络游戏的架构和实现原理,尤其是针对初学...

    src_冒险岛027版本源码_完美修复_

    总的来说,"src_冒险岛027版本源码_完美修复_"不仅是一个游戏服务器端的源代码集合,也是一个学习和研究网络游戏开发的宝贵资源,特别是对于那些想要深入理解游戏服务器工作原理和想要尝试自己搭建游戏服务器的人来...

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar

    Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程编排工具-源代码+文档.rar Java开发案例-springboot-61-整合asyncTool京东多线程...

    java 冒险岛游戏源码

    Java冒险岛游戏源码是一个基于Java编程语言开发的小型游戏项目。这个源码提供了一个学习和探索Java游戏开发的平台,对于初学者来说是很好的参考资料。在这个游戏中,开发者可能运用了Java Swing或JavaFX库来构建游戏...

    面试-Java一些常见面试题+题解之多线程开发-JavaConcurrent.zip

    在Java编程领域,多线程开发是不可或缺的一部分,特别是在面试环节,面试官常常会通过考察开发者对多线程的理解和实战经验来评估其技术水平。JavaConcurrent是Java平台提供的高级并发API,它使得多线程编程更加高效...

    岁月最新源码_冒险岛源码_冒险岛_冒险岛源码_岁月冒险岛端源码_岁月冒险岛079.zip

    《岁月冒险岛源码解析与游戏开发探讨》 在IT行业中,游戏开发一直是一个充满挑战与创新的领域,尤其在网络游戏领域,冒险岛作为一款深受玩家喜爱的经典2D横版卷轴游戏,其源码的价值不言而喻。标题中的"岁月最新...

    079冒险岛命令java

    【标题】"079冒险岛命令java"指的是一个基于Java编程语言实现的与网络游戏《冒险岛》相关的命令系统。这个系统可能允许玩家在游戏内执行特定的操作或交互,例如移动、聊天、交易等,通过输入特定的命令来实现。 ...

    冒险岛代码

    "冒险岛代码"指的是《冒险岛》游戏的079版本服务端源代码,这是一个针对网络游戏开发的重要组成部分。源代码是程序设计的基础,它包含了编写游戏服务器的所有指令和逻辑,让游戏能够运行、处理玩家交互、管理游戏...

Global site tag (gtag.js) - Google Analytics