Сообщений: 299
Написано 71 полезных сообщений (для 123 пользователей)
Dendy'вские псевдо-3D гонки на MP
давным-давно после просмотра псевдо-3D гонок, придумал алгоритм для отображения местности и перемещения на нем, сегодня наткнулся на исходники, и решил переложить в MP.
___
Идея проста, здесь не используется 3D и даже не 2D, а 1D пространство! т.е. машина едет по одномерному массиву каждая ячейка - текущее состояние дороги т.е.: 0-прямая; -1 -поворот налево; +1 -поворот направо.
"физика" слабоватая, т.к. версия была полностью на ассемблере, без тригонометричекских функций, только целочисленные вычисления
var
{Наверное также сделаны подобные игрушки, я не разбирался... но если нет, то ставьте мой копирайт ;)}
n1 :array[0..99]of integer;
n2 :array[0..10]of image;
n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16:integer;
begin
{programming by arT (c). e-mail: [email protected]}
n1[0]:=0;n1[1]:=0;n1[2]:=-1;n1[3]:=-1;n1[4]:=-1;
n1[5]:=-1;n1[6]:=-1;n1[7]:=-1;n1[8]:=-1;n1[9]:=-1;
n1[10]:=0;n1[12]:=1;n1[13]:=1;n1[14]:=1;n1[15]:=1;
n1[16]:=0;n1[17]:=-1;n1[18]:=-1;n1[19]:=-1;n1[20]:=0;
n1[21]:=0;n1[22]:=0;n1[23]:=1;n1[24]:=0;n1[25]:=-1;
n1[26]:=0;n1[27]:=0;n1[28]:=1;n1[29]:=1;n1[30]:=1;
n1[31]:=0;n1[32]:=0;n1[33]:=0;n1[34]:=0;n1[35]:=0;
n1[36]:=0;n1[37]:=0;n1[38]:=0;n1[39]:=1;n1[40]:=0;
n1[41]:=0;n1[42]:=0;n1[43]:=1;n1[44]:=0;n1[45]:=-1;
n1[46]:=-1;n1[47]:=0;n1[48]:=1;n1[49]:=1;n1[50]:=1;
n1[51]:=0;n1[52]:=1;n1[53]:=1;n1[54]:=1;n1[55]:=0;
n1[56]:=0;n1[57]:=0;n1[58]:=0;n1[59]:=-1;n1[60]:=-1;
for n3:=0 to 10 do n2[n3]:=loadimage('/'+n3+'.png');
n4:=getwidth;
n6:=n4 div 2;
n5:=getheight;
n8:=0;
n9:=n6;
n16:=0;
n7:=0;
repeat
setcolor(0,255,0);
fillrect(0,99,n4,n5-99);
n12:=n9;
for n11:=n5-1 downto 99 do
begin
n12:=n12+((n5-n11)div 16)*n1[(n8+((n5-1)-n11)*8)div 256];
n13:=n12-(n11-60);
n14:=n12+(n11-60);
if n13<0 then n13:=0;
if n14>n4 then n14:=n4;
setcolor(60,40,30);
while n13<n14 do begin plot(n13,n11);n13:=n13+1;end;
n13:=n12-((n11-99)div 8);
n14:=n12+((n11-99)div 8);
if n13<0 then n13:=0;
if n14>n4 then n14:=n4;
n15:=(n8+((n5-1)-n11)*8)and $ff;
if ((n15>=0)and (n15<=40))or ((n15>=80)and (n15<=120))or ((n15>=160)and (n15<=200))then
begin
setcolor(255,255,255);
while n13<n14 do begin plot(n13,n11);n13:=n13+1;end;
end;
end;
drawimage(n2[0],-((255-n12)and $ff),0);
n15:=3-n7;
if (n8 and 12)<>0 then n15:=n15+5;
drawimage(n2[n15],n6-23,n5-30);
setcolor(255,255,255);
drawtext('x:'+n8+' y:'+n9+' spd:'+n16+' cnt:'+n12,0,0);
repaint;
n10:=keytoaction(getkeypressed);
if (n10=ga_up)then if (n16<30)then n16:=n16+2;
if (n10=ga_down)then if (n16>0)then n16:=n16-2;
if (n10=ga_right)then if (n7<2)then n7:=n7+1;
if (n10=ga_left)then if (n7>-2)then n7:=n7-1;
if n16>0 then
begin
n8:=n8+(n16 div 2);
if n8>(56*256)then n8:=0;//restart
n9:=n9-n7+(1+(n16 div 8))*n1[(n8+128)div 256];
if n9<0 then n9:=0;
if n9>n4 then n9:=n4;
if (n9<=0)or (n9>=n4)then if (n16>3)then n16:=n16-3;
if (n16>60)then
if (n7>0)then n7:=n7-1
else if (n7<0)then n7:=n7+1;
end;
delay(10);
until n10=ga_fire;
end.
Сообщений: 26
Написано 2 полезных сообщений (для 2 пользователей)
Ответ: Dendy'вские псевдо-3D гонки на MP
неплохо неплохо.. вот рандомная трасса + пояснения
program race01; var {Наверное также сделаны подобные игрушки, я не разбирался... но если нет, то ставьте мой копирайт ;)} n1 :array[0..99]of integer; n2 :array[0..10]of image; n3,n4,n5,n6,n7,n8,n9,n10,n11,n12,n13,n14,n15,n16:integer; begin {programming by arT (c). e-mail: ironWoodcutter@bk.ru} /////////////////////////////////// for n3:=0 to 60 do n1[n3]:=random(3)-1; ////создаем трассу /////////////////////////////////// for n3:=0 to 10 do n2[n3]:=loadimage('/'+n3+'.png'); ////грузим в масив рисунки (10) из res\ n4:=getwidth; n6:=n4 div 2; n5:=getheight; n8:=0; n9:=n6; n16:=0; n7:=0; repeat setcolor(0,255,0); ////нижнюю половину fillrect(0,99,n4,n5-99); ////прорисовываем зеленым n12:=n9; for n11:=n5-1 downto 99 do ////строим дорогу begin n12:=n12+((n5-n11)div 16)*n1[(n8+((n5-1)-n11)*8)div 256]; n13:=n12-(n11-60); n14:=n12+(n11-60); if n13<0 then n13:=0; if n14>n4 then n14:=n4; setcolor(60,40,30); while n13<n14 do begin plot(n13,n11);n13:=n13+1;end; ////рисуем дорогу n13:=n12-((n11-99)div 8); n14:=n12+((n11-99)div 8); if n13<0 then n13:=0; if n14>n4 then n14:=n4; n15:=(n8+((n5-1)-n11)*8)and $ff; if ((n15>=0)and (n15<=40))or ((n15>=80)and (n15<=120))or ((n15>=160)and (n15<=200))then begin setcolor(255,255,255); while n13<n14 do begin plot(n13,n11);n13:=n13+1;end; ////рисуем разметку end; end; drawimage(n2[0],-((255-n12)and $ff),0); ////вставляем небо n15:=3-n7; if (n8 and 12)<>0 then n15:=n15+5; drawimage(n2[n15],n6-23,n5-30); ////вставляем тачку setcolor(255,255,255); drawtext('x:'+n8+' y:'+n9+' spd:'+n16+' cnt:'+n12,0,0); ////инфа вверху repaint; n10:=keytoaction(getkeypressed);////управление if (n10=ga_up)then if (n16<30)then n16:=n16+2; if (n10=ga_down)then if (n16>0)then n16:=n16-2; if (n10=ga_right)then if (n7<2)then n7:=n7+1; if (n10=ga_left)then if (n7>-2)then n7:=n7-1; if n16>0 then begin n8:=n8+(n16 div 2); if n8>(56*256)then n8:=0;//restart n9:=n9-n7+(1+(n16 div 8))*n1[(n8+128)div 256]; if n9<0 then n9:=0; if n9>n4 then n9:=n4; if (n9<=0)or (n9>=n4)then if (n16>3)then n16:=n16-3; if (n16>60)then if (n7>0)then n7:=n7-1 else if (n7<0)then n7:=n7+1; end; delay(10); until n10=ga_fire; end.
Сообщений: 26
Написано 2 полезных сообщений (для 2 пользователей)
Ответ: Dendy'вские псевдо-3D гонки на MP
кстати использование одномерного массива вообщето и есть привычная школьная 2Д пространство(ХОY) (индекс-х,значение-у), плоскость не построешь но кривую какраз да(что и используется в данной игре) - эт так к слову о пространствах и масивах