Create site free
Хозяйке на заметку - Общие вопросы разработки игр - Разработка игр на Game Maker (Simple Mode) - Форум Game Maker. Разработка игр.
Здравствуй Гость | Перейти на сайт

Главная | Форум | Регистрация | Войти
gmaker.net ;) [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Хозяйке на заметку (Различные наблюдения, и фишки, которые не тянут на статью...)
Хозяйке на заметку
WertyXBOCT Дата: Суббота, 14.08.2010, 14:26 | Сообщение # 1
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
Различные наблюдения, и фишки, которые не тянут на статью но несомненно будут полезны.

Решил создать эту тему, так-как из-за некоторых особенностей GM некоторые люди рвали себе волосы на гениталиях.

События


  • Событие создания (create) у объектов в комнате выполняется в порядке их создания.
  • Событие шага (step) выполняется по object_index, повлиять на это, вряд-ли получится.
  • Событие рисования (draw), самое прожорливое, очередность выполнения зависит от depth, при равных depth, первым будет объект с большим id.

Drag-n-drop

  • Все дрег-н-дропы, имеют аналог в виде команды. Например команда action_move_point.
  • Долгое время, я использовал команду action_inherited(), вместо event_inherited(). biggrin

Математика

  • если знать, что lengthdir_x(len,dir) это cos(degtorad(dir))*len, то можно немножко сэкономить на вычислениях. Например чтобы узнать косинус угла, можно сделать так: lengthdir_x(1,direction). Или например, если необходимо расставить объекты под одним углом к объекту, но на разном расстоянии от него, можно узнать lengthdir для наибольшего общего делителя (или для единицы), а потом домножать на некоторую величину. Третий способ сэкономить, это когда вокруг некой точки, необходимо найти 2-4 точки, угол между которыми составляет 90 градусов в исходной точке. Достаточно знать геометрию.
  • Есть очень полезная функция sign() - возвращает является ли значение положительным, отрицательным или нулем (1,-1,0) соответственно.
    При помощи этой функции можно например разворачивать врагов в сторону героя и т.п.
    Однако, нам не всегда нужно чтобы возвращался 0 (если, от этого положим зависит image_xscale объекта (иначе он просто исчезнет))
    Так вот, sign, который не возвращает 0 выглядит так: xxx=sign(sign(value)*2+1) YemSalat
  • Если нужно изменить значение булевой переменной на противоположное, можно писать var ^= 1; Это короче чем var = !var;Ninja

Давайте делиться своими находками)



Blog:www.WeslomPo.ru
mailto: i@weslompo.ru


Сообщение отредактировал WertyXBOCT - Суббота, 14.08.2010, 20:08
 
YemSalat Дата: Суббота, 14.08.2010, 15:47 | Сообщение # 2
Хрен заткнешь
Группа: Проверенные
Сообщений: 385
Статус: Offline
Хорошая тема, тоже поделюсь )

Есть очень полезная функция sign() - возвращает является ли значение положительным, отрицательным или нулем (1,-1,0) соответсвенно.
При помощи этой функции можно например разворачивать врагов в сторону героя и т.п.
Однако, нам не всегда нужно чтобы возвращался 0 (если, от этого положим зависит image_xscale объекта (иначе он просто исчезнет))

Так вот, sign, который не возвращает 0 выглядит так:
xxx=sign(sign(value)*2+1)



Мои игры:
LaLaLaLAMA - игра не про Ламу
GoMommy! - Invaders Must Die !!
[Caption Game] - игра в заголовке
CombatForce - долгожданный релиз
А мою аватарку можно поменять


Сообщение отредактировал YemSalat - Суббота, 14.08.2010, 15:49
 
WertyXBOCT Дата: Суббота, 14.08.2010, 16:53 | Сообщение # 3
Каждый 5й пост мой
Группа: Страж
Сообщений: 2467
Статус: Offline
На самом деле, над sign без нуля два дня назад думал)), сделал через if.


Blog:www.WeslomPo.ru
mailto: i@weslompo.ru
 
Ninja Дата: Суббота, 14.08.2010, 17:43 | Сообщение # 4
Хоть палкой гони
Группа: Проверенные
Сообщений: 683
Статус: Offline
если нужно изменить значение булевой переменной на противоположное, можно писать var ^= 1; Это короче чем var = !var;


Oh, my God! You kill Kenny! You bastard!
 
