А ведь можно проще. Просто сделать прямоугольники на поворотах. Ох
Я так понял, ты всё ещё с коллизиями не разобрался? Могу подкинуть алгоритм для лёгкого определения столкновений между 2D-многоугольниками любой формы. Вообще, можно и с кривыми работать, но мне это не нужно было, так что я в этом не разбирался.
Собственно, вот тут описание алгоритма определения пересечения двух отрезков на плоскости. Его нужно загнать в отдельную функцию (например, ab_cd), которая выдаёт true если есть пересечение, и false - если нет (плюс точку пересечения, если вдруг понадобится, но для простых столкновений не обязательно). Далее, нам потребуется описание многоугольников (полигонов, назовём их модели коллизий), между которыми нужно определить пересечение/столкновение. Короче, массив координат вершин, ничего сложного. У героя (автомобиля) это будет прямоугольник, у окружения (трассы) - произвольный многоугольник. Для определения пересечения придётся пробежаться по массивам вершин с нашей функцией ab_cd, примерно так: берём первую грань модели игрока, сравниваем её со всеми гранями целевой модели (трассы, например, или другого автомобиля), если вдруг выдаётся true - выходим и делаем действия, либо продолжаем для всех граней модели игрока, потом повторяем для каждой модели на сцене/карте (для оптимизации можно сравнивать примерные расстояния между некоторыми объектами, и проверять только на маленьком расстоянии, но у тебя объектов мало и это будет лишним). В конце концов, если обнаружили столкновение, проверяем состояние машинки игрока (скорость, направление, и т.п.) и изменяем соответственно...
Цитата (Amri)
Ну кто смотрел, отпишитесь пожалуйста
А что ты хочешь услышать? Игра запускается, машинка катается, передачи переключаются. До гоночной игры ещё далеко. Может быть, сделаешь выбор в меню курсором? А то непривычно стрелочками.
стоит маленько подождать. Когда синяя машинка пойдет на второй круг.
Цитата (TimKruz)
А что ты хочешь услышать
Вдруг у кого не запустилась, или еще что-то в таком роде. Не могу же я знать, как ведет себя недоальфа,причем архисырая игрулина на разных машинах с разными выпусками окошек.
Цитата (TimKruz)
Собственно, вот тут описание алгоритма
спасибо большое попробую. А по стандарту в хна столкновения формируются проверкой пересечения ограничивающих прямоугольников. Как то
Код
if (bbcar.Intersects(bbcar2)) { st = 2; }
bbcar - это ограничивающий прямоугольник зелёной машинки. bbcar2 - огр. прям. синей машинки. Intersects - функция проверки пересечений, стандартная. в принципе, вот и весь механизм.
Цитата (TimKruz)
Может быть, сделаешь выбор в меню курсором? А то непривычно стрелочками.
Здравое замечание сделаю
Добавлено (19.03.2013, 22:25) --------------------------------------------- И еще одно дополнение, но уже насчет скорости разработки (чё так медленно?!11): времени на все не хватает (весна пришла :( ), да и просто настроения нет.
Сообщение отредактировал Amri - Вторник, 19 Марта 2013, 22:31
стоит маленько подождать. Когда синяя машинка пойдет на второй круг.
Да. На втором круге она фигово начинает путь искать, болтается туда-сюда. Но до конца второго так и не доходит, сворачивает примерно на середине левого вертикального отрезка пути направо, в газон, после чего экран мигает синим и машинка пропадает. Зелёной машинкой можно кататься дальше.
Цитата (Amri)
на разных машинах с разными выпусками окошек
Windows 8 Pro WMC x64. Полёт нормальный.
Цитата (Amri)
Intersects - функция проверки пересечений
Может быть, там есть какие-то другие функции? Или возможность задать непрямоугольную форму модели коллизий. Могу часть своего кода (Pascal/Delphi) показать, правда, там всё запутанно и я сам там уже давно запутался. Я там использую классы, но коряво алгоритм инкапсулировал, надо бы переписать...
Цитата (Amri)
Здравое замечание biggrin сделаю cool
И ещё задний ход сделай. С учётом столкновений придётся иногда отъезжать назад.
Да. На втором круге она фигово начинает путь искать, болтается туда-сюда. Но до конца второго так и не доходит, сворачивает примерно на середине левого вертикального отрезка пути направо, в газон, после чего экран мигает синим и машинка пропадает.
"Большой взрыв", продукт небольшого недовольства (задолбало )
Цитата (TimKruz)
Windows 8 Pro WMC x64. Полёт нормальный.
это радует, ибо у мну Windows 7 Home Basic x32
Цитата (TimKruz)
Может быть, там есть какие-то другие функции? Или возможность задать непрямоугольную форму модели коллизий.
вроде, форма задается при создании прямоугольника, ибо интерсетс - это только проверка. Там есть три типа ограничивающих линий : BoundindBox - прямоугольник, но он трехмерный, точнее они все трехмерные BoundingSphere - по идее это сфера, но применить не получилось, ибо требует тело (хз) BoundingFrustum - какая-то фигня, вот что в справке пишут
Цитата
Public Constructors Name Description BoundingFrustum Creates a new instance of BoundingFrustum.
Public Fields Name Description CornerCount Specifies the total number of corners (8) in the BoundingFrustum.
Public Properties Name Description Bottom Gets the bottom plane of the BoundingFrustum. Far Gets the far plane of the BoundingFrustum. Left Gets the left plane of the BoundingFrustum. Matrix Gets or sets the Matrix that describes this bounding frustum. Near Gets the near plane of the BoundingFrustum. Right Gets the right plane of the BoundingFrustum. Top Gets the top plane of the BoundingFrustum.
Public Methods Name Description Contains Overloaded. Checks whether the current BoundingFrustum contains a specified bounding volume. Equals Overloaded. Determines whether two instances of BoundingFrustum are equal. GetCorners Overloaded. Gets an array of points that make up the corners of the BoundingFrustum. GetHashCode Gets the hash code for this instance. GetType (Inherited from Object.) Intersects Overloaded. Checks whether the current BoundingFrustum intersects a specified volume. op_Equality Determines whether two instances of BoundingFrustum are equal. op_Inequality Determines whether two instances of BoundingFrustum are not equal. ToString Returns a String that represents the current BoundingFrustum.
Protected Methods Name Description Finalize (Inherited from Object.) MemberwiseClone (Inherited from Object.)
Цитата (TimKruz)
Могу часть своего кода (Pascal/Delphi) показать, правда, там всё запутанно и я сам там уже давно запутался.
думаю, не разберусь. Не знаю их, даже не видел
Цитата (TimKruz)
И ещё задний ход сделай. С учётом столкновений придётся иногда отъезжать назад.
сделаю. Раньше не получалось, но появилась одна мыслишка, надо проверить.
Это же пирамида усечённая. У тебя все колизии по боксам считаются? Лучше бы после колизии с боксом дополнительно попиксельные считать. Примеров и туторов море :)
Благодарю новые фишки я еще не ввожу. Принцип такой - сначала все основное, а фишки потом. Попробую и попиксельные. Отпишусь и покажу, что получится. Сегодня не могу попробовать, ибо на работе
Добавлено (22.03.2013, 21:58) --------------------------------------------- Делал сегодня задний ход, и каким-то трансцендентальным способом получил ускорение. Походу ускорение было из-за того, что все считалось через отрицательные числа. Сейчас уже все нормально. Вроде, ускорения не заметно. А то получилось что задняя скорость выше, чем самая высшая передняя. Интересно, почему так. Вот тот код:
Код
if (isZH) {
velocityZH = new Vector2((float)Math.Cos(rotation)*(-1), (float)Math.Sin(rotation)*(-1)); speed = 1;
if (speed == 1) { if (dxzh <= 0) dxzh -= 0.1f; } spritePosition -= velocityZH * dxzh ; }
IszZH - это булева переменная, отвечающая за заднюю скорость (включена/выключена), velocityZH - скорость заднего хода, dxzh - перемещение за игровой цикл (смещение относительно игрового поля), spritePosition - позиция спрайта на экране.
Amri, Посмотрел исходник "0.12 альфа" Теперь я знаю, откуда баги у тебя берутся Программирование - точно не твоё. Без обид, но твой код изрядно доставил. Вcем зла.
Сообщение отредактировал Undead - Пятница, 22 Марта 2013, 23:19
Undead, не переходить же мне в самом деле на ГМ? Это слишком жестоко.
Добавлено (23.03.2013, 04:49) --------------------------------------------- Закон Amri : если он что-то реализовал в коде, то можно со 100% вероятностью заявить, что можно сделать проще.
Добавлено (23.03.2013, 07:16) --------------------------------------------- Да и по барабану особо как то.
Добавлено (23.03.2013, 07:17) --------------------------------------------- Хотя, по гуглу все правильно - Race on the machines = Гонки на машинах. Что не так?
Напиши для хранения уровней отдельный класс с иерархической структурой. Вещи вроде
Код
static int ScrollX; static int ScrollY;
Заменяй на
Код
Vector2 Scroll;
Исрользуй Switch,и. Десяток if,ов - это ужасно. Напиши отдельный класс для проверки столкновений. Добавь к объектам уровня событие Collision и при столкновении вызывай. Удобнее будет. Написание игры на XNA == написание своего движка. Xna по сути врапер для dx, хоть и довольно высокоуровневый.
Добавлено (23.03.2013, 16:00) --------------------------------------------- И всё таки лучше бы для физики взять сторонний двиг, тот же Farseer Physics. А ещё лучше бы использовать xen. Вcем зла.
Сообщение отредактировал Undead - Суббота, 23 Марта 2013, 16:02
я не понимаю, вы настолько .... как бы так помягче... недалеки, что верите в то, что какая-то машина может знать русский язык? Вернее не так. Машина не может. В машину закладывают перевод люди. фактор первый: люди, которые закладывали в машину перевод - не являются носителями русского языка. Следовательно не носители русского языка не могут перевести правильно текст, на 100% или около того. Если считать 3 слова текста = 100%, то выходит 1 слово примерно 33%. Т.е. во фразе "гонки на машинах" как минимум одно слово уже будет неверным. Ну это ладно. Шанс уменьшается, если мы будем иметь ввиду остальные факторы, которые могут повлиять на перевод фразы. К примеру: фактор второй: в гугле не дураки сидят, приглашают русскоязычных переводчиков, НО рус яз - сложный язык, не романской группы. Это не французский или немецкий, который практически схожи с английским. И к тому эе это синтетический язык, он отличается словообразованием и много чем другим. Поэтому нельзя наложить одну фразу из русского на перевод английского, они никогда не лягут ровно друг на друга. как две матрицы разного размера не перемножатся. и часто переводить приходится не слово в слово, а просто смысл фразы. поэтому ваш аргумент, что мол "гугол знает как правильно", мной вообще не воспринимается как доказательство. и много много мнонго много других факторов которые снижают вероятность того перевода к малому проценту. вплоть до того, что Вы явно не являетесь лингвистом переводчиком или у вас есть друзья такие, ваш возраст (согласитесь, что какой-нибудь школьник не может знать предмет на уровне преподавания вуза, хотя бывают исключения), но всё же мы учитыаем и эти факторы так же. Всему виной теория вероятности, мой друг. написал много. прям сюжет для новой игры. только не забудьте меня как автора указать, если что.
вы настолько .... как бы так помягче... недалеки, что верите в то, что какая-то машина может знать русский язык?
словари тоже не знают русский язык. А я рассматриваю гугл именно как словарь, и не более.
Цитата (woof)
Т.е. во фразе "гонки на машинах" как минимум одно слово уже будет неверным. Ну это ладно. Шанс уменьшается, если мы будем иметь ввиду остальные факторы, которые могут повлиять на перевод фразы.
Короче, вот точный перевод названия "Гонки на машинах" с помощью словаря и ручки Weitrennen in Autos. Точный, нормальный перевод. Но, woof, да не стоит рассуждать так серьезно относитесь ко всему с известной долей несерьезности. А вообще, в самом первоначальном варианте не было никаких машин, а были только стрелки было Race Arrows.
Напиши для хранения уровней отдельный класс с иерархической структурой.
да я так и хотел. Сначала все в одном сделать, а потом раскидать по классам. Но, хотя, по классам будет намного удобнее.
Цитата (Undead)
Напиши отдельный класс для проверки столкновений.
Ты абсолютно прав.
Слушай, а задний ход нормально работает? И обьясни пожалуйста, почему при отрицательных значениях, ну короче в в этом кусочке
Код
if (isZH) {
velocityZH = new Vector2((float)Math.Cos(rotation)*(-1), (float)Math.Sin(rotation)*(-1)); speed = 1;
if (speed == 1) { if (dxzh <= 0) dxzh -= 0.1f; } spritePosition -= velocityZH * dxzh ; }
ну откуда тут постоянное увеличение скорости? Потому что, если я пойму, откуда берется, я добавлю возможностей в управление - сделаю кнопку газа. Можно расширить управление - (кстати, сейчас , именно в самой последней, управление дублировано на WASD, переключение передач перенесено на F) - основные кнопки есть (вперед, назад, влево, вправо). Кнопка переключения передач уже есть, и добавить сцепление (только в связке с коробкой, что бы скорость переключить), и газ. Как думаешь, норм будет, и так себе?