为什么setPosition(xPos,yPos)包装为yPos = y * 40,其中y = 20(yPos = 800)?

时间:2019-05-22 21:19:45

标签: c++ sfml

我正在尝试制作自己的地图。 首先,我使用Paint创建了几个png图像,然后将它们调整为40p x 40p图像。 (40_Brick01.png,40_Brick02.png,40_Water01.png等)。

然后我将它们加载到各自的Texture变量。

我创建了一个48 x 27的Sprite数组,以40像素增量覆盖1920x1080 res屏幕。 使用for循环和if / else语句,我根据用于if else语句的逻辑为每个Sprite分配了一个纹理。 在这些for循环中,我使用m_TileSprite[x][y].setPosition(xPos, yPos);在其中xPos = x*40; yPos = y*40;

为Sprites分配了位置

然后使用嵌入式for循环执行了draw命令。

大多数屏幕加载正常,但最后6行/行的瓷砖没有填充。

我注释掉了屏幕顶部的第一块图块,发现丢失的图块隐藏在刚注释掉的图块的“海底”。

我选择了两个图块(0,23)和(0,26),发现它们显示在图块(1,2)和(1,5)的位置。在这里,我发现y起始位置大于800的所有内容都移至下一个x列,并从y = 0开始。

当我使用m_TileSprite[x][y].setPosition(0, 920);m_TileSprite[x][y].setPosition(0, 1040);而不是m_TileSprite[x][y].setPosition(xPos, yPos);时,然后正确地平铺(0,23)和(0,26)位置。

我尝试了多种不同的方法来对setPosition函数的输入进行参数化,但是它们都具有相同的效果。插入一些调试检查后,我发现变量已填充到其各自正确的坐标,但在setPosition调用中却以某种方式被破坏。

为什么在使用变量时会自动换行,而在直接使用值时却不会自动换行?

执行尝试操作的另一种方法是:https://www.sfml-dev.org/tutorials/2.5/graphics-vertex-array.php

但是我想弄清楚为什么我的方法在借用另一种方法之前不起作用。

编辑: 我尝试过:

Vector2f m_TileGrid; //declared in .h

//in .cpp
m_TileGrid.x = 0.0;
m_TileGrid.y = 0.0;
for (int x = 0; x < 48; x++)
{
    for (int y = 0; y < 27; y++)
    {
        m_TileGrid.x = x * 40.f; //Tried with just 40 as well
        m_TileGrid.y = y * 40.f;
        m_TileSprite[x][y].setPosition(m_TileGrid);
    }
}

我也尝试过:

//in .cpp
int xPos = 0;  //Tried with float and double
int yPos = 0;
for (int x = 0; x < 48; x++)
{
    for (int y = 0; y < 27; y++)
    {
        xPos = x * 40.0; //Tried with just 40 as well and 40.f
        yPos = y * 40.0;
        m_TileSprite[x][y].setPosition(xPos,yPos);
    }
}

我只有一次在y = 800 IE以下填充任何内容,其中y> = 840是当我执行以下操作时:

if (y == 23 && x == 0)
{
    m_TileSprite[x][y].setPosition(0, 920);
}
if (y == 26 && x == 0)
{
    m_TileSprite[x][y].setPosition(0, 1040);
}

其他信息: 我刚刚发现,它是在定义窗口大小之前设置此Sprite的位置的。这无关紧要,因为在定义窗口大小之后才会执行draw命令。除非它对我的变量进行一些预处理,然后在定义窗口之前包装它们。由于位置没有变化,因此无法纠正在刷新屏幕,重绘所有内容的while循环中的位置。好像我将直接值设为常数一样,也许没有进行任何预处理。 情况并非如此,因为我现在尝试在创建窗口后设置位置。

我不知道我是否可以缩小示例代码的数量,并且仍然展示出效果:

//Tim.h
//Adopted and adapted from Bob.h from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#pragma once
#include <SFML/Graphics.hpp>

using namespace sf;

class Tim
{
private:
    Vector2f m_TileGrid;
    Texture m_Cobble01, m_Water05;

