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;