首页 > 其他分享 >Cocos实例1:实现平面游戏中的滚动地图

Cocos实例1:实现平面游戏中的滚动地图

时间:2024-03-18 13:29:47浏览次数:41  
标签:Cocos bg 滚动 jin pos 实例 let ._ yuan

Cocos实例:实现平面游戏中的滚动地图

1.应用:

	在2D游戏或某些UI界面中,会经常遇到一些循环滚动的背景或元素。例如飞机大战的背景、冒险岛的双层循环滚动背景,模拟视觉效果上角色在无限背景地图中运动。

2.实现原理

	需要一张上下或左右在顺序排列时可以无缝衔接的背景图片,搭建UI时顺序排列两张以上的背景图,当一张背景图移除屏幕时,另外一张图替换其滚动的初始位置来实现无缝的切换,如此循环。

3.实例

示例的话准备实现两个:一个是在应用中提到的飞机大战背景的循环滚动;一个是类似冒险岛的双层背景滚动。

1.美术资产

  • 飞机大战 :
    飞机大战b g
    在这里插入图片描述

  • 冒险岛:
    在这里插入图片描述
    在这里插入图片描述
    注:可以看到背景1的上下部分是无缝衔接的,背景2左右部分是无缝衔接的。
    备注:资源都是在百度上找的,仅供学习使用,勿商用。

2.搭建UI**

	打开CocosCreator编辑器,这里使用的版本是3.6.3
  • 飞机大战
    设计分辨率选择750*1334(竖屏)
    在这里插入图片描述
    接下来编写背景移动的脚本PlaneBg.ts
  • 冒险岛
    设计分辨率选择1334*750(横屏)
    和飞机大战的背景搭建一样,只不过横版换成了竖版
    在这里插入图片描述
    接下来编写背景移动的脚本RunBg.ts

3.编写脚本**

  • 飞机大战
    编写背景移动的脚本PlaneBg.ts
import { _decorator, Component, Node, UITransform, view } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('PlaneBg')
export class PlaneBg extends Component {
    @property()
    speed: number = 20;
    private bgs: Node[] = [];

    protected onl oad(): void {
        // 获取bg节点
        for (let i = 0; i < 3; i++) {
            this.bgs[i] = this.node.getChildByName(`bg${i}`);
        };
    }
    start() {

    }

    update(deltaTime: number) {
        // 遍历bgs数组,获取每一个背景的当前位置
        for (let i = 0; i < 3; i++) {
            let bg = this.bgs[i];
            const bg_pos = bg.getPosition();
            // 计算新的位置
            let new_pos_x = bg_pos.x;
            let new_pos_y = bg_pos.y - this.speed * deltaTime;
            // 设置新的位置
            bg.setPosition(new_pos_x, new_pos_y);
        };
        // 如果第一个背景的y坐标小于等于-view的高度,则将其从数组中移除,并将其添加到第二个背景的下面
        if (this.bgs[0].getPosition().y <= -view.getVisibleSize().height) {
            let bg = this.bgs.shift();
            this.bgs.push(bg);
            // 设置新的位置
            bg.setPosition(bg.getPosition().x, this.bgs[1].getPosition().y + this.bgs[1].getComponent(UITransform).height);
        }
    }
}

编写完背景移动的脚本后把它添加到背景的父节点上,就可以预览效果了。

在这里插入图片描述

  • 冒险岛
    编写背景移动的脚本RunBg.ts
import { _decorator, Component, Node, UITransform, view } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('RunBg')
export class RunBg extends Component {

    @property()
    speed_yuan: number = 20;//远景的移动速度慢一点
    @property()
    speed_jin: number = 50;//近景的移动速度快一点

    private _yuanBgs: Node[] = [];
    private _jinBgs: Node[] = [];
    protected onl oad(): void {
        for (let i = 0; i < 3; i++) {
            this._yuanBgs[i] = this.node.getChildByName(`bg_yuan${i}`);
            this._jinBgs[i] = this.node.getChildByName(`bg_jin${i}`);
        };
    }
    start() {

    }

    update(deltaTime: number) {
       // 遍历jin_bg数组,计算新的位置,并设置新的位置
        for (let i = 0; i < 3; i++) {
            let jin_bg = this._jinBgs[i];
            const jin_pos = jin_bg.getPosition();
            let new_jinpos_x = jin_pos.x - this.speed_jin * deltaTime;;
            let new_jinpos_y = jin_pos.y;
            jin_bg.setPosition(new_jinpos_x, new_jinpos_y);

            let yuan_bg = this._yuanBgs[i];
            const yuan_pos = yuan_bg.getPosition();
            let new_yuanpos_x = yuan_pos.x - this.speed_yuan * deltaTime;;
            let new_yuanpos_y = yuan_pos.y;
            yuan_bg.setPosition(new_yuanpos_x, new_yuanpos_y);
        };
        // 如果jin_bg数组的第一个元素的位置小于等于-view的可见宽度,则将其从数组中移除,并将该元素放置在数组的第二个元素的位置的右边
        if (this._jinBgs[0].getPosition().x <= -view.getVisibleSize().width) {
            let jin_bg = this._jinBgs.shift();
            this._jinBgs.push(jin_bg);
            jin_bg.setPosition(this._jinBgs[1].getPosition().x + this._jinBgs[1].getComponent(UITransform).width, jin_bg.getPosition().y);
        }
        // 如果yuan_bg数组的第一个元素的位置小于等于-view的可见宽度,则将其从数组中移除,并将该元素放置在数组的第二个元素的位置的右边
        if (this._yuanBgs[0].getPosition().x <= -view.getVisibleSize().width) {
            let yuan_bg = this._yuanBgs.shift();
            this._yuanBgs.push(yuan_bg);
            yuan_bg.setPosition(this._yuanBgs[1].getPosition().x + this._yuanBgs[1].getComponent(UITransform).width, yuan_bg.getPosition().y);
        }
    }
}


