我正在尝试制作自己的地图。 首先,我使用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;
然后使用嵌入式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;
}
顶部的“水”应该在白色上方,实际上应该是“卵石”,而在底部的卵石线下方应该是“卵石”。