Java实现一个坦克大战的小游戏【附源码】

简介: Java实现一个坦克大战的小游戏【附源码】

1 前言

🚀获取源码,文末公众号回复【坦克】,即可。

⭐欢迎点赞留言

2 正文

13MB GIF可以欣赏:

https://ucc.alicdn.com/images/user-upload-01/img_convert/4721f22d97731adcdbc8baff4b520176.gif


2.2 项目结构

2.2 主要代码展示


var Bullet = function(context,owner,type,dir){
  this.ctx = context;
  this.x = 0;
  this.y = 0;
  this.owner = owner; //子弹的所属者
  this.type = type;//1、玩家  2、敌方
  this.dir = dir;
  this.speed = 3;
  this.size = 6;
  this.hit = false;
  this.isDestroyed = false;
  
  this.draw = function(){
    this.ctx.drawImage(RESOURCE_IMAGE,POS["bullet"][0]+this.dir*this.size,POS["bullet"][1],this.size,this.size,this.x,this.y,this.size,this.size);
    this.move();
  };
  
  this.move = function(){
    if(this.dir == UP){
      this.y -= this.speed;
    }else if(this.dir == DOWN){
      this.y += this.speed;
    }else if(this.dir == RIGHT){
      this.x += this.speed;
    }else if(this.dir == LEFT){
      this.x -= this.speed;
    }
    
    this.isHit();
  };
  
  /**
   * 碰撞检测
   */
  this.isHit = function(){
    if(this.isDestroyed){
      return;
    }
    //临界检测
    if(this.x < map.offsetX){
      this.x = map.offsetX;
      this.hit = true;
    }else if(this.x > map.offsetX + map.mapWidth - this.size){
      this.x = map.offsetX + map.mapWidth - this.size;
      this.hit = true;
    }
    if(this.y < map.offsetY){
      this.y = map.offsetY;
      this.hit = true;
    }else if(this.y > map.offsetY + map.mapHeight - this.size){
      this.y = map.offsetY + map.mapHeight - this.size;
      this.hit = true;
    }
    //子弹是否碰撞了其他子弹
    if(!this.hit){
      if(bulletArray != null && bulletArray.length > 0){
        for(var i=0;i<bulletArray.length;i++){
          if(bulletArray[i] != this && this.owner.isAI != bulletArray[i].owner.isAI && bulletArray[i].hit == false && CheckIntersect(bulletArray[i],this,0)){
            this.hit = true;
            bulletArray[i].hit = true;
            break;
          }
        }
      }
    }
    
    if(!this.hit){
      //地图检测
      if(bulletMapCollision(this,map)){
        this.hit = true;
      }
      //是否击中坦克
      if(this.type == BULLET_TYPE_PLAYER){
        if(enemyArray != null || enemyArray.length > 0){
          for(var i=0;i<enemyArray.length;i++){
            var enemyObj = enemyArray[i];
            if(!enemyObj.isDestroyed && CheckIntersect(this,enemyObj,0)){
              CheckIntersect(this,enemyObj,0);
              if(enemyObj.lives > 1){
                enemyObj.lives --;
              }else{
                enemyObj.distroy();
              }
              this.hit = true;
              break;
            }
          }
        }
      }else if(this.type == BULLET_TYPE_ENEMY){
        if(player1.lives > 0 && CheckIntersect(this,player1,0)){
          if(!player1.isProtected && !player1.isDestroyed){
            player1.distroy();
          }
          this.hit = true;
        }else if(player2.lives > 0 && CheckIntersect(this,player2,0)){
          if(!player2.isProtected && !player2.isDestroyed){
            player2.distroy();
          }
          this.hit = true;
        }
      }
    }
    
    
    if(this.hit){
      this.distroy();
    }
  };
  
  /**
   * 销毁
   */
  this.distroy = function(){
    this.isDestroyed = true;
    crackArray.push(new CrackAnimation(CRACK_TYPE_BULLET,this.ctx,this));
    if(!this.owner.isAI){
      BULLET_DESTROY_AUDIO.play();
    }
  };
  
  
};

2.3 按钮操作


var CrackAnimation = function(type,context,crackObj){
  this.times = 0;
  this.ctx = context;
  this.frame = 0;
  this.x = 0;
  this.y = 0;
  this.posName = "";
  this.size = 0;
  this.isOver = false;
  this.tempDir = 1;
  this.owner = crackObj;
  
  if(type == CRACK_TYPE_TANK){
    this.posName = "tankBomb";
    this.size = 66;
    this.frame = 4;
  }else{
    this.posName = "bulletBomb";
    this.size = 32;
    this.frame = 3;
  }
  this.x = crackObj.x + (parseInt(crackObj.size - this.size)/2);
  this.y = crackObj.y + (parseInt(crackObj.size - this.size)/2);
  
  this.draw = function(){
    var gaptime = 3;
    var temp = parseInt(this.times/gaptime);
    this.ctx.drawImage(RESOURCE_IMAGE,POS[this.posName][0]+temp*this.size,POS[this.posName][1],this.size,this.size,this.x,this.y,this.size,this.size);
    this.times += this.tempDir;
    if(this.times > this.frame * gaptime - parseInt(gaptime/2)){
      this.tempDir = -1;
    }
    if(this.times <= 0){
      this.isOver = true;
    }
  };
};

不会还有人没 点赞 + 关注 + 收藏 吧!

目录
相关文章
|
4天前
|
运维 监控 网络协议
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
由一次线上故障来理解下 TCP 三握、四挥 & Java 堆栈分析到源码的探秘
10 0
|
10天前
|
Java
Java 实现 捕鱼达人 小游戏【附源码】
Java 实现 捕鱼达人 小游戏【附源码】
33 0
|
9天前
|
存储 Java 测试技术
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
【6月更文挑战第15天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
18 1
滚雪球学Java(61):从源码角度解读Java Set接口底层实现原理
|
6天前
|
人工智能 监控 Java
|
10天前
|
Java
Java 实现 植物大战僵尸 小游戏【附源码】
Java 实现 植物大战僵尸 小游戏【附源码】
27 3
|
3天前
|
Java API 开发工具
企业微信api,企业微信sdk接口java调用源码
企业微信api,企业微信sdk接口java调用源码
11 0
|
10天前
|
Java
Java 实现 贪吃蛇 小游戏【附源码】
Java 实现 贪吃蛇 小游戏【附源码】
23 0
|
安全 Java
Java并发编程笔记之CopyOnWriteArrayList源码分析
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝数组(快照)上进行的,也就是写时拷贝策略。
19524 0
|
Java 安全
Java并发编程笔记之读写锁 ReentrantReadWriteLock 源码分析
我们知道在解决线程安全问题上使用 ReentrantLock 就可以,但是 ReentrantLock 是独占锁,同时只有一个线程可以获取该锁,而实际情况下会有写少读多的场景,显然 ReentrantLock 满足不了需求,所以 ReentrantReadWriteLock 应运而生,ReentrantReadWriteLock 采用读写分离,多个线程可以同时获取读锁。
3097 0
|
Java
Java并发编程笔记之FutureTask源码分析
FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果,因此,FutureTask非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。
4268 0