forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Библиотеки (http://forum.boolean.name/forumdisplay.php?f=124)
-   -   Lib_arcade - Аркадные игры это просто (http://forum.boolean.name/showthread.php?t=11783)

odd 24.01.2010 04:58

Lib_arcade - Аркадные игры это просто
 
Вложений: 9
Перед созданием игры нужно прежде всего понять, что каждая игра состоит из собственно игрового мира и персонажей, которые передвигаются по этому игровому миру.

Для начала поговорим об игровом мире. Практически во всех играх игровое пространство представляет собой прямоугольник, состоящий из множества повторяющихся картинок (спрайтов). Другими словами представьте, что весь игровой мир можно нарисовать на листочке в клеточку. Тогда весь мир будет прямоугольником из M столбцов и N строк. Ну а в каждой клетке изображена какая-то маленькая часть игрового мира. Усвоили? Ну тогда приступаем к работе.

Для начала нам потребуются спрайты(картинки) с изображением частей нашего игрового мира. У меня уже была такая готовая картинка под рукой и я буду использовать её, а вы можете нарисовать собственную. Мой набор спрайтов выглядит так:


Ну а вы можете нарисовать что-то на своё усмотрение, главное чтобы спрайты были квадратными (хотя честно говоря и это не обязательно, но для простоты условимся, что все наши спрайты будут квадратными). Количество и расположение спрайтов в файле может быть произвольным. Формат файла: сохраните в двух экземплярах в форматах PNG (для использования в самой игре) и BMP. Зачем это нужно - позже поймете.

Теперь приступим к созданию карты нашего игрового мира.
Для этого запускаем программу Mappy. Вот что мы увидим при первом запуске:


Для начала нужно создать новую карту. Для этого нажимаем:
File --> New map... и видим вот такое окошко:


Поясню что тут нужно вводить:
Во первой строчке указываем ширину и высоту спрайтов, с помощью которых мы и будем рисовать нашу карту. В моем случае размер спрайта 40 * 40 точек, но у вас может быть и совершенно другим.
Во второй строке вводим два числа - это ширина и высота создаваемой карты в клетках. В нашем случае это 24 * 24, но вы можете указать любые размеры. Всё, нажимаем на OK для создания новой карты.

Теперь добавим в программу наш набор спрайтов. Для этого нажимаем:
File --> Import и выбираем наш BMP файл со спрайтами игрового мира.
Дело в том, что программа Mappy создавалась очень давно, так что формат PNG она плохо понимает, поэтому приходится использовать BMP, но в нашем случае это совершенно не важно. Всё, теперь можно приступать к рисованию карты. Для этого выбираем в правом окне нужный спрайт, а в левом окне рисуем как обычной кистью нашу карту. У меня вышло примерно следующее, ну а вы можете проявить свою фантазию:



Когда вдоволь нарисуетесь и уровень нашей будущей игры будет наконец готов, приступим к сохранению нашего шедевра. Для этого нажимаем на кнопку:
File --> Save As... и назовём нашу карту ну скажем 1.FMP, но нас не интересует полученный файл. Самое главное не забудьте потом нажать на
File --> Export и поставьте галочку напротив строки "Map array as comma values only (?.CSV)" и нажмите ОК. Вот этот файл 1.CSV нам и будет нужен.

Теперь приступим к созданию спрайтов героя игры.
Я особо не стал заморачиваться и на скорую руку накалякал 4 кадра движения героя.


Вы можете добавить кадров и намного больше и красивее. Я в вас нисколько не сомневаюсь.

Всё, приступаем к созданию самой игры. А для этого нам потребуется новая библиотека Lib_arcade. Опишем вкратце новые функции, которые поддерживает данная библиотека:

NewMap(w: integer; h: integer; im: image; sw: integer; sh: integer) - Создать новую карту
w - ширина карты в клетках,
h - высота карты в клетках
im - картинка со спрайтами карты
sw - ширина каждого спрайта в пикселах
sh - высота спрайта в пикселах

LoadMap(s: string) - загрузить карту
s - строка, где перечислены через запятую все номера спрайтов, использованных в карте в порядке слева-направо и сверху-вниз.
Нумерация спрайтов идет с единицы.

LoadCSV(fname: string) - Загрузить CSV файл с картой
fname - имя CSV файла

PlaceMap(x: integer; y: integer) - сдвинуть карту в требуемую точку
x, y - кординаты точки на дисплее, которые соответсвуют левому верхнему углу карты

DrawMap - Отрисовать карту (нужно ещё вызывать Repaint чтобы карта стала видимой)

CenterCell(x: integer; y: integer) - Отцентровать карту на экране относительно некой клетки на карте
x, y - координаты клетки

MoveMap(x: integer; y: integer) - Сдвинуть карту
x - перемещение по оси X в пикселах (может быть как положительным так и отрицательным)
y - перемещение по оси Y в пикселах (может быть как положительным так и отрицательным)

SetCell(x: integer; y: integer; n: integer) - Записать в клетку карты новый номер спрайта
x, y - координаты клетки
n - новый номер спрайта

integer GetCell(x: integer; y: integer) - Прочитать номер спрайта в клетке с координатами (x, y)

AddSprite(im: image; w: integer; h: integer) - Загрузить набор спрайтов
im - картинка с набором спрайтов
w - ширина спрайта
h - высота спрайта
Всем загружаемым наборам спрайтов присваиваются номера с 0 и выше.

NextFrame(n: integer) - Сдвинуть на 1 кадр указатель текущего спрайта для набора спрайтов
n - номер набора спрайтов

SetFrame(n: integer; f: integer) - Установить конкретный номер кадра для набора спрайтов
n - номер набора спрайтов
f - номер требуемого кадра

SpritePosition(n: integer; x: integer; y: integer) - Установить позицию куда будет выводиться спрайт
n - номер набора спрайтов
x, y - координаты левого верхнего угла спайта

DrawSprite(n: integer) - Нарисовать спрайт на экране
n - номер набора спрайтов

RemoveSprites - Очистить весь массив с наборами спрайтов

Ну и в качестве примера использования библиотеки приведу маленький пример игры. В игре вы можете передвигать по лабиринту маленького человечка и собирать алмазы. За каждый алмаз начисляется 100 очков. Вот исходный код (кому впадлу набирать, можете скачать его ниже):

PHP код:

Program ArcadeDemo;
Uses arcade;
Var    
xyscorekeyinteger;
        
pboolean;

Procedure DrawAll;
begin
    SetColor
(000);
    
FillRect(00GetWidthGetHeight); // Очистка экрана
    
CenterCell(xy); // Центрируем карту относительно главного героя
    
DrawMap// Отрисовываем карту
    
DrawSprite(0); // Отрисовываем героя
    
NextFrame(0); // Следующий кадр для героя
    
SetColor(255255255); 
    
DrawText('SCORE: ' score33); // Рисуем количество очков
    
Repaint;
    
p:=false// Сброс флага отрисовки
end;

Function 
Step(dxintegerdyinteger): boolean// Тут у нас проверка можно ли ходить в эту клетку
begin
    Step
:=true;
    if ((
dx 1) or (dy 1) or (dx 23) or (dy 23)) then Step:=false;
    else
    
begin
        
if (GetCell(dxdy) > 3then Step:=false;
    
end;
    if (
GetCell(dxdy) = 3then score:=score+100// Если это алмаз, то прибавляем очки
end;

Begin
    NewMap
(2424LoadImage('/s1.png'), 4040); // Создаем новую карту
    
LoadCSV('/1.CSV'); // Загружаем файл с картой
    
x:=1y:=1// Начальные координаты героя
    
score:=0// Очки пока равны нулю
    
AddSprite(LoadImage('/hero.png'), 4040); // Загрузка спрайтов главного героя
    
SpritePosition(0GetWidth/220GetHeight/220); // Устанавливаем позицию куда выводить спрайт
    
p:=true// Это флаг того нужна ли перерисовка экрана
    
While(true) do // Бесконечный цикл
begin
    
if (pthen DrawAll;    
    
key:=KeyToAction(GetKeyClicked);    
    if (
key GA_LEFTthen if (Step(1y)) then begin x:=x-1p:=trueSetCell(xy1); end;
    if (
key GA_RIGHTthen if (Step(1y)) then begin x:=x+1p:=trueSetCell(xy1);  end;
    if (
key GA_UPthen if (Step(x1)) then begin y:=y-1p:=trueSetCell(xy1);  end;    
    if (
key GA_DOWNthen if (Step(x1)) then begin y:=y+1p:=trueSetCell(xy1);  end;
    
Delay(50);
end;    
End

Вот скриншот из игры:


Как видите, всего 50 строк кода, а готова практически уже законченная игра.
На досуге попытайтесь расширить эту игру введя в неё несколько уровней или попробуйте добавить расчет каждого алмаза или валуна на падение (то есть после каждого шага героя пробегаетесь по массиву клеток и если под валуном или алмазом пустая клетка, то сдвигаете этот валун/алмаз вниз).

cherepets 24.01.2010 10:40

Ответ: Lib_arcade - Аркадные игры это просто
 
круто)) есть вопросы:
1) а платформер можно сделать на этой либе?
2) мап едитор сам писал или нашел подходящий и подстраивался под его формат (мне важно т.к. тоже хочу редактор сделать, но с дельфи пока не все так хорошо)

im_zorg 24.01.2010 10:54

Ответ: Lib_arcade - Аркадные игры это просто
 
спс рульная либа а редактор переводит в *.txt(типо
11111111
11233344
11111111?)

cherepets 24.01.2010 12:28

Ответ: Lib_arcade - Аркадные игры это просто
 
у меня мой редактор вылетает при попытке посимвольного чтения из файла. в чем может быть дело?
типы переменных:
Код:

var i,j:integer;
    fl:textfile;
    c:array [1..25,1..25] of char;
    temp:char;

сам код:
Код:

for j:=1 to 25 do
for i:=1 to 25 do
  begin
    Read(fl,temp);
    if temp<>chr(10) then if temp<>chr(13) then c[i,j]:=temp;
  end;


im_zorg 24.01.2010 13:37

Ответ: Lib_arcade - Аркадные игры это просто
 
это делфи?

cherepets 24.01.2010 13:48

Ответ: Lib_arcade - Аркадные игры это просто
 
да)
если не выйдет, буду делать как я обычно делаю - турбо паскаль + граф + грмаус.
просто охота сделать редактор примерно как этот...

cherepets 24.01.2010 19:55

Ответ: Lib_arcade - Аркадные игры это просто
 
все, нафигачил я свой редактор на паскале с графом и без мыши. результат - жесть, но работает норм и достаточно удобный)))

DIMMON4IK 24.01.2010 20:57

Ответ: Lib_arcade - Аркадные игры это просто
 
НУ знач покаж :)

Платформер - проверяй есть под игроком пол или нет, если нет то делай падение вниз -- можно

odd 25.01.2010 02:39

Ответ: Lib_arcade - Аркадные игры это просто
 
Честно говоря я перепробовал по крайней мере 3 редактора карт.
Этот самый оптимальный из всех опробованных. Потом либу уже подгонял под этот редактор.
Думаю ещё можно добавить детектор столкновения спрайтов для полного счастья.

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

cherepets 25.01.2010 09:02

Ответ: Lib_arcade - Аркадные игры это просто
 
для платформера наверно карту надо делать большую с маленькими тайлами?
вот, кстати, смейтесь:
http://10pix.ru/img1/4235/732267.png

KeipL 25.01.2010 12:57

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от cherepets (Сообщение 134710)
для платформера наверно карту надо делать большую с маленькими тайлами?
вот, кстати, смейтесь:
http://10pix.ru/img1/4235/732267.png

выглядит довольно многообещающе))

2odd Релиз такой библиотеки - это очень круто. Прочитав название темы библиотеки - подумал фейк, увидел ядом твой ник. Открыл тему. Глага сделались как у смайла в шапке темы.

odd 25.01.2010 16:08

Ответ: Lib_arcade - Аркадные игры это просто
 
Библиотеку ещё можно доработать.
Можно сделать 2 карты: одну с фоновым рисунком, а другую для описания препятствий (стены, платформы). К тому же неплохо бы добавить детектор столкновения спрайтов, тогда это будет уже что-то.

