Egret学习-坦克大战开发(五)

玩家的功能已经全部完成,开始完成敌方的AI

敌方坦克也可以随机做一下几个动作

1.移动,2.发射子弹,3.转向

为了看起来效果更好一点,移动应该最大比例,发射子弹和转向应该比较少

首先要有个随机方法

 1 public randomNum(minNum:number,maxNum:number){
 2         switch(arguments.length){
 3             case 1:
 4                 return Math.random()*minNum+1;
 5             case 2:
 6                 return Math.random()*(maxNum-minNum+1)+minNum;
 7             default:
 8                 return 0;
 9         }
10     }

实现随机逻辑

 1     private doEnemyAI() {
 2         // 敌方坦克AI,随机发射,转向,移动
 3         if(Main.enemyList.length <= 0) {
 4             return;
 5         }
 6         for(let idx=Main.enemyList.length; idx>=0; idx--) {
 7             let enemy:Tank = Main.enemyList[idx];
 8             if(enemy == null) {
 9                 continue;
10             }
11             let rand = this.randomNum(1,100);//
12             if(rand >= 98) {// 转向 5%
13                 enemy.turnRand();
14             } else if(rand >= 96) {// 发射子弹 10%
15                 enemy.shoot();
16             } else {// 移动 94%
17                 enemy.moveFront();
18             }
19         }
20     }

最后还要处理子弹,发射后子弹要延原来方向一直向前运动,运动过程中要判断是否遇到砖块,是否遇到石头,是否遇到玩家坦克,是否超出边界,如果是玩家的子弹,要判断是否遇到地方坦克

    private handleBullet() {
        // 子弹逻辑
        if(Main.bulletList.length <= 0) {
            return;
        }

        for(let idx=Main.bulletList.length; idx>=0; idx--) {
            let bullet:Bullet =  Main.bulletList[idx];
            if(bullet == null) {
                continue;
            }
            bullet.move()
            // 判断是否到边界
            if(bullet.x <= 0 || bullet.y <= 0) {
                // 移除子弹
                Main.bulletList.splice(idx,1);
                bullet.parent.removeChild(bullet);
                continue;
            }
            if(bullet.x >= 640 || bullet.y >= 640) {
                // 移除子弹
                Main.bulletList.splice(idx,1);
                bullet.parent.removeChild(bullet);
                continue;
            }
            // 判断是否撞倒墙
            let tile:tiled.TMXTile = this.layerZhuan.getTile(bullet.x, bullet.y);
            if(tile) {
                console.log(‘---x,y‘, tile.x, tile.y);
                // 移除子弹
                Main.bulletList.splice(idx,1);
                bullet.parent.removeChild(bullet);
                // 移除砖块
                this.layerZhuan.clearTile(tile.tileX, tile.tileY);
                tile.bitmap.parent.removeChild(tile.bitmap);
                continue;
            }
            // 判断是否撞到石头
            tile = null;
            tile = this.layerShitou.getTile(bullet.x, bullet.y);
            if(tile) {
                // 移除子弹
                Main.bulletList.splice(idx,1);
                bullet.parent.removeChild(bullet);
            }
            // 判断是否撞倒其他坦克
            for(let j=Main.enemyList.length; j>=0; j--) {
                let enemy:Tank = Main.enemyList[j];
                if(enemy == null) {
                    continue;
                }

                if(enemy.hitTestPoint(bullet.x, bullet.y)) {
                    if(bullet.tank.camp == ‘player‘) {
                        Main.enemyList.splice(j,1);
                        enemy.parent.removeChild(enemy);
                    }
                }
            }
            // 判断是否撞到玩家
            if(this.player1 && bullet.tank.camp == ‘enemy‘) {
                if(this.player1.hitTestPoint(bullet.x, bullet.y)) {
                    this.player1.parent.removeChild(this.player1);
                    this.player1 = null;
                }
            }
        }
    }

最后附上游戏试玩地址http://521100.net/games/tank/index.html

原文地址:https://www.cnblogs.com/woaitech/p/12242375.html

时间: 2024-07-31 13:50:59

Egret学习-坦克大战开发(五)的相关文章

Egret学习-坦克大战开发

