Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
TabulaRasa
4 / 4 / 0
Регистрация: 31.10.2012
Сообщений: 40
1

Игра, подобная Roguelike - перемещение игрока по карте

09.12.2012, 20:12. Просмотров 3735. Ответов 66
Метки нет (Все метки)

В общем, пишу ASCII игрушку, семейства Rogue-like, для того что бы закрепить знание Pascal'я.
Как происходит передвижение:
Рисуется карта, происходит нажатие клавиши передвижения, замена координат игрока, clrscr - и карта перерисовывается.
В общем главная проблема - из за вечных очисток экрана и перерисовки карты - возникает некое мерцание (ещё бы).
Есть ли другой способ менять координаты персонажа на карте?

И еще вопрос: Считывание нажатия клавиш у меня происходит так: пользователь ПЕЧАТАЕТ клавишу направления (wasd) и нажимает Enter, а после идут расчеты. Есть ли способ считывания нажатия клавиш без использования Enter?

Добавлено через 1 час 48 минут
Со вторым вопросом разобрался. Как я мог не знать о ReadKey() ума не приложу)
1
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2012, 20:12
Ответы с готовыми решениями:

Игра, подобная Go. Проверка расположения фишек
Мне надо создать игру для экзамена, но у меня возникли трудности... Я решил создать игру на...

Игра, подобная шашкам. Оптимизация кода
Добрый вечер. У меня маленькая проблема: пишу игру, наподобие шашек. Почти готово, потом выложу...

Игра, подобная танчикам Dedny - продумать коллизии
Пытаюсь в качестве курсовой написать подобие Танчиков, что были на Денди. Пока у меня получился...

Перемещение игрока во время анимации
Здравствуйте, есть такой вопрос, как мне можно сделать так, что бы во время проигрывания...

66
TabulaRasa
4 / 4 / 0
Регистрация: 31.10.2012
Сообщений: 40
10.12.2012, 22:45  [ТС] 2
Разобрался и с первым. Тему закрывайте.
1
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
29.01.2017, 19:12 3
Как вы разобрались с первым? и как вообще успехи? я вот мучаюсь, пытаясь написать рогалик
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
5312 / 3168 / 2343
Регистрация: 22.11.2013
Сообщений: 8,951
29.01.2017, 20:44 4
Про отрисовку:
1) можно не стирать (не вызывать ClrScr), но при отрисовке заполнять весь экран,
2) если скорости недостаточно, можно перейти на прямой доступ к видеопамяти (то это только для TP).
1
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
05.02.2017, 17:01 5
bormant Про отрисовку:
1) можно не стирать (не вызывать ClrScr), но при отрисовке заполнять весь экран,
2) если скорости недостаточно, можно перейти на прямой доступ к видеопамяти (то это только для TP).
Что вы имеете ввиду? "но при отрисовке заполнять весь экран"?
1
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
05.02.2017, 19:40 6
Что-то ТС молчит... Если коротко:
Цитата Сообщение от Luke0208 Посмотреть сообщение
Как вы разобрались с первым?
readkey
Цитата Сообщение от Luke0208 Посмотреть сообщение
Что вы имеете ввиду?
gotoXY
0
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
05.02.2017, 21:00 7
Если без clrscr то прошлое положение игрока останеться на экране.
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
05.02.2017, 21:32 8
Отчего же? Просто вывести на прошлое место игрока тот символ, который был до игрока (ну, или другой, по контексту, мало ли, может, игрок подобрал на данной клетке что-то или убил кого-то). Зачем перерисовывать всё, если можно перерисовать только парочку символов?
0
ФедосеевПавел
Модератор
6162 / 2943 / 1202
Регистрация: 01.02.2015
Сообщений: 9,523
Записей в блоге: 1
06.02.2017, 00:26 9
Luke0208, попадалась переводная статья "Давайте сделаем рогалик" http://free-basic.ru/g00.html
http://uvadzucumi.blogspot.ru/p/blog-post.html
для FreeBASIC. Но ведь главное - идея.
0
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
06.02.2017, 22:10 10
Цитата Сообщение от Cyborg Drone Посмотреть сообщение
Отчего же? Просто вывести на прошлое место игрока тот символ, который был до игрока (ну, или другой, по контексту, мало ли, может, игрок подобрал на данной клетке что-то или убил кого-то). Зачем перерисовывать всё, если можно перерисовать только парочку символов?
Я хотел так и сделать. Но вот как? Я сейчас в процессе обучения, поэтому ,возможно, и сам разбирусь потом. Но может хоть подсказачку?
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
07.02.2017, 01:01 11
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Да очень просто. Я бы сделал так:

