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)

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;

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

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


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

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