TankRockett Ответов: 4

Неизвестные ошибки в проекте SFML/C++ (visual studio 2019 V. 16.2):


Недавно я учусь делать 2d-игру в SFML, используя учебную серию на youtube от Suraj Sharma(в настоящее время видео 57):

https://www.youtube.com/watch?v=kwd_AVCkvXE&list=PL6xSOsbVA1ebkU66okpi-KViAO8_9DJKg&index=57

После 10:14 в видео я получаю кучу ошибок в классе 'TileMap'

Вот этот код:

Наслаждайтесь в прицеле орудия.ч:

<pre>#pragma once
#ifndef TILE_MAP_HH
#define TILE_MAP_HH

#include "Tile.h"

class TileMap
{
private:
	float GridSizeF;
	unsigned GridSizeU;
	unsigned Layers;
	sf::Vector2u MaxSize;
	std::vector<std::vector<std::vector<Tile>>>Map;
public:
	TileMap();
	virtual~TileMap();

	//Funcs
	void Update();
	void Render(sf::RenderTarget& target);
};
#endif // !TILE_MAP_HH


TileMap.cpp:

<pre>#include "pch.h"
#include "TileMap.h"

TileMap::TileMap()
{
	this->GridSizeF = 50.f;
	this->GridSizeU = static_cast<unsigned>(this->GridSizeF);
	this->MaxSize.x = 10;
	this->MaxSize.y = 10;
	this->Layers = 1;

	/*Both push_back and resize functions have E0135 error
	which says:
		class "std::vector<std::vector<std::vector<Tile, std::allocator<Tile>>,
		std::allocator<std::vector<Tile, std::allocator<Tile>>>>,
		std::allocator<std::vector<std::vector<Tile, std::allocator<Tile>>,
		std::allocator<std::vector<Tile, std::allocator<Tile>>>>>>"
		has no member "push_back"("resize")
		*/
	//E0020 : x,y,z are undefined
	//E0065 : expected a ';' in x,y,z for loop declaration

	this->Map.resize(this->MaxSize.x);
	for (size_t x = 0; x < this->MaxSize.x; x++)
	{				
		this->Map.push_back(std::vector<std::vector<Tile>>());
		for (size_t y = 0; y < this->MaxSize.y; y++)
		{	
			this->Map.resize(this->MaxSize.x);
			this->Map[x].push_back(std::vector<Tile>());
			for (size_t z = 0; z < this->Layers; z++)
			{	
				this->Map.resize(this->MaxSize.x);
				this->Map[x][y].push_back(Tile(x*this->GridSizeF, y * this->GridSizeF, this->GridSizeF));
			}
		}
	}
}

TileMap::~TileMap()
{
}

//Funcs
void TileMap::Update()
{
}

void TileMap::Render(sf::RenderTarget& target)
{
	for (auto& x : this->Map) {  /*E2291:this range-based 'for' statement requires
					 a suitable 'begin' function and none was found          
				     */
		for (auto& y : x) {
			for (auto& z : y) {
				z.Render(target);
			}
		}
	}
}


До появления видео 57 проект работал отлично.

Кто-нибудь может мне помочь ?

Что я уже пробовал:

Я проверил предварительно скомпилированный заголовочный файл в 'TileMap.cpp-и все в порядке.

4 Ответов

Рейтинг:
36

OriginalGriff

Поэтому вернитесь к видео и спросите автора в комментарии внизу. Он будет знать свой код: мы-нет!


TankRockett

Да примерно that...It прошла уже неделя, а я ничего от него не слышал

OriginalGriff

Тогда он явно заботится о своем проекте и своем учебнике: или он опубликовал кучу вещей, о которых он мало знает, просто чтобы получить подписчиков.

Вы сами по себе - я бы вытащил отладчик и начал его разрабатывать!

Рейтинг:
11

TankRockett

Извините за все неприятности,сообщество Visual Studio 2019 было ужасным.Я перешел на Visual Studio 2019 Professional, и теперь игра работает нормально.


Рейтинг:
1

KarstenK

Классическая задача отладки, поэтому начните использовать отладчик.

Следите за созданием объектов TileMaps, чтобы некоторые из них были уничтожены и не затопляли вашу память.

совет: разделите код конструктора TileMap () (цикл for) на несколько дополнительных функций, чтобы лучше видеть, что происходит.


Рейтинг:
0

CPallini

Цитата:
или (auto& x : this->Map) { /*E2291:этот оператор 'for' на основе диапазона требует
подходящая функция "начать" и ни одна не была найдена

На самом деле это должно сработать, потому что Map это std::vector и последнее действительно обеспечивает "подходящий" begin.
Во всяком случае вы могли бы заменить его на
for (size_t n=0; n< Map.size(); ++n)
{
  auto & x = Map[n];
  //...


TankRockett

Отладчик сказал: "size_t" - это не имя типа".

CPallini

Либо использовать
#включить <cstddef>
или измените его на
for (unsigned n = 0; n < Map.size(); ++n)