Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/76: Рейтинг темы: голосов - 76, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 20.07.2016
Сообщений: 4

Очередная 2D игра-платформер

27.07.2016, 00:56. Показов 15833. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, товарищи.

В общем: Я не программист, но захотелось самому склепать 2д игру, художник есть. Полистал некоторые туториалы и мало что нашёл, так что принимал решения исходя из своих знаний.
Если кому интересно, я тут скину свои некоторые решения ниже. Прошу советов, возможно я что то вкорне делаю неверно.

В основном пишу тут, т.к. столкнулся с проблемами, решения которых сам найти не смог.
Начну с того, что решил.(или нашёл решение в нете).

1. Перемещение персонажа (соответственно и врагов по карте) - РЕШЕНО.
2. Анимация персонажей, врагов (спорно,но ..) - РЕШЕНО.
3. загрузка аудиофайлов в паскальАБС.нет(спорно, но...) - РЕШЕНО.

.. а теперь понеслось:
4. Можно ли звуки загружать не построчно, а как картинки - в массив? вообще есть ли в паскале массив звуковых файлов?
5. Как бы мне сделать загрузку карты из текстовых файлов или просто прописать в паскале (буквенно, а к соответствующей букве приделать блок определённого размера, свойство которого я пропишу, и к этому блоку,т.е. букве смогу прописать картинку),
6. скроллинг карты - т.е. мир или уровень или карта -очень большой и выходит за рамки экрана. Как сделать так что бы экран перемещался вслед за персонажем по этой самой карте?
7. насколько знаю, цикл WHILE означает "пока, что...". т.е. он выполняется, пока не выполнится его условие или мы его не пропустим. Но при выполнении условия цикла игра не переходит к следующему. Она повисает.
вопрос: как осуществить данный переход? (например смену уровней).
8. как привязать действие в цикле WHILE ко времени? как вообще объявить время? (смысл в том, что бы анимировать персонажа во времени, пока он стоит на месте, а так же, если долго стоит, то можно было бы приписать действия-анимацию).

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

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



Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
uses GraphABC;
var jump:=System.Media.SoundPlayer.Create('sound/jump.wav'); //загружаем звук прыжка
var x,y,Left,Right,up,i,j:integer;
        bg:picture;
        dy:real;
        name:string;
        picplayer:array [1..5] of picture;
        
procedure KeyDown(Key:integer); //процедура нажатия клавиши
        begin
        if key=VK_Left then Left:=1;
        if key=VK_right then Right:=1;
        if key=VK_up then up:=1;
        end;
procedure KeyUp(Key:integer);
        begin
        if key=VK_Left then Left:=0;
        if key=VK_right then Right:=0;
        if key=VK_up then up:=0;
        end;
        
begin
LockDrawing;
SetWindowSize(380,210);
x:=190; y:=105; // начальные координаты для персонажа
bg:=Picture.Create('picture/i.jpg'); //картинка заднего фона
 
for i:=1 to 3 do //загружаем картинки персонажа в массив
     picplayer[i]:=picture.Create('picture/player/'+i.ToString+'.png');
for i:=4 to 5 do //загружаем картинки персонажа в массив
     begin
     j:=i-3;
     picplayer[i]:=picture.Create('picture/player/'+j.ToString+'.png'); 
     picplayer[i].FlipHorizontal; //отображаем по горизонтали для бега в др сторону
     end;
for i:=1 to 5 do // делаем фон картинок в массиве прозрачными
     picplayer[i].Transparent:=true;
 
 
 
 
 
While true do begin
 
//управление координатами игрока по Х
if left=1 then x:=x-5; //при нажатии клавиши влево
if Right=1 then x:=x+5; // вправо
 
 
//ускорение свободного падения
dy:=dy+0.3;
y:=y+round(dy);
 
 
if (y>150) then dy:=0; //ограничиваем высоту падения по У
//данное ограничение временное, пока не прописана карта и взаимодействие с ней
 
 
 
//ПРЫЖОК
if (up=1) and (dy=0) then jump.Play; //проигрываем звук прыжка
if (up=1) and (dy=0) then dy:=-5;   //придания отрицательного ускорения
 
 
 
 
bg.Draw(0,0); //рисуем задний фон
textOut(x-10,y-45,name); //имя игрока рядом с самим игроком (временно)
 
//АНИМАЦИЯ персонажа - я привязал по остатку от деления координаты Х
 
if (Left=1) and (x mod 2 = 0) then picplayer[4].Draw(x,y);
if (Left=1) and (x mod 2 = 1) then picplayer[5].Draw(x,y);
if (Right=1) and (x mod 2 = 0) then picplayer[1].Draw(x,y);
if (Right=1) and (x mod 2 = 1) then picplayer[2].Draw(x,y);
if (Right=0) and (Left=0) then picplayer[3].Draw(x,y);
 
 
 
OnKeyDown := KeyDown;
OnKeyUp := KeyUp;
Redraw;
sleep(100);
end;
 
end.
Вложения
Тип файла: rar picture.rar (12.8 Кб, 252 просмотров)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2016, 00:56
Ответы с готовыми решениями:

Игра платформер
Привет всем! Я программирую в Visual Studio C++ 2010. Я задался вопросом о том, как сделать игру платформер. Для начала я запрограммировал...

Игра-платформер на C++. Разобраться в причинах ошибок
Привет всем! Пишу продолжение Марио по 2 видео из youtube. Столкнулся с ошибкой, далее коды игры и спрайт с волком: main #include...

Очередная игра в слова
Здравствуйте:) Предлагаю сыграть в обычную игру "слова" необычным образом) Правила игры таковы: Автор темы, то есть я (FreudeMan),...

4
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
27.07.2016, 08:15
Цитата Сообщение от Riischoreske Посмотреть сообщение
4. Можно ли звуки загружать не построчно, а как картинки - в массив? вообще есть ли в паскале массив звуковых файлов?
Почему бы и нет?
Конечно можно!

Цитата Сообщение от Riischoreske Посмотреть сообщение
5. Как бы мне сделать загрузку карты из текстовых файлов или просто прописать в паскале (буквенно, а к соответствующей букве приделать блок определённого размера, свойство которого я пропишу, и к этому блоку,т.е. букве смогу прописать картинку),
Ну, в принципе, они так примерно и делаются… Карты описываются в одном файле, а спрайты — выводятся уже на готовую карту.
Можете посмотреть как это делается у старых Близардовских игр: starcraft или warcraft.

Цитата Сообщение от Riischoreske Посмотреть сообщение
7. насколько знаю, цикл WHILE означает "пока, что...". т.е. он выполняется, пока не выполнится его условие или мы его не пропустим.
Цикл while выполняется пока условие выполняется.
Цикл repeat выполняется пока условие не выполнится.
С этим вопросом в любой букварь по ЯП Паскаль…

Цитата Сообщение от Riischoreske Посмотреть сообщение
8. как привязать действие в цикле WHILE ко времени? как вообще объявить время? (смысл в том, что бы анимировать персонажа во времени, пока он стоит на месте, а так же, если долго стоит, то можно было бы приписать действия-анимацию).
Вы про объекты что-нибудь слышали?
Делается общий список объектов (персонажей и не только) и в цикле обрабатываете каждый из них…
А там уже что они делать будут — это всё зависит от внутренних счётчиков и флагов.

Цитата Сообщение от Riischoreske Посмотреть сообщение
6. скроллинг карты - т.е. мир или уровень или карта -очень большой и выходит за рамки экрана. Как сделать так что бы экран перемещался вслед за персонажем по этой самой карте?
Это некоторые частные условия, которые решаются простыми булевыми выражениями.
0
9 / 9 / 0
Регистрация: 04.03.2015
Сообщений: 71
29.07.2016, 12:22
Я сейчас тоже занят созданием чего-то подобного.

Цитата Сообщение от Riischoreske Посмотреть сообщение
5. Как бы мне сделать загрузку карты из текстовых файлов или просто прописать в паскале (буквенно, а к соответствующей букве приделать блок определённого размера, свойство которого я пропишу, и к этому блоку,т.е. букве смогу прописать картинку),
Проблему загрузки карт в игру в обход парсинга текстовых файлов я, например, хочу решить с помощью .resx файлов. Как мне только что объяснили в соседнем топике форума, чтобы передавать ресурсы из одной программы в другую, надо дать возможность обоим программам(создающей и читающей) обращаться к одной библиотеке с типами этих ресурсов. То есть создаем библиотеку с классами, которые используются в твоей карте(персонажи, мобы и т.д.). В моем примере это будет библиотека testClasses.dll

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
unit testClasses;
 
interface
 
uses system, system.Resources, graphABC, system.drawing;
 
type
  //атрибут [serializable], указывающий компилятору на необходимость сериализации класса ниже
  [serializable]  
  testClass = class
  public
  number: integer;  
  text: string;
  //ВАЖНО: не все типы данных могут быть подвергуты сериализации. Например, тип system.drawing.Bitmap сериализовываь можно, а тип picture(как и большинство ABC-классов) - нельзя.
  //как узнать можно ли сериализовывать объект до компиляции программы мне неизвестно. 
  //При попытке сериализовать перемнную несериализуемого типа ты увидишь ошибку: Ошибка времени выполнения: Тип "тип, который не получилось сериализвовать" в сборке "блаблабла" не помечен как сериализуемый.
  btm: system.drawing.Bitmap; 
  [nonserialized] //в этом случае используется атрибут [nonserialized]
  pic: picture;
  constructor create(paramNumber: integer; paramText: string; paramPicPath: string);
  begin
    number := paramNumber;
    text := paramText;
    btm := new bitmap(paramPicPath);
  end;
