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)

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); и добавьте дорисовку текущего столбца цветом заднего фона (т.е. очистку).


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

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