forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   The Maze (http://forum.boolean.name/showthread.php?t=4621)

aureli0 01.10.2007 20:47

исходники The Maze (псевдо 3d)
 
Вложений: 4
Вариация на тему Eye of Beholder. Мож кому и пригодится.

dector 28.10.2007 00:28

Re: The Maze
 
Думаю пригодится.
Спасибо.

abcdef 01.11.2008 18:37

Ответ: The Maze
 
Вложений: 1
Спасибо за исходник! интересный движек игры. не удержался и переделал в более понятный и простой вариант. понравилась идея подстраивать скорость игры под заданный FPS (кол-во кадров в секунду).

Немного изменил логику, наложение спрайтов и пересчет задержки, все реализовано без внешних java-библиотек.

Теперь только добавить противников,их логику и будет неплохая игра ;)

Phantom 10.11.2008 05:19

Ответ: The Maze
 
Кстати, видел подобную игру. Даже не подобную. Я бы сказал, практически копия. Не помню как называлась. Там было несколько уровней и карту можно было смотреть вроде на решётку. И в карте было открыто только то, где ты уже ходил (вроде, точно не помню). Помнится, с неделю у меня на мобиле стояла эта игра (с детства обожаю всякие лабиринты!!!), но так как все уровни в итоге знал наизусть - удалил =) Года два назад это было, оформление было всё такое зелёное вроде, стены зелёные, тёмно-зелёные. Названия не помню. Но ооочень похоже на твой движок. Я тогда целый день в инете искал лабирант какой-нибудь на телефон ))))))))))))) И вот нашёл. Очень интересная идея! 3D в 2D. Круто! МегаРеспект и зачот!

Romanzes 10.11.2008 11:46

Ответ: The Maze
 
Я тоже люблю такие игрушки. Вот некоторые:
Doom RPG
Orcs and Elves

Tadeus 10.11.2008 11:56

Ответ: The Maze
 
Байанистые игрушки :) Играли все кому не лень.

Phantom 10.11.2008 22:30

Ответ: The Maze
 
Не. В Дум раньше играл, а вторую впервые вижу. В них же вроде ТРУ 3D заюзано? Дум страшно тормозил на семёне. А тут выложен 2D двиг, который эмитирует 3D!!! На семёне летает!!! А если ещё сделать пару промежуточных кадров, чтобы каждый шаг плавно происходил, то вообще класс будет!!! Может быть займусь этим. только на Java. Можно попробовать даже либу-двиг для МП написать =) Вот только проблематично будет противников сделать. Разве что просто по лабиранту ходить. У кого-нибудь есть мысли какие-нибудь?

Phantom 11.11.2008 00:51

Ответ: The Maze
 
Кстати, на сименсе запускаю этот лабиринт и все прозрачные места картинок залиты красным цветом. На эмуле нормально, а насименсе такая вот фигня. В чём дело?

Romanzes 11.11.2008 20:12

Ответ: The Maze
 
В них не Тру 3D. Это псевдо-3D.
Цитата:

Может быть займусь этим. только на Java.
Эээ... я уже давно это задумал делать. Специально джаву для этого учу. Так что не воруй у меня хлеб :)

Phantom 11.11.2008 22:55

Ответ: The Maze
 
О_о реально что ли там псевдо 3D??? Ща расшарю.
- - -
А это, в Java вообще есть ТРУ 3D? Есть ведь вроде какие-то библиотеки для создания сцен и 3D объектов?

abcdef 12.11.2008 11:32

Ответ: The Maze
 
когда-то делал 3D игру полностью весь движек и остальное. На одной клавиатура можно было играть от 1 до 4 игроков плюс боты... но времена MS-DOS прошли. Программы в телефон примерно тоже самое. Создание игры в телефоне делится на две группы: либо используюте встроенные библиотеки,-тогда не на всех телефонах будет работать, либо пишете движек для вывод изображения в двухмерный массив а потом сбрасываете его на экран -работать будет везде и нормально если правильно сделать

Romanzes 12.11.2008 18:02

Ответ: The Maze
 
Java 3D есть. Это JSR 184. Но я хочю сделать именно псевдо-3D.

Phantom 12.11.2008 18:08

Ответ: The Maze
 
abcdef, хз-хз. Не видел ни одной TRUE 3D java игры, которая шла бы нормально на сименсе. Я, например, не представляю, как можно на лету наклонять в перспективе изображения, чтобы это не повлияло на скорость. Точнее я вообще не представляю, как пересчитать пиксели картинки в массиве, чтобы получилась наклонная картинка, но даже если это сделать, то сименс будет ооочень медленно это делать. А так как у меня за всё время было только два телефона, один из них Soney Ericsson T290i, который вообще java не поддерживает, а остальные - сименсы, поэтому меня не волнуют другие мобилы, если на моей это будет тормозить. =)

abcdef 12.11.2008 21:34

Ответ: The Maze
 
