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

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

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

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

В общем: Я не программист, но захотелось самому склепать 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 Кб, 247 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2016, 00:56
Ответы с готовыми решениями:

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

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

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

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

4
5084 / 2655 / 2350
Регистрация: 10.12.2014
Сообщений: 10,047
27.07.2016, 08:15 2
Цитата Сообщение от Riischoreske Посмотреть сообщение
4. Можно ли звуки загружать не построчно, а как картинки - в массив? вообще есть ли в паскале массив звуковых файлов?
Почему бы и нет?
Конечно можно!

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

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

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

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

Цитата Сообщение от 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
14 / 14 / 15
Регистрация: 21.08.2015
Сообщений: 48
08.08.2016, 09:56 4
Лучший ответ Сообщение было отмечено Riischoreske как решение

Решение

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

1. Перемещение персонажа по карте - РЕШЕНО.
2. Анимация- РЕШЕНО.
3. загрузка аудиофайлов - РЕШЕНО.
4. загружать звуки в массив - НЕ РЕШЕНО
5. Загрузка карты из текстовых файлов - РЕШЕНО
6. скроллинг карты - РЕШЕНО
7. Повисание игры при смене уровней - НЕ РЕШЕНО
8. и пока основной - главный вопрос.
сейчас скорость приложения зависит не от времени, а от скорости работы компьютера или тип того.
если действия привязывать к таймерам, то вообще всё тупит по полчаса.
можно ли это как то привязать ко времени? на примере кода желательно
0
21.08.2016, 14:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.08.2016, 14:30
Помогаю со студенческими работами здесь

Платформер
Здравствуйте, начал изучать SFML библиотеки по вот этому уроку ---->...

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru