0

我正在为我的大学作业创建一个太空入侵者游戏。我在纸上分解零件,我认为一个好的起点是在屏幕上移动精灵。我现在遇到的问题是,当精灵在屏幕的右侧时它会继续移动,所以我添加了以下代码:

    if (invadersSprite.getPosition().x > 650)           
    {
        std::cout << "WIDTH_END" << std::endl;
    }

我基本上将其用于调试以供将来参考。输出弹出到控制台,所以我知道我在做某事。所以,我开始从输出转移到实际将精灵移回屏幕的左侧。我现在遇到的问题比预期的要多。

为了便于阅读代码,我为 up、left、right 和 down 声明了一些整数。

int spriteWalkSpeed = 50;
int up=-spriteWalkSpeed, down=spriteWalkSpeed, left=-spriteWalkSpeed, right=spriteWalkSpeed;

我尝试过使用 SFML 移动命令和 setPosition,但它们都没有像我认为的那样真正起作用。

移动:

我遇到的问题是它基本上停在屏幕中间。它仍然会为腿部运动等设置动画,但不会向左或向右移动。

    if (invadersSprite.getPosition().x > 650)           
    {
        invadersSprite.move(left, 00);
    }

设置位置:

这有点接近我所追求的,但仍然没有雪茄。移动暂停大约一秒钟,然后在屏幕左侧弹出。我需要的是向下移动屏幕。

    if (invadersSprite.getPosition().x > 650)           
    {
        invadersSprite.setPosition(left, 00);
    }

我已经很久没有使用 SFML,所以我对此有点困惑。

编辑

目前精灵正在根据需要移动到屏幕的右侧:

if(spriteTimer>delay)
            {
                invadersSprite.setTextureRect(area);
                ++count;
                invadersSprite.move(right,0);
                if(count==SPRITECOLS) //WE HAVE MOVED OFF THE RIGHT OF THE IMAGE
                {
                    area.left=0;            //reset texture rect at left

                    count=0;                //reset count
                }
                else
                {
                    area.left+=spaceWidth; //move texture rect right

                }


                spriteTimer=0; //we have made one move in the sprite tile - start timing for the next move
            }
4

1 回答 1

0

如果 x 坐标大于 650,您当前的逻辑只会将精灵向左移动一次 - 但这并不是您想要的。您想要的是精灵在到达边缘后不断向左移动。

为此,您需要跟踪精灵的当前速度。例如,当您的精灵启动时,它将向右移动:

xVelocity = right;

然后你可以有 2 个条件来切换方向(当碰到屏幕边缘时):

if (invaderSprite.getPosition().x >= screenWidth) {
    // hit the right side of screen
    xVelocity = left;
} else if (invaderSprite.getPosition().x <= 0) {
    // hit the left side of screen
    xVelocity = right;
}

现在,在任何游戏时间,您只需根据当前速度移动您的精灵:

invaderSprite.move(xVelocity, yVelocity);

还有一些其他的事情需要修复,比如考虑精灵的宽度、改变 y 速度等,但这是主要思想。

于 2013-03-05T15:21:19.703 回答