gpt4 book ai didi

c++ - 如果你向前移动如何改变屏幕,如果你向后移动如何看到旧的东西?

转载 作者:太空宇宙 更新时间:2023-11-04 12:32:58 25 4
gpt4 key购买 nike

我正在做一个游戏项目,但遇到了一个问题。所以我有一个游戏对象,如果向右移动然后再次进入左侧的屏幕(吃 bean 人效果),就会有一个新屏幕,我的意思是屏幕是一样的,但应该有新的其他对象,但是如果游戏对象返回,我应该能够在屏幕上看到旧版本的对象。所以我有一个行星列表列表。我创建了它们,如果向前移动,我想“打印”列表的第一个元素,如果我向后移动,我想看到前一个元素。我确实想尝试使用循环版本,但我决定不这样做。 https://imgur.com/a/vCjk9iW

class planet {
//an shape planet has these charateristics
sf::CircleShape shape;
//etc
};

struct nodeplanet
{
planet Planet;
nodeplanet *planet;
}

typedef nodeplanet *ptr_listplanet;

//here I make a list with planet

class listofplanets
{
private:
ptr_listplanet head;
public:
listofplanets()
{
head = NULL;
}
ptr_listofplanets create ()
//etc;
};

//then i create a system of planets;

struct nodeSystem
{
listofplanets ListOfPlanets;
nodeSystem*next;
nodeSystem *prev;
}
ptr_listSystem GenerateNode()
{
ptr_listSystem tmp;
tmp = new nodeSystem;
tmp->ListOfPlanets = ListOfPlanets();
tmp->ListOfPlanets.create(randomnumber());
tmp->prev = NULL;
tmp->next = NULL;
return tmp;
}
ptr_listSystem GenerateSystem ()
{

for (int i=0; i<3; i=i+1){ //just a trial, creating three systems
ptr_listSistema newNode = GenerateNode();
newNode->prev = NULL;
newNode->next = head;
if (head!=NULL)
head->prev = newNode;
head = newNode;
}
return this->head;
}
void Visualize(sf::RenderWindow &window, Player player)
{
ptr_listSistema current = this->head;

float x;
//while (current!=NULL){
x = player.shape.getPosition().x;
current->ListOfPlanet.draw(window);
//if ((player.shape.getPosition().x > 1269))
if (x>1269)
{
//current = GenerateSystem();
current = current->next;


window.clear();
current->ListaPianeta.draw(window);

}
//if ((player.shape.getPosition().x< 3) && (Keyboard::isKeyPressed(Keyboard::Left)))
{
if ((x<3) && (Keyboard::isKeyPressed(Keyboard::Left)))
//p = current->prev;
current = current->prev;
if (current == NULL)
{
current = current->next; //in the case I am in the "head" screen, I should see the head screen;
}

window.clear();
current->ListOfPlanet.draw(window);
}

// }
}

可视化函数是经典的列表打印函数。至少我认为,列表已经生成,如果玩家向前移动我应该能够看到下一个节点中生成的行星,如果玩家向后移动我应该能够看到前一个节点。我尝试使用循环,使用 while,但这并不是说我应该继续“打印”,这取决于。 (不知道我的想法逻辑上是否正确)

最佳答案

认为您可以大大简化所有事情。把所有东西都画在它实际所在的地方。然后使用 sf::View 表示当前可见屏幕并相应地移动它:

// setup done only once, we'll reposition it later
sf::View screen(sf::Vector2(0,0), sf::Vector2(screen_width, screen_height));

// before drawing
screen.setCenter((std::floor(player.shape.getPosition().x / screen_width) + 0.5f) * screen_width, screen_height / 2);
window.setView(screen);

这基本上是计算屏幕的预期左边界位置(通过划分、舍入,然后乘以屏幕宽度)并使用屏幕中心的偏移量(+ 0.5f).

显然,您也可以复制 X 坐标的代码,并将其重新用于 Y,同时允许上/下转换:

screen.setCenter((std::floor(player.shape.getPosition().x / screen_width) + 0.5f) * screen_width, (std::floor(player.shape.getPosition().y / screen_height) + 0.5f) * screen_height);

关于c++ - 如果你向前移动如何改变屏幕,如果你向后移动如何看到旧的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57924126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com