Давайте сделаем игру на as3
Создал новую рубрику на блоге — as3.
И сразу-же предлагаю поучаствовать в создании игры.
Знания as3 не требуются. Требуется только желание создавать графику для игры (юниты и тп).
Создавать нужно по определённым правилам, иначе толку в создании нет никакого.
Юниты, графику можете рисовать где угодно, но юнит должен быть мувиком в flash’е. В флэше разобраться не трудно. Полный нуб за один час, научится создавать мувики.
В случае монетизации игры доход будет 80 на 20 (20 ваши).
Для первый игры я выбрал весьма сложную пассивную стратегию на тему защиты базы.
Писать я её буду долго, и нудно.
Юниты в ней маленькие и простые, но думаю их будет много. Самое важное — это соблюдать правила. Если кто согласится, то будет пост на тему правил. Писать тут, в комменты.
Хотите вы или нет, а я уже начал.
ты бы сделал анонс этого поста где-нибудь на форумах и т.п
На форумах народу много, но они обычно не способны ни на что кроме развода срача друг с другом.
А так мало ли кто из читателей. В любом случае я могу сделать и один.
Всегда мечтал. Только нифига не знаю по as3 =) А вообще было бы круто если бы ты, делая игру, делился каждым этапом… Ну или даже чаще, типа туториала 🙂
Я не понял, так ты будешь рисовать юниты?
Сори, нет… Не люблю и не умею ) Просто хотелось бы в части кодинга почерпнуть инфы, я об этом.
А что тут подчёркивать? Мои знания взяты из случайных мест. Что-то со справки от адоба, что-то с форумов. В принципе, для создания первой игры тебе хватит справки адоба.
Делая по ней будет простенькая игрушка.
Пускай объекты в ней будут чистыми мувиклипами.
Самое сложное — это заставить себя что-либо делать, открыть справку для начала, особенно зная, что готового результата может и не быть даже через месяц.
Если хочешь подчеркнуть инфы, могу придумать простое задание на as3 — по нему потренируешься. Требуются базовые знания программирования и умение гуглить. Задание будет специально под gamedev.
Вот в этом есть смысл.
«подчеркнуть инфы»
Эм… Я писал почерпнуть, ну не суть 🙂
По поводу остального — да, согласен. Лень к несчастью 🙂 По справке — вообще беда как лазить не люблю. В основном стараюсь лезть в неё уже имея неплохие знания в чём-то. Предпочитаю «специализированные» (охватывающие узкие вопросы) туториалы 🙂 По поводу задания — не откажусь, т.к. тебе уже виднее какое будет простое 🙂
А по поводу справки ты зря.
У адоба, как и у пхп богатая справка на сайте.
У адоба даже кое-чем лучше.
Хорошо.
Перед тем как выполнять.
В флеше есть два стиля кодинга — первый код пишется на таймлайне.
Второй тип — весь код идёт в файлах. На таймлане нету, ну или почти.
Можешь пока использовать первый тип тк сэкономишь время.
Вот задание:
1) Создай мувиклип- например нарисуй внутри квадрат.
2) используя код расплоди квадрат. То-есть сделай чтобы при запуске ролика было штук 20 рандомно.
3) Поверни все квадраты одновременно со скоростью один градус (не важно по часовой или против).
Используя гугл выполни всё что я написал. Если какое-то слово непонятно — гугл!
Важно именно используя код а не просто нарисовать 20 штук!
Мда, что-то пока что никак не получается «клонировать» MovieClip. Создать смог, вращение добавил, но копии сделать не понимаю пока что как. Например с помощью кода создать много квадратов с одинаковыми параметрами я смог, но именно создать, а не копировать…
Покажи код.
чтобы вставить код в коммент пиши
code lang=»as3″ [/code]
code lang=язык в квадратных скобках. Язык в двойных кавычках.
P.S. Очень сомневаюсь что у меня тут всё по правилам. Поправь меня, ибо я чувствую что наморозил ерунды местами.
В принципе ты сделал всё верно. Только я бы не рисовал квадрат кодом. Это весьма геморно!
Только представь если бы ты рисовал каждый юнит кодом!
Я бы сделал мувиклип, задал ему linkage и расплодил бы его экземпляры.
Хорошо вторая чать:
1) Сделай так чтобы квадраты двигались рандомно по событию энтерфрейм.
2) Вращать квадраты больше не нужно,теперь проверь их на столкновение!
Если квадраты столкнуться сделай trace(«столкновение»);
Важно чтоб ты научился делать именно мувиклипы с linkage.
Линкэйдж сделать просто. Нажми правой кнопкой на мувиклип — дальше пропертис -дальше export to actionscript. Дальше там где класс введи имя. Теперь используя это имя мувиклип доступен в коде и с ним можно работать.
Спасибо огромное! По поводу рисования кодом — это я понимаю, поэтому и пытался как-то использовать мувиклип. Собственно использовать то я и смог, только размножить не мог, но теперь кажется понял. По поводу столкновений — ожидал и побаивался, но счас возьмусь и посмотрим так ли всё страшно 🙂
По поводу столкновений:
Нарисуй на бумаге 2 прямоугольника.
Докажи сталкиваются они или нет.
На всякий случай напишу что стороны разных квадратов перпендикулярны.
Квадраты не лежат под острыми углами друг к другу.
Вот блин… Если б не увидел этот пост то подумал бы что не стоит заморачиваться… Просто я сначала хотел создать функцию просчёта столкновений, но неожиданно понял что умные дядьки за меня всё уже сделали, увидя hitTestObject(). Пожалуй для общего развития мне неплохо бы самому попробовать написать подобную функцию… Но пока что счас покажу код, который у меня получился с вышеуказанной функцией…
Функция col_check должна была быть функцией просчёта собственно, но я решил оставить её для наглядности и, возможно, попытки написания её позже. Скажи плиз, правильно ли я её объявил (или как это тут называется) и вызвал?
Блин, походу теги не прально написал… сори, удали этот пост если хочешь.
Кстати, я не уверен (в принципе можно проверить, но я пока что не проверял), но похоже hitTestObject() просчитывает столкновения не контейнеров, а попиксельно 0_0 Ну типа в зависимости от альфа-канала… Хотя не знаю, мне это воспоминания о DirectDraw навеяли
Собственно
1) сделай не хиттестом, а просто условием
2) у тебя проверяются все мувиклипы со всеми. Это не экономно.
Оптимизируй его. Проверяй близлежащие.
Хиттест это самое медленное что есть.
По поводу то го правильно ли ты объявил:
Сойдёт, я обычно делаю так:
По поводу второго пункта не согласен, т.к. во втором цикле for у меня идёт отталкивание от последнего проверенного объекта в первом цикле for и количество сверяемых объектов постоянно уменьшается, но может я не прав, сообщи плиз.
Остальное вот так придумал:
Готов быть забросан гнилыми помидорами 🙂
У тебя функция проверки столкновения не оптимизирована до конца.
Можно ещё.
И все равно у тебя проверяются все мувиклипы, или почти все.
У тебя простой двойной цикл. И мне вообще кажется что он будет неправильно работать.
Давай выясним. Сделай следующее:
1) оптимизируй функцию col_check.
2) теперь наш квадрат будет состоять из двух кадров, если есть столкновение — кадр2 — если нету 1. Сделай так чтобы квадрат во втором кадре отличался от первого.
3)Я тогда не заметил но, в твоей работе квадраты не двигаются, а тупо меняют местоположение. Сделай чтобы они двигались нормально. Не очень быстро и не очень медленно. Чтобы движение было визуальным.
Попробуй использовать. Давно писал движение квадратов.
Заметил что ты в col_check Math.abs. Не понимаю зачем. У нас ведь прямоугольные столкновения.
По-моему в col_check тебе нечего оптимизировать.
Как напишешь кину свою версию прямоугольных столкновений. Или если хочешь можешь сам подумать.
Ок, всё прочёл — завтра буду разбираться.
По поводу 2 вариантов квадратов… Это в смысле если 2 квадрата сталкиваются то оба меняют цвет (например)? Если 3 то все три меняют и т.д.? Или какой-то один квадрат будет «главным» и менять цвет будет только он при столкновении с остальными?
Если квадрат сталкивается с другим — оба меняют цвет. Если сталкиваются 3 — они все меняют.
Все что сталкиваются — те меняют.
Закончилось столкновение — стали прежними.
Это проще чем тебе кажется.
Ды ёлы-палы, ну я тупой ваще… Никак не могу сообразить как поменять мувиклип… Короче я у тебя спрошу кое-что, надеюсь подскажешь, а потом я ещё подумаю. Вот скажи, правильно ли я рассуждаю: я создал новый мувиклип, отличный от первого. Если происходит столкновение — столкнувшиеся мувиклипы типа 1 нужно заменить на мувиклипы типа 2, если столкновения больше нет — нужно заменить мувиклипы 2 на мувиклипы 1. Это правильно? Если да, то я никак не въеду как в ячейке массива заменить один мувиклип на другой… Линкейдж создан у обоих, он разный… Как его использовать в этом случае… хм. У меня одна идея: создать ещё один массив с мувиклипами 2, но это как-то неправильно, я думаю… Может как-то подскажешь?
Приехали. То ли я не выспался, то ли что-то ещё, но почему простой код…
…у меня повторяется бесконечное кол-во раз? Я думал что если это не слушатель события ENTER_FRAME то выполниться он должен 1 раз… Какая-то беда началась: вдруг начал бесконечно повторяться весь код, а не только слушатель события ENTER_FRAME и начали бесконечно плодиться мувиклипы пипец… С чем это может быть связано?
Есть мувик квадрат. В нём 2 кадра. 1 — обычное состояние. 2 — при столкновении.
При столкновении делаем kvadrat.gotoAndStop(2);Ну или типа того. Невнимательно читаешь задание.
Опа… Так это двумя кадрами решается… Слушай, забегаю вперёд, а в завершённой игре обязательно будет больше одного кадра? Никак нельзя сделать всё на одном?
Не путай понятия:
есть сцена — на ней есть кадры.
В игре на сцене может быть один кадр.
Есть мувиклипы, мувиклипы тоже имеют кадры.
Научись работать с кадрами.
Да, проблема в том что я до сих пор нормально не определил для себя что есть что и как это между собой взаимодействует. Вот ещё один вопрос возник, но его я задам после того как допишу и покажу новый код. Кстати ты продвигаешься по созданию игры?
По части кодинга, да. Нет таких вещей которых я не могу сделать.
По части анимации всё очень печально.((((
Радует то что меня консультирует человек, уверенный в своих знаниях кодинга 🙂 Да блин, рисование и дизайн у меня тоже на ужасном уровне… Как и кодинг 🙂 Чё собсна зашёл… Зашёл сообщить что у меня опять завал какои-то образовался. Движение я реализовал зашибись, теперь квадраты движутся плавно, но началась какая-то жесть со столкновениями… С их просчётом. Ох… даж не знаю с чего начать… В общем, во-первых хотел узнать у тебя о твоём цикле перебора, он у тебя не из 2 for, как я понимаю? Вопрос в том постоянное ли количество перебираемых объектов в твоём варианте цикла, если общее количество объектов сцены неизменно? То есть, например, для 5 объектов количество проверок (вызовов функции проверки) будет всегда одинаковым, или от чего-то зависящим? …Пока писал это — появилась идея, сча проверю и отпишусь дальше…
Тьфу ты… Пол дня провозился с ошибкой просчёта, а всё оказалось опять из-за моего непонимания кадров и с ними связанного… Блин, с этим надо что-то делать. Смотри, вот у меня проблема такая: код лежит в первом кадре в отдельном слое (layer’е), первый вариант квадрата (без столкновений) — во втором кадре второго слоя, второй вариант квадрата лежит в третьем кадре второго слоя… Короче куча проблем с этого места. Во-первых возможно ли всё заставить работать как в твоём задании требуется при такой расстановке объектов? Например у меня такие проблемы возникают: если я нарисовал квадрат в том же кадре что и код (независимо от слоя) — этот квадрат получается родителем для копий и дальше в коде я управляю копиями, но не этим квадратом-родителем и он остаётся висеть на сцене в том месте месте где я его нарисовал. Я этого избежал размещением кода и квадрата в разных кадрах… Дальше. При использовании gotoAndStop(), если я перехожу в кадр, отличный от кадра, в котором лежит код — начинаются какие-то проблемы с логикой работы кода… В общем я не знаю как мне разобраться с тем что где и как правильно распологать 🙁
Располагать так: на сцене ничего нет. Только код.
В библиотеке есть мувиклип квадрат с двумя кадрами.
http://govnoproger.ru/wp-content/uploads/kv.zip
Держи заготовку. Сэкономит время. Открывать в flash cs5.
Спасибо!!![!]
P.S. Да, а что насчёт моего вопроса по циклу выбора сверяемых объектов?
«хотел узнать у тебя о твоём цикле перебора, он у тебя не из 2 for, как я понимаю? Вопрос в том постоянное ли количество перебираемых объектов в твоём варианте цикла, если общее количество объектов сцены неизменно? То есть, например, для 5 объектов количество проверок (вызовов функции проверки) будет всегда одинаковым, или от чего-то зависящим?»
По поводу проверок я уже говорил, проверяй близлежащие квадраты.
Количество проверок в этом случае будет всегда разным.
Кароче как напишешь так и будет.
В сообщении 2011.07.07 я написал что у меня два фор в цикле.
Хыхы, оказалось что я как раз перед тем как скачал твой вариант сделал у себя точно так же, ну отлично, теперь я наконец уверен что это правильно. Но… 🙂 Короче всё гладко, кроме смены цвета у 2 квадратов… Меняет почему-то либо 2, либо 2… Пока не понял от чего зависит, но буду дальше разбираться…
Ой ё-моё, когда (если) я добьюсь наконец требуемого результата, то сниму штаны и буду бегать по квартире с криками «аллилуйа»!.. )
* То есть либо 1, либо 2, ну ты понял )
Обрати внимание:
В примере я написал мувиклипу gotoandstop, если бы я этого не написал, мувиклип бы бесконечно проигрывался.
Ммм! Окей! Я на это уже обратил внимание, спс
Ооо… Не может быть… Похоже это свершилось: http://gamesfirst.xirad.ru/dvizh_kvadraty.swf
Ага, а проверяешь близлежащие?
Кстати сделал бы себе блог.
Про блог — это интересная мысль ) Только я подумал мб лучше было бы подучиться сначала побольше 🙂 По поводу близлежащих — нет 🙁 Пока что нет… А там посмотрим, в зависимости от сложностей будущих задач 🙂 Кстати спасибо огромное за пример того как ты вызываешь и объявляешь функции — теперь так и делаю (передаю и обрабатываю объекты, где это возможно), сегодня кое-что в планах ещё проверить и возможно будет вопросик… А, и объявление переменных одинакового типа через запятую — тоже интересно, не знал что так можно 🙂 И ещё если тело условия короткое — пишу строчкой, а не в скобках, в принципе об этом можно было догадаться, но всё равно спасибо и за этот пример ))
А что дальше? Какое задание дашь?
Ну задание на этот раз такое — завести блог.
Это нужно чтобы лучше запомнить в памяти.
Просто пиши всё, что ты делал.
Далее зарегай домен, пускай с доменом будет. Домен ру стоит 89 руб. Можно и дешевле.
Я так и не услышал ты делал проверку близлежащих объектов или проверяешь все?
А вижу не делал близлежащих. Вот это и советую сделать.
Ну не знаю, если создавать блог только ради того чтоб не забыть что и куда, то хз стоит ли, можно обойтись и личным дневником (локальным) 🙂 Если честно то никогда не регал доменов, так что даже не знаю куда идти и что для этого делать 🙂
А по поводу проверок… У тебя получается что на столкновения проверяются все, но не со всеми, так? То есть для каждого юнита будет проведена проверка, но не с каждым? Блин, надо подумать… Кстати если объектов мало то такую «продвинутую» проверку всё равно выгоднее делать?
* не регал доменов второго (или какой это site.ru) уровня
Да, кстати, получается что всё равно придётся высчитать расстояние между каждым… Или нет? Посто может проще вызывать функцию проверки столкновний (если она конечно не с точностью до пикселя), чем каждый раз проверять расстояние до каждого объекта. Я не знаю, видимо если я к такому выводу прихожу, то наверное неправильно представляю способ определения какие из объектов рядом, а какие нет..
Я чуть позже покаху свой «оптимизированный» код проверки столкновений…
* покажу
P.S. нет, ну я конечно понимаю что блог не только для себя делают 😉 но всё же мне на данный момент без него как-то получше.
Оч важный вопрос: в твоём варианте проверки число «прокруток» циклов постоянно, а число вызовов функции проверки столкновений переменно, или же даже число повторений циклов переменно? (в связи с искуственным изменением в теле цикла значения переменной-счётчика цикла)
Число прокруток постоянно, а число проверок переменно.
Даже если пять квадратов выгоднее делать эту проверку.
Отлично.
Хм, так и не получилось. Вопрос: как правильно создать метод? А конкретнее — у меня сейчас рандомное движение обычной функцией создано, а я хочу «проапгрейдить» её до метода. Вроде как твой пример рандомного движения (он же является методом?). Если я просто вставляю public blablabla в код — на меня ругаются, говоря что должно быть в пакете — создаю package Neme { public blablabla … — говорит что пакет, мол, не ожидается… в чём дело?
Наткнулся на вариант создания этого дела во внешнем *.as файле… Пока не проверил этот вариант, но если так можно, то можно ли в самом основном коде создать метод?
Справку адоба посмотри.
Я ответить могу, но мой ответ эквивалентен справке.
По поводу блога:
Ну я тоже года 3 назад так считал. Сейчас я жалею об этом.
По поводу доменов — просто регай где дешевле и всё.
Ты спросил про метод. Это говорит о том что ты не знаком с концепцией ооп.
Метод это функция в классе. Все больше ничего. Я крайне рекомендую тебе не сыпать терминологией.
Да, с ооп я дело имею впервые 🙂
Всё же не придумал как мне оптимизировать проверку. В моей функции проверки и так основу составляет проверка расстояния между объектами… Вычисляется расстояние, меньше которого будет считаться столкновение и затем само расстояние между объектами и собственно условием проверяется меньше ли это расстояние… Подумав как можно избавиться от выполнения этой функции — я написал практически такую же функцию для избавления от неё же )) Короче для меня тут тупик, не могу придумать…
В принципе это вообще можно одним условием записать… Мб это даже чуток быстрее будет?
…и даже вне функции 🙂
Начнём с того что у тебя всего один выход. Всё выполняется полностью и всегда.
Два квадрата в разных углах экрана будут проверяться на столкновения.
Хотя ты должен избежать этого.
Если объект не рядом тогда не нужно с ним проверять.
перейди к следующему объекту используя continue;
Твой алгоритм столкновений сам по себе не самый лучший. Но ладно.
Я вот ещё думаю — оптимизация это конечно круто и обязательно при создании конечного приложения, но при осваивании программирования мне кажется это больше топтание на месте. Как считаешь? Или стоит долюить до посинения? )))
Ну собственно что мешает проверить самому? сделай дофига квадратов и смотри как начнёт тормозить. Думаю 50 квадратов предел для этого алгоритма.
* долбить
…не хватает функции редактирования 🙂
Так я не спорю что алгоритм дерьмо и с ним далеко не уплывёшь, просто заменить его недолго (ну придумать дольше, но это скорее матиматика), но от этого по части кодинга я нового не узнаю, имхо… Я думаю так )
* математика
пля = )
Возьми проверь ради интереса.
Ок, сча
При 50 фпс держится, при сотне падает где-то на половину.
Ну вот, твоя игрушка просела на половину при 50 пульках.
Кстати если вынести это дело из функции прямо в код, просто условием — при 100 объектах фпс ещё держится 🙂 Но это конечно не повод забить на оптимизацию. Если можно сделать лучше — то нужно сделать лучше, я понимаю.
Math.abs() быстрая функция? Ты её в циклах проверки столкновений не используешь?
Нет, не использую вообще.
Правильно ли я понимаю: в Name.x и Name.y — Name является классом, а «x» и «y» его своиствами? И при обращении к ним мы просто считываем значение переменной? (то есть не происходит дополнительных вычислений при обращении?)
В твоём случае верно.
У тебя в самой функции проверки м.б. ещё и не используются координаты для проверки столкновения?
Они всегда используются.
Ну хоть так… В общем… Покажешь свой вариант проверки? )
Я тут ошибку нашёл в своей старой функции, так что выкладывать не буду.
Если хочешь, то могу только теорию.
Я тогда не заметил — но в нём есть вероятность что столкновение не будет если 1 прямоугольник в другом.
Хотя так он в принципе работает.
Да, давай теорию
Погоди пока, я пытаюсь исправить)
Ну вот по-моему я исправил этот баг.
При сравнении выяснилось что как я не старался — моя функция работает медленнее чем твоя.
Толку в ней ноль.
Вот твоя функция немного изменённая
То есть после исправления она стала медленнее, да? Прежний вариант был быстрее?
Кстати я такой вариант своей функции тоже рассматривал, но потом почему-то передумал её корректировать, хотя понимаю что так она иногда быстрее будет выполняться.
Вот какой вопрос у меня возник: при создании полноценной игры удобнее использовать несколько кадров для размещения кода, или же весь код в одном кадре? Я прикинул и уже начиная с первого шага, первое что обычно видит игрок — экран меню. Я подумал что его просто сделать в отдельном кадре, а далее, допустим первый уровень — в другом. Что ты на это скажешь? Какое лично твоё мнение?
Здорово снова. Твоя функция работает не верно.
Она не всегда срабатывает.
Обращай внимания на синий квадрат в самом низу.
Собственно как я проверял:
Смещал квадраты по клику мыши. Рекомендую этот способ.
Кстати он показал что мой метод никогда не ошибается.
В кадрах код не пишут. Пока не парься по этому поводу.
мой способ
govnoproger.ru/wp-content/uploads/MYcol.swf
твой
govnoproger.ru/wp-content/uploads/YOURcol.swf
Чтобы сдвинуть квадраты кликни мышкой.
Ну-ка ну-ка… (полез в код смотреть)
А кстати, не подскажешь как мне включить подсказки при написании функций и т.п., у меня до этого flash показывал все аргументы для внутренних функций, а теперь нет
Я даже знаю почему не верно.
Столкновения сделаны по окружности. Они и не будут работать.
Насчёт подсказок хз.
Логично, но у меня вроде почему-то работает: http://gamesfirst.xirad.ru/test.swf …или нет? Я не заметил отклонений по крайней мере
…по нажатию любой клавиши на клаве…
Короче говоря вот тут всё видно govnoproger.ru/wp-content/uploads/YOURcol.swf
Делай больше квадратов, и размеры делай как у меня- кривые, тонкие и толстые.
Функция не может верно работать, у прямоугольников радиусы не равны как у кругов.
Могу предположить что этот код ты откуда-то взял.
Нет, к этому коду проверки я сам пришёл. Счас ещё буду медитировать 🙂
Вот очень наглядно: http://gamesfirst.xirad.ru/test_2.swf
Снова по нажатию клавиши на клаве…
Тьфу ты… Ну вот я собственно и понял почему я не вложил одно условие в другое 🙂
Потому что тогда функция работает как раз и неправильно 🙂 Ты попробуй мой вариант проанализировать — результаты будут разные.
Наверное… Короче я уже запутался, но у меня функция вычисляет не по радиусу… Кажется 🙂 Я честно просто уже думать не могу, голова болит
В выложенной мной флехе как раз твой вариант, без изменений!
Кстати код совершенно одинаков в плане алгоритма — просто добавлена точка выхода, и на проверку это повлиять не могло.
Твоя проверка она абсолютно не логична для прямоугольников! Ты можешь словами объяснить почему ты так делал?
Можешь на форуме flasher.ru тему создать.
Ты бы вместо бессмысленных утверждений просто посмотрел govnoproger.ru/wp-content/uploads/YOURcol.swf
в каких случаях не работает. Запомнил бы ширину, размеры.
Я смотрел govnoproger.ru/wp-content/uploads/YOURcol.swf и у меня нет идей почему так. Я свои бессмысленные утверждения выдвигаю потому что у меня, как мне кажется, всё работает. И да, я вижу что у тебя с моей функцией не всё работает правильно и похоже что рассчёт идёт по радиусу.
«Твоя проверка она абсолютно не логична для прямоугольников! Ты можешь словами объяснить почему ты так делал?»
Да, могу. Я отвечаю что не взял готовую функцию, а рисовал сначала всё на бумаге чтобы вычислить условие столкновения. Рассуждал я так: для определения столкновения нам нужно чтобы прямоугольники находились на расстояниях, по осям (причём обязательно бо обеим одновременно) меньше каких-то. Меньше каких? Вычисляем: по оси X меньше чем половина ширины одного прямоугольника (так как точка координат лежит в центре прямоугольника) плюс половина ширины второго прямоугольника. Теперь это значение есть расстояние столкновения по оси X. Теперь узнаем каково текущее расстояние по оси X между прямоугольниками, этим значением будет модуль разности текущих координат прямоугольников по оси Х. Аналогично проводим вычисления и проверку по оси Y. Теперь если после первого вычисления мы выяснили что расстояние меньше или равно расстоянию столкновения — проверяем такой ли результат и у вторых вычислений, если да — столкновение есть.
Почему нужно проверять по обеим осям? Даже если нарисовать на бумаге — ответ станет ясен: при определении столкновения по одной из осей и по второй столкновения нет, то визуально это быдет выглядеть как прямоугольники, находяшиеся приблизительно на одном уровне по оси, на которой определено пересечение и не находящиеся на одном уровне по другой оси, что не соответствует видимому столкновению и мы его собственно не видим.
На держи координаты:
Якобы он показывает что они сталкиваются, хотя на самом деле нет.
Читать так
x,width,y,height
294.5 —- 24 —- 94.05 —- 15.9
291.55 —- 41.9 —- 119.6 —- 39.3
Подставим
if ((((24+41.9)/2) >= Math.abs(294.5 — 291.55)) && (((94.05 + 119.6)/2) >= Math.abs(15.9 — 39.3)))
32,95>=2,95 && 52,825>= Math.abs(-23)
Удовлетвориться?
Удовлетвориться. Столкновение будет, хотя если нарисуешь то не будет.
Да и без рисования видно: у нас первый прямоуг, его высота 15,9 при этом его y равен 94.05
считаем y нижней стороны 15,9+94.5
посчитали 110,4
а у второго прямоугольника y 119.6
Они не могут пересекаться. Он лежит ниже первого квадрата, это невозможно.
Вот так вот.
вот они красные