Вложений: 1
Вот простой исходник и компиленная демка 3D-мира.
Сделана не мной, я немного перерабатывал в более простой вид.
Cкачивал с http://www.gamedev.ru/download/ там еще были: 3D-танк; охота за птицами; shooter c динозавром... но сейчас ссылка на этот файл не работает.
Здесь представлен один из базовых алгоритмов вывода 3D-грани с наложением текстуры и использованием Z-буфера.
_______
Если это реализовать для телефона, то нужно составлять несложную карту с минимальным кол-вом граней, потому что отрисовка отнимает много времени.

вот некоторые 3D игры, которые работают на моей моторолле, где медленная java-машина и нет 3D библиотек: DungeonWarrior; 3D_Paintball; MDoom; tutanhamon_3d. Также есть группа игр, где псевдо-3D изображение реализованно когда камера смотрит на игрока сверху-сбоку такие игры работают довольно быстро.

Romanzes 12.11.2008 23:04

Ответ: The Maze
 
Занятно! Я сейчас пытаюсь сделать нечто подобное на java. Когда сделаю, обязательно выложу :)

Phantom 13.11.2008 01:00

Ответ: The Maze
 
Ща скачаю. Ну под TRUE 3D я подразумеваю любое 3D, где реально происходит наклон картинок в перспективе. А псевдо 3D - это как в The Maze, там все наклоны отрисованы в отдельные картинки и сохранены. =)
- - -
Через минуту:
EXEшник показывает чёрный экран, а паскаль я не знаю и компилятора нет :@

jimon 13.11.2008 01:16

Ответ: The Maze
 
тру 3д это на улице, у телефона экран 2д

abcdef 13.11.2008 01:30

Ответ: The Maze
 
DOS-программы ведут себя не предсказуемо в windows линейки NT, бывает перестановишь, и вообще в полноэкранном режиме отказываются работать, хотя до этого все было OK, бывает на 2-й раз запускается... а вообще скачай эмулятор DosBox, или загрузись с дискеты и запускай...

Phantom 13.11.2008 14:30

Ответ: The Maze
 
jimon, блин, ну неужели не понятно, что я имею ввиду?

Romanzes 16.11.2008 20:49

Ответ: The Maze
 
Вложений: 1
Я наконец смог придумать функцию, которая наклоняет картинку в пространстве. Правда, еще не оптимизировал.

Phantom 17.11.2008 04:43

Ответ: The Maze
 
О_о Я даже не представляю, как это сделать... Хотя...Сначала сжать по горизонтали, пересчитать все пиксели в каждой строке на основании новой ширины рисунка, потому пересчитывать каждый столбик отдельно, в зависимости от его высоты (высота в данном случае будет разная у всех столбиков). Типа так. А ещё можно даже не пересчитывая. Просто выбрасывать лишние пикселы, ну а если растягивать картинку, то просто заменять новые пикселы такого же цвета, как и соседние. Во блин. А до этого момента даже в голову не приходило как это работает =)

jimon 17.11.2008 10:58

Ответ: The Maze
 
Phantom_wc
по ищи формулы основ 3д графики - перевод 3д координаты в 2д кооридануту на екране, сможешь сделать банальное проволочное 3д (крутить 3д кубик из линий на екране)
так же сможешь найти как рендерить полигон с текстурой

Phantom 17.11.2008 15:35

Ответ: The Maze
 
jimon, так дело-то в том, что я к этому и не стремлюсь. Я не занимаюсь игроделаньем. И мысль была сделать именно так, как сделан этот проект в первом посте, потому что не требуется высокая производительность. А вот пример Романзеса с вращающейся в перспективе картиннкой на моём сименсе воспроизводится с трудом. Да и пока некогда и этим заниматься. =(

abcdef 18.11.2008 21:00

Ответ: The Maze
 
Неплохая идея сделать игру на основе voxel'ого движка (кто не знает - отрисовка карты из двухмерного массива, в котором элементы - это высота точки на карте, столбцы либо разукрашиваются в зависимсти от высоты. Либо на рельеф накладывается рисунок как в предложенном примере.
home page: http://delphi6games.narod.ru/prim.htm
download_url: http://delphi6games.narod.ru/prim/voxel.rar

Для нормальной компиляции в Delphi локальную переменную
rotate:integer=0; перенесите в область глобальных переменных примерно так:
_____________
Var
{Cosine and Sine tables}
CosT, SinT : Array [0..2047] of Integer;
{Distance compensation table}
DComp : Array [1..Depth + 1] of Integer;

iMap:array[0..$FFFF] of byte;
hMap:array[0..$FFFF] of byte;
rotate:integer=0;
_________________

abcdef 21.11.2008 22:06

Ответ: The Maze
 
Вложений: 1
Сегодня на работе занимался дуракавалянием, под руку попался на кануне скачанный picture3D.zip от Romanzes.
Переделал под MIDletPascal без дополнительных java-библиотек.
интересно, что хотя я добавил много дополнительного кода, но jar-файл получился на 10% меньше чем предоставленная java-версия.
Работает медленнее раза в 3 чем java-аналог, впрочем для MIDletPascal это нормально.
__________
Идеи (от arT) реализованные в данной программе:
1. Загрузка 256-цветных bmp файлов в байтовый массив и работа с ним
2. Загрузка чисел из текстовой строки, числа разделяются любым кол-вом символов, которые не в диапазоне '0'..'9' (т.е. не являются числом)
_ Примечание: команды сохраниения константных массивов равносильны одиночным присваиваниям и каждая занимает в памяти около 7 байт, поэтому лучше загружать данные из ресурсов или конвертировать из строки.
____
p.s. полностью 3D-алгоритм реализовать в MIDletPascal вредно, для этого подходит только java, притом с хорошей оптимизацией методов/идей и алгоритма..

Romanzes 22.11.2008 13:00

Ответ: The Maze
 
Я как раз думал о том, что очень хорошо бы было пользоваться 256-цветной палитрой. Вот в чем прикол: я в java-программе для отрисовки картинки пользуюсь функциями getRGB и drawRGB, которые юзают массив чисел int. Каждое число занимает 4 байта. В картинке >6000 пикселей. Получается, что этот массив в памяти занимает больше 24 Кб. Кроме того, программа наверняка будет работать гораздо быстрее с числами byte, нежели чем с int. Я даже декомпилировал стандартные классы j2me, чтобы посмотреть реализацию этих функций, и написать свои :) , но там написано вот что:
public native void drawRGB(int ai[], int i, int j, int k, int l, int i1, int j1, boolean flag);
Если кто знает, как реализовать загрузку и отрисовку массива пикселей в формате byte, пишите.
Прога на Midlet Pascal работает медленнее скорее всего потому, что для отрисовки используется процедура plot, которая в МП реализована через рисование квадрата размером в 1 писксель :-D.

