forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   Dendy'вские псевдо-3D гонки на MP (http://forum.boolean.name/showthread.php?t=7705)

abcdef 26.01.2009 22:18

Dendy'вские псевдо-3D гонки на MP
 
Вложений: 1
давным-давно после просмотра псевдо-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.


ASMjavaC 10.03.2009 12:43

Ответ: Dendy'вские псевдо-3D гонки на MP
 
неплохо неплохо.. вот рандомная трасса + пояснения
PHP код:

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-mailironWoodcutter@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


KAK? TAK! 14.03.2009 11:25

Ответ: Dendy'вские псевдо-3D гонки на MP
 
ррс с

ASMjavaC 15.03.2009 14:13

Ответ: Dendy'вские псевдо-3D гонки на MP
 
KAK? TAK!
что случилось?

KAK? TAK! 19.03.2009 13:52

Ответ: Dendy'вские псевдо-3D гонки на MP
 
заглавие 3D гонки а тут

Dj_Alex 21.03.2009 21:48

Ответ: Dendy'вские псевдо-3D гонки на MP
 
а что смысл слова "псевдо" не понятно?

ASMjavaC 21.03.2009 23:14

Ответ: Dendy'вские псевдо-3D гонки на MP
 
кстати использование одномерного массива вообщето и есть привычная школьная 2Д пространство(ХОY) (индекс-х,значение-у), плоскость не построешь но кривую какраз да(что и используется в данной игре) - эт так к слову о пространствах и масивах

Dj_Alex 22.03.2009 12:52

Ответ: Dendy'вские псевдо-3D гонки на MP
 
на эмуле тормозит пострашному. может стоит рисовать не точками а горизонтальными линиями?

Dj_Alex 22.03.2009 13:03

Ответ: Dendy'вские псевдо-3D гонки на MP
 
заменил строчку
while n13<n14 do begin plot(n13,n11);n13:=n13+1;end;
на
drawline(n13,n11,n14,n11);
и скорость заметно прибавилась


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

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