last2424, да тут пофиг на правила, написано же: "в жанре симулятора выживания в зомби-апокалипсисе". Если ко всему прочему ещё и в 3D, с открытым миром, реалистичной графикой, полной симуляцией жизни, да к тому же на голом энтузиазме (а рили разработчики работают исключительно на нём!!) - "полюбас надо вписываться". И вообще, это наверное тестовое задание - соискатель сам должен вычислить контекст и всю подноготную, начать работать без ТЗ и уже предоставить остальной команде труды своих работ, по которым и будет принято решение о его зачислении в команду. Как-то так.
tduk, тебе необходимо отложить проект в сторону и внимательно заняться изучением Unity, ознакомиться и понять базовые уроки по работе с 2D в данной среде. Говорю это отнюдь не с напыщенностью и надменностью, а исключительно из желания помочь, потому как сейчас у тебя в корне неверное представление.
Во-первых, если работаешь с 2D, то и использовать надо соответствующие классы и компоненты: RaycastHit2D, Physics2D и т.д. Во-вторых, объекты участвующие в raycast'е обязательно должны иметь collider (в данном случае, какой-нибудь из 2D коллайдеров). В-третьих, разберись с алгоритмом. У тебя здесь получается следующее:
Код
Если есть объект на пути луча, то ... Двигаем объект в направлении луча
А должно быть совершенно наоборот. В-четвертых, в данном случае это не важно, но ты пускаешь бесконечный луч. Это означает, что даже если рядом слева от спрайта есть пустое место, а где-то далеко имеется стена, то raycast'вернёт тебе именно стену. Тебе ещё нужен параметр distance. В-пятых, при работе с 2D, использовать координату Z стоит только в исключительных случаях. В твоём же случае, оптимальным вариантом будет работа с layermask'ами и tag'ами. Узнать про них больше сможешь из тех же уроков Unity. В-шестых, вот пример рабочего скрипта для управления объектом (проверяет, нет ли рядом любых других объектов с collider'ом):
Код
public class HeroScript : MonoBehaviour {
void Move (Vector2 dir) { RaycastHit2D hit = Physics2D.Raycast(transform.position, dir, 1); if (hit.collider == null) transform.Translate(dir); }
void FixedUpdate () { float x = Input.GetAxisRaw("Horizontal"); float y = Input.GetAxisRaw("Vertical"); Move(new Vector2(x, y)); } }
Сообщение отредактировал Rean - Пятница, 13 Января 2017, 01:16
Подскажите, пожалуйста, какие нибудь простые законченные идеи по нарастающей чтобы попрактиковаться.
Смотря в чем надо попрактиковаться. Если в использовании API, то здесь можно вообще обойтись Демо-сценами. Если в создании игровой логики - достаточно взять любую 2D игру и воплотить её в 3D: Понг, Змейка, Тетрис, Пакмэн, Сапёр, Морской бой, Шашки (с ИИ) и т.д. В крайнем случае, есть codingame, где можно оттачивать исключительно алгоритмическую базу.
Отрисовку чего-либо, из соображений оптимизации, крайне желательно производить в Draw Event'ах. В том числе и surface'ов:
Цитата
Third, you should try to draw to surfaces in the draw event. This is not always possible, but due to the optimised way in which GameMaker: Studio draws to the screen, it is recommended that you keep all draw functions within the draw event.
К тому же, если использовать draw-методы не в событии draw, возможны неконтролируемые поведения.
Маленькое замечание. У меня VS ругнулся на строку "if (!lStr.Contains(ch))", что не может преобразовать "char" в "string", я добавил преобразование в строку "if (!lStr.Contains(ch.ToString()))"
Странно. У меня в VS 2015 есть перегрузка с char. Но можно и через ToString() (думаю, там так и реализовано)
Добавлено (25 декабря 2016, 02:06) --------------------------------------------- Глянул на подключенные пространства: так у меня там Linq, оттуда и перегрузка с char А вот здесь можно рассмотреть/обсудить C++ версию от falcoware. Я сильно не вдавался в подробности, что и как работает. Если у кого будет желания - можете допилить.
Сообщение отредактировал Rean - Суббота, 24 Декабря 2016, 22:39
Достаточно интересно получается! Что касается изображения женского пола, то в голову приходит только третичные половые признаки: макияж, аксессуары. Что-то вроде:
Вот рабочий масштабируемый вариант. Представляет из себя работу с функцией по нахождению всех комбинаций размещения множества n (src) по k элементам.
Код
class Program { static void Main(string[] args) { string source = "abcd"; List<string> result = new List<string>();
for (int i = 0; i < source.Length; i++) Placement(i + 1, source, ref result);
for (int i = 0; i < result.Count; i++) Console.WriteLine("{0}", result[i]);
Console.WriteLine("-------------------------------"); Console.WriteLine("Всего {0} возможных комбинаций.", result.Count);
Console.Read(); }
/// <summary> /// Добавляет в результирущющий список rsl все комбинации слов из elm элементов множества src. /// </summary> /// <param name="k">Количество элементов в слове.</param> /// <param name="src">Исходное множество элементов.</param> /// <param name="rsl">Результирующий список строк.</param> /// <param name="lStr">Строка для хранения данных рекурсии. По умолчанию, пуста.</param> static void Placement (int k, string src, ref List<string> rsl, string lStr = "") { foreach (char ch in src) if (!lStr.Contains(ch)) if (k == 1) rsl.Add(lStr.ToString() + ch.ToString()); else Placement(k - 1, src, ref rsl, lStr + ch.ToString()); }
}
Из минусов: string'и и рекурсия. Зато достаточно компактно. Ссылка на реализацию: Permutation
Сообщение отредактировал Rean - Воскресенье, 25 Декабря 2016, 02:22
EchoIT, копирование текста не то же самое, что копирование изображения в буфер. Копирование текста возможно средствами системного события и то с рядом ограничений: необходимо иметь фокус на текстовом поле (скрытом, например) и т.д. Фактически, работать с буфером можно (внедряя костыли) и довольствуясь лишь ограниченным набором типов данных. Изображения, к сожалению (или к счастью), пока не входят в данный перечень.
EchoIT, средствами JS это тоже по-дефолту запрещено. Пользователю либо надо обязательно разрешить это в настройках браузера, либо установить соответствующий аддон. Есть вариант костылей по типу ActiveX и Flash, но стоит ли игра свеч? Если необходимо каким-либо образом получить скриншот на машине пользователя, то я бы смотрел в сторону рендера в текстуру, кодирования текстуры в PNG и сохранения файла на клиентской машине по средством JS.
falcoware, EzKekPolice, если чисто с точки зрения комбинаторики, то это получается сумма размещений с последовательным уменьшением количества элементов слова. Для алфавита с мощностью 3, выглядит так:
где количество размещений
Реализация данного алгоритма на языке C#: Рекурсивные методы:
Код
// Факториал числа n int Factorial(int n) { if (n == 0) return 1;
return Factorial(n - 1) * n; } // Сумма размещений для мощности cap int Comb(int cap, int n) { if (n < 2) return cap;
return Factorial(cap) / Factorial(cap - n) + Comb(cap, n - 1); } // Перегрузка для удобства вызова int Comb(int cap) { return Comb(cap, cap); }
С использованием циклов:
Код
// Факториал числа n int Factorial(int n) { int result = 1; for (int i = n; i > 0; i--) result *= i; return result; } // Сумма размещений для мощности cap int Comb(int cap) { int result = 0;
for (int i = cap; i > 0; i--) result += Factorial(cap) / Factorial(cap - i);
return result; }
Сообщение отредактировал Rean - Четверг, 22 Декабря 2016, 23:54
UPD: эх, как обычно, как я задаю тут вопрос, все замолкают.
Дело в том, что из-за многих ограничений работа с Web нетривиальна. Из-за соображений безопасности многие функции урезаны. В том числе и работа с буфером.