abcdef 22.11.2008 21:59

Ответ: The Maze
 
Вложений: 1
Romanzes - основа 3D - это 3-x-трехугольная грань, потому что проще расчитывается, все изображения строятся на ее основе.

Быстрее чем getRGB и drawRGB врятли получиться. Integer - родной тип java-машины, с другими даже меньшими типами она дольше работает. Тип byte служит только для того чтоб занимать в памяти меньше места. Поэтому прийдется пожертвовать объемом памяти в пользу производительности.
___
plot - это обертка, писал для наглядности, а вообще оптимальнее писать так: fillRect(x,y,1,1); немножко оптимизировть это сократить кол-во циклов, поэтому можно напрямую выводить на экран, а не во временный массив
___
об оптимизации функцию sin, лучше переписать так:
function sin(angle:integer):integer;
begin
sin:=0;
angle:=angle mod 360;
if (angle<0) then angle:=360+angle;
if (angle<=90) then sin:=sintab[angle]
else if (angle<=180) then sin:=sintab[180-angle]
else if (angle<=270) then sin:=-sintab[angle-180]
else sin:=-sintab[360-angle];
end;
___
и еще везде где возможно расчитывайте заранее все выражения, которые не изменяются в цикле, а еще старайтесь чтобы смещение в массивах было инкрементным, а не с помощью вычислений..
___
p.s. Выкладываю свою версию проволочного 3D-куба.

abcdef 25.11.2008 21:52

Ответ: The Maze
 
Вложений: 1
Заинтересовала идея воксельного движка. Вот мои наработки: Лунный звездолет в MIDletPacal. Реализовано без внешних java-библиотек.

Но программа все-таки работает медленно, оптимизации требует переработка вывода графики с поточечного режима на getRGB и drawRGB.

Если добавлять логику, что еще приведет к снижению производительности, то необходимо уменьшить размеры экрана вывода, чтобы меньше точек пересчитывалось.
___
p.s. у кого какие идеи, можно сделать стрелялку или что-нить подобное только нужны дизайнеры и интересные задумки

FISHY 26.11.2008 02:10

Ответ: The Maze
 
Sorry I don't speak much Russian.

Nice work on the voxel engine and the 3D cube. The best approach would be to use a raycaster, like the one used in Duke Nukem 3D, this build engine worked on processors as slow as a 66MHz, 486. The only problem is there isn't enough RAM for many textures, and scaling them on the phone would also be a problem.

abcdef 26.11.2008 21:58

Ответ: The Maze
 
Вложений: 1
FISHY -
The problem even not in memory, as in speed of the machine, which differs in realizations. The usual telephone is worse than computer 486 (66MHz).
_____
Немного оптимизировал voxel (new version), картинка более четкая, теперь если оптимизировать дальше, то необходимо умножение/деление заменить побитовыми сдвигами (shr shl).
изменение отображения карты настраивается в строке:
y1:=((255-(c-h)*8) div depth)+60;
если нужно что бы камера реагировала на текущую высоту раскомментируйте строку:
h:=(map[(y div 1024) and 255, (x div 1024) and 255]);
и переправьте строку if y2<=40 then break; в if y2<=0 then break;

если будет использоваться drawRGB, то раскомментируйте строку
if y2>0 then verticalline(i,0,y2,0); и добавьте дорисовку текущего столбца цветом заднего фона (т.е. очистку).

