В большинстве игр, будь то стратегия, RPG, FPS, TPS, аркада, или даже полатформер, "карта" (уровень) представляется в формате некоего подобия растрового изображения, где каждый сегмент (клеточка, пиксель) представляет целый блок, будь то бонус, дверь, стена, ловушка и пр. Но вот незадача. Блоки целые, а когда пишешь подобную игру получается, что персонаж либо мифически "перескакивает" от блока к блоку, что само собой не естественно и не разумно, либо двигается как положено, но возникает целая тонна проблем относительно столкновений (проход сквозь стены, пропуск предметов, графические баги, вылеты, логические несоответствия и пр. х**ня...). И даже если удается написать движок достойный он, как правило, ДИКО (вызывая зверскую, просто животную ярость) тормозит!!!
Я много раз видел, как начинающие программисты и программисты среднего уровня жалуются, что в Basic создать хорошую игру не выходит, даже имея исходники того-же "Убей Санту"
Вот вдоволь захлебнувшись соплями и жалобами о собственном нежелании напрачь мозг я решил написать "совершенный "каркас" (движок, точнее начало игры любого подобного жанра) сегментно-промежуточный передвижений".
Для начала: что-же это такое? Сегментное - типа растрового, т.е. все рабочее поле (уровень, карта) разбито на некоторые "клеточки", которые принимают разнообразные фигуры, бонусы, препятствия и т.п. Сегментно-промежуточный означает, что хоть карта (уровень) и состоит из таких-вот "клеточек", персонаж способен двигаться между ними не "прыгая", т.е. плавно переходя из одного сегмента в другой. Пример: Игра Walker+ (разработанная мною, есть в разделе "творчество") имеет сугубо сегментный тип переходоы (ещё-бы! Игра все-таки псевдографическая ), а, к примеру "Убей Санту", или какой-нибудь платформер, например "Марио" Сегментно-промежуточный, т.к. уровни состоят не из описаний векторов (никакой виртуальной "сетки", сегменты отсутствуют), а именно из карты, построенной на основе сегментного описания типа "матрица".
Короче, Марио не "скачет" с сегмента к сегменту, а плавно, постепенно, имея возможность задержаться между сегментами, проходит не "дергаясь" по уровню. Вот такой вот тип переходов здесь и опишу
Знаю, что со вступлением немного загнул, зато теперь надеюсь не лицезреть сообщений типа "А что это такое", "А как этим пользоваться" и пр.
SCREEN 1: CLS Map$(0) = " " Map$(1) = " 11111111111111111 " Map$(2) = " 1 1 " Map$(3) = " 1 X 11 1 " Map$(4) = " 1 1 1 1 " Map$(5) = " 1 111 11 1111 1 " Map$(6) = " 1 111 1 1 1 " Map$(7) = " 1 1 " Map$(8) = " 11111111111111111 " Map$(9) = " " MX% = LEN(Map$(0)) MY% = 9 CS% = 16 FOR I% = 0 TO MY% FOR P% = 0 TO MX% - 1 F$ = MID$(Map$(I%), P% + 1, 1) IF F$ = "1" THEN LINE (P% * CS%, I% * CS%)-(P% * CS% + CS%, I% * CS% + CS%), 3, BF IF F$ = "X" THEN X% = CS% * P% Y% = CS% * I% Map$(I%) = MID$(Map$(I%), 1, P%) + " " + MID$(Map$(I%), P% + 2, MX% - P% - 2) END IF LINE (P% * CS%, I% * CS%)-(P% * CS% + CS%, I% * CS% + CS%), 2, B NEXT P% NEXT I% DO E% = X% / CS% EE! = E% / 2 EE% = E% / 2 IF EE! = EE% THEN AA% = CS% / 2 ELSE AA% = CS% / 2 - 1 F% = Y% / CS% FF! = F% / 2 FF% = F% / 2 IF FF! = FF% THEN CC% = CS% / 2 ELSE CC% = CS% / 2 - 1 A% = (X% - AA%) / CS% A! = X% / CS% C% = (Y% - CC%) / CS% C! = Y% / CS% IF A% = A! THEN B% = A%: XM% = 1 ELSE B% = A% + 1: XM% = 0 IF C% = C! THEN D% = C%: YM% = 1 ELSE D% = C% + 1: YM% = 0 LOCATE 22, 1: PRINT "A:"; A%; "B:"; B%; LOCATE 23, 1: PRINT "C:"; C%; "D:"; D%; LOCATE 24, 1: PRINT "X:"; X%; "Y:"; Y%; LINE (A% * CS%, C% * CS%)-(B% * CS% + CS%, D% * CS% + CS%), 1, B LINE (X% + 2, Y% + 2)-(X% + CS% - 2, Y% + CS% - 2), 3, B Key$ = INKEY$ DO WHILE Key$ = "" Key$ = INKEY$ LOOP LINE (A% * CS%, C% * CS%)-(B% * CS% + CS%, D% * CS% + CS%), 2, B LINE (X% + 2, Y% + 2)-(X% + CS% - 2, Y% + CS% - 2), 0, B IF Key$ = CHR$(0) + CHR$(75) THEN IF XM% = 1 THEN F1$ = MID$(Map$(C%), A%, 1) F2$ = MID$(Map$(D%), A%, 1) ELSE F1$ = MID$(Map$(C%), A% + 1, 1) F2$ = MID$(Map$(D%), A% + 1, 1) END IF IF F1$ = " " AND F2$ = " " THEN X% = X% - 1 END IF IF Key$ = CHR$(0) + CHR$(77) THEN IF XM% = 1 THEN F1$ = MID$(Map$(C%), B% + 2, 1) F2$ = MID$(Map$(D%), B% + 2, 1) ELSE F1$ = MID$(Map$(C%), B% + 1, 1) F2$ = MID$(Map$(D%), B% + 1, 1) END IF IF F1$ = " " AND F2$ = " " THEN X% = X% + 1 END IF IF Key$ = CHR$(0) + CHR$(72) THEN IF YM% = 1 THEN F1$ = MID$(Map$(C% - 1), A% + 1, 1) F2$ = MID$(Map$(C% - 1), B% + 1, 1) ELSE F1$ = MID$(Map$(C%), A% + 1, 1) F2$ = MID$(Map$(C%), B% + 1, 1) END IF IF F1$ = " " AND F2$ = " " THEN Y% = Y% - 1 END IF IF Key$ = CHR$(0) + CHR$(80) THEN IF YM% = 1 THEN F1$ = MID$(Map$(D% + 1), A% + 1, 1) F2$ = MID$(Map$(D% + 1), B% + 1, 1) ELSE F1$ = MID$(Map$(D%), A% + 1, 1) F2$ = MID$(Map$(D%), B% + 1, 1) END IF IF F1$ = " " AND F2$ = " " THEN Y% = Y% + 1 END IF IF Key$ = CHR$(27) THEN END LOOP
Кратенько опишу, что здесь происходит (хотя в этом нет нужды, если у интересующегося есть QBasic 1.0 и выше):
В коде есть некоторая карта (её можно перевести на загрузку из файла. Как? Самим слабо?), далее эта карта "сканируется" и выискивается место постановки игрока (Большой Х). Далее в начале каждого цикла высчитывается в соответствии с положением игрока соседние (ВСЕ КОТОРЫЕ МОГУТ БЫТЬ СОПРЯЖЕНЫ!!!) сегменты на наличие прохода, или блок-стенки. Клавиши управления: Стрелки - движение, ESC - выход.
Да вот еще что! Я не просто написал наибыстрейший, наименьший (в объеме, а не в возможностях) и наиправильнейший (без багов, пока Вы сами их там не накалякаете) движок. Я создал СОВЕРШЕННЫЙ ДВИЖОК
Дело в том, что переменная CS% равная в начале 16 определяет размер сегментов. Значение CS% должно быть положительным и иметь четное число (Оно ведь позже делиться пополам, в противном случае могут быть ошибки при определении "суседей" ) . Для стратегий можно использовать предел от 6 до 16, для аркад - любое, зависит от типа, а для платформеров от 10 (если что-то типа Клада, или Walley II на КУВТ (Yamaha)) до 50 (Если что-то типа игры "Самурай Джек - медальон времени на GBA).
В общем все самое-самое уже есть. Управление и даже некоторое графическое оформление для простоты понятия работы кода. Осталось выбрать видеорежим, метод и способ контроля, добавить врагов (если надо), написать файлы карт, создать собственную графику и пр. мелкую работу.
Учитывая, что данная математическая прогрессия была найдена мной потому, что все только жаловались и никто (даже те, кто нашел ответ) ничего не ответили я требую, чтобы при использовании данного кода (или его части, неважно) в обязательном порядке создавался фрейм, "лист", "скролл", или что-то еще из категории "Создатели", где должно быть указано, что математическая прогрессия сегментно-промежуточных переходов принадлежит мне, администратору данного сайта (и указать ссыль). В случае, если я замечу свой код, и он не будет содержать подобного текста - подам в суд (авторство зарегестрировано). Я не требую оплаты (хотя мог-бы), или чего-то унизительно-принудительного, просто не вписывать меня в список "лохов". Данное требование есть условие бесплатного пользование, а за его нарушение в порядке судебного решения придется платить (а это будет уже не бесплатная основа). Поэтому я надеюсь, что люди здесь адекватные, и денег никто просто так, из глупости, выбрасывать не хочет. Если кто вдруг захочет сделать пожертвование - в ЛС (он не засекречен, написать может любой, если проблемы - в раздел "для админа". Со всеми вопросами и предложениями туда-же). Кстати, размещение кода где либо без моего согласия тоже нарушение авторских прав, влекущее за собой штрафы и выплаты Действуйте разумно Предварительно получайте мое согласие и условия бесплатного размещения.
Ну, "свод о законах" получился может и не длиннее, но внишительным, зато всё ясненько Удачи