效果图
项目结构
项目层级结构:
预制:
代码
import { _decorator, CCFloat, Component, Node, Sprite, instantiate, Prefab, assert } from 'cc';
const { ccclass, property } = _decorator;
/**
* 背景脚本
*/
@ccclass('Background')
export class Background extends Component {
/** 背景图片预制体 */
@property(Prefab)
backgroundPrefab: Prefab;
/** 背景图片移动速度 */
@property(CCFloat)
speed: number = 100;
/** 背景图片高度 */
private bgHeight: number;
/** 背景节点数组 */
private backgroundNodeArray: Node[] = [];
/** 背景图片数量 */
private readonly bgPicNum = 2;
/**
* 初始化背景图片数组
*/
private initBackgroundNodeArray() {
for (let i = 0; i < this.bgPicNum; i++) {
// 实例化预制体
let bgNode = instantiate(this.backgroundPrefab);
// 推入背景图片数组
this.backgroundNodeArray.push(bgNode);
// 挂载到背景根节点下
this.node.addChild(bgNode);
// 初始化背景图片高度
this.initBackgroundHeight(bgNode);
}
}
/**
* 初始化背景图片高度
*/
private initBackgroundHeight(bgNode: Node) {
// 如果已初始化高度则返回
if (!!this.bgHeight) {
return;
}
// 获取背景图片精灵
let bgSprite = bgNode.getComponent(Sprite);
assert(!!bgSprite, "背景图片精灵未设置");
// 动态读取背景图片高度
this.bgHeight = bgSprite.spriteFrame.height;
}
/**
* 初始化每个背景图片的位置
*/
private initEachBackgroundNodePosition() {
for (let i = 0; i < this.backgroundNodeArray.length; i++) {
let bgNode = this.backgroundNodeArray[i];
// 图片位置按图片高度叠加
bgNode.setPosition(bgNode.position.x, this.bgHeight * i);
}
}
start() {
assert(!!this.backgroundPrefab, "背景图片预制体未设置");
// 初始化背景图片数组
this.initBackgroundNodeArray();
// 初始化背景图片位置
this.initEachBackgroundNodePosition();
}
update(deltaTime: number) {
// 更新背景图片位置
this.updateBackgroundPosition(deltaTime);
}
/**
* 更新背景图片位置
* @param deltaTime 时间间隔
*/
private updateBackgroundPosition(deltaTime: number) {
this.backgroundNodeArray.forEach(bgNode => {
// 背景图片随时间下移
bgNode.setPosition(bgNode.position.x, bgNode.position.y - this.speed * deltaTime);
// 如果背景图片超出屏幕高度,则重置位置,接在上方
if (bgNode.position.y < -this.bgHeight) {
// 位置设置图片高度时得-1像素,否则会有缝
bgNode.setPosition(bgNode.position.x, this.bgHeight * (this.bgPicNum - 1) - 1);
}
});
}
}