Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Tiled Map и волновой алгоритм 
:(
    Опции темы
lenarano
Дата 21.10.2015, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 17.4.2014

Репутация: нет
Всего: нет



Ребята, помогите решить вопрос реализации волнового алгоритма, когда мы загружаем уровни с помощью 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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.