SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › неправильное отображение персонажа › Ответ в теме: неправильное отображение персонажа
я подправил и ничего не изменилось, и координаты появления багают.
C++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 |
#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);//заливаем текстуру спрайтом 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);//"оживляем" камеру в окне sfml viewmap(time);//функция скроллинга карты, передаем ей время sfml changeview();//разная хрень с картой, поворот,зум и т.д. 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.setTextureRect(IntRect(40, 41, 20, 20)); s_map.setPosition(j * 20, i * 20);//по сути раскидывает квадратики, превращая в карту. то есть задает каждому из них позицию. если убрать, то вся карта нарисуется в одном квадрате 32*32 и мы увидим один квадрат window.draw(s_map);//рисуем квадратики на экран } window.draw(p.sprite); window.display(); } return 0; } |