SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › добавление второго файла в карту
В этой теме 1 ответ, 1 участник, последнее обновление Dench 7 года/лет, 4 мес. назад.
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
-
АвторСообщения
-
Что не так?
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192#include <SFML/Graphics.hpp>#include "map.h"#include "view.h"using namespace sf;class Player//класс игрока{//private:float x, y;public://свойство позволяющее обращаться к классу со стороныfloat x,y, w, h, dx, dy, speed = 0;// обьявляем переменные координаты игрока x и y я их удалил, так как инициилизировал их ниже, высота ширина, ускорение движения dx и dy и сама скорость.int dir = 0;//направление движения игрокаString File;//файл с расширениемImage image;//sfml изображениеTexture texture;//сфмл текстураSprite sprite;//сфмл спрайтPlayer(String F, int X, int Y, float W, float H){//Конструктор с формальными параметрами для класса плейер.при создании обьекта прописываем параметрыFile = F;//имя файла с расширениемw = W; h = H;//высота и ширинаimage.loadFromFile("images/" + File);//загружаем наше изображение.//image.createMaskFromColor(Color(41, 33, 59));//убираем ненужный цветtexture.loadFromImage(image);//заливаем изображение в текстуруsprite.setTexture(texture);//заливаем спрайт текстуройx = X; y = Y;//координаты появления спрайтаsprite.setTextureRect(IntRect(0, 0, w, h));//задаем спрайту один прямоугольник. интрект-приведение типов.}void update(float time){//функция оживления обьекта класса.принимает в себя СФМЛ . работает бесконечно давая персонажу движение.switch (dir)//поведение в зависимости от направления. (каждая цифра соответствует направлению){case 0:dx = speed; dy = 0; break;//вправоcase 1:dx = -speed; dy = 0; break;//влевоcase 2:dx = 0; dy = speed; break;//внизcase 3:dx = 0; dy = -speed; break;//вверх}x += dx*time;y += dy*time;speed = 0;sprite.setPosition(x, y);}float getPlayerCoordinateX() {//Этим методом будем забирать координату иксreturn x;}float getPlayerCoordinateY() {//этим методомо забираем координату игрекreturn y;}};int main(){RenderWindow window(sf::VideoMode(640, 480), "Test");view.reset(FloatRect(0, 0, 640, 480));//размер "вида" камеры при создании объекта вида камеры. (потом можем менять как хотим) Что то типа инициализации./*Texture herotexture;herotexture.loadFromFile("images/hero.png");Sprite herosprite;herosprite.setTexture(herotexture);herosprite.setTextureRect(IntRect(0, 416, 16, 32));herosprite.setPosition(250, 250);*/Player p("hero.png", 16, 480, 16, 32);p.sprite.setPosition(150, 150);//координаты появления персонажа//то, что выше можно удалить, так как сейчас мы вызвали класс плеер, в который уже включено вышенаписанное.Clock clock;//создаем переменную времени, т.о. привязка ко времени(а не мощности/загруженности процессора).float CurrentFrame = 1;// хранит текущий кадрwhile (window.isOpen()){Image map_image;//объект изображения для картыmap_image.loadFromFile("images/map.bmp");//загружаем файл для картыTexture map;//текстура картыmap.loadFromImage(map_image);//заряжаем текстуру картинкойSprite s_map;//создаём спрайт для картыs_map.setTexture(map);//заливаем текстуру спрайтомImage map_image_1;//добавляю второй файл для картыmap_image_1.loadFromFile("images/map_2.png");Texture map_1;map_1.loadFromImage(map_image_1);Sprite s_map_1;s_map_1.setTexture(map_1);float time = clock.getElapsedTime().asMicroseconds(); //дать прошедшее время в микросекундахclock.restart(); //перезагружает времяtime = time / 800; //скорость игры//std::cout << time << "\n";//смотрим как живет время (перезагружается, как видим)//heroteleporttimer += time;//прибавляем к нашей переменной time//if (heroteleporttimer > 3000) { herosprite.setPosition(0, 120); heroteleporttimer = 0; } //если таймертелепорта больше 3000 (это примерно 3 секунды), то телепортируем героя и обнуляем таймер телепортацииsf::Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}if (Keyboard::isKeyPressed(Keyboard::Left)) {p.dir = 1;p.speed = 0.1;//dir направление движения, спиид скорость движения.на время мы тут уже не умножаем, все прописанно в классе.CurrentFrame += 0.01*time;if (CurrentFrame > 3)CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 480, 16, 32));getPlayerCoordinateForView(p.getPlayerCoordinateX(), p.getPlayerCoordinateY());}if (Keyboard::isKeyPressed(Keyboard::Right)) {p.dir = 0;p.speed = 0.1;CurrentFrame += 0.01*time;//скорость анимацииif (CurrentFrame > 3)//число кадров анимацииCurrentFrame -= 3;//обновление числаp.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 416, 16, 32));getPlayerCoordinateForView(p.getPlayerCoordinateX(), p.getPlayerCoordinateY());}if (Keyboard::isKeyPressed(Keyboard::Up)) {CurrentFrame += 0.01*time;if (CurrentFrame > 3)CurrentFrame -= 3;p.sprite.setTextureRect(IntRect(96 * int(CurrentFrame), 96, 96, 96));getPlayerCoordinateForView(p.getPlayerCoordinateX(), p.getPlayerCoordinateY());//передаем координаты игрока в функцию управления камеройp.dir = 3;p.speed = 0.1;p.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 384, 16, 32));}// см вышеif (Keyboard::isKeyPressed(Keyboard::Down)) {CurrentFrame += 0.01*time;if (CurrentFrame > 3)CurrentFrame -= 3;getPlayerCoordinateForView(p.getPlayerCoordinateX(), p.getPlayerCoordinateY());p.dir = 2;p.speed = 0.1;p.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 448, 16, 32));}//herosprite.setRotation(90);эта функция выполняет поворот спрайта, в скобках градусы поворотаwindow.setView(view);//"оживляем" камеру в окне sfmlviewmap(time);//функция скроллинга карты, передаем ей время sfmlchangeview();//разная хрень с картой, поворот,зум и т.д.p.update(time);window.clear();for (int i = 0; i < HEIGHT_MAP; i++)for (int j = 0; j < WIDHT_MAP;j++){if (TileMap[i][j] == '1'){s_map.setTextureRect(IntRect(0, 1, 20, 20));} //если встретили символ пробел, то рисуем 1й квадратикif (TileMap[i][j] == '2'){s_map.setTextureRect(IntRect(40, 1, 20, 20));}//если встретили символ s, то рисуем 2й квадратикif (TileMap[i][j] == '3') s_map.setTextureRect(IntRect(80, 1, 20, 20));//если встретили символ 0, то рисуем 3й квадратикif (TileMap[i][j] == ' ') s_map.setTextureRect(IntRect(40,121,20,20));if (TileMap[i][j] == 'a') s_map_1.setTextureRect(IntRect(70, 230, 120, 280));s_map.setPosition(j * 20, i * 20);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадратwindow.draw(s_map);window.draw(s_map_1);//рисуем квадратики на экран}window.draw(p.sprite);window.display();}return 0;}Вложения:
You must be logged in to view attached files. -
АвторСообщения
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
Для ответа в этой теме необходимо авторизоваться.