SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › Движение объектов
В этой теме 35 ответов, 4 участника, последнее обновление Heisenberg 8 года/лет, 6 мес. назад.
-
АвторСообщения
-
C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124#include <SFML/Graphics.hpp>#include "view.h"#include <iostream>#include <sstream>#include "mission.h"#include "iostream"#include "level.h"#include <vector>#include <list>#include "TinyXML/tinyxml.h"using namespace sf;////////////////////////////////////Общий класс-родитель//////////////////////////class Entity {public:std::vector<Object> obj;//вектор объектов картыfloat dx, dy, x, y, speed, moveTimer;int w, h, health;bool life, isMove;Texture texture;Sprite sprite;String name;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; isMove = false;texture.loadFromImage(image);sprite.setTexture(texture);sprite.setOrigin(w / 2, h / 2);}FloatRect getRect(){//ф-ция получения прямоугольника. его коорд,размеры (шир,высот).return FloatRect(x, y, w, h);//эта ф-ция нужна для проверки столкновений}};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;dy = 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"){//если встретили препятствие (объект с именем solid)if (Dy < 0) { x = obj[i].rect.left + w; dx = -0.1; dy = 0; sprite.scale(-1, 1); }if (Dy > 0) { x = obj[i].rect.left + obj[i].rect.width; dx = 0.1; dy = 0; sprite.scale(-1, 1); }if (Dx < 0) { y = obj[i].rect.top + h; dy = -0.1; dx = 0; sprite.scale(1, -1); }if (Dx > 0) { y = obj[i].rect.top + obj[i].rect.height; dy = 0.1; dx = 0; sprite.scale(1, -1); }}}}void update(float time){if (name == "EasyEnemy"){//moveTimer += time;if (moveTimer>3000){ dx *= -1; moveTimer = 0; }//меняет направление примерно каждые 3 секcheckCollisionWithMap(dx, dy);y += dy*time;x += dx*time;sprite.setPosition(x + w / 2, y + h / 2);if (health <= 0){ life = false; }}}};int main(){RenderWindow window(VideoMode(1280, 700), "Lesson 22. kychka-pc.ru");view.reset(FloatRect(0, 0, 1280, 700));Level lvl;//создали экземпляр класса уровеньlvl.LoadFromFile("map.tmx");//загрузили в него карту, внутри класса с помощью методов он ее обработает.Image easyEnemyImage;easyEnemyImage.loadFromFile("B1.png");easyEnemyImage.createMaskFromColor(Color(255, 0, 0));Object easyEnemyObject = lvl.GetObject("easyEnemy");//объект легкого врага на нашей карте.задаем координаты игроку в начале при помощи негоEnemy easyEnemy(easyEnemyImage, "EasyEnemy", lvl, easyEnemyObject.rect.left, easyEnemyObject.rect.top, 32, 32);//передаем координаты прямоугольника 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 == Event::Closed)window.close();}easyEnemy.update(time);window.setView(view);window.clear(Color(77, 83, 140));lvl.Draw(window);//рисуем новую картуwindow.draw(easyEnemy.sprite);window.display();}return 0;}
помогите плз прописать поворот при столкновении со “solid”
Если я правильно понял то добавь логическую переменную, отвечающую за направление, при столкновении меняй скорость на отрицательное значение.
C++123enum Direction {dirLeft, dirRight} dir;if(dir == dirLeft){ dir = dirRight; dx = -0.1; }if(dir == dirRight( dir = dirLeft; = +0.1; }суть в том что он у меня направление и спрыгивает с карты.
C++123456//У тебя идёт автоматическое смещение нулевой точки в центр спрайта.sprite.setOrigin(w / 2, h / 2);//попробуй сделай так//sprite.setPosition(x + w / 2, y + h / 2); тут у тебя получается ты указываешь на правый нижний угол.sprite.setPosition(x, y);не получается
он меня двигается вниз встречает объект поворачивает на право потом встречает еще 1 объект спрыгивает вниз с карты и летит в право
Залей проект на облако, гляну что у тебя там не получается.
или найди меня в vk.com/v1z34я в вк подписался
народ кто нибудь отзовитесь
плз
кое как понял что ты хочешь, глянув на код. по тексту не догонял долго фразу :”суть в том что он у меня направление и спрыгивает с карты”.
Вобщем попробуй использовать rotate(градусы), а не scale.
sprite.rotate(90); -поворачивает спрайт на 90 градусов
Уже решено)
У него теперь заморочка с динамическими объектами, курит list 😀паша помоги плз как мне сделать так чтоб у меня в одном месте появлялись враги с некоторым промежутком времени учитывая 22 и 23 уроки
это уже другая тема =\ и обращайся ко всем, тебе тут не только я помогаю..
нужно сделать таймер (как в начале уроков, например где была телепортация героя примерно каждые 3 сек, это примерно 4-7 уроки, поищи там) и по этому таймеру вставлять врагов , точно так же их создавать, как в самом начале . entities push back….;
Я ему уже обьяснял, это копипастер…
народ в уроке рассматривается создание врагов в разных местах карты и там стоит счетчик на количество объектов равное количеству объектов на мапе
по сути мне надо просто счетчик заменить на таймер и создать переменную отвечающую за количество врагов?
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.