|
27.11.2008, 21:42
|
#31
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: 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 и д.р.
|
(Offline)
|
|
29.11.2008, 18:13
|
#32
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: The Maze
Я сейчас сильно занят, когда освобожусь, попытаюсь сделать движок типа Wolfenstein 3D с использованием рэй-кастинга.
|
(Offline)
|
|
30.11.2008, 20:51
|
#33
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: The Maze
спасибо Ром, твой арканойд с классной, интересной логикой!
(по разработке wolf-3D)
В виду ограниченной скорости Z-buffer реализовать не получится, только его частный случай,
вот некоторые приемы отображения спрайтов в псевдо-3D:
после прорисовки всех стен остается массив размером в ширину экрана, и для каждого вертикального столбца в одну точку шириной записывается дистанция до стены.
После расчета положения всех спрайтов, расстояния до них, и, соответственно, масштабирования, при их выводе, если линия пикселей из картинки ближе чем отрезок стены, то выводим его, иначе она за стеной, и мы его не выводим
|
(Offline)
|
|
01.12.2008, 01:20
|
#34
|
AnyKey`щик
Регистрация: 27.04.2008
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Ответ: The Maze
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.
|
(Offline)
|
|
04.12.2008, 01:15
|
#35
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: The Maze
Что ж, будем стараться сделать
|
(Offline)
|
|
04.12.2008, 06:13
|
#36
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: The Maze
Классные движки), молодцы парни. В двиге от Fishy движение относительно камеры под -135 градусов(так выглядит). А в Vox'ельном карта клеится из сгенеренной картинки?
|
(Offline)
|
|
04.12.2008, 22:05
|
#37
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: The Maze
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) пропробуй сделать логику..
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо abcdef за это полезное сообщение:
|
|
04.12.2008, 22:52
|
#38
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: The Maze
Abcdef, а можешь дать скомпиленный lib_mathmp?
|
(Offline)
|
|
04.12.2008, 22:59
|
#39
|
Разработчик
Регистрация: 06.04.2008
Сообщений: 541
Написано 196 полезных сообщений (для 638 пользователей)
|
Ответ: The Maze
abcdef... Офигенно!!!
Примерно так я это и представлял... Реально круто. Теперь постараюсь в свободное время поработать с твоим движком.
|
(Offline)
|
|
05.12.2008, 00:22
|
#40
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: The Maze
спасибо Рома.
Cliffe Snake - распакуй jar файлик и получишь компиленный class-файл.
___
p.s.: т.к. библиотека работает с типом integer, то необходимо внимательно проводить вычисления, т.е.: все константы и переменные integer-типа переводить в fixed-real через специализированную функцию fIntToReal. Числа с точкой лучше вводить через функцию fStrToReal. Все арифметические действия, кроме суммы и разности также проводить через функции библиотеки fixed-real
|
(Offline)
|
|
07.12.2008, 00:49
|
#41
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: The Maze
Оптимизировал алгоритм 3D-текстурирования.
Проверил функции fixed-point library, немного оптимизировал, некоторые функции возвращают более точные значения, убрал некоторые ошибки стандартной библиотеки. Деление на ноль не вешает java-машину, а возвращает ноль.
Переписал финкцию fStrToReal, теперь запись можно разделять пробелами напр: ' - 123 . 4567', ' + 98765 . 4321'
|
(Offline)
|
|
07.12.2008, 02:47
|
#42
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: The Maze
Тестил пример на эмуле. Когда стенки находятся далеко от камеры, то довольно шустро, а когда близко, очень сильно тормозит, примерно 1fps, а то и 0.5. То есть когда тектура стены во весь экран и таким образом двигаешься, то очень медленно видимо рассчёт большой картинки происходит.Может попробовать картинку раза в четыре меньше взять? И её просто растягивать будет, не на столько чётко будет, но зато будет быстрее рассчитывать наклон в перспективе. Или я не прав?
|
(Offline)
|
|
07.12.2008, 10:49
|
#43
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: The Maze
тормозит из-за процедуры plot, чем больше рисовать тем больше plot. Уменьшение текстур не приведет к снижению четкости, просто точки станут больше. Писал программу под легкую переделку в java, если перенести скорость повысится на 50% и более
|
(Offline)
|
|
07.12.2008, 11:02
|
#44
|
Нуждающийся
Регистрация: 22.09.2008
Сообщений: 74
Написано 8 полезных сообщений (для 12 пользователей)
|
Ответ: The Maze
На Microemulator'е работает почти без тормозов. На sjboy и NHAL(MidpX) тормоза конкретные, особенно на первом.
Добавил в двиг радар, и ещё по мелочи. (см. ReadMe)
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.12.2008, 13:16
|
#45
|
Знающий
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
|
Ответ: 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;
для простоты можно делать так, что спрайт всегда повернут к нам "лицом", с какой-бы стороны мы к нему не подходили.
Логика отображения: после прохождения массива спрайтов мы расчитывает положение и размеры каждого из них, а затем при выводе на экран проверяем попадает ли он в угол зрения игрока, и при выводе каждой вертикальной его линии следим чтобы она была больше, т.е. ближе чем линия стены.
Последний раз редактировалось abcdef, 07.12.2008 в 13:22.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:20.
|