В начале игры или уровня делаем следующее:

Формируем в памяти образ экрана (двумерный массив из символов), причём по тем координатам лабиринта, куда должен быть помещён игрок, должно быть поле (не обязательно пустое), в которое этого самого игрока возможно поместить (скажем так, не стена, хотя можно и стену, нужно только будет предусмотреть, что делать с игроком в такой ситуации). Естественно, в этом массиве также должны быть не только поле с лабиринтом, но и поля для характеристик игрока, типа здоровья, брони и тому подобного, текущих координат игрока, рюкзака, текущего оружия, поле для сообщений, ну и, что там ещё нужно на игровом экране. Некоторые поля в начале можно оставить пустыми, если вывод в них обязательно будет в процессе игры. Теперь выводим сформированный массив на экран. Целиком, и один раз, далее будем выводить на экран только те поля, которые изменятся в процессе игры, а не весь образ экрана.

В программе должны быть переменные, хранящие характеристики игрока, некоторые из которых соответствуют каким-либо полям на игровом экране (отображаемые), и другие характеристики (неотображаемые). В характеристиках обязательно должны быть текущие и предполагаемые координаты игрока, а также состояние той клетки, на которой находится игрок. Аналогичные наборы переменных должны быть и для каждого движущегося объекта, если таковые предполагаются. Определяем изначальное состояние игрока. В частности, в текущие и предполагаемые координаты игрока пишем координаты (одинаковые, естественно), куда должен быть помещён игрок, в состояние клетки, на которой находится игрок, копируем из массива клетку, в которое игрока нужно в начале поместить. Аналогично определяем изначальные состояния движущихся объектов (если они всё же предполагаются).

Замечание: далее я не буду рассматривать реакцию программы на клавиши, соответствующие действиям типа поесть, переобуться, одеть кепку, сменить оружие и им подобных. Буду рассматривать только реакцию программы на клавиши движения.

Всё, игра началась. В этот момент считаем, что как будто игрок находится на начальной клетке, и что как будто была нажата какая-то там, неважно какая, клавиша перемещения (текущие и предполагаемые координаты игрока одни и те же, припоминаете?).

Далее идёт игровой цикл:

1. Определяем, можно ли поместить игрока по предполагаемым координатам. Если нет, то ничего не делаем, если да, тогда делаем следующее. В лабиринт по текущим координатам игрока в массив и на экран помещаем клетку из переменной состояния клетки, на которой находится игрок (заодно стираем изображение игрока, если оно там было). Запоминаем клетку лабиринта по предполагаемым координатам игрока в переменной состояния клетки, на которой находится игрок. Копируем предполагаемые координаты игрока в текущие. Производим взаимодействие характеристик игрока и состояния клетки. С помощью gotoXY выводим самого игрока (заодно стирая изображение той клетки, куда его размещаем) и все его изменившиеся отображаемые характеристики в массив и на экран. Далее, если нужно, производим аналогичные действия с каждым движущимся объектом (при этом вполне возможно, что характеристики движущегося объекта будут взаимодействовать с характеристиками игрока). В частности, определяем по характеристикам для каждого движущегося объекта действие, которое нужно с ним сделать (переместить, изменить отображение, уничтожить и тому подобное), и делаем это действие.
2. По характеристикам игрока определяем, в состоянии ли он и далее передвигаться по лабиринту. Если нет (попал на клетку, обозначающую конец уровня, или, например, умер, застрял, провалился сквозь пол и тому подобное), то переходим к следующему уровню или к концу игры, по ситуации. Если игрок в состоянии передвигаться по лабиринту, то ждём нажатия клавиши.
3. При нажатии клавиши (readkey) определяем, что за клавиша (case, я так думаю), и производим действия по этой клавише. В частности, если была нажата клавиша движения, то определяем, и затем записываем предполагаемые координаты в характеристики игрока.
4. Переходим к пункту 1.

