SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Не отображается карта(22 урок)
В этой теме 1 ответ, 1 участник, последнее обновление Dead Man 5 года/лет, 4 мес. назад.
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
-
АвторСообщения
-
Создал карту в редакторе
Вроде все правильно подключил
Карта не отображается при запуске проектаОбъекты загружаются нормально, но вот сама карта не хочет работать
Карта находится в папке рядом с main.cpp(у меня называется Sourse.cpp)
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182#include <SFML/Graphics.hpp>//#include "map.h"#include "view.h"#include <sstream>#include <iostream>#include "level.h"#include <vector>//#include <list>using namespace sf;using namespace std;class Entity {public:vector<Object> obj;//вектор объектов картыfloat dx, dy, x, y, speed, moveTimer;//добавили переменную таймер для будущих целейint w, h, health;bool life, isMove, onGround;Texture texture;Sprite sprite;String name;//враги могут быть разные, мы не будем делать другой класс для врага.всего лишь различим врагов по имени и дадим каждому свое действие в update в зависимости от имениEntity(Image &image, String Name,float X, float Y, int W, int H) {x = X; y = Y; w = W; h = H; name = Name; moveTimer = 0;speed = 0; health = 100; dx = 0; dy = 0;life = true; onGround = false; isMove = false;texture.loadFromImage(image);sprite.setTexture(texture);sprite.setOrigin(w / 2, h / 2);}FloatRect getRect() {//ф-ция получения прямоугольника. его коорд,размеры (шир,высот).return FloatRect(x, y, w, h);//эта ф-ция нужна для проверки столкновений}};class Hero :public Entity{public:enum { left, right, up, down, jump, stay } state;//добавляем тип перечисления - состояние объектаint playerScore;Hero(Image &image, String Name, Level &lev, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H) {playerScore = 0; state = stay; obj = lev.GetAllObjects();//инициализируем.получаем все объекты для взаимодействия персонажа с картойif (name == "player") {sprite.setTextureRect(IntRect(4, 19, w, h));}}void control() {if (Keyboard::isKeyPressed) {if (Keyboard::isKeyPressed(Keyboard::A)) {state = left; speed = 0.1;}if (Keyboard::isKeyPressed(Keyboard::D)) {state = right; speed = 0.1;}if ((Keyboard::isKeyPressed(Keyboard::W)) && (onGround)) {state = jump; dy = -0.5; onGround = false;//то состояние равно прыжок,прыгнули и сообщили, что мы не на земле}if (Keyboard::isKeyPressed(Keyboard::S)) {state = down;}}}void checkCollisionWithMap(float Dx, float Dy)//ф ция проверки столкновений с картой{for (int i = 0; i<obj.size(); i++)//проходимся по объектамif (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом{if (obj[i].name == "solid")//если встретили препятствие{if (Dy>0) { y = obj[i].rect.top - h; dy = 0; onGround = true; }if (Dy<0) { y = obj[i].rect.top + obj[i].rect.height; dy = 0; }if (Dx>0) { x = obj[i].rect.left - w; }if (Dx<0) { x = obj[i].rect.left + obj[i].rect.width; }}}}void update(float time) {control();switch (state) {case right: dx = speed; break;//состояние идти вправоcase left: dx = -speed; break;//состояние идти влевоcase up: break;//будет состояние поднятия наверх (например по лестнице)case down: dx = 0; break;//будет состояние во время спуска персонажа (например по лестнице)case jump: break;//здесь может быть вызов анимацииcase stay: break;//и здесь тоже}x += dx*time;checkCollisionWithMap(dx, 0);//обрабатываем столкновение по Хy += dy*time;checkCollisionWithMap(0, dy);//обрабатываем столкновение по Хsprite.setPosition(x + w / 2, y + h / 2); //задаем позицию спрайта в место его центраif (health <= 0) { life = false; }if (!isMove) { speed = 0; }if (life) { getPlayerCoordinateForView(x, y); }dy = dy + 0.0015*time;// делаем притяжение к земле}};class Enemy :public Entity {public:Enemy(Image &image, String Name, Level &lvl, float X, float Y, int W, int H) :Entity(image, Name, X, Y, W, H) {obj = lvl.GetObjects("solid");//инициализируем.получаем нужные объекты для взаимодействия врага с картойif (name == "EasyEnemy") {sprite.setTextureRect(IntRect(0, 0, w, h));dx = 0.1;//даем скорость.этот объект всегда двигается}}void checkCollisionWithMap(float Dx, float Dy)//ф ция проверки столкновений с картой{for (int i = 0; i<obj.size(); i++)//проходимся по объектамif (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом{if (obj[i].name == "solid")//если встретили препятствие{if (Dy>0) { y = obj[i].rect.top - h; dy = 0; onGround = true; }if (Dy<0) { y = obj[i].rect.top + obj[i].rect.height; dy = 0; }if (Dx>0) { x = obj[i].rect.left - w; dx = -0.1; sprite.scale(-1, 1); }if (Dx<0) { x = obj[i].rect.left + obj[i].rect.width; dx = 0.1; sprite.scale(-1, 1); }}}}void update(float time){if (name == "EasyEnemy") {//для персонажа с таким именем логика будет такой//moveTimer += time;if (moveTimer>3000){ dx *= -1; moveTimer = 0; }//меняет направление примерно каждые 3 секcheckCollisionWithMap(dx, 0);//обрабатываем столкновение по Хx += dx*time;sprite.setPosition(x + w / 2, y + h / 2); //задаем позицию спрайта в место его центраif (health <= 0) { life = false; }}}};int main(){RenderWindow window(VideoMode(640, 480), "Lesson 22. kychka-pc.ru");view.reset(FloatRect(0, 0, 640, 480));Level lvl;//создали экземпляр класса уровеньlvl.LoadFromFile("maps.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.Image heroImage;heroImage.loadFromFile("images/MilesTailsPrower.gif");Image easyEnemyImage;easyEnemyImage.loadFromFile("images/shamaich.png");easyEnemyImage.createMaskFromColor(Color(255, 0, 0));Object player = lvl.GetObject("player");//объект игрока на нашей карте.задаем координаты игроку в начале при помощи негоObject easyEnemyObject = lvl.GetObject("easyEnemy");//объект легкого врага на нашей карте.задаем координаты игроку в начале при помощи негоHero p(heroImage, "player", lvl, player.rect.left, player.rect.top, 40, 30);//передаем координаты прямоугольника player из карты в координаты нашего игрокаEnemy easyEnemy(easyEnemyImage, "EasyEnemy", lvl, easyEnemyObject.rect.left, easyEnemyObject.rect.top, 200, 97);//передаем координаты прямоугольника easyEnemy из карты в координаты нашего врагаClock clock;while (window.isOpen()){float time = clock.getElapsedTime().asMicroseconds();clock.restart();time = time / 800;Event event;while (window.pollEvent(event)){if (event.type == sf::Event::Closed)window.close();}p.update(time);easyEnemy.update(time);window.setView(view);lvl.Draw(window);//рисуем новую картуwindow.draw(easyEnemy.sprite);window.draw(p.sprite);window.display();}return 0;}Вложения:
You must be logged in to view attached files. -
АвторСообщения
Просмотр 2 сообщений - с 1 по 2 (из 2 всего)
Для ответа в этой теме необходимо авторизоваться.