abcdef 27.11.2008 21:42

Ответ: The Maze
 
ещё неброльшая оптимизация в MIDletPascal, дальше только реализация алгоритма в java. ....ну так как? какие у кого идеи? у меня сейчас логику делать - нету времени...
Код:

procedure drawMap;
var  {вывод видимой проекции на экран}
  px,py,dx,dy,k,y1,y2,depth,i,h:integer;
begin
  //h:=map[(y div 1024) and 255, (x div 1024) and 255]+10;
  for i:=8 to 8+sw do
  begin
    px:=x;
    py:=y;
    k:=(angle+1960+i) and 2047;//рисовать проекцию слева и справа от центрального угла
    dy:=sintab[k];
    dx:=costab[k];
    y2:=sh;
    for depth:=1 to 60{#1} do
    begin
      px:=px+dx;
      py:=py+dy;
      k:=map[(py div 1024) and 255, (px div 1024) and 255];
      y1:=(((265{#2}-k)*8{#3}) div depth)+10{#4};  //constant #2 = (#1/#3)+2+h, h=255;  #4 - place for the sky
      if (y1<y2) then  //вертикальная линия цветом "k" от "y1" до "y2" где "i"="x"
      begin
        setColor(cr[k],cg[k],cb[k]);
        drawLine(i,y1,i,y2);
        y2:=y1;
        if y2<=0 then break; //выход если достигли границы экрана, дальше рисовать не имеет смысла
      end;
    end;
    //if y2>0 then begin setColor(0,0,0); drawLine(i,0,i,y2); end;  //fills in a background
  end;
end;

p.s. Если придумать хорошую логику, и переделать в java, будет приемлемая скорость, даже для телефонов Motorola e398,v3,v3i и д.р.

Romanzes 29.11.2008 18:13

Ответ: The Maze
 
Я сейчас сильно занят, когда освобожусь, попытаюсь сделать движок типа Wolfenstein 3D с использованием рэй-кастинга.

abcdef 30.11.2008 20:51

Ответ: The Maze
 
спасибо Ром, твой арканойд с классной, интересной логикой!

(по разработке wolf-3D)
В виду ограниченной скорости Z-buffer реализовать не получится, только его частный случай,
вот некоторые приемы отображения спрайтов в псевдо-3D:
после прорисовки всех стен остается массив размером в ширину экрана, и для каждого вертикального столбца в одну точку шириной записывается дистанция до стены.
После расчета положения всех спрайтов, расстояния до них, и, соответственно, масштабирования, при их выводе, если линия пикселей из картинки ближе чем отрезок стены, то выводим его, иначе она за стеной, и мы его не выводим

FISHY 01.12.2008 01:20

Ответ: The Maze
 
Вложений: 1
Sorry I don't speak much Russian
--------------------------------------
Basic Raycaster -
Good - it works (mostly)
Bad - Buggy, ugly, no textures and incomplete.
Features - Basic collision detection, movement, sprites, variable depth, full-screen rendering.
Needed: Everything fixed - I don't have time - Look forward to seeing what you come up with. Thanks.

Romanzes 04.12.2008 01:15

Ответ: The Maze
 
Что ж, будем стараться сделать :)

Cliffe Snake 04.12.2008 06:13

Ответ: The Maze
 
Классные движки), молодцы парни. В двиге от Fishy движение относительно камеры под -135 градусов(так выглядит). А в Vox'ельном карта клеится из сгенеренной картинки?

abcdef 04.12.2008 22:05

Ответ: The Maze
 
Вложений: 1
FISHY -
I have made correct 3D algorithm and imposing of the images. Now it is necessary to make logic and opponents.
_____
Сделал текстурирование стен и корректное 3D-изображение.
Необходимо добавить спрайты и логику противников.
Работает довольно быстро.
Выдрал и немножко оптимизировал библиотеку MIDletPascal работы с типом Real (fixed point) числа с фиксированной точкой..
Возможны ошибки.. тестировать было мало времени, просьба оттестировать путем сравнения результатов вычисления в цикле, с оригинальной библиотекой.
_____
Программу легко переделать под java, Ром (Romanzes) пропробуй сделать логику..

Cliffe Snake 04.12.2008 22:52

Ответ: The Maze
 
Abcdef, а можешь дать скомпиленный lib_mathmp?

Romanzes 04.12.2008 22:59

Ответ: The Maze
 
abcdef... Офигенно!!!
Примерно так я это и представлял... Реально круто. Теперь постараюсь в свободное время поработать с твоим движком.

abcdef 05.12.2008 00:22

Ответ: The Maze
 
спасибо Рома.
Cliffe Snake - распакуй jar файлик и получишь компиленный class-файл.
___
p.s.: т.к. библиотека работает с типом integer, то необходимо внимательно проводить вычисления, т.е.: все константы и переменные integer-типа переводить в fixed-real через специализированную функцию fIntToReal. Числа с точкой лучше вводить через функцию fStrToReal. Все арифметические действия, кроме суммы и разности также проводить через функции библиотеки fixed-real

abcdef 07.12.2008 00:49

Ответ: The Maze
 
Вложений: 1
Оптимизировал алгоритм 3D-текстурирования.
Проверил функции fixed-point library, немного оптимизировал, некоторые функции возвращают более точные значения, убрал некоторые ошибки стандартной библиотеки. Деление на ноль не вешает java-машину, а возвращает ноль.
Переписал финкцию fStrToReal, теперь запись можно разделять пробелами напр: ' - 123 . 4567', ' + 98765 . 4321'

Phantom 07.12.2008 02:47

Ответ: The Maze
 
Тестил пример на эмуле. Когда стенки находятся далеко от камеры, то довольно шустро, а когда близко, очень сильно тормозит, примерно 1fps, а то и 0.5. То есть когда тектура стены во весь экран и таким образом двигаешься, то очень медленно видимо рассчёт большой картинки происходит.Может попробовать картинку раза в четыре меньше взять? И её просто растягивать будет, не на столько чётко будет, но зато будет быстрее рассчитывать наклон в перспективе. Или я не прав?

abcdef 07.12.2008 10:49

Ответ: The Maze
 
тормозит из-за процедуры plot, чем больше рисовать тем больше plot. Уменьшение текстур не приведет к снижению четкости, просто точки станут больше. Писал программу под легкую переделку в java, если перенести скорость повысится на 50% и более

Cliffe Snake 07.12.2008 11:02

Ответ: The Maze
 
Вложений: 1
На Microemulator'е работает почти без тормозов. На sjboy и NHAL(MidpX) тормоза конкретные, особенно на первом.
Добавил в двиг радар, и ещё по мелочи. (см. ReadMe)

abcdef 07.12.2008 13:16

Ответ: The Maze
 
молодец Cliffe Snake, движёк начинает быть похожим на игру.. я старательно избугаю внешних java-библиотек, чтобы показать реализацию программ более простыми (но не всегда эффективными) методами. Если продолжать проект в MIDletPascal, то нужно добавить drawRGB вместо plot(x,y), создать массив спрайтов примерно следующего вида:
Код:

TSprite = Record    {Параметры спрайта}
  Id    : Integer;    {классификация спрайта}
  Status: Integer;  {статус спрайта: активный/убит и т.д.}
  X, Y  : Integer;    {Координаты спрайта}
  Dist  : Integer;    {расстояние до спрайта (т.е масштаб его картинки)}
  Ray  : Integer;    {луч центра спрайта относительно экрана}
  Ang  : Integer;    {угол движения спрайта на карте}
  Cnt  : Integer;    {счетчик анимации текстур для спрайта}
  //Racurs: Integer;  {номер картинки поворота}
end;

.......

procedure outTexture(x,y,size,imgNum : integer);
var  {вывод текстуры с масштабированием}
  i,j,xo,yo,coof,offs,color : integer;
begin
  coof := (63*256) div size;
  xo := 0;
  for i := 0 to size-1 do
  begin
    if (size>screenDist[x+i]) then
    begin
      yo := 0;
      offs := imgNum*64*64+(xo shr 8);
      for j := 0 to size-1 do
      begin
        color := data[offs+((yo shr 8) shl 6)];
        if (color<>0) then
        begin
          setColor(....);
          plot(x+i,y+j);
        end;
        inc(yo, coof);
      end;
    end;
    inc(xo, coof);
  end;
end;

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

Логика отображения: после прохождения массива спрайтов мы расчитывает положение и размеры каждого из них, а затем при выводе на экран проверяем попадает ли он в угол зрения игрока, и при выводе каждой вертикальной его линии следим чтобы она была больше, т.е. ближе чем линия стены.

Tadeus 07.12.2008 16:42

Ответ: The Maze
 
Товарищи, а где можно популярно и доходчиво почитать про ray-casting? Все никак не могу с ним разобраться :)

Romanzes 07.12.2008 18:15

Ответ: The Maze
 
Вот, если кто хочет, покурите исходники оригинального Wolfenstein 3D. Сам я в них разобраться не могу, потому что пока не знаю C++. А я пока займусь переносом двига от abcdef на java. Все-таки я считаю, что нужно юзать png картинки, а не bmp.

abcdef 07.12.2008 19:28

Ответ: The Maze
 
Romanzes - в принципе без разницы в каком формате картинки. Помнится что jar-файл поворота картинки был даже больше, чем версия на паскале. Это все из-за файла Gordon.png - он плохо сжимался. А bmp из-за малой палитры лучше упаковывался. Все-таки лучше оставить bmp, потому что с ним легче работать и после загрузки картинок (безразлично в каком формате) остаются только массивы пикселов.
___
Cliffe Snake - текстурирование пола и потолка в 2 раза понизит скорость программы, но есть способ зарисовки удаленным задним фоном зданий/гор/неба, (когда-то придумывал, но он будет работать только c drawRGB),состоит в том что: в массив экрана вводим другой массив со смешением позиции: остаток от деления угола зрения на ширину экрана, таким образом получаем плавную прокрутку заднего фона.. смотрится довольно эффективно,..
___
Посмотрел "в закромах" нашел алгоритм, который когда-то делал для расчетов и рисования спрайтов. Выкладываю чтоб не изобретали велосипед. Возможно где-нибудь будет неточности, переписывал не проверяя..
___
Код:

function intSqrt(v : integer) : integer;
{Вычисление квадратного корня}
var
  result, tmp : integer;
  low, high : integer;
  i : integer;
begin
  if (v > 1) then
  begin
    low := v;
    high := 0;
    result := 0;
    for i := 0 to 15 do
    begin
      result := result+result;
      high := (high shl 2) or ((low shr 30) and $03);
      low  := low shl 2;
      tmp  := result+result+1;
      if (high >= tmp) then
      begin
        inc(result);
        high := high-tmp;
      end;
    end;
    if (v-(result*result) >= (result - 1)) then  inc(result);
    intSqrt := result;
  end
    else intSqrt := abs(v);
end;


procedure sprites;
const
  scalNum = 7000;  {масштабный коофициент для спрайтов}
var
  sp : tSprite;
  dx,dy,rx,ry : integer;
  i,j,scale,r,ycent, xcent : integer;
var  {- Рисование линии заданной высоты: с y1 до y2 -}
  yyy,y1,y2,offs,coof,yo,imgOffs,color : Integer;
begin
  ycent := screenHeight shr 1;
  xcent := screenWidth shr 1;
  for i := 0 to MaxSprites-1 do
  begin
    {Найдем расстояние до спрайта}
    dx := sprite[i].x - px;
    dy := sprite[i].y - py;
    sprite[i].dist :=intSqrt(dx*dx+dy*dy); {Определение расстояния между двумя точками}
    {Расчет луча для центра спрайта}
    rx := trunc(dx*costab[angle] + dy*sintab[angle]);  {Поворачиваем dx,dy на}
    ry := trunc(dy*costab[angle] - dx*sintab[angle]);  {угол зрения игрока}
    if (rx < 0) then  sprite[i].ray :=-1000          {спрайт вне зоны видимости}
    else
    begin    {Расчет луча для центра спрайта}
      if (rx > 0) then  ray := xcent + trunc((xcent*ry)/(rx*tan30))
        else  ray := xcent + trunc((xcent*ry)/tan30);
      {найдем положение спрайта относительно нас}
      if (abs(dx) >= abs(dy))  then
      begin
        if dx > 0 then
        begin
          if dy > 0 then  Racurs := 0
            else  Racurs := 7;
        end else
        begin
          if dy > 0 then  Racurs := 3
            else  Racurs := 4;
        end;
      end
        else
        begin
          if dx > 0 then
          begin
            if dy > 0 then  Racurs := 1
              else  Racurs := 6;
          end else
          begin
            if dy > 0 then  Racurs := 2
              else  Racurs := 5;
          end;
        end;
    end;
  end;
  {Сортировка спрайтов по удаленности}
  for i := 0 to MaxSprites-1-1 do
    for j := i+1 to MaxSprites-1 do
      if sprite[i].dist < sprite[j].dist then
      begin
        sp := sprite[i];  sprite[i] := sprite[j];  sprite[j] := sp;
      end;

  {логика работы и вывод спрайтов на экран}
  for i :=0 to MaxSprites-1 do
  begin
    {logic}
    анимация-высчитываем номер картинки: imgOffs := номер_картинки*64*64
    где (64*64 - размер одной картинки)
    .....
    {logic-end}
    {outToScreen}
    {Вывод спрайтов на экран если они попадают в зону видимости}
    scale := scalNum div (sprite[i].dist+1);  {масштаб изображения}
    r := sprite[i].ray - (scale shr 1);    {по обе стороны от середины}
    for j := 1 to scale do
    begin
      if (r>=0) and (r<=screenWidth-1) then {если попадаем в экран и}
      if (scale>screenDist[r]) then    {если ближе чем стена, то вывести}
      begin
        {---------------------- Текстурирование линии ----------------------}
        offs := imgOffs + ((j shl 6) div scale);
        y1  := (screenHeight-scale) shr 1;
        y2  := y1+scale;
        if y2 > screenHeight-1 then  y2 := screenHeight-1;
        coof := (63*256) div scale;
        yo := 0;
        for yyy := y1 to y2 do
        begin
          if yyy >= 0 then
          begin
            color := data[offs+((yo shr 8) shl 6)];
            if color <> 0 then begin setColor(...); plot(r,yyy); end;
          end;
          inc(yo, coof);
        end;
        {-------------------------------------------------------------------}
      end;
      inc(r);                            {следующий луч}
    end;
    {outToScreen-end}
  end;
end;


Cliffe Snake 08.12.2008 15:48

Ответ: The Maze
 
Вложений: 1
Вот подкрутил радарчик, исправил текстуры, добавил небо. Полный список изменений смотрите в ReadMe.txt :)

Romanzes 08.12.2008 21:25

Ответ: The Maze
 
Цитата:

Сообщение от Tadeus (Сообщение 91824)
Товарищи, а где можно популярно и доходчиво почитать про ray-casting? Все никак не могу с ним разобраться :)