    Sprite m_TileSprite[48][21];


public:
    Tim();
    Sprite getTileSprite(int, int);
    void setTileSpritePos(int, int);

};

//Tim.cpp
//Adopted and adapted from Bob.ccp from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#include "stdafx.h"
#include "Tim.h"

Tim::Tim()
{

    m_Cobble01.loadFromFile("C:\\Visual Studio Stuff\\Projects\\Simple Game Engine\\Simple Game Engine\\40_Cobble01.png");
    m_Water05.loadFromFile("C:\\Visual Studio Stuff\\Projects\\Simple Game Engine\\Simple Game Engine\\40_Water05.png");
    sf::Vector2f position;
    m_TileGrid.x = 0.0;
    m_TileGrid.y = 0.0;
    float xPos = 0.f, yPos = 0.f;
    for (int x = 0; x < 48; x++)
    {
        yPos = 0;
        for (int y = 0; y < 27; y++)
        {
            m_TileGrid.x = x * 40.f; m_TileGrid.y = y * 40.f;
            //m_TileSprite[x][y].setPosition(xPos, yPos);
            if (y < 20)
            {
                m_TileSprite[x][y].setTexture(m_Water05);
            }
            else 
            {
                m_TileSprite[x][y].setTexture(m_Cobble01);
            }
            m_TileSprite[x][y].setPosition(xPos, yPos);
            yPos += 40;
        }
        xPos += 40;
    }
}

Sprite Tim::getTileSprite(int x, int y)
{
    return m_TileSprite[x][y];
}
void Tim::setTileSpritePos(int x, int y)
{
    m_TileGrid.x = x*40.f;
    m_TileGrid.y = y*40.f;
    m_TileSprite[x][y].setPosition(m_TileGrid);
    //m_TileSprite[x][y].sf::Transformable.m_position.x = m_TileGrid.x;
    //m_TileSprite[x][y].sf::Transformable.m_position.y = m_TileGrid.y;
    //  setPosition(m_TileGrid);
}

//Engine.h
//Adopted and adapted from Engine.h from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#pragma once
#include <SFML/Graphics.hpp>
#include "Tim.h";

using namespace sf;

class Engine
{
private:
    RenderWindow m_Window;
    Tim m_Tim;
    void draw();
    void firstDraw();

public:
    Engine();
    void start();

};

//Engine.cpp  -variant
//Adopted and adapted from Engine.cpp from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#include "stdafx.h"
#include "Engine.h"

Engine::Engine()
{
    Vector2f resolution;
    resolution.x = VideoMode::getDesktopMode().width;
    resolution.y = VideoMode::getDesktopMode().height;

    m_Window.create(VideoMode(resolution.x, resolution.y),
        "Simple Game Engine",
        Style::Fullscreen);



}

void Engine::start()
{
    firstDraw();
    while (m_Window.isOpen())
    {
        if (Keyboard::isKeyPressed(Keyboard::Escape))
        {
            m_Window.close();
        }
    }
}

//Draw.ccp
//Adopted and adapted from Draw.cpp from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#include "stdafx.h"
#include "Engine.h"

void Engine::firstDraw()
{
    for (int x = 0; x < 48; x++)
    {
        for (int y = 0; y < 27; y++)
        {
            m_Tim.setTileSpritePos(x, y);
        }
    }

    draw();
}
void Engine::draw()
{
    m_Window.clear(Color::White);

    for (int x = 0; x < 48; x++)
    {
        for (int y = 0; y < 27; y++)
        {
            if (y>8)
            {
                m_Window.draw(m_Tim.getTileSprite(x, y));
            }
        }
    }
    m_Window.display();
}

//Main.cpp
//Adopted and adapted from Main.cpp from http://gamecodeschool.com/sfml/building-a-simple-game-engine-in-c-plus-plus/
#include "stdafx.h"
#include "Engine.h"

int main()
{
    Engine engine;

    engine.start();

    return 0;
}

顶部的“水”应该在白色上方,实际上应该是“卵石”,而在底部的卵石线下方应该是“卵石”。

0 个答案:

没有答案