学习了几天Egret,基本的语法和用法了解的差不多了,现在开始写一个坦克大战练习下,实践是最好的学习方式 首先确定下开发内容,概要设计 1.加载一个TiledMap,作为游戏地图 2.坦克分为两个阵营,玩家和敌方 3.有砖块和石头作为障碍物,坦克不能穿过 4.通过鼠标控制玩家坦克移动,坦克移动到鼠标点击的位置,简单的寻路,先左右移,后上下移动,遇到障碍物则停止 5.鼠标点击坦克,坦克发射子弹, 1)子弹遇到敌方,敌方坦克消失,子弹消失, 2)子弹遇到砖块,砖块消失,子弹消失 3)子弹遇到石头,石

Egret学习-坦克大战开发(二)

现在开始写具体实现代码 1.加载TiledMap 1 /** 2 * 创建游戏场景 3 * Create a game scene 4 */ 5 private createGameScene() { 6 let sky = this.createBitmapByName("bg_jpg"); 7 this.addChild(sky); 8 9 /*加载地图*/ 10 /*初始化资源加载路径*/ 11 this.url = "resource/640bg.tmx";

Egret学习-坦克大战开发(三)

实现玩家坦克的移动 基本流程 1.鼠标点击目标位置 2.坦克移动到指定位置,不能斜向移动,只能水平或垂直移动 3.可以简单寻路,如果中途遇到障碍,自动转向, 鼠标点击目标位置,将位置记录在坦克,在循环中移动到目标位置,同时判断是否遇到障碍, 给背景添加鼠标点击事件 1 let bg = this.createBitmapByName("bg_jpg"); 2 this.addChild(bg); 3 bg.touchEnabled = true; 4 bg.addEventListen

Egret学习-坦克大战开发-总结

用了几天开发游戏,现在回头整理下知识 首先附上源码,下载地址 http://www.521100.net/forum.php?mod=viewthread&tid=26&extra=page%3D1 1.Egret 主循环,用于实现业务逻辑更新游戏进度 egret.lifecycle.addLifecycleListener((context) => { context.onUpdate = () => { if(!this.init) { return; } if(this.

unity3D学习—坦克大战(一)

背景介绍 本人一名C#程序员,从事C#开发已经有四年有余了,目前在一家大型公司上班.鉴于公司的业务需要,现在需要学习unity3D游戏开发,好在unity支持C#脚本开发,无形中省下了许多重新学习新语言的时间.好了,闲话不多说,开始正式学习之路. 本篇文章主要介绍unity的相关背景和下载安装等,使用的unity开发软件为当前最新5.3.5版本. 第一步,使用各大搜索引擎搜索关键字:unity 此处以百度搜索为例,红线框起来的是unity的官方网站,其网址为http://unity3d.com/

Java坦克大战(一)

接下来的几篇博客,想记录一下通过学习坦克大战项目来循序渐进的学习Java基础.主要是为了巩固基础知识,当然学习编程重要的还是多敲,问题通常是在敲代码的过程中发现的,积累也是在敲代码中寻求的经验.这个坦克大战项目是利用Java图形界面来做的,比较简陋.但是,在不断的往里面加功能的时候,可以学到很多知识,最重要的还是体会Java的面向对象编程思想.下面介绍几个用的上的Demo,最后是坦克大战的1.0版本. Demo1:回顾事件处理机制 /* * 功能:事件处理机制(ActionListener的应用

HTML5移动开发之路(8)——坦克大战游戏2

本文为 兄弟连IT教育 机构官方 HTML5培训 教程,主要介绍:HTML5移动开发之路(8)--坦克大战游戏2 在上一篇文章中我们已经画出了自己的坦克,并且可以控制自己的坦克移动,我们继续接着上一篇来实现我们的坦克大战游戏吧. 一.将JS文件分离出来 使用OO的思想,我们已经对坦克进行了封装,对画坦克也进行了封装,下面我们将这两个对象提取到外部的js文件中,文件内容如下: [javascript] view plain copy print? //定义一个Hero类(后面还要改进) //x表示

小白学习Unity 3D做经典游戏坦克大战日常

老师 | Trigger 学习者 |小白 出品 | Siki 学院 Hello,小伙伴们.接下来小白跟Trigger老师做一款2D游戏坦克大战.从素材.代码到场景和UI的游戏开发.小白把日常遇到的问题做一个记录贴,让各位小伙伴充分了解Untiy 3D基本游戏开发和一些小白容易疏忽的问题.Unity 3D有着非常便利的管理和编码功能.现在非常热门的MOBA游戏王者荣耀,也是用Unity 3D 开发的呢!用其他编程语言例如: java / kotlin 和 Object-C / swift 原生游戏

HTML坦克大战学习02---坦克动起来

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> </head> <body onkeydown="getCommand()"> <canvas id="tankMap" width="400px" height="