end;  
  
implementation
end.
Теперь у нас есть динамическая библиотека с классами монстров, персонажей и прочего. Ее можно подключать к любой программе и пользоваться классами, там описанными.


С помощью следующего кода мы создаем файл ресурсов из сделанной нами карты:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
{$reference testClasses.dll}  //Обязательно подключаем к программе нашу библиотеку, чтобы мы могли к ней обращаться
uses system, system.Resources, graphABC, system.drawing;
 
var
  resWriter := new resXResourceWriter('testRes.resx');  //объект resource-maker
  tc := new testClasses.testClass(123, 'текст из класса', '1.png');  //объект типа testClass, что описан в библиотеке testClasses.dll, который будет добавлен в ресурсы. 
  
begin  
  resWriter.AddResource('textRes', 'текст123');  //добавляем в файл ресурсов произвольный текст
  resWriter.AddResource('testClassRes', tc);  //добавляем в файл ресурсов объект tc
  resWriter.Close; //после добавления всех ресурсов вызываем поцедуру close. Она сохраняет наш .resx файл
end.

С помощью следующего кода мы можем распаковывать и использовать ресурсы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{$reference testClasses.dll}  //Обязательно подключаем к программе нашу библиотеку, чтобы мы могли к ней обращаться
uses system, system.Resources, graphABC, system.drawing;
 
 
var
  resReader := new ResXResourceSet('testRes.resx');  //объект resource-reader
  s: string;  //переменная для произвольного текста
  tc: testClasses.testClass;  //объект типа testClass, что описан в библиотеке testClasses.dll, который будет добавлен в ресурсы.
 
 
begin
  s := resReader.GetString('textRes');  //получаем произвольный текст из ресурсов
  SetConsoleIO;
  writeln('textRes: ', s);  //выводим произвольный текст из ресурсов
  tc := testClasses.testClass(resReader.GetObject('testClassRes'));  //получаем готовый объект из ресурсов
  //пользуемся объектом из ресурсов
  writeln('testClass number: ', tc.number, 'testClass text: ', tc.text);  
  var
    bm:system.drawing.bitmap := tc.btm;
end.
1
 Аватар для Atomus
14 / 14 / 15
Регистрация: 21.08.2015
Сообщений: 48
08.08.2016, 09:56
Лучший ответ Сообщение было отмечено Riischoreske как решение

Решение

Цитата Сообщение от Riischoreske Посмотреть сообщение
5. Как бы мне сделать загрузку карты из текстовых файлов или просто прописать в паскале (буквенно, а к соответствующей букве приделать блок определённого размера, свойство которого я пропишу, и к этому блоку,т.е. букве смогу прописать картинку)
Я это делал так
1
0 / 0 / 0
Регистрация: 20.07.2016
Сообщений: 4
21.08.2016, 14:30  [ТС]
по своему же списку:

1. Перемещение персонажа по карте - РЕШЕНО.
2. Анимация- РЕШЕНО.
3. загрузка аудиофайлов - РЕШЕНО.
4. загружать звуки в массив - НЕ РЕШЕНО
5. Загрузка карты из текстовых файлов - РЕШЕНО
6. скроллинг карты - РЕШЕНО
7. Повисание игры при смене уровней - НЕ РЕШЕНО
8. и пока основной - главный вопрос.
сейчас скорость приложения зависит не от времени, а от скорости работы компьютера или тип того.
если действия привязывать к таймерам, то вообще всё тупит по полчаса.
можно ли это как то привязать ко времени? на примере кода желательно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2016, 14:30
Помогаю со студенческими работами здесь

2D платформер
Помогите сделать 2D платформер (Ссылка на сторонний ресурс удалена) Не получается физика столкновения с платформой и одновременное...

Платформер
Здравствуйте, начал изучать SFML библиотеки по вот этому уроку ----> http://www.youtube.com/watch?v=T6o5OlgsCew Но при первой проверки...

Время на платформер
Всем доброго времени суток! Думаю начать учить с++. Вот думаю если сделать платформер, сколько примерно времени уйдет на его создание, если...

Платформер с анимацией
Всем привет!!! Делаю платформер на андроид, но у меня сложности с бегом персонажа. Если кому не сложно помогите мне! мне нужно сделать так,...

Платформер на С++ и SFML
Вообщем. Сделал платформем. Есть проблема с переходом с уровня на уровень. Кто создавал игры на с++ с использованием SFML. Помогите...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru