逻辑:使用门户网站时防止无限循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逻辑:使用门户网站时防止无限循环相关的知识,希望对你有一定的参考价值。

在我目前正在开发的游戏中,有许多门户,它们成对链接,每两个门户都有。每当玩家进入一个门户时,都应该将其传送到链接到他们刚进入的门户的另一个门户。问题在于,一旦将其传送出去,另一个门户就会看到玩家正在与之碰撞,并将其传送回第一个,然后将其发送回去,依此类推。此项目的代码很大,并且包含许多文件,但这是最重要的:

((javascript,请忽略框架,并暂停动画,那些是动画的)]


export class Portal extends gameObject{
    constructor(x, y, size, id){
        super(x, y, size);
        this.currentFrame = 0;//updated when (below) > (2 below)
        this.countingFrame =0;//update every time;
        this.pause = 3;//frames between frames
        this.id = id;
        this.justVisited = false;
    }
    update(player, portals){
        if(this.countingFrame >= this.pause){
            this.currentFrame = (this.currentFrame + 1) % 4;
            this.countingFrame = 0;
        }else{
            this.countingFrame ++;
        }
        if(super.checkPlayerCollision(player)){
            this.justVisited = true;
            for(let i in portals){
                if(this.id === portals[i].id && portals[i] !== this && !portals[i].justVisited){
                    player.x = portals[i].x;
                    player.y = portals[i].y;
                }
            }
        }else{
            for(let i in portals){
                if(this.id === portals[i].id && portals[i] !== this && portals[i].justVisited){
                    this.justVisited = false;
                }
            }
        }
    }
    render(canvas, spritesheet){
        super.render(canvas, spritesheet, this.currentFrame , 26);
    }
}

这是修补它的一种尝试,但是仍然失败。我该如何做,以便玩家在遇到第一个碰撞时就从第一个穿过,然后从第二个出来,直到玩家移开然后再打开时才重新回到第一个?

编辑:经过一番掩盖,对this问题最常给出的答案是“ 将玩家传送到第二个传送门之外时将其移动到第二个传送门的范围之外”。在我的情况下,这是行不通的,因为当播放器更新时,他的位置会随着最后一帧的播放时间而改变。在一个完美的世界中,这是可以的,但是因为它并不完美,所以玩家无法可靠地站在一个点上。另外,如果我将其完全移出了Hitbox,那看起来会很奇怪,因此也不起作用。

答案

在玩家退出两个链接的门户之前,这不会使门户开火

class Portal extends gameObject{
    constructor(x, y, size, id){
        super(x, y, size);
        this.currentFrame = 0;//updated when (below) > (2 below)
        this.countingFrame =0;//update every time;
        this.pause = 6;//frames between frames
        this.id = id;
        this.playerMoveOff = true;
        this.other = null;   
    }
    findOther(portals){
        for(let portal of portals){
            if(portal.id === this.id && portal !== this){
                this.other = portal;
            }
        }
    }
    update(player){
        if(this.countingFrame >= this.pause){
            this.currentFrame = (this.currentFrame + 1) % 4;
            this.countingFrame = 0;
        }else{
            this.countingFrame ++;
        }
        if(super.checkPlayerCollision(player)){
            if(this.other.playerMoveOff && this.playerMoveOff){
                player.x = this.other.x;
                player.y = this.other.y;
            }
            this.playerMoveOff = false;
        }else{
            this.playerMoveOff = true;
        }
    }
    render(canvas, spritesheet){
        super.render(canvas, spritesheet, this.currentFrame , 26);
    }
}

以上是关于逻辑:使用门户网站时防止无限循环的主要内容,如果未能解决你的问题,请参考以下文章

useEffect - 更新状态时防止无限循环

React:在 useEffect 中调用上下文函数时防止无限循环

在render()中更新状态时,防止无限循环

我有一个错误:重新渲染太多。 React 限制渲染次数以防止无限循环

React 限制渲染次数以防止无限循环...重新渲染次数过多

错误:重新渲染过多。 React 限制了渲染的数量以防止无限循环。即使使用箭头函数