Просмотр полной версии : Проектирвание класса персонажа в игре
Dalass13
12.04.2013, 08:32
Доброго времени суток всем.
Понимаю, что всех уже достали подобные вопросы, но я лучше спрошу 1 раз и больше у меня проблем не возникнет, чем накидаю невнятный код и пойму, что решение неверное, потрачу время и, в итоге, все равно задам вопрос. Небольшое вступление закончено. Итак, к проблеме.
Написана модель движения аля Diablo | Sacred | Torchlight (управление мышью, Shift останавливает персонажа и т.п. ), то бишь используются функции типа "moveTo", "moveStart", "moveStop", которые принимают произвольные для персонажа координаты. Все бы ничего, и создал бы я класс Character и добавил бы в него все эти функции, НО другие объекты так же двигаются (снаряды, стрелы, противники). Итого, получаем функции, нужные всем дин. объектам. Итак, вопрос: как лучше спроектировать классы? Пока я вижу одно решение - выделить общий класс всех "движущихся" объектов игры, например GameDynamicObjects и класс Character будет дочерним от него.
Если бы управление было стрелочно-WASD'шным, то я без тени сомнения добавил бы это все в класс Character И не парился, но я парюсь по вышеизложенным причинам, поэтому прошу помощи более опытных людей в этом плане. Спасибо за внимание
Dalass13, по-моему, вы абсолютно правильно мыслите.
выделить общий класс всех "движущихся" объектов игры, например GameDynamicObjects и класс Character будет дочерним от него.
Только я бы этот класс назвал немного по-другому, например "DynamicGameObject" (extends BaseGameObject).
Dalass13
12.04.2013, 08:55
Да, я понимаю, что путаница небольшая возникает из-за слова "динамический", спасибо за совет.
Получается, я на правильном пути?
Dalass13, думаю, что да. Подождите ответов других участников, может подскажут больше :)
Если бы управление было стрелочно-WASD'шным, то я без тени сомнения добавил бы это все в класс Character И не парился
Еще вот подумал, — помимо методов "moveTo", "moveStart" и "moveStop" можно добавить "moveBy", который будет смещать игровой объект на некоторые значения. Тогда структура классов сохранится, а управление wasd просто будет "дергать" смещение. Надеюсь понятно объяснил :)
Dalass13
12.04.2013, 09:06
Да, была такая мысль, но старое доброе дьябловское управление изменять не хочу. А такие WASD'шные "подергивания" и "отклонения от траектории" могут понадобиться, например, для уворота от стрел, когда маршрут уже указан. Одна проблема - при удерживании мыши персонаж двигается за мышью непрерывно и управление в этот момент WASD может просто напросто запутывать игрока в отношении его движения. Палка с двумя концами, как говорится) Юзабилити с одной стороны падает,а с другой стороны, кто - то посчитает это очень нужной фичей. Но это тоже, если я правильно понял
Весь общий функционал наследуйте, то, что не наследуется приходиться расширять т.е. экстендить. Слова английские в языке AS3 не просто так используются :)
caseyryan
12.04.2013, 10:37
Вообще, можно одни и те же функции использовать и для управления мышью, и для управления клавиатурой.
Я бы ввел отдельно функцию setRotation(angle:Number):void и moveTo(toX:Number, toY:Number, distance:Number = -1):void
Во втором опциональный параметр, то есть при щелчке мышью можно передать координаты к которым должен двигаться объект, и расстояние, чтобы он не прошел больше этого расстояния. Но это методы можно использовать и при движении с помощью клавиатуры. Например при нажатии W персонаж начинает двигаться в том направлении, в котором развернут на расстояние, равное текущей скорости.
Только я бы этот класс назвал немного по-другому, например "DynamicGameObject" (extends BaseGameObject).
Я думаю что даже слово Game тут не нужно. Просто DynamicObject или MovableObject
Dalass13
12.04.2013, 10:38
Весь общий функционал наследуйте, то, что не наследуется приходиться расширять т.е. экстендить. Слова английские в языке AS3 не просто так используются :)
Это абсолютно естественно, я понимаю принципы ООП, но есть некоторые исключения все-таки. Хотя бы потому, что пишу игру без формализованного проекта и может что - то поменяться "на ходу". Сложно проектировать все одному. Исходя из этого и пытаюсь сделать более "гибкую" к будущим незапланированным изменениям структуру.
Добавлено через 1 минуту
Я думаю что даже слово Game тут не нужно. Просто DynamicObject или MovableObject
На самом деле слово Game чисто для своего удобства. Словом меньше - словом больше, не суть важно ведь
Добавлено через 12 минут
Вообще, можно одни и те же функции использовать и для управления мышью, и для управления клавиатурой.
Я бы ввел отдельно функцию setRotation(angle:Number):void и moveTo(toX:Number, toY:Number, distance:Number = -1):void
Насчет этого лишнего функционала я тоже уже высказывался, а то, что предложили Вы больше подойдет для игр с видом сверху или 2D изометрии. У меня же будет чисто 2D задумка ( прямо, как старые битемапы ). Вот, кажется все мысли высказал
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.