Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2012, 21:30   #11
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

phomm, размер канала моего интернета не позволяет выкладывать файлы больше 5мб, поэтому Tao скинуть не могу(хоть он и весит всего лишь ~35мб).
А проект вот:
Вложения
Тип файла: rar Game_Test.rar (49.4 Кб, 17 просмотров)
Alek-de-Mik вне форума Ответить с цитированием
Старый 18.09.2012, 23:56   #12
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Вот вроде у меня получился волновой алгоритм, но при выводе на экран, я что-то напутал с индексами, сам уже третий час бьюсь не могу разобраться где именно, помогите пожалуйста.
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AStarInMatrix
{
    class Pathfinde
    {
        private int MapWidht;
        private int MapHeight; 
        private int[,] Map;
        int[,] WayMap;
        public void ReadMap()
        {
            string[] s = System.IO.File.ReadAllLines("level.txt");
            Map = new int[s.Length,s[0].Length];
            for (int i = 0; i < s.Length; i++)
            {
                for (int j = 0; j < s[0].Length; j++)
                {
                    Map[i,j] = (int)char.GetNumericValue(s[i][j]);
                }
            }
            MapWidht = s[0].Length;
            MapHeight = s.Length;
            for (int y = 0; y < MapHeight; y++)
            {
                Console.WriteLine();
                for (int x = 0; x < MapWidht; x++)
                    if (Map[y, x] == 1)
                        Console.Write("+");
                    else
                        Console.Write(" ");
            }
            Console.ReadKey();
        }
           public void FindWave(int startX, int startY, int targetX, int targetY)
        {

            bool add = true;
            int[,] cMap = new int[MapWidht, MapHeight];
            int x, y, step = 0;
            for (y = 0; y < MapHeight; y++)
                for (x = 0; x < MapWidht; x++)
                {
                    if (Map[y,x] == 1)
                        cMap[x,y] = -2;//индикатор стены
                    else
                        cMap[x,y] = -1;//индикатор еще не ступали сюда
                }
            cMap[targetX, targetY] = 0;//Начинаем с финиша
            while (add == true)
            {
                add = false;
                for (y = 0; y < MapHeight; y++)
                    for (x = 0; x < MapWidht ; x++)
                    {
                        if (cMap[x, y] == step)
                        {
                            //Ставим значение шага+1 в соседние ячейки (если они проходимы)
                            if (y - 1 >= 0 && cMap[x - 1, y] != -2 && cMap[x - 1, y] == -1)
                                cMap[x - 1, y] = step + 1;
                            if (x - 1 >= 0 && cMap[x, y - 1] != -2 && cMap[x, y - 1] == -1)
                                cMap[x, y - 1] = step + 1;
                            if (y + 1 < MapWidht && cMap[x + 1, y] != -2 && cMap[x + 1, y] == -1)
                                cMap[x + 1, y] = step + 1;
                            if (x + 1 < MapHeight && cMap[x, y + 1] != -2 && cMap[x, y + 1] == -1)
                                cMap[x, y + 1] = step + 1;
                        }
                    }
                step++;
                add = true;
                if (cMap[startX, startY] != -1)//решение найдено
                    add = false;
                if (step > MapWidht * MapHeight)//решение не найдено
                    add = false;
                //Отрисовка
                for (y = 0; y < MapHeight; y++)
                {
                    Console.WriteLine();
                    for (x = 0; x < MapWidht; x++)
                        if (cMap[x, y] == -1)
                            Console.Write(" ");
                        else
                            if (cMap[x,y] == -2)
                                Console.Write("#");
                            else
                                if (y == startY && x == startX)
                                    Console.Write("S");
                                else
                                    if (y == targetY && x == targetX)
                                        Console.Write("F");
                                    else
                                        if (cMap[y, x] > -1)
                                            Console.Write("{0}", cMap[y, x]);

                }
                Console.ReadKey();
            }
        }
    }
}
Изображения
Тип файла: jpg Снимок.jpg (8.7 Кб, 94 просмотров)

Последний раз редактировалось Alek-de-Mik; 19.09.2012 в 00:00.
Alek-de-Mik вне форума Ответить с цитированием
Старый 19.09.2012, 18:54   #13
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я писал вот такой фикс, вроде работало:
Код:
if (x - 1 >= 0 && cMap[x - 1, y] == -1)
    cMap[x - 1, y] = step + 1;
if (y - 1 >= 0 && cMap[x, y - 1] == -1)
    cMap[x, y - 1] = step + 1;
if (x + 1 < MapWidht && cMap[x + 1, y] == -1)
    cMap[x + 1, y] = step + 1;
if (y + 1 < MapHeight && cMap[x, y + 1] == -1)
    cMap[x, y + 1] = step + 1;
Но, на мой взгляд, задача не совсем Вами понимается, я бы посоветовал провести декомпозицию проекта получше.

Как-то код составлен хаотично, лишние операции, много вещей в кучу, надо пораскидать по классам, опять же параметризацию методов надо повышать.

Также хочется услышать направление проекта, какие Вы цели ставите, какие задачи видите и как предполагаете их решать.
phomm вне форума Ответить с цитированием
Старый 19.09.2012, 18:57   #14
Vova777
Уважаемый
Форумчанин
 
Аватар для Vova777
 
Регистрация: 04.07.2010
Сообщений: 318
Восклицание