Только что нашел туториал по рэй-кастингу на английском языке: http://www.permadi.com/tutorial/raycast/. Сейчас буду разбираться.

abcdef 09.12.2008 00:59

Ответ: The Maze
 
Вложений: 1
Cliffe Snake - да,да задний фон примерно так как ты сделал.. но немножко упростил, выглядит так:
Код:

  drawimage(sky,-((angle+angle) mod 360),0);
  drawImage(floor,0,h2);
  raycast;

картинка sky высотой в пол-экрана (64). и длинной 360+ширина_экрана, где кусочек 360..360+ширина_экрана совпадает с изображением в позиции 0..ширина_экрана.
___
Оч. неудобно что MIDletPascal не хочет делать длинные массивы, правильная идея сделать двухмерный :) но думаю на java быстрее будет делать одномерным..
___
переделал программку с учетом предложений Cliffe Snake
___
давайте для оптимальности будем делать так:
1. вычисления real заменять Lib_mathmp.class.
2. картинки желательно в bmp-формате, и при необходимости png, другие форматы лучше не использовать т.к. не все телефоны их будут поддерживать.
3. карты записывать в текстовом виде, где кубик стены записывается числом, здесь же будем описывать спрайты.

Cliffe Snake 09.12.2008 04:43

Ответ: The Maze
 
Цитата:

Сообщение от abcdef (Сообщение 91885)
Cliffe Snake - да,да задний фон примерно так как ты сделал.. но немножко упростил, выглядит так:
Код:

  drawimage(sky,-((angle+angle) mod 360),0);
  drawImage(floor,0,h2);
  raycast;

картинка sky высотой в пол-экрана (64). и длинной 360+ширина_экрана, где кусочек 360..360+ширина_экрана совпадает с изображением в позиции 0..ширина_экрана.

При такой реализации на экране 240x320 изображение смазывается.
Мой способ отображения "неба" более универсален, так как не зависит от размера экрана. :p :)

abcdef 09.12.2008 09:33

Ответ: The Maze
 
длина картинки заднего фона расчитывается так: угол обзора 60 градусов, равны ширине экрана, значит всего этих экранов будет 6 плюс добавочный, получается длина_картинки = ширина_экрана*7.
запускал на motorola V3i повисло, пришлось уменьшить data [0..6,0..4096] of integer;

Cliffe Snake 09.12.2008 17:54

Ответ: The Maze
 
Цитата:

Сообщение от abcdef (Сообщение 91888)
длина картинки заднего фона расчитывается так: угол обзора 60 градусов, равны ширине экрана, значит всего этих экранов будет 6 плюс добавочный, получается длина_картинки = ширина_экрана*7.