Вот, как-то так, в общих чертах.
0
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
07.02.2017, 14:05 12
Большое спасибо за такую отзывчивость. Пойду доучивать массивы и пробовать

Добавлено через 1 час 58 минут
TabulaRasa,
Цитата Сообщение от TabulaRasa Посмотреть сообщение
Разобрался и с первым. Тему закрывайте.
Уже 5 лет прошло, но может вы ответите. Если вы писали рогалик, не могли бы вы скинуть исходный код?
0
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
11.02.2017, 18:01 13
Cyborg Drone, есть рогалики где карта(массив) не ограничиваеться игровым окном. Я так полагаю, там создается(генерируеться или заранее нарисованный) массив, и на экран выводиться только часть его. Или как?
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
13.02.2017, 01:36 14
Именно так. Выводится часть массива.
1
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
13.02.2017, 22:56 15
Cyborg Drone, а возможно ли написать сетевую игру на паскале. И вывод части массива на паскале возможен? (Понимаю надоел)

Добавлено через 32 минуты
И как сделать переход от одного массива к другому(глобальная карта)?
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
13.02.2017, 23:37 16
Возможно. На паскале что угодно возможно. Лучше писать на Delphi, Lazarus (Free Pascal) или Pascal ABC.NET. Вам нужно будет разобраться со всякими интернетовскими прибамбасами для выбранного Вами диалекта паскаля и заодно написать протокол обмена. Программа будет не одна, а как минимум две: программа-сервер и программа-клиент. Легко не будет, мгновенно это дело освоить не удастся. Я считаю, проще всего это можно сделать на Delphi. Так, для общего развития, насчёт интернет-программ: на Delphi полностью или частично написаны QIP, Skype, The Bat!, Ad-Aware, Download Master и ещё много чего.

Не нужно никакого перехода. Хранить глобальные координаты угла карты, и суммировать эти координаты с локальными. Проще говоря, всякий раз при выводе очередной части карты принимать за нулевую координату какую-то клетку глобальной карты, относительно этой клетки часть этой самой карты и выводить.
1
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
14.02.2017, 21:02 17
Спасибо огромное. Сколько ты уже паскалем занимаешся что так хорошо его знаешь?
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
14.02.2017, 21:25 18
Не то чтобы я прямо так уж паскалем занимаюсь, у меня много и иных интересов. Вообще говоря, язык паскаль я знаю более 30 лет.
0
Luke0208
33 / 58 / 6
Регистрация: 22.01.2017
Сообщений: 640
14.02.2017, 21:36 19
Насколько я понял для глобальной карты мне нужно сделать что типо этого: "вывести часть массива с такими-то координатами", считать их вручную прийдеться
На форуме появился как раз отличное описанние массивов.
0
Cyborg Drone
Модератор
7352 / 3746 / 2678
Регистрация: 17.08.2012
Сообщений: 11,980
15.02.2017, 01:07 20
??? в смысле, вручную? На бумажке, что ли? Да ладно! Допустим, угловая точка в карте имеет координаты (x; y), тогда экранные координаты будут (x+sx+dx-1; y+sy+dy-1), где sx, sy - смещение отображаемой части карты от верхнего левого угла экрана (минимальное смещение = 0), dx, dy - относительные координаты в отображаемой части карты. Это если считать, что координаты начинаются с 1. Замечание: используется только один массив - глобальная карта.
0
15.02.2017, 01:07
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.02.2017, 01:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перемещение 2D игрока без учета массы
Здравствуйте! Подскажите пожалуйста, как исправить управление чтобы масса не учитывалась при...

Перемещение игрока в сетевой игре пс использованием джойстика
Есть два скрипта:джойстик и скрипт игрока, который получает от джойстика вектор. Но суть в том, что...

Игра .ехе + 2 игрока онлайн
Если я запускаю шахматы .ехе ,и с другого компа запускаю тоже,то как прописать подключение через...

Перемещение игрока возможно лишь если клик был по необходимому объекту (?)
Здравствуйте, ребята! Я новичок в Unity, поэтому не судите строго. Столкнулся с вроде бы легкой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.