You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PIXI实现精灵上下无缝环绕舞台滚动效果

实现PIXI.js精灵上下无缝环绕舞台滚动(解决闪烁问题)

我来帮你搞定这个上下无缝滚动的问题!原代码直接重置精灵位置的方式会出现明显的跳转断层,而之前的双精灵方案出现闪烁,主要是因为精灵可见性切换和位置计算的时机没处理好,导致帧渲染时出现短暂的视觉空白。

核心实现思路

  • 使用两个完全相同的精灵组成滚动队列,让它们始终保持上下衔接的位置
  • 同步移动两个精灵,当其中一个完全移出舞台范围时,立刻将它重新定位到另一个精灵的正对面(比如下方精灵移出底部,就把它放到上方精灵的正上方)
  • 全程不需要切换精灵可见性,通过持续的位置循环保证视觉上的无缝衔接

修正后的完整代码

const WIDTH = 500;
const HEIGHT = 500;
const app = new PIXI.Application({ 
    width: WIDTH, 
    height: HEIGHT, 
    backgroundColor: 0x000000 
});
document.body.appendChild(app.view);

// 创建两个完全相同的绿色方块精灵
const sprite1 = PIXI.Sprite.from('https://i.ibb.co/b3Sjn6M/greeenblock.png');
const sprite2 = PIXI.Sprite.from('https://i.ibb.co/b3Sjn6M/greeenblock.png');

// 设置精灵尺寸和锚点(锚点设为中心方便定位)
const spriteSize = 100;
[sprite1, sprite2].forEach(sprite => {
    sprite.width = spriteSize;
    sprite.height = spriteSize;
    sprite.anchor.set(0.5);
    sprite.x = app.screen.width / 2; // 水平居中
});

// 初始位置:sprite1在屏幕中心,sprite2在sprite1的正上方(刚好衔接)
sprite1.y = app.screen.height / 2;
sprite2.y = sprite1.y - HEIGHT;

// 将两个精灵添加到舞台
app.stage.addChild(sprite1);
app.stage.addChild(sprite2);

// 监听动画帧更新
app.ticker.add((delta) => {
    // 同步移动两个精灵的y坐标(delta保证移动速度稳定)
    const moveSpeed = 2;
    sprite1.y += delta * moveSpeed;
    sprite2.y += delta * moveSpeed;

    // 检查sprite1是否完全移出舞台底部,是的话把它放到sprite2的正上方
    if (sprite1.y > HEIGHT + spriteSize / 2) {
        sprite1.y = sprite2.y - HEIGHT;
    }

    // 检查sprite2是否完全移出舞台底部,是的话把它放到sprite1的正上方
    if (sprite2.y > HEIGHT + spriteSize / 2) {
        sprite2.y = sprite1.y - HEIGHT;
    }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/pixi.js/5.3.3/pixi.min.js"></script>

关键细节说明

  • 锚点设置:把精灵锚点设为中心(anchor.set(0.5)),让位置计算更直观,判断移出边界的条件也更清晰
  • 位置循环逻辑:当精灵的y坐标超过HEIGHT + spriteSize/2时,说明它已经完全移出舞台底部,此时将它放到另一个精灵的正上方(偏移量为舞台高度HEIGHT,刚好衔接)
  • 同步移动:两个精灵保持相同的移动速度,确保始终处于衔接状态,不会出现错位

为什么之前的方案会闪烁?

之前的方案通过spriteReverse.visible = false/true来切换精灵显示状态,这种方式在帧渲染过程中可能会出现:某一帧里原精灵已经移出屏幕,而反转精灵还没来得及显示(或者位置计算错误),导致屏幕出现短暂空白,也就是我们看到的闪烁问题。而现在的持续循环移动方案,两个精灵始终处于舞台内或即将进入舞台的位置,完全避免了状态切换带来的视觉断层。

内容的提问来源于stack exchange,提问作者Orbitum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 14:32:36