По моим вычислениям выходит, что 360 градусов равны 1080 пикселям
(то есть 1 градус = 3 пикселям)
PHP код:

//....
drawimage(nebo,angle*(-3),0);
drawimage(nebo,angle*(-3)+360,0);
drawimage(nebo,angle*(-3)+720,0);
drawimage(nebo,angle*(-3)+1080,0);
raycast;
//.... 

Dlina текстуры неба=90*n // где n=[1..12]
Кол-во повторений drawimage со двигом на Dlina = 1080/Dlina+1
Проверенно, 100% работает не зависимо от экрана.
Цитата:

Сообщение от abcdef (Сообщение 91888)
запускал на motorola V3i повисло, пришлось уменьшить data [0..6,0..4096] of integer;

Да... надо будет подсчитать сколько хипа хавает одна текстура..

abcdef 10.12.2008 00:36

Ответ: The Maze
 
Вложений: 1
Cliffe Snake - спорим об одном и том же, хотя по идее можно обойтись и картинкой шириной с экран.. нужно как можно более минимизировать кол-во вызовов графических функций.
Текстуры лучше представить одним файлом, на подобии вертикальной киноленты, т.о. будем экономить на каждом файле более 1кб из счет заголовка и палитры, кроме того большой файл упаковывается лучше, чем несколько маленьких. кол-во текстур нужно сократить и подгружать их по ходу игры, например при входе в комнату, но это уже в конце, когда все будет готово..
___
Интересно как справиться с программой средствами MIDletPascal, а иначе переписал бы за час на java..
Ранее выложил всю необходимую математику спрайтов, кто-нить уже сделал живых человечков? логику можно сделать такой: если догнал - уменьшаются жизни, а еще довольно неплохо смотриться метание огненными шарами (как в DOOM), шар - тот-же спрайт (направление движения (dx,dy) как у игрока в момент создания), который деинициализиреутся когда столкнется с каким-либо предметом.
Массив со спрайтами наполовину пуст, для генерации всевозможных дополнительных спрайтов. отработавшие спрайты либо превращаются в статические либо помечаются как пустые и свободные..
___
p.s. выкладываю редактор спрайтов/текстур для MSDOS-Wolfenshtein3D скопировать в папку с программой и запускать, есть возможность сохранения изображений в формате gif.

Trazzy 10.12.2008 07:25

Ответ: The Maze
 
Вижу, я немного не в тему пишу, еще про maze. Но пдскажите, пожалуйста, как в maze3d сделать так чтоб когда поварачиваешся влево/вправо не поварачивалась и карта (при этом меняются координаты х, у, что очень мешает узнаванию местонахождения на карте). Если не трудно выложите пример в зипе или хотябы просто листинг. Заранее благодарен...

abcdef 10.12.2008 09:10

Ответ: The Maze
 
поворот карты, своего рода оптимизация, иначе б в основном алгоритме нужно было рассматривать 4е случая. Получить координаты можно если запомнинать поворот относительно начального, а затем временные_х_у поворачивать обратно

Trazzy 12.12.2008 07:10

Ответ: The Maze
 
Я в мидлетпаскале относительно не долго, и теоретически знаю как это делается, а на деле чет не выходит. Можно пример?

abcdef 12.12.2008 21:22

Ответ: The Maze
 
Вложений: 1
Добавил алгоритм спрайтов, нужно оптимизировать и добавить логику, тогда будет хорошая игрушка. Подобных программ на MP не видел.. Кто возьмется делать логику? у кого есть интересные идеи?
__
p.s. ArtikZ - MIDletPascal это не лучший пособ для первого языка программирования, много ситуаций компиляции и проверки синтаксиса программы не поддается здравому смыслу, например при разработке спрайтов, если они были в записях record, то неправильно считался один из параметров. и если в массивах, то нельзя использовать последний элемент,
алгоритм поворота направо t:=x;x:=y;y:=29-t; налево t:=y;y:=x;x:=29-t; смотри какой угол и поворачивай в цикле обратно..

abcdef 14.12.2008 10:21

Ответ: The Maze
 
несколько замечаний по использованию вычислений в fixed-point real: числа с фиксированной точкой можно напрямую умножать или делить (если real в делимом, но не наоборот) на integer, а также складывать или вычитать два real-числа обычным сложением или вычитанием, во всех остальных случаях вычисления проводить только через библиотеку, а integer приводить к типу real через fIntToReal

sasha_peleng 30.12.2008 16:14

Ответ: The Maze
 
:-) Спасибо за исходники

Serg153 04.01.2009 03:21

Ответ: The Maze
 
>>
Добавил алгоритм спрайтов, нужно оптимизировать и добавить логику, тогда будет хорошая игрушка. Подобных программ на MP не видел.. Кто возьмется делать логику? у кого есть интересные идеи?
>>
надобы сделать редактор 3д мира - можно на дельфях (в фольфштейне был мир 64*64 клеточки)
- клеточкам присваивать текстуры
- расстановку в клетках спрайтов... факелы - освещаемые пятна(анимац)
- расстановка "монстров"
- расстановка "обьектов" - аптечки - патроны - ключи...
и типа "компиляцию" ресурсов в какойнить DAT файл
АИ врагов - простую (по колву ед жизни -100% ищет игрока - 50% убегает) типа стрелялки

---
про первые 3д игры хорошо описано у Андрэ Ламот Программирование Игр - алгоритмы рендеров...

abcdef 04.01.2009 09:43

Ответ: The Maze
 
про это уже писал, некоторое из этого не получится, потому что ограничение на кол-во текстур (добавил еще 2 и перестало запускаться на V3i), карту лучше сделать в текстовом файле, редактор пока не обязателен. размер карты в wolf3d 64x64 обусловлен размером целой части в числах с фиксированной точкой.
Также врятли найдется рендер 2.5D быстрее чем представленный здесь, вся задержка только в методе вывода на экран

abcdef 11.01.2009 21:46

Ответ: The Maze
 
случайно заглянул на http://wap.mtsgames.ru/free/?p=1 и нашел кучу 2.5D игр...
вот некоторые ссылки
http://get.mtscity.ru/free/id.9416/j...e.210/game.jar
http://get.mtscity.ru/free/id.16003/...e.210/game.jar
http://get.mtscity.ru/free/id.18974/...e.210/game.jar
http://get.mtscity.ru/free/id.21239/...e.210/game.jar
http://get.mtscity.ru/free/id.21990/...e.210/game.jar
http://get.mtscity.ru/free/id.22479/...e.210/game.jar
http://get.mtscity.ru/free/id.22477/...e.210/game.jar
http://get.mtscity.ru/free/id.25361/...e.210/game.jar
графика сделана довольно профессионально, работать будет на большинстве моделей телефонов, клавиши тоже на своих местах, вот только через какое-то время выскакивает окошко с требованием регистрации, которое выкидывает из игры...

некоторые игры виснут на motorola v3i, те что работают тормозят, но чуть быстрее чем MIDletPascal-версия движка.
____
p.s. а все-же где весь народ? все что-то потерялись... хочется увидеть исходники/логику от другого программиста,... а в свои игрушки играть-то неинтересно


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

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