Ух ё, ну и войны идут… Счас буду разбираться в том, чем ты мне по голове ударил )
Ты не всё предусмотрел!
Хочешь верь, а хочешь — нет, но: http://gamesfirst.xirad.ru/test_4.swf
Код этого:
По всей видимости этот же код у тебя выведет прямоугольники иначе. Я уже понял в чём дело, а ты? 🙂 Кстати я этот момент написал в своём «словесном» описании рассчёта столкновений.
P.S. Можешь меня забанить, но я настаиваю на том, что это функция рассчёта столкновений не для круглых объектов.
У тебя один квадрат синий
Так это я специально чтоб показать что он слегка даже залазит на второй (тут нет просчёта столкновений, ВЕСЬ код этого — выше). Цвета из-за разных gotoAndStop.
Вот сейчас я нихрена не понимаю
Цитирую себя:
«Вычисляем: по оси X меньше чем половина ширины одного прямоугольника (так как точка координат лежит в центре прямоугольника)»
Точка координат лежит в центре прямоугольника 😉 Вот моя догадка. Проверь
вот сейчас до меня дошло. У тебя координата сдвинута.
Всё вот теперь я уверен что вроде-бы работает.
И это хорошо. Не придётся использовать мой метод.
Я думаю напишу пост про столкновения. Твой метод мне понравился он очень быстрый, но в нём сдвинута координата.
Следующее задание — перепиши всё в классы.
Я настаиваю чтоб ты завёл блог.
Цена домена 90 руб в год!
🙂 Эх, всё хорошо что хорошо кончается… А знаешь какой плюс всего этого? Из-за споров, чтоб доказать что моя функция рассчёта столкновений прямоугольников не является функцией рассчёта столкновений объектов круглой формы я вывел функцию столкновений круглых объектов 🙂
Вот пример её работы: http://gamesfirst.xirad.ru/test_5.swf
Вот код этого примера:
Переменные dlina_1 и dlina_2 введены для наглядности
(Круг двигать мышкой) 😉
Ну, кружочками интернет не удивишь. В нём итак ими всё завалено.
Поэтому я и предположил что ты его взял от туда.
А алгоритма проверки прямоугольников либо нету, либо хрен найдёшь, либо хиттест.
0_0 Ого, даже так. Я пытался найти альтернативу своему алгоритму, но не нашёл вообще ничего, хотя честно говоря не сильно старался найти… Ладно. Блин, классы говоришь… Ох ё… Придётся поломать голову немного… Но это завтра.
Оу, ничего себе, счас разбираюсь как бы мне «правильнее» создать классы и понял что походу это сделает всё проще чем я предполагал. Я конечно догадываюсь что в этом и суть ооп (упрощение программирования), но всё похоже ещё круче чем я предполагал 🙂 Осталось только сделать 100 ошибок на пути к правильному созданию классов 🙂
Допустим я понял как переложить в классы, но я не понял что перекладывать… Я догадываюсь что можно например тупо весь код переложить в класс (в этом кстати есть вообще смысл?) , часть кода и функцию проверки, часть кода, фукцию проверки и прямоугольники (по отдельным классам)… Ладно, допустим для начала я хочу сделать класс прямоугольников (у меня есть идея добавить некоторые свойства), но вроде этот класс же уже создан при создании объекта в библиотеке? 0_о И кстати мне уже несколько раз приходил в голову вопрос можно ли с нуля создать сам класс как он создаётся при создании мувиклипа (я ещё заметил такую штуку как класс — конструктор классов, если не ошибаюсь и пока не понял как он работает) я пока что запутался.
Дело в том что есть определённые грабли при написании as3 в классах. Нужно чтоб ты по ним прошёлся.
Пускай квадраты и двигаются по пробелу, теперь сделай так чтобы при клике на квадрат — выводилось что либо, ну например его координаты.
Эта функция должна находиться в классе квадрата.
Ок, спасибо за бОльшую конкретизацию задачи. Вчера как раз разобрался (думаю) как более-менее правильно создать класс для мувиклипа, чему очень рад 🙂 Теперь попробую сделать что ты сказал…
Не могу найти список всех свойств класса MovieClip. Не подскажешь где искать? (ну надо 🙂 )
help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/MovieClip.html?filter_flex=4.1&filter_flashplayer=10.2&filter_air=2.6
Оказывается не в той справке искал ) Если в функции-конструкторе прописать trace(что-нибудь) то это же должно быть выведено при создании копии класса? У меня ничего не выводится… Возможно проблема с размещением файла класса, сейчас ещё покумекаю.
Нет, файл где надо лежит… Что не так… Или ничего и не должно в таком случае вывестись?
должно
Создал всё с чистого листа — теперь выводится… И подсказки снова появились 0_0 Слушай, а если я установил русскоязычную версию Flash то язык в нём только русский? Я не нашёл что-то где его сменить… До этого англ. ставил, с русским часто неудобно.
И ещё, ты по части кодинга со своим проектом-игрой что-то делаешь? Как-то продвигаешься или всё уже готово кроме анимации/графики?
Хаха, ну это ж надо, оказывается не работало из-за того что я по привычке не жал сохранить перед проверкой работы класса 🙂 В коде это делать не обязательно… Надо привыкать, как бы снова не затупить так и не возиться час с непонятной проблемой 🙂
Чувствую тут надо слегка разобраться… Дело такое: я прописал в функции класса addEventListener но событие не «слушалось», затем изменил на stage.addEventListener после чего нажатия клавиш стали «ловиться». Вот мне интересно много ли таких моментов где нужно учитывать это? И ещё вопросик: запись width и this.width внутри класса подразумевают одно и то же?
Сделал движение по нажатию кнопки и клика мышки прямоугольники тоже слушаются (всё в классе) и если использовать trace для вывода координат — всё хорошо, но я попробовал сделать вывод «динамическим текстом» — добавил поля на сцену, но не понял как к ним обратиться из класса… в смысле как передать им то что нужно вывести.
Пля, я в расстройствах. Не разобрался до сих пор… Хотя пока пытался, услышал что такая ситуация вроде как нежелательна (когда нужно из класса к другому внешнему классу обращаться). В общем я пока что в ступоре
Кстати у меня постоянно такой косяк))))
Ого, я не одинок ))
Так эт… Не подскажешь в чём может быть дело в такой ситуации: у меня в основном коде создано поле динамического текста TextField , а изменить я его пытаюсь из созданного мною класса, но вылазит ошибка что у TextField (ну в смысле у созданного мной экземпляра) нет свойства .text, почему такое происходит?
Лучше напишу дословно, что-то я сомневаюсь что правильно понял ошибку, её текст: 1120: Обращение несуществующего свойства .
Чёрт, тут скобки как у тегов прописал, ещё раз: 1120: Обращение несуществующего свойства «имя моего экземпляра TextField».
Указано что эта ошибка в созданном мной классе.
Хотя я догадываюсь что видимо класс просто не знает имени экземпляра класса TextField, так как оно задано в основном коде, а не в классе, но я пробовал прописать всё в классе — появлялась другая ошибка, но не об этом счас… Вопрос в том можно ли заставить такую «конструкцию» работать?
Я тебе вот что скажу: ты крайне коряво выражаешься.
Выкладывай фла cs5
Может просто код покажу? Думаю сразу поймёшь о чём я.
Файл .fla:
Файл .as, из которого нужно вывести какой-то текст, в текстовое поле, созданное в .fla файле:
Хм… Что-то резко переписка остановилась, хотелось бы мне(школьнику) тоже выучить as3.
Ладно, на всякий оставлю свой скайп: ilya112-skype
Могу порисовать графику для игры.Если есть скетчарт игры то будет совсем замечательно.
Сейчас не актуально пока, но если что дам знать на мыло.