dess 25.01.2010 19:25

Ответ: Lib_arcade - Аркадные игры это просто
 
спасибо за либу

odd 26.01.2010 04:46

Ответ: Lib_arcade - Аркадные игры это просто
 
Вложений: 2
Немного доработал либу. Добавил возможность вращения спрайтов, детектор столкновения спрайтов и немного улучшил работу с клетками карты.

В придачу к библиотеке прикладываю ещё один пример набросков игры типа ПАКМАН. Код игры очень похож на первый, но улучшено движение спрайта главного героя (более плавнее и с использованием функции вращения спрайта).



LLI.T.A.L.K.E.R. 01.02.2010 20:32

Ответ: Lib_arcade - Аркадные игры это просто
 
Кажется здесь используется псевдо-перемещение игрока?
Сначала хотел спросить где же связь x,y с позицией игрока в if (key = GA_ ) then и SpritePosition(x,y например)

А оказывается управляется какая-то точка, а игрок просто стоит по центру. И ещё есть точка для карты и для клеток (это в MoveMap и SetCell)
В общем думаю Марио так трудно будет смастерить. :crazy:

odd :rolleyes: пока мне не совсем понятна система позиционирования в Lib_arcade.

Сделай наглядный пример Марио, если это возможно (можно и без физики).
Я не ленивый, просто не очень то и разберёшься когда не понятно и не удобно.

