Созданные ответы форума
-
АвторСообщения
-
Ясно, спасибо за помощь.
Не совсем понял что значит глобальный указатель?
А можно ли как то получить доступ к полям класса наследника через класс родитель? В данном случае в классе Button есть переменная isActive которой нет в Entity. А список у меня std::list<Entity*> entities; не дает доступ к этой переменной.
А что за буфера?
Задачу решил таким образом:
C++123456789101112131415161718std::map<std::string,Entity*> actions;for(it=entities.begin(); it!=entities.end(); it++){if((*it)->type.compare(""))actions[(*it)->type] = &(**it);}actions["bond1"]->dx = 0;//..............................if((*it)->name == "button" && p.getRect().intersects((*it)->getRect())){if(Keyboard::isKeyPressed(Keyboard::F)){(*it)->anim.set("green");actions["bond1"]->dx = -0.08;}}Не знаю на сколько это будет удобно в дальнейшем.
Получается нужно будет два раза список проходить что бы найти нужную пару, так?
C++12345678910for(it = entities.begin(); it != entities.end(); it++){if((*it)->name == "button")if(*it)->id==0)for(it2 = entities.begin(); it2!=entities.end(); it2++)if((*it2)->name == "platform")if(*it2)->id==0)if(Keyboard::isKeyPressed(Keyboard::F))(*it2)->dx = 0.8;}Идея заключается в том, что когда проверяется столкновения игрока с врагом, ты указываете прямоугольник с большей длиной что бы пуле было куда лететь. И если они пересеклись, пуля вылетает. А в классе врага стоит счетчик который будет тормозить стрельбу, что бы летела одна пуля а не сразу очередь.
Если класса пули у Вас еще нет, то его можно взять в уроке 28. А что бы стрелял враг можно сделать так:
C++12345678910111213141516for(it = entities.begin(); it != entities.end(); it++){if((*it)->name == "easyEnemy"){if(p.dir == p.right){if(IntRect(p.x,p.y,p.w*3,p.h).intersects((*it)->getRect()))if ((*it)->isShoot == true) { (*it)->isShoot = false; entities.push_back(new Bullet(BulletImage, "Bullet", lvl, p.x, p.y, 16, 16, p.left)); }}else if(p.dir == p.left){if(IntRect(p.x-p.w*3,p.y,p.w*3,p.h).intersects((*it)->getRect()))if ((*it)->isShoot == true) { (*it)->isShoot = false; entities.push_back(new Bullet(BulletImage, "Bullet", lvl, p.x, p.y, 16, 16, p.right)); }}}}В цикле, где проверяются все объекты:
C++123456789101112131415161718192021222324252627void update(float time){if(name=="easyEnemy"){x += dx*time;checkCollision(dx,0);y += dy*time;checkCollision(0,dy);dy += 0.0005*time;if(!isShoot){moveTimer += time;if(moveTimer >= 500){isShoot = true;moveTimer = 0;}}if(health <= 0)life = false;anim.tick(time);}}Можно сделать так: если работаете в TileMapEditor то сделайте там объект с именем “thorn”.
И в класс игрока в void checkCollision(float Dx,float Dy) добавить, в цикл где проверяются все объекты:
C++12345678if(getRect().intersects(obj[i].rect)){if(obj[i].name == "thorn"){dy = -0.5;health -= 5;}}Но скорость не становиться равна 0 и персонаж продолжает двигаться,а вот камера ломается и больше за ним не следит
Возможно у Вас есть еще какие-то переменные отвечающие за скорость движения – вроде dx или dy, которые не обнуляются.
Когда мой игрок контактирует с врагом вычитание жизней происходит пока контакт не прекратится
вообщем вычитание жизней происходит ~60-100 раз
а мне надо чтобы это вычитание происходила один раз при каждом столкновении
Как это сделать?Сделайте что бы при столкновении с врагом игрок отскакивал от него в противоположную сторону как и сам враг. Так же можно ввести логическую переменную которая будет отвечать за то что игрока ударили – когда игрока ударили она становиться true на некоторое время и пока она не станет обратно false то его нельзя будет опять атаковать.
Пытаюсь собрать. Выбрал в конфигурации параметр “Visual Studio 10 2010″. Выдает ошибки.
Вложения:
You must be logged in to view attached files.Скачал TGUI и SFML 2.4.0. В проекте указал путь к dll и lib файлам. В итоге, при подключении TGUI\TGUI.hpp выдает кучу ошибок.
Вложения:
You must be logged in to view attached files.Хорошо, буду пробовать.
Спасибо, думаю это еще пригодится.
-
АвторСообщения