SFML и C++ Уроки \ Разработка игр › Форумы › SFML System, Window и другие вопросы › Проблемы :D
В этой теме 10 ответов, 3 участника, последнее обновление Ivan_gaga 8 года/лет назад.
-
АвторСообщения
-
У меня еще возникли проблемы :
Как заставить врага стрелять ?
Как вообще оперировать переменными врага ? я не могу их вызвать как переменные игрока : p.x или p.health
И хочу сделать что то наподобие шипов,но не могу даже внести новый статический объект,который бы отнимал жизни игрока
код использую с уроков по sfml,которые были на этом сайте
Как все это реализовать? 😀Можно сделать так: если работаете в 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;}}я делал объект,но когда игрок его касается ничего не происходит
Я конечно сейчас ваш вариант опробуюДа,все заработало!Спасибо вам Darkos
Помогите еще организовать стрельбу для врагаЕсли класса пули у Вас еще нет, то его можно взять в уроке 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);}}почему-то не работает
И я не очень понимаю за что отвечает это:<span class=”crayon-st”>if</span><span class=”crayon-sy”>(</span><span class=”crayon-e”>IntRect</span><span class=”crayon-sy”>(</span><span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>x</span><span class=”crayon-sy”>,</span><span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>y</span><span class=”crayon-sy”>,</span><span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>w</span><span class=”crayon-o”>*</span><span class=”crayon-cn”>3</span><span class=”crayon-sy”>,</span><span class=”crayon-v”>p</span><span class=”crayon-sy”>.</span><span class=”crayon-v”>h</span><span class=”crayon-sy”>)</span><span class=”crayon-sy”>.</span><span class=”crayon-e”>intersects</span><span class=”crayon-sy”>(</span><span class=”crayon-sy”>(</span><span class=”crayon-o”>*</span><span class=”crayon-v”>it</span><span class=”crayon-sy”>)</span><span class=”crayon-o”>-></span><span class=”crayon-e”>getRect</span><span class=”crayon-sy”>(</span><span class=”crayon-sy”>)</span><span class=”crayon-sy”>)</span><span class=”crayon-sy”>)</span>упс
я не очень понимаю за что отвечает это:C++1if(IntRect(p.x,p.y,p.w*3,p.h).intersects((*it)->getRect()))Проверка на то что прямоугольник игрока соприкоснуля с прямоугольником it.
Идея заключается в том, что когда проверяется столкновения игрока с врагом, ты указываете прямоугольник с большей длиной что бы пуле было куда лететь. И если они пересеклись, пуля вылетает. А в классе врага стоит счетчик который будет тормозить стрельбу, что бы летела одна пуля а не сразу очередь.
Это слишком сложный вариант
Мне надо чтобы враг просто стрелял(постоянно) и когда пуля попадает в игрок вычитается 20 жизнейя не понимаю,но для враг выстрел я сделать не могу
вот я рисую пулю для игрока :C++1if(Keyboard::isKeyPressed(Keyboard::M)){ entities.push_back(new Bullet(BulletImage, "Bullet", lvl, p.x, p.y, 16, 16)); }Она рисуется и ее видно
С врагом такого сделать я не могу…. -
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.