А за либу конечно СПАСИБО

odd 02.02.2010 19:39

Ответ: Lib_arcade - Аркадные игры это просто
 
Система позиционирования такая:
Можно выводить карту тупо как хочешь с помощью PlaceMap (отрисовывать любой участок). Можно выводить карту по какой-то клетке внутри карты CenterCell (при этом данная клетка будет отображаться в центре экрана).
Спрайты не привязаны к карте и их можно выводить где угодно. Сделано так специально, потому что спрайты могут быть не только для отображения героев игры, но и для других целей, скажем для отображения количества жизней, энергии и проч. Да и если привязать спрайты к карте, то тогда можно будет двигаться только по клеткам, без плавности, а это плохо.

В примере при движении сдвигается карта, но сам герой стоит на месте.
Но тебе никто не запрещает двигать игрока, а карту не двигать, или сдвигать карту если герой попытается зайти за край экрана. Всё это условности и всё легко реализуется.

LLI.T.A.L.K.E.R. 21.02.2010 11:25

Ответ: Lib_arcade - Аркадные игры это просто
 
Похоже необходимо следущее, например в проекте подобному "Героям М&М" или пошаговых стратегий.
1) Как лучше использовать отображения вражеских персонажей?
  • а) отображение с помощью "клетки" - тогда неоходимо определить координаты клетки по экрану. Т.е. например клетка 17x17 под номером (3,1) =~ 68,17 в экранных пикселях.
    Тогда нужна функция например GetCellX и GetCellY.
  • б) отображение с помощью "спрайта" - тогда кажется необходимо наоборот получение клетки по позиции спрайта (пока не могу осмыслить на сколько это необходимо)
Всё это нужно для того например, если надо отобразить количество жизни или войск (как в героях) у клетки или спрайта в их координатах.

2) Возможно ли прикрепить второй массив информации клеток и/или спрайтов для лучшей совместимости? Хотя кажется лучше самому создавать его (просто, я пока не пробовал в МП массивы).
Думаю так будет облегчение по привязкам данных если сразу в либе, но всё-таки не возможно определить заранее кол-во данных (такие как жизни, деньги, войска и т.д.)

odd 21.02.2010 11:37

Ответ: Lib_arcade - Аркадные игры это просто
 
1. Энергию, деньги, координаты и прочую информацию по каждому спрайту удобнее хранить в мессиве [0..N] желательно для этого создать отдельную запись типа record
2. Тебе скорее подойдет отображение с помощью клеток (координаты в пикселях подсчитаешь сам) и спрайты все же привязывать к клеткам, но при движении с клетки на клетку спрайт нужно плавно передвигать, а не прыжком, тогда будет нормально. В любом случае почти все походовки основаны на клетках.

Sand 22.02.2010 16:35

Ответ: Lib_arcade - Аркадные игры это просто
 
lib клевая ток когда я скидываю приложение на телефон карта не отрисовывается?
Что делать?

Sand 22.02.2010 16:42

Ответ: Lib_arcade - Аркадные игры это просто
 
в эмуляторе все робит.

odd 22.02.2010 17:05

Ответ: Lib_arcade - Аркадные игры это просто
 
Проверь настройки программы. Должен стоять профиль MIDP 2.0

Sand 22.02.2010 18:53

Ответ: Lib_arcade - Аркадные игры это просто
 
Спс все робит

Sand 23.02.2010 15:04

Ответ: Lib_arcade - Аркадные игры это просто
 
не чет не робит серавно?? вот можт что в самом мидлете??

Sand 23.02.2010 15:17

Ответ: Lib_arcade - Аркадные игры это просто
 
Вложений: 1
вот скрин даже с телефона

Sand 23.02.2010 15:28

Ответ: Lib_arcade - Аркадные игры это просто
 
или на нокиях это болезнь

odd 23.02.2010 22:42

Ответ: Lib_arcade - Аркадные игры это просто
 
