CocosCreator实战篇 |CocosCreator实现《飞机大战》

news2024/11/15 21:37:55
  • 📢博客主页:肩匣与橘

  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📢本文由肩匣与橘编写,首发于CSDN🙉

  • 📢生活依旧是美好而又温柔的,你也是✨


《飞机大战》

📝前言

一、素材准备

二、场景搭建

①背景

②主角战斗机

③敌方战机生成点

④分数UI

⑤副摄像机

三、脚本编写

Ⅰ主角战斗机

Ⅱ敌方战斗机

Ⅲ子弹

 Ⅳ背景

四、效果展示


📝前言

        飞机大战游戏是一款经典的射击游戏,玩家操控一个飞机进行空战任务,通过不断发射子弹摧毁敌方飞机来增加游戏的分数。本着界面简单,开发容易的原则,这款游戏也成为诸多游戏开发者的第一款上手项目。 本文将系统的介绍《飞机大战》游戏各个模块的实现。


一、素材准备

  1. Cocos Creator:本文展示的是2.4.8版本
  2. Visual Studio Code:脚本语言使用 Type Script
  3. 素材:背景图、己方飞机图、敌方飞机图、发射音效、飞机爆炸音效

二、场景搭建

①背景

游戏的移动展示分为角色移动 背景不动/角色移动 背景移动/角色不动 背景移动

这次项目采用的是角色不动 背景移动,通过背景循环实现无限地图,场景搭建如下:

使用三张背景图衔接

②主角战斗机

将主角战斗机放到场景中,并为其添加碰撞体,添加player脚本

③敌方战机生成点

        为方便初学者理解,本项目将设置一个空节点在场景上方,以此点为基准生成敌方战斗机

④分数UI

        创建文本组件,实现分数的计算

⑤副摄像机

        创建一个单独渲染背景的摄像机,并将背景的分组改为bg,副摄像机渲染选择渲染背景

三、脚本编写

  • 主角战斗机:飞机的位置实时保持鼠标移动的位置;发射子弹
  • 敌方战斗机:随机生成并向下飞行
  • 子弹:生成后自动往上发射
  • 背景:持续滚动

Ⅰ主角战斗机

        在主代码中编写鼠标回调,移动时,飞机的位置等于鼠标按下/滑动的位置

 this.node.on(cc.Node.EventType.TOUCH_MOVE,(event)=>{

        var pos=new cc.Vec2(event.getLocationX()-240,event.getLocationY()-426);
        
        console.log(pos);
        
        this.test.setPosition(pos);
});

 飞机自己的代码包含子弹预制体,发射子弹,碰撞回调(撞到敌机爆炸)

 //预制体
    @property(cc.Prefab)
    bulletPre: cc.Prefab = null;

    isDie: boolean = false;

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    start() {
        if (this.isDie == false) {
            //攻击  //计时器
            //参数: 方法   0.5秒调用一次  n次 第一次n个
            this.schedule(() => {
                //创建子弹
                let bullet = cc.instantiate(this.bulletPre);
                //设置父物体
                bullet.setParent(this.node.getParent());
                //设置子弹发射位置
                bullet.x = this.node.x;
                bullet.y = this.node.y + 80;
                let Playe: cc.AudioSource = this.getComponent(cc.AudioSource);
                cc.loader.loadRes("shot", cc.AudioClip, (res, clip) => {
                    Playe.clip = clip;
                    Playe.play();
                });
            }, 0.5);

            //开启碰撞
            cc.director.getCollisionManager().enabled = true;
        }
    }


    die() {
        this.isDie = true;
        //加载爆炸图
        cc.loader.loadRes("herodie", cc.SpriteFrame, (err, res) => {
            this.node.getComponent(cc.Sprite).spriteFrame = res;
        });
        cc.loader.loadRes("boom", cc.AudioClip, (res, clip) => {
            let audioId: number = cc.audioEngine.playMusic(clip, false);
        });
        //300毫秒销毁
        setTimeout(() => {
            this.node.destroy();
        }, 500);

    }
    update(dt) {



    }

Ⅱ敌方战斗机

        从生成飞机的点,随机生成敌机