Ang3L Дата: Суббота, 21.08.2010, 22:23 | Сообщение # 5
Каждый 5й пост мой
Группа: Админы
Сообщений: 2667
Статус: Offline
Скрипты:
Одной из самых интересных штучек в программировании - функции. Их можно использовать не только для каких-то расчётов, но и для возвращения булевой переменной для условия. Допустим есть в 30 местах в коде строчка:
Quote
if(mouse_x >= argument0 && mouse_y >= argument1 && mouse_x <= argument2 && mouse_y <= argument3)
{//do something}

И теперь нужно изменить условия со включенного сравнения (>=;<=) на просто сравнение (>;<), нужно будет условие менять в 30 местах, нужно будет найти их все и правильно изменить. Делаем:
Quote
if(mouse_in(argument0, argument1, argument2, argument3))
{//do something}

Где:
Quote (mouse_in())
if(mouse_x >= argument0 && mouse_y >= argument1 && mouse_x <= argument2 && mouse_y <= argument3)
return true;
else return false;

Теперь нужно всего лишь изменить 1 строчку в одном скрипте в одном месте, остальные 30 изменяться автоматически.
Плюсы: Меньше изменений, быстро, удобно, качественно.
Минусы: В ГМ может быть тормознуто из-за тормознутости вызова скриптов (в C++ используйте свойство inline).

Графика:
Используйте Surface для отрисовки интерфейса. Surface перерисовываете только по требованию пользователя. Это не только ускорит процесс отрисовки, но и даст дополнительные возможности в рисований интерфейса (например, разграничение областей).
Плюсы: Больше возможностей для рисования.
Минусы: Более сложное программирование, возьня с поверхностями.

P.S.: Если что-нибудь ещё интересненькое вспомню, поведаю.

Добавлено (21.08.2010, 22:22)
---------------------------------------------
Я сейчас читаю книгу (наконец-то руки дошли) "Веревка достаточной длины, чтобы… выстрелить себе в ногу" Алена И. Голуба, и вот нашёл массу полезных советов (правда многие вырваны из контекста, так что советую прочитать саму книгу). Курсивом будут выделены мои комментарии.
Вот несколько советов от профессионального программиста вырванных из книги:
1. Сущность программирования: без сюрпризов, минимум сцепления и максимум согласованности

Quote
Сцепление — это связь между двумя программами или объектами пользовательского интерфейса. Когда один объект меняется, то все, с чем он соединен, может также измениться. Сцепление вызывает сюрпризы. (Я меняю эту штучку здесь, и внезапно та штуковина вон там перестает работать). Пример из Си++: если объект одного класса посылает сообщение объекту второго класса, то посылающий класс сцеплен с принимающим классом. Если вы меняете интерфейс для принимающего класса, то вы также должны исследовать код в посылающем классе, чтобы убедиться в том, что он еще работает. Этот вид слабого сцепления безвреден. Вам нужно знать об отношениях сцепления для сопровождения программы, но без некоторого количества сцеплений программа не могла бы работать. Несмотря на это, для вас желательно по мере возможности минимизировать число отношений сцепления.

Пример из практики ГМ. Допустим у вас есть скрипт create_monster(x, y); Создаёт монстра в точке (x; y). Этот скрипт вы использовали в нескольких местах, допустим в пару десятков. Но тут вдруг решили, что хотите не только создавать монстра в точке (x; y), но и указать какой тип монстра. Меняем интерфейс скрипта на create_monster(type, x, y); или create_monster(x, y, type); и тут оказывается что программа не работает, т.к. сцепка неверна - передаются неверные аргументы скрипта. Теперь нужно облазить все места где этот скрипт есть и не дай бог забыть где-то.

2. Подавляйте демонов сложности (часть 1)
2.1. Не решайте проблем, которых не существует
2.2. Решайте конкретную проблему, а не общий случай

Quote
Вместо того, чтобы учитывать в проекте все возможные случаи, проектируйте свой код так, чтобы он мог быть легко расширен при необходимости добавления новых возможностей.

3. Интерфейс пользователя не должен быть похожим на компьютерную программу (принцип прозрачности)

Quote
Я однажды слышал, как кто-то сказал, что лучшим пользовательским интерфейсом из когда-либо разработанных является карандаш. Его назначение тотчас же понятно, для него не нужно руководство пользователя, он готовится к работе без особой суеты. Однако наиболее важным свойством является прозрачность. Когда вы пользуетесь карандашом, то думаете о том, что вы пишите, а не о самом карандаше.

Сравните Рогалик и какую-нибудь современную РПГ. Или текстовый квест с PointNClick'ом.

4. Не путайте легкость в изучении с легкостью в использовании

Quote
Вернемся к примеру с карандашом из предыдущего параграфа. Очень трудно научиться пользоваться карандашом. У большинства детей это занимает несколько лет. (Вы могли бы возразить, что, судя по каракулям на рецептах, многие врачи этому так и не научились). С другой стороны, после того, как вы научились, карандашом пользоваться очень легко.

Да, или вот, например, научиться перемещать юниты в Dune II можно в несколько кликов, а вот попробуйте поуправлять 15-20 юнитами, поймёте как это весело.

5. Производительность может измеряться числом нажатий клавиш

Quote
Интерфейс, требующий меньше нажатий клавиш (или других действий пользователя типа щелчков мышью), лучше того, который требует много нажатий для выполнения одной и той же операции, даже если такие виды интерфейсов обычно сложнее в освоении.

Соответственно, интерфейс какой-нибудь кибер-спортивной стратегий убог. Потому что там не столько важен результат сколько кол-во нажатий.

6. Если вы не можете сказать это по-английски, то вы не сможете выполнить это и на Си/Си++

Quote
Это правило с последующим также относятся к правилам пользовательского интерфейса, но здесь под "пользователем" уже понимается программист, использующий написанный вами код — часто это вы сами.
Акт записи на английском языке описания того, что делает программа, и что делает каждая функция в программе, является критическим шагом в мыслительном процессе. Хорошо построенное, грамматически правильное предложение — признак ясного мышления. Если вы не можете это записать, то велика вероятность того, что вы не полностью продумали проблему или решение. Плохая грамматика и построение предложения являются также показателем небрежного мышления. Поэтому первый шаг в написании любой программы — записать то, что делает программа, и как она это делает.
Есть разные мнения о возможности мышления вне языка, но я убежден, что аналитическое мышление того типа, который нужен в компьютерном программировании, тесно связано с языковыми навыками. Я не думаю, что является случайностью то, что многие из знакомых мне лучших программистов имеют дипломы по истории, филологии и схожим наукам.
Также не является случайностью то, что некоторые из виденных мной худших программ были написаны инженерами, физиками и математиками, затратившими в университете массу энергии на то, чтобы держаться как можно дальше от занятий по языку и литературе.
Сущность заключается в том, что математическая подготовка почти не нужна в компьютерном программировании. Тот тип организационного мастерства и аналитических способностей, который нужен для программирования, связан полностью с гуманитарными науками. Логика, например, преподавалась на философском факультете, когда я был в университете. Процесс, используемый при проектировании и написании компьютерных программ, почти полностью идентичен тому, который используется, чтобы сочинять и писать книги. Процесс программирования совсем не связан с теми процессами, которые используются для решения математических уравнений.
...
Программирование требует организационных способностей и языковой подготовки, а не абстрактного мышления, необходимого для занятий математическим анализом.
...
Обратной стороной этой медали является то, что если вы зашли в тупик при решении проблемы, один из лучших способов выйти из него — это объяснить проблему приятелю. Почти всегда решение возникает в вашей голове посредине объяснения.

Здесь вместо английского вставьте русский (хотя желательно думать и на англ. это упростит процесс программирования), а вместо C/C++ вставьте абсолютно любой другой язык. Действительно, если вы не знаете чего хотите, не знаете как это выразить, то увы, ничего не получится. Это одно из самых главных правил, на мой взгляд.[i]

6.1. Начинайте с комментариев

Quote
Если вы последовали совету в предыдущем правиле, то комментарии для вашей программы уже готовы. Для того, чтобы получить документированное описание реализации, вы просто писали и добавляли вслед за каждым абзацем блоки кода, реализующие качества, описанные в этом абзаце. Оправдание "у меня не было времени, чтобы добавить комментарии" на самом деле означает "я писал этот код без проекта системы и у меня нет времени воспроизвести его". Если создатель программы не может воспроизвести проект, то кто же сможет?

[i]Впервые это метод я увидел в видео 3D Buzz. Это действительно интересно, и помогает спроектировать программу, до её написания. А главное очень просто, даже для не разбирающегося в GML, но знающего что он хочет получить.

Добавлено (21.08.2010, 22:22)
---------------------------------------------
7. Читайте код

Quote
Все писатели — это читатели. Вы учитесь, когда смотрите, что делают другие писатели. Удивительно, но программисты — писатели на Си++ и Си — часто не читают код. Тем хуже. Я настоятельно рекомендую, чтобы, как минимум, члены группы программирования читали код друг друга. Читатель может найти ошибки, которые вы не увидели, и подать мысль, как улучшить код.

Чем в принципе тут и занимаемся: читаем код друг друга. И охрениваем от кол-ва ошибок... cheesygrin но всегда находим проблему!

8. Разбивайте сложные проблемы на задачи меньшего размера

Quote
На самом деле это также правило и литературного стиля. Если концепцию слишком сложно объяснить за один раз, то разбейте ее на меньшие части и объясняйте каждую по очереди. То же назначение у глав в книге и параграфов в главе.

Ну эт правило должны были все уже выучить: "Разделяй и властвуй."

10. Проблема должна быть хорошо продумана перед тем, как она сможет быть решена

Quote
Это правило с двумя последующими первоначально располагалось в начале этой главы. Подумав, я переместил их сюда, так как побоялся, что, прочитав их, вы пропустите оставшуюся часть главы. Однако в мои намерения не входит чтение проповедей. Эти правила посвящены весьма реальным проблемам и во многих отношениях являются самыми важными правилами в этой книге.
Настоящее правило является настолько очевидным утверждением в повседневной жизни, что кажется странным его восприятие как едва ли не ереси применительно к программированию. Мне часто говорят, что "невозможно потратить пять месяцев на проектирование, не написав ни одной строки кода — ведь наша производительность измеряется числом строк кода, написанных за день". Люди, говорящее это, обычно знают, как делается хороший проект; просто у них нет этой "роскоши".
Мой опыт говорит, что хорошо спроектированная программа не только работает лучше (или просто работает), но и может быть написана быстрее и быть проще в сопровождении, чем плохо спроектированная. Лишние четыре месяца при проектировании могут сэкономить вам более четырех месяцев на этапе реализации и буквально годы в период сопровождения. Вам не добиться высокой производительности, если приходится выбрасывать прошлогоднюю работу из-за существенных изъянов проекта.

Ну это, наверное, знакомо уже большинству кто написал несколько проектов, когда наступал момент что программа настолько "плоха", что её проще "пристрелить", чем пытаться исправить её. И в итоге пишут ещё одну такую же... smile Потом ещё и ещё, и вот уже десятый проект уже более ли менее похож на пекмана или на арканойд.

12. Вовлекайте пользователей в процесс проектирования

15. Прежде всего, не навреди

Quote
Это правило касается сопровождения программ. Будучи ребенком, я читал научно-фантастический рассказ, в котором незадачливый путешественник во времени случайно наступает на доисторическую бабочку и, вернувшись в свое время, находит окружающий мир изменившимся ужасным образом. Это похоже на большие компьютерные программы, где тронь здесь что-то кажущееся незначительным — и где-то там вся программа перестает работать. Методы объектно-ориентированного проектирования существуют, прежде всего, для решения (или по крайней мере для облегчения решения) этой проблемы в будущем, но уже существуют миллионы строк старого кода, который сегодня нуждается в сопровождении.
Мне приходилось видеть людей, которые изменяют программу просто потому, что им не нравится, как она выглядит. Это не очень хорошая идея. Если вы не знаете всех частей программы, затрагиваемых изменением (а это почти невозможно), то не трогайте код. Вы можете вполне резонно возразить, что на самом деле ни одно из правил в этой книге не относится к сопровождению программ. Вы просто не можете менять существующий код в соответствии с каким-то методическом руководством (как бы вам этого ни хотелось), не вызывая риска непоправимого вреда. Представленные здесь правила полезны лишь в том случае, когда вы начинаете программу с нуля.

20. Пустые потери времени

Quote
Если вы не можете решить неподатливую проблему, то займитесь на некоторое время чем-либо другим. Программисты часто наиболее продуктивны, когда смотрят в окно, слоняются по коридорам с пустым выражением на своих лицах, сидят в кафе и пьют кофе с молоком, или иным способом "теряют время".

21.1. Эффективность — часто просто пугало

Quote
Я потратил несколько часов, делая одну подпрограмму более "эффективной", и не останавливался, чтобы подумать о том, как часто эта подпрограмма будет вызываться, что является пустой потерей времени в том случае, когда программа вызывается лишь один или два раза. Ваша программа должна быть непременно настолько эффективной, насколько это возможно, но вашей первоочередной заботой является сопровождение, и вы не должны приносить читаемость в жертву на алтарь эффективности. Напишите программу сперва с учетом сопровождения, затем запустите свою программу под профайлером и определите, где на самом деле есть узкие места. Будучи вооружены реальной информацией, вы теперь знаете, где стоит обменять часть читаемости на скорость, и можете вернуться и сделать это изменение. Тем не менее, вы можете включить первоначальный текст в комментарий, чтобы не потерять его. Всегда имейте в виду, что любое количество подчисток на уровне текста программы не повысит эффективность так, как это сделает лучший алгоритм. Пузырьковая сортировка будет выполняться медленно вне зависимости от того, насколько хорошо она запрограммирована.

22. Программа без комментариев ничего не стоит

Добавлено (21.08.2010, 22:23)
---------------------------------------------
24. Комментарии должны быть предложениями

Quote
Они должны быть хорошо составлены и иметь правильную пунктуацию, по возможности без сокращений. Не превращайте свои комментарии в секретный код, применяя странные сокращения и изобретая свой собственный грамматический строй. Вам также не должна требоваться нить Ариадны для расшифровки комментариев.

И не надо говорить что-то типа: "Как хочу так и пишу."

26. Комментарий не должен подтверждать очевидное

39. Пробел — один из наиболее эффективных комментариев
Очень многие забывают это, а зря.

Code
default:text_add(cut(0,x,window_get_width()),cut(0,y,window_get_height()),'Ball: Error - switch(dynamic.type):Unknown type.');break;

Code
default: text_add(cut(0, x, window_get_width()), cut(0, y, window_get_height()), 'Ball: Error - switch(dynamic.type): Unknown type.'); break;

40. Используйте отступы в четыре пробела

Quote
Никлас Вирт, который изобрел языки Паскаль и Модула-2, однажды выпустил книгу, где всюду использовались отступы в один символ. Чтение в ней листингов стало одним из самых тяжелых случаев в моей практике. Используйте достаточно большие отступы, чтобы ваш читатель мог сказать, что в тексте видно абзацы; четыре пробела кажутся идеальными.

51. Функция должна делать только одно дело

Quote
Это обычно не очень удачная мысль — записывать то, что должна делать функция, через ее аргументы. Это должно делать имя функции.

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

Quote
Если вы обнаруживаете почти идентичный код появляющимся более чем в одном месте своей программы, то этот код должен быть выделен в подпрограмму, которая вызывается из нескольких мест. Выгода состоит в меньшем размере программы и лучшей сопровождаемости вследствие упрощения программы и того, что вы должны теперь сопровождать лишь одну функцию; если вы находите ошибку, то вам нужно исправить ее только в одном месте. Как было упомянуто ранее, имя функции также дает хорошую абстракцию. Вызовы функции с хорошо выбранным именем являются обычно самодокументирующимися, устраняя необходимость в комментариях.

56.1. Избегайте глобальных идентификаторов

Quote
Положим, что две функции связаны посредством глобальной переменной, если одна из них устанавливает эту переменную, а вторая ее использует. (Если бы глобальная переменная не использовалась совместно, то не было бы причины иметь ее глобальной; она могла бы быть статической локальной). Отношения связи с участием глобальных переменных вызывают особенно неприятные проблемы при сопровождении, потому что эти отношения тяжело отслеживать. Когда глобальная переменная меняется во время выполнения программы, то очень трудно разобраться, что ее изменило. Аналогично, если вы должны изменить поведение глобального объекта, то очень трудно разобраться, где он используется. По этой причине лучше всего вообще избегать глобальных переменных. Конечно, большинству программ реального мира необходимо незначительное количество глобальных переменных, но, как правило, я начинаю сильно нервничать, если их становится больше 10.

58. Старайтесь сдвинуть ошибки с этапа выполнения на этап компиляции

Quote
Неинициализированные переменные — по сути ошибки, ждущие своего часа. Вы всегда должны инициализировать переменную при ее объявлении. В Си++ инициализация во время объявления возможна всегда, потому что объявление может проводиться везде, где можно поместить оператор; просто откладывайте объявление до тех пор, пока у вас не будет достаточно информации для объявления в произвольном месте с инициализацией переменной. Таким образом, если вы попытаетесь использовать эту переменную преждевременно, то получите ошибку на этапе компиляции ("переменная не найдена") вместо ошибки во время выполнения.

Компиляций в ГМ нет, но это будет похоже на проверку перед запуском.

Добавлено (21.08.2010, 22:23)
---------------------------------------------
60. Избегайте циклов do/while

Quote
Я профессионально занимаюсь программированием с 1979 года и за это время использовал цикл do/while всего два раза.

Сам его никогда не использую.

61. В цикле со счетчиком его значение должно по возможности уменьшаться

Quote
Циклы являются одним из тех мест, где малое повышение эффективности значительно улучшает выполнение программы, потому что их код выполняется многократно. Так как сравнение с нулем обычно более эффективно, чем сравнение с определенным числом, то цикл с уменьшающимся счетчиком, как правило, выполняется быстрее.

Не знал такого.

65. Допускайте, что ситуация может измениться в худшую сторону

Quote
Если функция может индицировать состояние ошибки, то вы должны допустить, что ошибка произойдет, по меньшей мере, однажды за время жизни программы.

Дальше идёт специфика С++, но это не значит что такого не бывает на GML. Распространённый пример, переполнение массива. Т.е. несмотря на то что массив большой и он весь может и не понадобиться, но имейте ввиду что он может переполнится.

66.2. Всегда проверяйте коды возврата ошибки

Quote
Это должно быть очевидно, но комитет ISO/ANSI по Си++ потребовал, чтобы оператор new вызывал исключение, если он не смог выделить память, потому что было установлено, что удивительное множество ошибок во время выполнения в реальных программах вызвано тем, что люди не потрудились проверить, не возвратил ли new значение NULL.
Мне также довелось видеть множество программ, в которых люди не позаботились посмотреть, сработала ли функция fopen(), перед тем как начать пользоваться указателем FILE.

Дааа... Это очень часто бывает. И часто из-за лени и спешки.

68. Не нужно магических чисел

Quote
В основном тексте вашей программы не должно быть чисел в явном виде. Используйте перечислитель или константу для того, чтобы дать числу символическое имя. Тут есть два преимущества:
  • Символическое имя делает величину самодокументируемой, устраняя необходимость в комментарии.
  • Если число используется более чем в одном месте, то менять нужно лишь одно место — определение константы.

  • Ну здесь всё понятно:
    Code
    ball_scale = 32;
    ...
    if(x != (x div ball_scale) * ball_scale + ball_scale div 2 && y != (y div ball_scale) * ball_scale + ball_scale div 2)
    {
         ball_x_get = (x div ball_scale) * ball_scale + ball_scale div 2;
         ball_y_get = (y div ball_scale) * ball_scale + ball_scale div 2;
    }

    Чтобы изменить коэффициент везде достаточно сменить ball_scale, да и название говорить само за себя, а не число 32.

    71. Немедленно обрабатывайте особые случаи

    76. Сообщение об ошибке должно подсказывать пользователю, как ее исправить

    Quote
    Когда-то, во времена CP/M, отладчик DDT имел единственное сообщение об ошибке. Не имело значения, что вы натворили, он всегда говорил:
    ?
    ...
    Я часто видел сообщения об ошибках, которые давали мне обильное количество информации о том, что я сделал неправильно, не давая подсказки, как это делается правильно. В самой печальной ситуации диалоговое меню предлагает вам ввести число, но когда вы вводите неверное число, оно выводит такое сообщение:
    Неверное значение.
    без намека на то, какое значение будет верным.
    ...
    Сообщение об ошибке должно подсказывать вам, как исправить эту ситуацию

    77. Не выводите сообщения об ошибке, если она исправима

    Заключение

    Quote
    Вот так-то. Множество правил, которые я считаю полезными и которые, надеюсь, будут полезны и для вас. Конечно, многие из представленных здесь правил дискуссионны. Пожалуйста, я готов с вами о них поспорить. Несомненно, я не считаю себя каким-то законодателем в стиле Си++ и сам нарушаю многие из этих правил при случае; но я искренне верю, что следование этим правилам сделает меня лучшим программистом, и надеюсь, что вы их тоже оцените.
    Я закончу вопросом. Сколько времени потребуется программисту на Си++ для того, чтобы заменить электрическую лампочку? Ответ — нисколько, а вы, кажется, все еще мыслите процедурно. Правильно спроектированный класс электрическая_лампа должен наследовать метод замены от базового класса лампа. Просто создайте объект производного класса и пошлите ему сообщение заменить_себя().

    И немножко от меня. Я выбрал советы наиболее подходящие к общему программированию, независимо от языка, но и наиболее похожее на GML. Надеюсь поможет вам в созданий ваших игр.
    Прикрепления: 9170454.png(9Kb)


    Blogpost
     
    SRes Дата: Суббота, 21.08.2010, 22:41 | Сообщение # 6
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 2512
    Статус: Offline
    Quote
    60. Избегайте циклов do/while
    Quote
    Я профессионально занимаюсь программированием с 1979 года и за это время использовал цикл do/while всего два раза.

    Сам его никогда не использую.


    С чего вдруг ? Один и тот-же cmp + jmp. Это на вкус и цвет.
    Quote
    61. В цикле со счетчиком его значение должно по возможности уменьшаться
    Quote
    Циклы являются одним из тех мест, где малое повышение эффективности значительно улучшает выполнение программы, потому что их код выполняется многократно. Так как сравнение с нулем обычно более эффективно, чем сравнение с определенным числом, то цикл с уменьшающимся счетчиком, как правило, выполняется быстрее.

    Не знал такого.


    Учитывая что на дворе 2010 год - это ересь, т.к. выиграть пару тактов процессора за каждый проход по циклу ценой читабельности ничего не стоит. Лучше делать так, как удобнее.


    Velociped Inc.
     
    DragonSkiN Дата: Суббота, 21.08.2010, 22:57 | Сообщение # 7
    Всех уже задолбал
    Группа: Страж
    Сообщений: 1180
    Статус: Offline
    Quote (Ang3L)
    Никлас Вирт, который изобрел языки Паскаль и Модула-2, однажды выпустил книгу, где всюду использовались отступы в один символ. Чтение в ней листингов стало одним из самых тяжелых случаев в моей практике. Используйте достаточно большие отступы, чтобы ваш читатель мог сказать, что в тексте видно абзацы; четыре пробела кажутся идеальными.

    Сейчас обычно пользуются кнопкой tab, к сожалению ГМ не до конца удобно распознаёт её, но зато код читать существенно удобнее.

    Добавлено (21.08.2010, 22:57)
    ---------------------------------------------

    Quote (SRes)
    Лучше делать так, как удобнее.

    именно поэтому мне очень трудно жить на компе с 1,280 МБ оперативки под Win 7.
    потому что мелкомягкие делают так, как им удобнее, $%@09*!@ !


    http://gamegraphycs.do.am/ - сайт о 2D графике
    http://dragonskin.ath.cx:777/- доступ по хттп к сборнику ресурсов для игр
     
    SRes Дата: Суббота, 21.08.2010, 23:03 | Сообщение # 8
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 2512
    Статус: Offline
    Не сравнивай абсолютно разные вещи. Сотня тактов за секунду в наше время - сущий смех, это ничего не значит и не решает. Другое дело, как ты сказал, нерациональное использование оперативки - это как болото и океан. К тому же сотня тактов может быть важна для всяких серверов, но это другая "весовая" категория.


    Velociped Inc.
     
    DragonSkiN Дата: Суббота, 21.08.2010, 23:11 | Сообщение # 9
    Всех уже задолбал
    Группа: Страж
    Сообщений: 1180
    Статус: Offline
    SRes, а если это цикл в цикле, и повторяется всё это дело скажем 30-40 раз в секунду?
    допустим обход массива 100000*100000 - хочешь - не хочешь, а об оптимизации по возможности подумаешь.

    Речь ведь в тексте идёт о крупных и серьёзных проектах, да и автор даёт рекомендацию думать в первую очередь об "узких", проблемных местах.



    http://gamegraphycs.do.am/ - сайт о 2D графике
    http://dragonskin.ath.cx:777/- доступ по хттп к сборнику ресурсов для игр


    Сообщение отредактировал DragonSkiN - Суббота, 21.08.2010, 23:13
     
    SRes Дата: Суббота, 21.08.2010, 23:13 | Сообщение # 10
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 2512
    Статус: Offline
    Черт, ты хотя-бы понял о чем говориться ? О паре тактов за один проход ! Да и то, информация может быть устаревшей\недостоверной, а возможно всего один такт ! Да это было бы актуально лет 20 назад, лет 15, но не сейчас. Сейчас вообще пришла эпоха интерпретируемых языков, как ни крути. В них о таком и не мечтать. И в ГМе тоже.


    Velociped Inc.
     
    DragonSkiN Дата: Суббота, 21.08.2010, 23:42 | Сообщение # 11
    Всех уже задолбал
    Группа: Страж
    Сообщений: 1180
    Статус: Offline
    для прикола попробовал на ГМ:
    никакой разницы, фпс упал до 14-15 на обоих вариантах.
    Прикрепления: test.gmk(9Kb)


    http://gamegraphycs.do.am/ - сайт о 2D графике
    http://dragonskin.ath.cx:777/- доступ по хттп к сборнику ресурсов для игр
     
    Ang3L Дата: Суббота, 21.08.2010, 23:52 | Сообщение # 12
    Каждый 5й пост мой
    Группа: Админы
    Сообщений: 2667
    Статус: Offline
    У меня обычный порядок 38-39, обратный 42-43. Разница невелика, значит этот совет только на крайний случай, т.к. эффект небольшой.
    И всё таки чувак был прав! happy


    Blogpost
     
    sanek-x107 Дата: Воскресенье, 22.08.2010, 02:32 | Сообщение # 13
    Хоть палкой гони
    Группа: Проверенные
    Сообщений: 770
    Статус: Offline
    1) Для того, чтобы постепенно свести число к нулю, можно юзать: x = sign(x)*max(0,abs(x)-sp), где sp - так скажем, скорость.
    2) Для простого перемещения игрока: x+=(keyboard_check_direct(vk_right)-keyboard_check_direct(vk_left))*sp , где sp - скорость перемещения.
    если требуется к тому же еще и проверка столкновения:

    Code

    xp=(keyboard_check_direct(vk_right)-keyboard_check_direct(vk_left))*sp;
    if place_free(x+xp,y) {x+=xp;}

    3) Для создания эффектов достаточно круто действует сурфейс, наложенный в качестве текстуры на полигон. Так можно делать простенькие эффекты дисторшиона.
    4) Формулы для простейшего Pseudo3d. Ниже данный скрипт как бы проецирует точку, заданную в аргументах на плоскость и возвращает ее координаты на плоскости в переменных tx, ty. Тут ps3d.cx, ps3d.cy - координаты центра экрана (абсолютные к комнате), ps3d.lkoff - коэффициент, подбирается на глазок.

    Code

    var koff;
    var mov;
    var dir;
    tx=argument0;
    ty=argument1;
    koff=point_distance(ps3d.cx,ps3d.cy,tx,ty)/(max(view_hview[ps3d.cv], view_hview[ps3d.cv])/2)*ps3d.lkoff;
    mov=koff*argument2;
    dir=point_direction(ps3d.cx,ps3d.cy,tx,ty);
    tx=tx+lengthdir_x(mov, dir)
    ty=ty+lengthdir_y(mov, dir)

    5) Очень полезны функции variable_local_***. Я их, например, часто использую для загрузки карт, для движков. Вот маленький кодик, который как бы инициализирует переменную, если она еще пока не инициализирована:

    if !variable_local_exists(argument0) then variable_local_set(argument0, argument1);

    тут argument0 - название переменной (строка), argument1 - значение переменной.

    6) Очень полезен иногда формат хранения файлов в чанках (chunks) - в блоках. Чтобы понять, что это, см. http://www.codenet.ru/progr/formt/3ds.php
    Это легко создает иерархию объектов и устраняет путаницу.

    7) Мое мнение, что чем меньше ресурсов в ексе запихнешь - тем лучше. EXE нам не для хранения ресурсов, да и к тому же к той игре, у которой ресурсы выносные, легко будет писать патчи и моды (и легко стырить их - зависит от формата хранения)

    8) Лучше понимать, когда использовать 100500 объектов, а когда - партиклы. Все зависит от сложности и, безусловно, количества.
    9) Пишите дебаг-логи! То есть, скажем, например, у вас есть мультиплеер игра. Трудно отследить ее действия - тогда просто записывайте всех их в текстовый файл, а потом, просматривая его, может быть, вы что-нибудь да найдете. вот пример лога из моей недоделанной игры (кстати, я ее не забросил) Wonderwar, автоматически созданный двигом Ultimate3d:

    Quote

    Log file created on 08/21/10 21:44:15.
    This log file has been created by Ultimate 3D 2.1 beta.
    Successfully created a mixed vertex processing device.
    With the created device 8 texture stages are supported, cube textures are supported, pixel shader model 1.4 and lower is supported and no antialiasing is being used.
    A new camera with index 0 has been created.
    A new camera with index 32 has been created.
    A new camera with index 33 has been created.
    A new camera with index 34 has been created.
    A new camera with index 35 has been created.
    A new camera with index 36 has been created.
    A new camera with index 37 has been created.
    Started loading a model called "SkyTetrahedon" from a resource.
    Successfully loaded the meshes of the *.u3d file.
    Successfully loaded the materials of the *.u3d file.
    Loading the model called "SkyTetrahedon" from a resource has succeeded.
    Started loading a model called "SkyBox" from a resource.
    Successfully loaded the meshes of the *.u3d file.
    Successfully loaded the materials of the *.u3d file.
    Loading the model called "SkyBox" from a resource has succeeded.
    Started loading a model called "SkySphere" from a resource.
    Successfully loaded the meshes of the *.u3d file.
    Successfully loaded the materials of the *.u3d file.
    Loading the model called "SkySphere" from a resource has succeeded.
    Trying to load the model file "data/models/hero_body.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/hero_body.3DS" has been loaded successfully (with 6 meshes, 4 materials and 7 bones).
    Trying to load the model file "data/models/hero_legs.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/hero_legs.3DS" has been loaded successfully (with 2 meshes, 1 materials and 2 bones).
    Trying to load the model file "data/models/weap_m4a1.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/weap_m4a1.3DS" has been loaded successfully (with 13 meshes, 5 materials and 14 bones).
    Trying to load the model file "data/models/weap_makarov.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/weap_makarov.3DS" has been loaded successfully (with 14 meshes, 8 materials and 15 bones).
    Trying to load the model file "data/models/weap_shotgun.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/weap_shotgun.3DS" has been loaded successfully (with 8 meshes, 4 materials and 8 bones).
    Trying to load the model file "data/models/weap_knife.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/weap_knife.3DS" has been loaded successfully (with 5 meshes, 4 materials and 7 bones).
    Trying to load the model file "data/models/ladder.3DS".
    Successfully parsed the *.3ds file.
    The model file "data/models/ladder.3DS" has been loaded successfully (with 3 meshes, 1 materials and 3 bones).
    Trying to load the model file "data/models/lamp-blinn.3ds".
    Successfully parsed the *.3ds file.
    The model file "data/models/lamp-blinn.3ds" has been loaded successfully (with 4 meshes, 3 materials and 5 bones).
    All primitive objects have been deinitialized successfully.
    All model objects have been deinitialized successfully.
    All terrain objects have been deinitialized successfully.
    All particle systems have been deinitialized successfully.
    All light sources have been deinitialized successfully.
    All fonts and the texture drawer have been deinitialized successfully.
    All camera objects have been deinitialized successfully.
    All shaders and textures have been deinitialized successfully.
    Ultimate 3D has been deinitialized successfully.

    Иногда помогает найти точку обрыва и ошибки.

    10) Перед сдачей игры, врубите "Write errors to game_errors.log". Если юзер захочет вам сообщить об ошибке, то ему будет удобнее отослать файл, а вообще лучше сэто дело автоматизировать - как в Windows окошко отправить отчет/не отправлять.
    Это пока первая десятка, может что еще нарою в своей дурной голове.



    http://gmbook.sx107.netai.net
    Мама, я - дебил!
     
    3bl3gamer Дата: Воскресенье, 22.08.2010, 12:22 | Сообщение # 14
    Хоть палкой гони
    Группа: Проверенные
    Сообщений: 650
    Статус: Offline
    Quote (sanek-x107)
    1) Для того, чтобы постепенно свести число к нулю, можно юзать: x = sign(x)*max(0,abs(x)-sp), где sp - так скажем, скорость.

    можно ещё так: x+=(num-x)/sp , где num - число, к которому сводить, sp - "скорость"(НЕ меньше 1). отличаестя тем, что приближает к нужной величине не с постоянной скоростью, а чем ближе к num, тем меньше скорость.
     
    Gaploid Дата: Воскресенье, 22.08.2010, 17:02 | Сообщение # 15
    Разговорчивый
    Группа: Пользователь
    Сообщений: 116
    Статус: Offline
    Все мы используем циклы. Очень часто для отрисовки массива. Как рисовать 'вниз' знают все, а что если нужно делать столбцы по 8 строки? Вот простой пример.
    Code

    var i;
    for(i=0 i<16 i+=1)
       draw_text(2+(i div 8)*32,(192+i*11)-(i div 8)*88,'['+string(i)+']:'+string(register[i]))



    Заходите!
    Gaploid aka Bizunow aka Илья aka crim :)


    Сообщение отредактировал Gaploid - Воскресенье, 22.08.2010, 17:03
     
    Druce Дата: Воскресенье, 22.08.2010, 17:21 | Сообщение # 16
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 1543
    Статус: Offline
    Quote (3bl3gamer)
    x+=(num-x)/sp

    Экспонента-мана однако. Мне лично как-то приятнее выводить некоторые формулы для всяких там движений и т.д. с математической или физической точки зрения. Например вместо того что ты написал можно привести к виду x=x0+(num-x0)*exp(-(t-t0)/sp). Хотя это чисто мой загон, но процессы, которые не требуют непременного численного моделирования (т.е. описываемые аналитическими уравнениями) лучше рассчитывать в стороне от программы на бумажке и подставлять нужные формулы. Однако нужен баланс с читаемостью.


    druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
     
    Stasundr Дата: Воскресенье, 22.08.2010, 17:23 | Сообщение # 17
    Всех уже задолбал
    Группа: Высший Советник
    Сообщений: 1058
    Статус: Offline
    Люто поддерживаю Druce'а. Сказывается физическое образование happy


    .blanco
     
    Druce Дата: Воскресенье, 22.08.2010, 17:26 | Сообщение # 18
    Каждый 5й пост мой
    Группа: Страж
    Сообщений: 1543
    Статус: Offline
    У меня еще пока нету физического образования. Я только поступил на физфак БГУ, еще не начал учиться. У меня есть только физическая ментальность happy .


    druce.ucoz.ru|andrewsweekly.livejournal.com|А OneStep тем временем мертв.
     
    Gaploid Дата: Суббота, 04.09.2010, 10:04 | Сообщение # 19
    Разговорчивый
    Группа: Пользователь
    Сообщений: 116
    Статус: Offline
    Перенос строк в ГМ делать не только #. Достаточно набрать 'str' + chr(13) + 'Bla-Bla-Bla', что бы убедиться в работоспособности.



    Заходите!
    Gaploid aka Bizunow aka Илья aka crim :)
     
    BanShee Дата: Суббота, 04.09.2010, 12:25 | Сообщение # 20
    Хрен заткнешь
    Группа: Проверенные
    Сообщений: 381
    Статус: Offline
    Хм, а разницы-то:
    'str' + '#' + 'Ololo'
    или
    'str' + chr(13) + 'Ololo'


    Этот пост автоматически делает любой тред на 20% круче, если не указано обратное.
     
    Форум Game Maker. Разработка игр. » Разработка игр на Game Maker (Simple Mode) » Общие вопросы разработки игр » Хозяйке на заметку (Различные наблюдения, и фишки, которые не тянут на статью...)
    Страница 1 из 212»
    Поиск:



    Сообщество Gmaker.SU 2005-2012
    Используются технологии uCoz
    Простой вход