SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › неправильное отображение персонажа
В этой теме 4 ответа, 2 участника, последнее обновление Dench 7 года/лет, 2 мес. назад.
-
АвторСообщения
-
при запуске окна, показываются не те координаты тайла.
выдает 16,40,16,32.хотя я таких координат вообще не указывал. а когда начинаю движение персонажем, то он становится правильным.
я так понимаю надо указать начальные координаты. но разве они не указаны в Player p(“…” 0,416C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137#include <SFML/Graphics.hpp>#include <iostream>#include<time.h>using namespace sf;class Player//класс игрока{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(w, h, 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);}};int main(){RenderWindow window(sf::VideoMode(640, 480), "Test");/*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", 0, 416, 16, 32);//то, что выше можно удалить, так как сейчас мы вызвали класс плеер, в который уже включено вышенаписанное.Clock clock;//создаем переменную времени, т.о. привязка ко времени(а не мощности/загруженности процессора).float CurrentFrame = 1;// хранит текущий кадрp.x = 100;p.y = 100;//задал координаты появления персонажаwhile (window.isOpen()){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) || (Keyboard::isKeyPressed(Keyboard::A)))) {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));}if ((Keyboard::isKeyPressed(Keyboard::Right) || (Keyboard::isKeyPressed(Keyboard::D)))) {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));}if ((Keyboard::isKeyPressed(Keyboard::Up) || (Keyboard::isKeyPressed(Keyboard::W)))) {CurrentFrame += 0.01*time;if (CurrentFrame > 3)CurrentFrame -= 3;p.dir = 3;p.speed = 0.1;p.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 384, 16, 32));}// см вышеif ((Keyboard::isKeyPressed(Keyboard::Down) || (Keyboard::isKeyPressed(Keyboard::S)))) {CurrentFrame += 0.01*time;if (CurrentFrame > 3)CurrentFrame -= 3;p.dir = 2;p.speed = 0.1;p.sprite.setTextureRect(IntRect(16 * int(CurrentFrame), 448, 16, 32));}// см выше//herosprite.setRotation(90);эта функция выполняет поворот спрайта, в скобках градусы поворотаp.update(time);window.clear();window.draw(p.sprite);window.display();}return 0;},16,32); ?
Что за бред?
C++1sprite.setTextureRect(IntRect(w, h, w, h));Набор параметров которые принимает sf::IntRect:
left
Left coordinate of the rectangle.top
Top coordinate of the rectangle.width
Width of the rectangle.height
Height of the rectangle.
Жмякни сюда
И будьте внимательней.увидел, надо было 0,0,w,h. спасибо
я подправил и ничего не изменилось, и координаты появления багают.
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180#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);//"оживляем" камеру в окне 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.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;}Вложения:
You must be logged in to view attached files. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.