Цитата:
Сообщение от phomm Посмотреть сообщение
...какие задачи видите и как предполагаете их решать.
Хотите окончательно запутать человека? Задачи решаются по мере поступления.
даешь высокое напряжение
Vova777 вне форума Ответить с цитированием
Старый 29.09.2012, 22:36   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Был занят на неделе, вот сел попинать проектик. Надеюсь поможет, хотя там косяки надо ещё повычищать (там скорее по графическим и мышко-клеточным расчетам проблемы), а путь вполне уверено ищет и бежит по нему. За кодом особо не следил, уж извините, не до рефакторинга сейчас было. Комментировал мало, в принципе, могу добавить, если потребуется.
В архиве экзешка, файл уровня и исходник. Бонусом захотелось сделать возможно динамически (на бегу) менять путь - тоже интересный финт, думаю.
Вложения
Тип файла: zip game-test.zip (10.8 Кб, 22 просмотров)

Последний раз редактировалось phomm; 29.09.2012 в 22:42.
phomm вне форума Ответить с цитированием
Старый 04.10.2012, 14:01   #16
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Ого, огромное спасибо, что потратили столько своего времени.
За смену маршрута на лету, отдельное спасибо.
А по поводу
Цитата:
Также хочется услышать направление проекта, какие Вы цели ставите, какие задачи видите и как предполагаете их решать.
По задумке, это догонялки, сетевая игра на 2 компьютера, с обработкой столкновений, это минимум того что мне нужно сделать. В будущем, если мне удастся хорошо усвоить методы которые использовались, то возможно получится что-то большее.
Мне удалось пофиксить преобразование координат мыши в координаты уровня, теперь при щелчке мышью в квадрат берутся координаты из его центра. И еще получилось сделать загрузку и отрисовку уровня из файла. Теперь буду думать, как совместить то что сделали вы и то что есть у меня.
....
С ужасом, осознал что буквально вчера похерил свой проект = ) Не стоило называть тот проект Test = ) К вечеру постараюсь восстановить и выложить.

Последний раз редактировалось Alek-de-Mik; 04.10.2012 в 14:38.
Alek-de-Mik вне форума Ответить с цитированием
Старый 05.10.2012, 23:33   #17
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Восстановил, как и обещал. Добавил немного комментариев. Если вы добавите комментариев в тот проект который выложили, то думаю у меня получится слить оба проекта.
Вложения
Тип файла: rar Test_Game.rar (213.9 Кб, 16 просмотров)
Alek-de-Mik вне форума Ответить с цитированием
Старый 06.10.2012, 23:21   #18
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

Соединил я оба проекта, но не отрисовывается окружность, проблема с координатами. Не зная как у вас устроены функции я не могу исправить эту ошибку = (. Теперь при нажатии на тайл, передается индекс ячейки массива отвечающего за проходимость этого тайла. Т.е. значения от 0до15 и получается что преобразовывать эти координаты для алгоритма нахождение пути не нужно. А вот для отрисовки наверное надо, но я не могу этого сделать, так как не понимаю какая переменная за что отвечает. Если у вас будет время прокомментируйте пожалуйста код в проекте.
Вложения
Тип файла: rar Runing.rar (222.9 Кб, 17 просмотров)
Alek-de-Mik вне форума Ответить с цитированием
Старый 07.10.2012, 11:35   #19
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Всё очень просто.
Ты забыл mob.Move(); в таймере
и снёс установку радиуса моба , мне самому следовало её сразу в моб-класс закинуть, ты там в инициализации просто поставь R=0. Плюс можно установку клеток начальных сделать, в том числе извне, из карты как бы, в конструктор передавать, например.
Ну ещё там координаты неправильно рассчитываются из-за несоответствия опенгл режима с у координатой идущей снизу вверх и обычным нашим представлением про неё же идущую сверху вниз. Вроде в предыдущем коде у меня было это учтено.. но уже не помню, плюс сегодня только с утра время есть, дак поглядел, а сейчас уже вовсю занят буду, реал... Могу посоветовать погонять оба кода под отладкой и последить что как работает. Комменты к предыдущему позже накину, мб в пн.
phomm вне форума Ответить с цитированием
Старый 08.10.2012, 17:58   #20
Alek-de-Mik
Пользователь
 
Регистрация: 07.09.2012
Сообщений: 44
По умолчанию

У меня получилось, благодаря вам = )
Теперь нужно как-то сделать обработку столкновений = )
Буду искать, читать, если будет не понятно, буду спрашивать здесь.
Но все равно, прокомментируйте пожалуйста свой код, я хочу в нем разобраться.
--
Почистил код и разложил почти все функции по классам. Попытался избавиться от лишних переменных типа double. И напоролся на проблему, перестала работать функция Move(). Несколько раз прогонял код отладчиком, но так и не понял в каком конкретно месте у меня проблема.
У кого будет время гляньте пожалуйста.
--
Проблему с Move() решил.
Вложения
Тип файла: rar Runing.rar (246.1 Кб, 18 просмотров)

Последний раз редактировалось Alek-de-Mik; 09.10.2012 в 14:03. Причина: Почистил код
Alek-de-Mik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передвижение объекта мышкой Яр|/||< (^_^) Qt и кроссплатформенное программирование С/С++ 3 26.06.2012 01:10
CLR. Ошибка C3918. Как вызвать из объекта обработчик, переданный родителю объекта от деда? Stilet Общие вопросы .NET 0 15.01.2011 17:49
Движение объекта на форме мышью _-Re@l-_ Общие вопросы Delphi 12 24.07.2010 02:12
Управление движением объекта мышью program123 Общие вопросы Delphi 9 08.03.2009 20:11
С помощью методов и свойств объекта осуществляется управление терминалом. Имя (идентификатор) объекта User>lia Общие вопросы Delphi 4 16.01.2009 16:37