Тема: The Maze
Показать сообщение отдельно
Старый 07.12.2008, 19:28   #48
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: The Maze

Romanzes - в принципе без разницы в каком формате картинки. Помнится что jar-файл поворота картинки был даже больше, чем версия на паскале. Это все из-за файла Gordon.png - он плохо сжимался. А bmp из-за малой палитры лучше упаковывался. Все-таки лучше оставить bmp, потому что с ним легче работать и после загрузки картинок (безразлично в каком формате) остаются только массивы пикселов.
___
Cliffe Snake - текстурирование пола и потолка в 2 раза понизит скорость программы, но есть способ зарисовки удаленным задним фоном зданий/гор/неба, (когда-то придумывал, но он будет работать только c drawRG,состоит в том что: в массив экрана вводим другой массив со смешением позиции: остаток от деления угола зрения на ширину экрана, таким образом получаем плавную прокрутку заднего фона.. смотрится довольно эффективно,..
___
Посмотрел "в закромах" нашел алгоритм, который когда-то делал для расчетов и рисования спрайтов. Выкладываю чтоб не изобретали велосипед. Возможно где-нибудь будет неточности, переписывал не проверяя..
___
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;
(Offline)
 
Ответить с цитированием