编写完背景移动的脚本后把它添加到背景的父节点上,预览效果
在这里插入图片描述

4.预览

  • 飞机大战
    可以看到,虽然飞机没有移动,看上去好像飞机在平稳飞行,背景好像是无限的。
  • 冒险岛
    可以看到,远景和近景都在移动,看上去好像是错开移动的,就像真实生活中场景一样。

标签:Cocos,bg,滚动,jin,pos,实例,let,._,yuan
From: https://blog.csdn.net/qq_43242691/article/details/136737221

相关文章

  • vue router-view 路由跳转时,页面如何滚动到顶部
    在Vue中使用路由进行页面切换后,我们可以通过设置scrollBehavior来控制页面的滚动位置。importVuefrom'vue'importRouterfrom'vue-router'//导入组件importHomePagefrom'./components/HomePage.vue'importAboutPagefrom'./components/AboutPage.vue'......
  • 鸿蒙Next-Scroll滚动-控横向滚动
    @Entry@ComponentstructScrollerCase02{@Statemessage:string='HelloWorld';scroller:Scroller=newScroller()//在组件中声明一个scroller的实例build(){Row(){Column(){//只能有一个组件Scroll(this.scroller){//......
  • 鸿蒙Next-Scroll滚动-控制纵向滚动
    出现滚动的前提条件,当子组件内容超过父组件的宽度或者高度4.0文档 文档中心build(){Column(){Row(){Text('顶部').textAlign(TextAlign.Center).width('100%')}.width('100%').height(50).b......
  • JAVA面向对象高级:static修饰成员方法 真正搞懂main方法 类方法实例方法应用场景
         真正搞懂main方法    类方法实例方法应用场景类方法最常见的应用场景是做工具类      ......
  • Java面试题:详解单例模式与内存泄漏?内存模型与volatile关键字的实操?并发工具包与并发框
    Java核心技术:设计模式、内存管理与并发编程深度解析在Java技术领域,设计模式、内存管理和并发编程是构建高效、稳定系统的关键。本文将通过三道综合性面试题,深入探讨这些核心知识点,帮助读者理解其背后的原理,并在实际编程中避免常见错误。面试题一:单例模式与内存泄漏问题核......
  • Pytorch实践学习笔记一(附可运行详细代码实例)
    一、Pytorch的诞生        2017年1月,FAIR(FacebookAIResearch)发布了PyTorch。PyTorch是在Torch基础上用python语言重新打造的一款深度学习框架。Torch是采用Lua语言为接口的机器学习框架,但是因为Lua语言较为小众,导致Torch学习成本高,因此知名度不高。......
  • FPD、DPD、vintage、滚动率、迁移率
    1、vintage、滚动率、迁移率https://zhuanlan.zhihu.com/p/81027037/vintage滚动率:前六个月到后六个月状态迁徙率是在vintage基础上加工而来的。vintagevintage:selectloan_month,mob,sum(loan_amt)as"放款金额",sum(if(overdueday>=1,left_repay_principal,0))as1+剩......
  • ADI小课堂丨今天咱们实例分析一款精密Σ-Δ型ADC
    AD717x是ADI最新系列的精密Σ-Δ型ADC。该ADC系列是市场上第一个提供真正24位无噪声输出的转换器系列。AD717x器件可使对噪声异常敏感的仪器仪表电路的动态范围最大化,支持降低或消除信号调理级中的前置放大器增益。这些器件还能高速运行,提供比以前更短的建立时间。由此可缩短......
  • 关闭Mac 双指左右滚动功能(浏览器前进、后退丢失页面)
    关闭所有浏览器的前进后退功能系统偏好设置=>触控板=>更多手势=>在页面之间轻扫取消勾选即可。如下图所示:仅关闭Chrome的前进后退功能如果是Chrome浏览器,还可以使用下面这份方法在终端输入执行下面两条命令,然后重启Chrome,需要注意的是Chrome重启需要完全退出程序......
  • 一篇文章带你掌握Flex 布局:语法、实例
    目录前言语法一、Flex布局是什么?二、基本概念三、容器的属性(应用在父元素上)1.**`flex-direction`**:2.**`flex-wrap`**:3.**`flex-flow`**:4.**`justify-content`**:5.**`align-items`**:6.**`align-content`**:四、项目的属性(应用在子元素上)1.**`order`**:2.**`flex-......