SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Как сделать динамическую генерацию уровня?
Помечено: chunk, map, runner, TileMapEditor
В этой теме 2 ответа, 2 участника, последнее обновление barbar 6 года/лет, 12 мес. назад.
-
АвторСообщения
-
Привет всем. Я и мои товарищи делаем сейчас раннер, и нам нужно сделать так, чтобы уровень генерировался на ходу, либо чтобы подгружались заранее заготовленные чанки (куски карты) в случайном порядке. Какими инструментами нам лучше воспользоваться для решения этой задачи? Сейчас у нас уровни в формате tmx, следующий загружается при прохождении текущего, но игра при этом перезагружается, то есть стык между уровнями виден.
Храним уровень в динамическом массиве. Его можно объявить так:
C++1234567int **level; // массив уровня// созданиеlevel = new int * [xSize];for (int i = 0; i < xSize; i++) {level[i] = new int [ySize];}обращаемся к массиву как к обычному двумерному массиву. Когда игрок приближается к концу, расширяем массив по иксу и грузим чанк.
Смотри, xSize и ySize поменяй местами, расширять такой массив можно только в одну сторону, а в примере выше только по y координате, а вам как я понял надо по x;
Вот пример кода, тут полоска генерируется динамически.C++12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667#include <SFML/Graphics.hpp>#include <ctime>using namespace sf;using namespace std;void draw(){srand(time(NULL));int x = 70, y = 30, shapeSize = 8;RenderWindow window(sf::VideoMode(700+shapeSize*x, shapeSize*y), "Writed by Gleb Stegalin aka barbar");int **field;int c = 1;field = new int*[y];for(int i=0;i<y;i++)field[i] = new int[x];for(int i=0;i<y;i++){for (int z=0;z<x;z++){field[i][z] = rand()%3;}}RectangleShape shape;shape.setSize(Vector2f(shapeSize, shapeSize));while (window.isOpen()){Event event;while (window.pollEvent(event)){if (event.type == Event::Closed)window.close();}sf::Vector2i pixelPos = sf::Mouse::getPosition(window);sf::Vector2f pos = window.mapPixelToCoords(pixelPos);window.clear(sf::Color(240,240,200));for(int i=0;i<y;i++){for (int z=0;z<x;z++){if (field[i][z] == 1)shape.setFillColor(Color(0,0,0));elseshape.setFillColor(Color(250,250,250));shape.setPosition(z*shapeSize, i*shapeSize);window.draw(shape);}}x++;window.display();}}int main(){draw();return 0;} -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.