//敌机预设题
    @property(cc.Prefab)
    enemyPre: cc.Prefab = null;

    // LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    start () {
        //每个两秒创建一个敌机
        this.schedule(()=>{
            //创建敌机
            let Enemy = cc.instantiate(this.enemyPre);
            //设置父物体  场景
            Enemy.setParent(this.node.getParent());

            Enemy.y = this.node.y;

            //20-420  随机生成
            Enemy.x = Math.random()*400-200;
        },1.5);
    }

         敌机生成后,持续往下飞行,撞到子弹销毁,撞到主机游戏失败

  @property
    Movespeed :number = 600;
    //是否死亡
    isDie:boolean = false;

    public dieNum:number=0;
    // LIFE-CYCLE CALLBACKS:

    // onLoad () {}

    start () {

    }

    update (dt) {
        //移动
        if(this.isDie == false){
            this.node.y-=300*dt;
        }
        if(this.node.y<-850){
            this.node.destroy();
        }
        
    }
    die(){
        this.isDie = true;
        //加载爆炸图
        cc.loader.loadRes("enemydie",cc.SpriteFrame,(err,res)=>{
            this.node.getComponent(cc.Sprite).spriteFrame =res;
        });
        //300毫秒销毁
        setTimeout(() => {
            this.node.destroy();
        }, 300);
      
    }
   

    onCollisionEnter(other){
        //碰到主机,销毁自己,让主机死亡
        if(other.tag == 2){
            //主机销毁
            other.getComponent(Player).die();
            
            //自己销毁
            this.node.destroy();
            GameModel._ins.mainGame.gameEnd();
            
        }
    }

Ⅲ子弹

子弹设置为预制体,生成后子弹持续往上飞行,撞到敌机实现加分

 update (dt) {
        //移动
        this.node.y+=this.speed*dt;
        if(this.node.y>850){
            this.node.destroy();
        }
    }
    onCollisionEnter(other){
        //碰到敌人,销毁自己,让敌人死亡
        if(other.tag == 1){
            //敌人销毁
            other.getComponent(Enemy).die();
            //自己销毁
            this.node.destroy();
        }
        GameModel._ins.gameScore++;
        
    }

 Ⅳ背景

        背景为3张 持续往屏下方向移动,当移动到一定位置,将位置设置到最上方图片的上面----即可实现背景无限滚动

 update (dt) {
        //移动
        //遍历子物体(背景)
        for(let bgNode of this.node.children){
            //移动  帧->秒
            bgNode.y-=50*dt;
            if(bgNode.y<-852){
                bgNode.y+=852*3;
            }
        }
    }

四、效果展示

 


        本文我们讨论了使用Cocos Creator制作2D飞机射击游戏的过程。我们从创建项目开始,介绍了游戏场景和UI设计、角色控制、碰撞检测和动画效果等关键技术点,并提供了代码示例和说明。通过这个项目,我们深入了解了Cocos Creator引擎的强大功能和易用性。同时也积累了开发2D游戏所需的实践经验和技能。希望这篇文章对想要学习Cocos Creator游戏开发的读者有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/410783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文赏析——约翰·科斯塔斯:线性系统编码

© 1952 J. P. Costas © 2023 Conmajia 作者简介 约翰彼得科斯塔斯&#xff08;1923-2008&#xff09;&#xff0c;美国电气工程师&#xff0c;曾发明科斯塔斯环和科斯塔斯数组。科斯塔斯参加过第二次世界大战&#xff0c;并在战后进入麻省理工学院攻读博士学位&#…

Java反序列化漏洞及实例详解

目录 一、序列化和反序列化 序列化 用途 二、Java反序列化漏洞 数据出现 函数接口 漏洞发现 漏洞利用 三、Java序列化反序列化演示 四、靶场演示 一、序列化和反序列化 序列化 把 Java 对象转换为字节序列&#xff08;字节流&#xff09;的过程。 反序列化 把字节序…

WebRTC 系列(一、简介)

一、什么是 WebRTC WebRTC 全称是 Web RealTime Communication&#xff0c;是一个用于实时通讯的技术&#xff0c;Google 公司在 2010 年用 6829 万美元将其从 Global IP Solutions 公司收购&#xff0c;并于 2011 年开源&#xff0c;不得不说 Google 确实是一家伟大的公司&am…

uniapp 引入插件市场的echart插件,使用指南!+踩坑记录!!血泪史!!!

此文章适用于微信小程序中&#xff0c;在uniapp做的小程序中使用echarts 插件地址&#xff1a;echarts-for-wx - DCloud 插件市场 插件网页往下翻有详细的使用步骤&#xff0c;这里简短的贴上几张图片 以下是我 项目中的使用情况&#xff0c;分享给大家&#xff1a; 1.一键导…

网关和spring cloud网关技术Gateway

文章目录一、网关1.1 网关是什么1.2 API网关的作用二、Spring Cloud Gateway2.1 简介2.2 搭建步骤2.3 路由断言工厂2.3.1 什么是路由断言工厂2.3.2 Spring Cloud Gateway提供的11 种断言工厂2.4 网关过滤器2.4.1 介绍2.4.2 网关过滤器作用2.4.3 过滤器配置2.4.4 全局过滤器Glob…

【STM32学习】模数转换器——ADC

【STM32学习】模数转换器——ADC零、参考一、ADC转换耗时二、转换模式三、对某些寄存器的理解1、ADC_CR22、ADC_SQRX四、库函数注意事项零、参考 STM32固件库&#xff08;标准外设库&#xff09;入门学习 第七章 ADC数模转换&#xff08;一&#xff09; 刘凯&#xff1a;STM32…

flyway:数据库移植框架,再也不用担心历史版本表结构管理问题

0. 引言 在开发周期较长&#xff0c;或者需求变更频繁&#xff0c;涉及多版本发布的项目中&#xff0c;我们常常遇到这样的问题&#xff1a; 改了表结构&#xff0c;开发环境执行了&#xff0c;忘记保存&#xff0c;发测试、生产环境时又要重写一遍DDL多人开发&#xff0c;都…

ChatGPT如何应用在数据治理的具体场景中?

自从ChatGPT爆火以来&#xff0c;技术圈的爆炸新闻是一波接一波&#xff0c;让人目不暇接&#xff0c;突然有了一种“人间一日&#xff0c;AI一年的感觉”。上周就有几条重磅新闻&#xff0c;来跟大家分享一下&#xff1a; New Bing 对所有用户放开&#xff0c;注册即可用周三…

每个企业经营者都应该了解的几个网络安全趋势

每个企业主都应了解的一些网络安全趋势&#xff1a; 1. 对实时数据可见性的需求增加 根据 IBM 发布的调查数据&#xff0c;企业发现并遏制漏洞的平均时间为 277 天。这种漏洞得不到解决的时间越长&#xff0c;泄露的数据就越多。这反过来会对您的业务产生更大的影响。企业需要…

【无人机】基于灰狼优化算法的无人机路径规划问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

蓝桥杯0基础学习

目录 Split()分隔字符串 StringBuilder用法 反转字符串中的单词 LocalDate用法 LocalDate类具体方法 查询年月日 修改时间 判断日期先后&#xff0c;是否是闰年&#xff0c;月份年份长度 对时间进行加减操作 跑步锻炼 使用LoaclDate解法 没使用LocalDate解法 next()…

Linux学习_设备树理论

Linux学习_设备树总结三种写驱动的方法资源和驱动在同一个文件里资源用 platform_device 指定、驱动在 platform_driver 实现资源用设备树指定驱动在 platform_driver 实现设备树的语法实际使用时&#xff0c;include模板小改常用属性#address-cells、#size-cells、regcompatib…

DBSCAN聚类算法及Python实现

DBSCAN聚类算法 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的聚类算法&#xff0c;可以将数据点分成不同的簇&#xff0c;并且能够识别噪声点&#xff08;不属于任何簇的点&#xff09;。 DBSCAN聚类算法的基…

告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

告诉老默我想学Spring Cloud了&#xff08;新手篇&#xff09;&#xff1a;从0到1搭建Spring Cloud项目一、前言二、如何选择版本2.1 SpringCloud 和 Spring Boot 版本选型2.1.1 Spring Cloud 版本与 Spring Boot 版本关系2.1.2 选择具体的合适版本2.2 第三方组件的版本选型三、…

SpringCloud之Eureka原理分析与实战(注册与发现)

目录 1、从本质理解服务治理思想 2、为什么选择Spring Cloud服务治理组件 3、Spring Cloud Eureka服务发现 3.1 Eureka的优势 3.2 Eureka架构组成 3.3 搭建Eureka Server 实战 3.3.1 添加依赖 3.3.2 开启服务注册 3.3.3 添加YML配置 3.3.4 访问服务 3.4 搭建Eureka …

【c语言】指针数组、数组指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

打造出ChatGPT的,是怎样一群人?

震惊世界的ChatGPT&#xff0c;要多少人才能开发出来&#xff1f;几百&#xff0c;还是几千&#xff1f; 答案是&#xff1a;87个人。 老实说&#xff0c;刚看到这个数字真是惊到我了&#xff0c;印象里&#xff0c;之前看媒体报道各大巨头人工智能人才储备时&#xff0c;动辄…

学编程应该选择什么操作系统?

今天来聊一个老生常谈的问题&#xff0c;学编程时到底选择什么操作系统&#xff1f;Mac、Windows&#xff0c;还是别的什么。。 作为一个每种操作系统都用过很多年的程序员&#xff0c;我会结合我自己的经历来给大家一些参考和建议。 接下来先分别聊聊每种操作系统的优点和不…

Linux服务器如何查看CPU使用率、内存占用情况

Linux服务器如何查看CPU使用率、内存占用情况 作为Linux运维工程师&#xff0c;系统维护过程以及日常工作中需要我们经常查看CPU使用率、内存使用率、带宽占用&#xff0c;从资源使用的程度分析系统整体的运行情况。 在 Linux 上查看资源使用情况有很多命令可以参考&#xff0c…

【SpringMVC】9—底层原理

⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 如果文章对你有所帮助&#xff0c;可以点赞&#x1f44d;…