Разберемся...

LLI.T.A.L.K.E.R. 26.02.2010 21:33

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от Sand (Сообщение 139001)
вот скрин даже с телефона

на Самсунг J210 всё нормально :super:

Sand 27.02.2010 08:22

Ответ: Lib_arcade - Аркадные игры это просто
 
Ладно буду делать для других телефов СПАСИБО ОДДУ ЗА ЛИБУ!!!

im_zorg 27.02.2010 17:39

Ответ: Lib_arcade - Аркадные игры это просто
 
А у меня нормально всё нокиа 3110с

odd 01.03.2010 13:50

Ответ: Lib_arcade - Аркадные игры это просто
 
Попробуйте в манифесте поставить MIDP 2.0 и CLDC 1.1 должно работать.

im_zorg 08.03.2010 19:00

Ответ: Lib_arcade - Аркадные игры это просто
 
у меня с MIDP 1.0 и foulscreen MIDP 2.0 и спокойно робит загрузка быстрее чем с MIDP 2.0 на реальном телефоне)))

NetBuilding 26.08.2010 20:10

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

кто нибудь еще пробовал загружать такие большие наборы спрайтов и рисовать карты?
почему такая фигня получается?






odd 28.08.2010 18:06

Ответ: Lib_arcade - Аркадные игры это просто
 
Первый спрайт в спрайтпаке должен быть пустым. Переделай немного спрайтпак и всё будет работать нормально.

FBI 09.03.2011 13:05

Ответ: Lib_arcade - Аркадные игры это просто
 
Сделай проверку на остаток спрайтов на карте. то есть например: какой нибудь спрайт у нас как бы еда например, после того как его хаваешь он пропадает с карты, и если все такие спрайты схаваешь, то переход на вторую миссию. а то трудновато как то!:)

odd 12.03.2011 17:49

Ответ: Lib_arcade - Аркадные игры это просто
 
Вложений: 1
Добавил функцию CountCell(n: integer) которая подсчитывает количество спрайтов определенного номера n на карте. Для игр где нужно собрать все алмазы (или другие спрайты) на карте и т.п.

FBI 15.03.2011 14:26

Ответ: Lib_arcade - Аркадные игры это просто
 
Благодарю:)

Twice 20.03.2011 15:16

Ответ: Lib_arcade - Аркадные игры это просто
 
хм.. белый экран..

odd 22.03.2011 15:27

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от Twice (Сообщение 183328)
хм.. белый экран..

На Нокии тестировали?

Twice 22.03.2011 19:56

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от odd (Сообщение 183470)
На Нокии тестировали?

На эмуляторах

aL1fe 01.09.2011 12:48

Ответ: Lib_arcade - Аркадные игры это просто
 
Уважаема администрация или пользователи у кого сохранилась основная статья в первом посте. Обновите пожалуйста картинки, а то они не отображаются. Очень хотелось бы почитать.

odd 07.09.2011 20:13

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от aL1fe (Сообщение 200806)
Уважаема администрация или пользователи у кого сохранилась основная статья в первом посте. Обновите пожалуйста картинки, а то они не отображаются. Очень хотелось бы почитать.

Да, сгинул мой сайт со всеми картинками. Могу наделать новых, только свой первый пост я редактировать не могу. Может ViNT поможет. Картинки могу предоставить заново.

aL1fe 08.09.2011 18:30

Ответ: Lib_arcade - Аркадные игры это просто
 
А вы продублируйте все здесь в новом сообщении, а модераторы потом перенесут в первый пост.

odd 13.09.2011 21:14

Ответ: Lib_arcade - Аркадные игры это просто
 
Вложений: 6
Вот все картинки. Их нужно вставить в первый пост.

aL1fe 14.09.2011 16:31

Ответ: Lib_arcade - Аркадные игры это просто
 
Пасиба.

ViNT 17.09.2011 01:01

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от odd (Сообщение 202249)
Вот все картинки. Их нужно вставить в первый пост.

Обновил первый пост.

iamempty 09.11.2011 16:40

Ответ: Lib_arcade - Аркадные игры это просто
 
Цитата:

Сообщение от odd (Сообщение 201603)
Да, сгинул мой сайт со всеми картинками. Могу наделать новых, только свой первый пост я редактировать не могу. Может ViNT поможет. Картинки могу предоставить заново.

скажите, это последняя версия вашей библиотеки из существующих на данный момент?


Часовой пояс GMT +4, время: 06:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot