坦克大战(二)

2023-12-19

欢迎来到程序小院

坦克大战(二)

玩法:键盘(A W S D)键来控制方向,空格键发射子弹,N:下一关,P:上一关,Enter:开始,赶紧去闯关吧^^。

开始游戏 icon-default.png?t=N7T8 https://www.ormcc.com/play/gameStart/221

html

  <CENTER><div id="game-area"></div></CENTER>

css

canvas{
    display: block; 
    touch-action: none; 
    user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 
    width: 414px; 
    height: 550px; 
    cursor: inherit;
}

js

game.physics.startSystem(Phaser.Physics.ARCADE); 
soundStart = game.add.audio("sound-start");
soundFire  = game.add.audio("sound-fire");
soundHit = game.add.audio("sound-hit");
soundBoom1 = game.add.audio("sound-boom1");
soundBoom2 = game.add.audio("sound-boom2");
soundWin = game.add.audio("sound-win");
soundOver = game.add.audio("sound-over");
soundStart.play();
map = game.add.tilemap("levels");
map.addTilesetImage("tile");
map.playTimer = 0;
map.playIndex = 0;
enemies = game.add.group();
enemies.enableBody = true;
for (var i=0; i<8; i++){
  var imgID=parseInt(i/4)*32+(i%4)*2;
  var enemy = enemies.create(0, 0, "enemy",imgID).kill();  
  enemy.animations.add("up",[imgID, imgID + 1], 5, true); 
  enemy.animations.add("right",[imgID + 8, imgID + 9], 5, true); 
  enemy.animations.add("down",[imgID + 16, imgID + 17], 5, true);
  enemy.animations.add("left",[imgID + 24, imgID + 25], 5, true);
  enemy.body.collideWorldBounds = true;
  enemy.timeToMove = 0;
}
//创建主角
player = game.add.sprite(26*8,38*8, "tank",0);  
game.physics.arcade.enable(player,Phaser.Physics.ARCADE);  
player.body.collideWorldBounds = true;
player.animations.add("up", [0, 1], 5, true); 
player.animations.add("right",[8, 9], 5, true); 
player.animations.add("down",[16, 17], 5, true);
player.animations.add("left", [24, 25], 5, true);
levelLayer = map.createLayer("level-"+_levelInfo[0]);
map.setCollisionByExclusion([5,6],true,levelLayer);
levelLayer.resizeWorld();
//按键
cursors = game.input.keyboard.createCursorKeys();
actKey  = game.input.keyboard.addKey(Phaser.Keyboard.SPACEBAR);
actKey.onDown.add(this.actKeyDown, this);
myFires = game.add.group();  
myFires.enableBody = true;
for (var i=0;i<2;i++){  //这里限制发弹数量
  var fire = myFires.create(0,0,"bullet",0).kill();
  fire.checkWorldBounds = true;
  fire.outOfBoundsKill = true;
}
enemyFires = game.add.group();
enemyFires.enableBody = true;
explodes = game.add.group(); //爆炸效果
explodes.enableBody = true;
bores = game.add.group();//这个就叫它敌机生成器吧
bores.enableBody = true;
bores.create(0,0,"bore",0).kill();
if(!game.device.desktop){
  this.addTouchKey(); //移动端显示虚拟按键
}
scoreText = game.add.text(16, 16, "Enemy: " + score, { fontSize: "16px", fill: "#fff" });  
scoreText.fixedToCamera=true;  
};
this.update = function(){
game.physics.arcade.collide(player, levelLayer, this.bossHit, null, this); 
game.physics.arcade.collide(enemies, levelLayer, this.bossHit, null, this); 
game.physics.arcade.overlap(player, enemies, this.tankHit, null, this); 
game.physics.arcade.overlap(player, enemyFires, this.fireHit, null, this); 
game.physics.arcade.overlap(enemies, myFires, this.fireHit, null, this);
game.physics.arcade.overlap(myFires, levelLayer, this.tileHit, null, this); 
game.physics.arcade.overlap(enemyFires, levelLayer, this.tileHit, null, this); 
player.body.velocity.setTo(0,0);
if(!isOver){
  if(cursors.right.isDown || touchRight){ 
    this.playerMove(8,0);
    player.animations.play("right");
    facing=1;
  }else if(cursors.left.isDown || touchLeft){
    this.playerMove(-8,0);
    player.animations.play("left");
    facing=3;
  }else if(cursors.up.isDown || touchUp){
    this.playerMove(0,-8);
    player.animations.play("up");
    facing=0;
  }else if(cursors.down.isDown || touchDown){
    this.playerMove(0,8);
    player.animations.play("down");
    facing=2;
  }else{
    player.animations.stop();
  }
  enemies.forEachAlive(this.enemyMove,this);
  //this.mapTilePlay(); // 水的动画效果
  this.enemyMake();
}
};
this.playerMove = function(xx,yy){
player.x = (yy!=0) ? Math.round(player.x/8)*8 : player.x;
player.y = (xx!=0) ? Math.round(player.y/8)*8 : player.y;
player.body.velocity.setTo(xx*8,yy*8);
};
this.enemyMove = function(enemy){
if(game.time.now>=enemy.timeToMove){
  var go = parseInt(Math.random()*7);
  go = go>3 ? go-3 : go; // 减少几率往上
  enemy.body.velocity.setTo((go==1?8:go==3?-8:0)*5,(go==0?-8:go==2?8:0)*5);
  enemy.animations.play(["up","right","down","left"][go]);
  enemy.timeToMove=game.time.now+Math.random()*2000;
  if(Math.random() < 0.5){  // 随机开炮...
    var xx = enemy.x+(go==3?0:go==1?10:5);
    var yy = enemy.y+(go==0?0:go==2?10:5);
    soundFire.play();
    var fire = enemyFires.getFirstDead(true, xx, yy,"bullet",go);
    fire.body.velocity.setTo((go==1?8:go==3?-8:0)*20,(go==2?8:go==0?-8:0)*20);
    fire.checkWorldBounds = true;
    fire.outOfBoundsKill = true;
  }
}
};

源码

需要源码请关注添加好友哦^ ^

转载:欢迎来到本站,转载请注明文章出处 https://ormcc.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

坦克大战(二) 的相关文章

随机推荐

  • WIN10安装gurobi给matlab使用(记录)

    https www gurobi com downloads gurobi software 这是以前的matlab路径 需要修改成新的 使用校园网激活一下 运行gurobi setup Google报错信息 发现mathwork官方的解释
  • C++内存布局

    温故而知新 本文浅聊和回顾下C 内存布局的知识 一 c 内存布局 C 的内存布局主要包括以下几个部分 代码段 存储程序的机器代码 数据段 存储全局变量和静态变量 数据段又分为初始化数据段 存储初始化的全局变量和静态变量 和未初始化数据段 存
  • ITIL流程是什么?理解和应用IT服务管理最重要的框架

    IT服务管理 IT Service Management 简称ITSM 是指通过采用一系列的最佳实践和方法论来规划 设计 交付和支持信息技术服务 以满足组织和用户的需求 而ITIL Information Technology Infras
  • ubuntu部署llama2-chinese

    ubuntu上安装cuda见之前的blog 已安装cuda12 使用nvcc V 下载llama2 chinese GitHub FlagAlpha Llama2 Chinese Llama中文社区 最好的中文Llama大模型 完全开源可商
  • 【雕爷学编程】Arduino智慧农业之养殖水质监测与控制

    Arduino是一个开放源码的电子原型平台 它可以让你用简单的硬件和软件来创建各种互动的项目 Arduino的核心是一个微控制器板 它可以通过一系列的引脚来连接各种传感器 执行器 显示器等外部设备 Arduino的编程是基于C C 语言的
  • 【神器】wakatime代码时间追踪工具

    文章目录 wakatime简介 支持的IDE 安装步骤 API文档 插件费用 写在最后 wakatime简介 wakatime就是一个IDE插件 一个代码时间追踪工具 可自动获取码编码时长和度量指标 以产
  • Kyligence 发布数据和分析领域垂直大模型司南(Compass)

    12 月 19 日 跬智信息 Kyligence 正式发布 数据和分析领域垂直大模型司南 Compass 以下简称 司南大模型 基于多年数据和分析领域的实践积累和全行业指标洞察的海量语料 Kyligence 司南大模型已具备 自然语言对话分
  • ssm+mysql应急指挥平台-计算机毕业设计源码13263

    摘 要 科技进步的飞速发展引起人们日常生活的巨大变化 电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用 信息时代的到来已成为不可阻挡的时尚潮流 人类发展的历史正进入一个新时代 在现实运用中 应用软件的工作规则和开发步
  • 制造业CRM选型注意事项:有这些功能的系统更好用

    当前 推动制造业数字化转型已成时代发展趋势 为了适应这一趋势 制造业使用 CRM管理系统 是非常 重要的 那么 制造业CRM应该怎么选 1 全方位客户管理 订单价值大 交货周期长 客户开发难 这一直是制造业的痛点 前二点是由于行业特性 第三
  • 物流运输CRM:让日常工作有条不紊

    很多物流行业的企业主都有这样的烦恼 客户来自各行各业 很难细分管理 业务量大庞大 工作很难细化 客户满意度低 缺乏售后跟踪 如果您也面临相同的问题 那么该让CRM管理系统 登场啦 下面说说 物流运输行业 CRM系统有什么作用 1 客户分类管
  • CRM系统在IT软件行业的重要性和价值 | 发展趋势和选择理由

    如今 IT软件行业面临诸多问题 如推广成本的增加和交易周期的延长 很多销售人员埋怨产品好 有需求 但最终没有做到买卖的流程 为了改善这种业务问题 CRM管理系统是一个不错的选择 那样 IT软件行业CRM系统的好处是什么呢 IT软件行业面临哪
  • 金融CRM有用吗?金融行业CRM有哪些功能

    市场形式波诡云谲 金融行业也面临着资源体系分散 竞争力后继不足 未知风险无法规避等问题 金融企业该如何解决这些问题 或许可以了解一下CRM管理系统 和其提供的 金融行业CRM解决方案 金融行业是银行业 保险业 信托业 证券业和租赁业的总称
  • 普通USB摄像头转为网络摄像头

    普通USB摄像头转为网络摄像头 2022 02 25 Raspberry Pi Zero W吃灰有一段时间了 想着能否废物利用 使用普通USB摄像头改成一个RTSP协议网络摄像头 1 查看摄像头是否可用 查看是否已识别USB摄像头 lsus
  • 井盖位移传感器作用一览,井盖出现位移如何预警

    在城市的公共马路 小区住宅或工厂区路面上随处可见各种各样的井盖 不仅材质不一 而且每一个井盖背后的存在意义也是不同的 但是这些井盖有一个共同的特点 便是地上地下城市生命线的关键连接点 无论哪一种类型的井盖出现问题 即便是轻微的位移或者翻转
  • 解决Electron应用中的白屏问题的实用方法

    在使用Electron构建应用程序时 一些开发者可能会面临窗口加载过程中出现的白屏问题 这种问题主要分为两个方面 Electron未加载完毕HTML 这时Electron自身产生的白色背景可能导致用户在启动应用时看到一片空白 HTML加载渲
  • Java——关于实现多线程的测试小题,帮助我们更好的理解多线程的使用方法

    前面讲解了关于多线程的使用方法 这篇文章则是进行实战 做几道测试题 感兴趣的情况下可以看一下 Java多线程 多线程练习1 卖电影票 一共有1000张电影票 可以在两个窗口领取 假设每次领取的时间为3000毫秒要求 请用多线程模拟卖票过程并
  • ubuntu 20.04 prometheus-alertmanager

    prometheus alertmanager prometheus alertmanager focal updates focal security 0 15 3 ds 3ubuntu1 1 amd64 prometheus xmpp
  • Ceph入门到精通-smartctl 查看硬盘参数

    smartctl 参数含义 Model Family Toshiba s Enterprise Capacity HDD Device Model TOSHIBA MG08ACss Serial Number sssssss LU WWN
  • 华为mpls vpn 跨域方案B

    跨域方案B原理 缺点是两个as如果有多个ce的话 asbr pe压力大 1 pe和P都和单域一样配置 只是asbr pe配置不同 2 2个asbr pe配置上面不需要建立ip vpn instance 实例 3 2个asbr pe互联接口上
  • 坦克大战(二)

    欢迎来到程序小院 坦克大战 二 玩法 键盘 A W S D 键来控制方向 空格键发射子弹 N 下一关 P 上一关 Enter 开始 赶紧去闯关吧 开始游戏 https www ormcc com play gameStart 221 htm