Ребята, помогите решить вопрос реализации волнового алгоритма, когда мы загружаем уровни с помощью Tiled Map. По алгоритму нам нужно создать карту подобную нашей и проверять есть ли на первоначальной карте на этом этапе стена и дошли ли мы до цели. Если дошли шагаем, при этом проверяем ближайшие клетки. С Tiled Map не работала, вообще не представляю к чему привязать ее здесь. Препод предложил создать упрощенный вариант моей карты(двумерный массив), там все делать, но как потом перейти обратно к моей карте? Организацию уровней я полностью брала отсюда кодВот мой класс Враг, только я хочу переделать взаимодействие героя с врагом, а то они у меня жутко тупые. | Код | #ifndef ENEMY_H #define ENEMY_H
#include "Entity.h"
class Enemy:public Entity{ int zq,timer; public: Enemy (sf::Image &image,sf::String Name,Level &lvl,float X, float Y, float W, float H): Entity(image,Name,X,Y,W,H){ zq=1;state=left;timer=0; obj=lvl.GetAllObjects();//иницилизируем нужные объекты для взаимодействия врага с картой if(name=="EasyEnemy"){ sprite.setTextureRect(sf::IntRect(0,0,w,h));
} }
void checkCollisionWithMap()//ф ция проверки столкновений с картой { for (int i = 0; i<obj.size(); i++)//проходимся по объектам if (getRect().intersects(obj[i].rect))//проверяем пересечение игрока с объектом { if (obj[i].name == "solid"||"teleport1"||"teleport2")//если встретили препятствие {if (dy>0) { y = obj[i].rect.top - h;dy=0.1;} if (dy<0) { y = obj[i].rect.top + obj[i].rect.height;} 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) { if (name == "EasyEnemy"){//для персонажа с таким именем логика будет такой timer+=time; if (timer+1000>1000) {zq=rand()%3;} if (timer>500) {if (zq==0) {if (x>px) {speed=0.1,state=left; timer=0;} {if (y>py) {speed=0.1,state=up; timer=0;} }}} if (timer>500) {if (zq==1) {if (x<px) {speed=0.1,state=right; timer=0;} {if (y<py) {speed=0.1,state=down; timer=0;} }}}
switch(state) { case right: dx=speed; dy=0; break; case left: dx=-speed; dy=0; break; case down: dx=0; dy=speed; break; case up: dx=0; dy=-speed; break; case stay:break; }
x += dx*time; y += dy*time; checkCollisionWithMap(); sprite.setPosition(x + w / 2, y + h / 2); //задаем позицию спрайта в место его центра
} }
};
|
Я хочу создать функцию подобную этой в своем классе, но не представляю, как ее адаптировать к моему Tiled Map. Что мне в ней изменить? | Код | void find_path(int N,int M) { struct t{ int x, y; }; t Q[10000], S, G; int i_st=0, i_end=1, t, i, j, a[100][100]={0}; for(i=0; i<N; i++) for(j=0; j<M; j++) { if(wayToPacMan[i][j]=='G') {G.x=i; G.y=j;} if(wayToPacMan[i][j]=='S') {S.x=i; S.y=j;} } a[G.x][G.y]=1; Q[0].x=G.x; Q[0].y=G.y; while(i_st<i_end) { if(a[Q[i_st].x-1][Q[i_st].y]==0 && wayToPacMan[Q[i_st].x-1][Q[i_st].y]!='#') { Q[i_end].x=Q[i_st].x-1; Q[i_end++].y=Q[i_st].y; a[Q[i_st].x-1][Q[i_st].y]=a[Q[i_st].x][Q[i_st].y]+1; } if(a[Q[i_st].x+1][Q[i_st].y]==0 && wayToPacMan[Q[i_st].x+1][Q[i_st].y]!='#') { Q[i_end].x=Q[i_st].x+1; Q[i_end++].y=Q[i_st].y; a[Q[i_st].x+1][Q[i_st].y]=a[Q[i_st].x][Q[i_st].y]+1; } if(a[Q[i_st].x][Q[i_st].y-1]==0 && wayToPacMan[Q[i_st].x][Q[i_st].y-1]!='#') { Q[i_end].x=Q[i_st].x; Q[i_end++].y=Q[i_st].y-1; a[Q[i_st].x][Q[i_st].y-1]=a[Q[i_st].x][Q[i_st].y]+1; } if(a[Q[i_st].x][Q[i_st].y+1]==0 && wayToPacMan[Q[i_st].x][Q[i_st].y+1]!='#') { Q[i_end].x=Q[i_st].x; Q[i_end++].y=Q[i_st].y+1; a[Q[i_st].x][Q[i_st].y+1]=a[Q[i_st].x][Q[i_st].y]+1; } i_st++; } if(a[S.x][S.y]==0) cout<<"No way"<<endl; else { t=a[S.x][S.y]; while(t>1) { if(a[S.x-1][S.y]==t-1) { wayToPacMan[S.x-1][S.y]='+'; S.x--; t--; } else if(a[S.x+1][S.y]==t-1) { wayToPacMan[S.x+1][S.y]='+'; S.x++; t--; } else if(a[S.x][S.y-1]==t-1) { wayToPacMan[S.x][S.y-1]='+'; S.y--; t--; } else if(a[S.x][S.y+1]==t-1) { wayToPacMan[S.x][S.y+1]='+'; S.y++; t--; } } } }
|
Или все-таки надо заморачиваться с дублированием моей карты в двумерном массиве. Ребята, очень надеюсь на помощь-я сама не справляюсь, опыта вообще нет. Заочка((( Добавлено через 6 минут и 46 секундhttp://habrahabr.ru/post/199064/Вот сайт, где рассказывалось про этот редактор Это сообщение отредактировал(а) lenarano - 21.10.2015, 10:56
Присоединённый файл ( Кол-во скачиваний: 3 )
Enemy.h 1,78 Kb
|