WIP: Tachka

Pixilang по русски
User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

WIP: Tachka

Post by Al_Rado » Sun Dec 30, 2007 8:18 pm

Ма-а-аленькая заготовка для гонок :) . Спрайт не мой, стянул на http://www.wayofthepixel.net

//Al_Rado// Tachka v.0.1 // Управление CURSOR_KEYS // Спрайт тут http://slil.ru/25305005
resize_pixi (0,320,240)
ballid = load_pixi("SLIX_F1.gif")
x=0 y=0 z=0 w=50
pila = new_array( 8 )
pila[ 0 ] = 1
pila[ 1 ] = 2000
pila[ 2 ] = 4000
pila[ 3 ] = 6000
pila[ 4 ] = 1
pila[ 5 ] = 2000
pila[ 6 ] = 4000
pila[ 7 ] = 6000

unu:
if y<-110 {y=-110}
if y>110 {y=110}
if x<-150 {x=-150}
if x>150 {x=150}
if vel<0 {vel=0 yp=0 xp=0}
if z < 0 {z = 31}
handle_hard_keys({downed},{})
clear (SNEG)
fpixi(ballid,x,y,1,y+120,z)
y=y+yp
x=x+xp
sound_volume (y+w)
send_sound( pila , 400, 1, 1 )
frame (30)
goto unu

downed:
g = ghk
if g = 264 {vel=1 w=200} // velocity
if g = 265 {vel=0 w=50} // velocity
if g = 266 {z-1} // left
if g = 267 {z+1} // right
xp=((cos(z*16)+64)/128) * vel
yp=((sin(z*16)+64)/128) * vel
ret
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: WIP: Tachka

Post by NightRadio » Mon Dec 31, 2007 12:39 pm

о. класс! Надо определенно продолжить тему

goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: WIP: Tachka

Post by goglus » Tue Jan 01, 2008 3:06 am

кульно будет аниматор можно будет такие прямо в pixilang формате рисовать :D

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Tachka v.02

Post by Al_Rado » Wed Jan 02, 2008 11:36 pm

Вот 02 версия :) Карта конечно не оч., даже без тайлов, но сам принцип "препятствий" реализовал + несколько скоростей и задний ход =)

//Al_Rado// Tachka v0.2 // Файл со спрайтами тут http://slil.ru/25311061
resize_pixi (0,320,240)
set_disk0 ("data.tar")
ballid = load_pixi("0:/SLIX_F1.gif")
fon = load_pixi("0:/fon.gif") // "непроходимый" рельеф, отрисован синим
fon_real = load_pixi("0:/fon_real.jpg") // рисованый фон, который будет отображаться
fontan = load_pixi("0:/fontan.gif")
pixi_alpha (fontan,fontan)
x=30 y=30 z=0 w=100 a=1
zvuk = new_array( 8 )
zvuk[ 0 ] = 1
zvuk[ 1 ] = 6000
zvuk[ 2 ] = 2000
zvuk[ 3 ] = 4000
zvuk[ 4 ] = 1
zvuk[ 5 ] = 6000
zvuk[ 6 ] = 2000
zvuk[ 7 ] = 4000

unu:
pixi( fon, 0, 0, 2 )
OPROS_FON
clear (SNEG) // закомментить для теста
if z < 0 {z = 31}
handle_hard_keys({OPROS},{})
pixi( fon_real, 0, 0, 1 ) // закомментить для теста
fpixi(ballid,x,y,1,y+120,z)
pixi( fontan, 5, -45, 1 )
y=y+yp
x=x+xp
sound_volume (y+w)
send_sound( zvuk , 400, 1, 1 )
frame (30)
//clear (SNEG) // закомментить для отрисовки фона
goto unu

OPROS:
if ghk = 264 {w=w+50 a=a+1 if a>2 {a=2 w=250}} // повышение передачи
if ghk = 265 {w=w-50 a=a-1 if a<-1 {a=-1 w=50}} // понижение передачи + задний ход
if ghk = 266 {z-1} // поворот налево
if ghk = 267 {z+1} // поворот направо
xp=((cos(z*16)+64)/128) * a
yp=((sin(z*16)+64)/128) * a
ret

OPROS_FON:
x_opr1 = x+5+xp/a+y/10
y_opr1 = y+5+yp/a+y/10
x_opr2 = x-10+xp/a-y/20
y_opr2 = y-5+yp/a-y/30
R_fon1 = get_red (get_dot (x_opr1,y_opr1))
G_fon1 = get_green (get_dot (x_opr1,y_opr1))
B_fon1 = get_blue (get_dot (x_opr1,y_opr1))
R_fon2 = get_red (get_dot (x_opr2,y_opr2))
G_fon2 = get_green (get_dot (x_opr2,y_opr2))
B_fon2 = get_blue (get_dot (x_opr2,y_opr2))
//print ("A",x_opr1,y_opr1,ORANGE) // первая точка "соприкосновения"
//print ("B",x_opr2,y_opr2,ORANGE) // вторая точка "соприкосновения"
if R_fon1<250 & G_fon1<250 & B_fon1>250 {xp=0 yp=0 a=0 w=100}
if R_fon2<250 & G_fon2<250 & B_fon2>250 {xp=0 yp=0 a=0 w=100}
ret
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: WIP: Tachka

Post by goglus » Wed Jan 02, 2008 11:46 pm

СУПЕР
нарисоватьбысюда ексклюзивный черно-белый пейзаж в стиле "ночной город малевича" была бы зачетная игруха
может заморочимся - мои уродцы твой код ?


машинки правда не 3д
http://goglus.com/palm/moe/car_car.gif
http://goglus.com/palm/game/gama2.gif

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: WIP: Tachka

Post by Al_Rado » Thu Jan 03, 2008 12:31 am

Будет интересно, я за!
Только спрайт тачки - пока оставим этот, здесь все-таки эдакая "3д-фишка" :) Отрисовать такую задачка не из легких (ну для не профессиональных пиксель-художников)... Но стоит попробовать.
Можно сделать карту протяженностью несколько экранов (слева-направо например) - город, интересная идея, с улицами и домиками.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Tachka v.03

Post by Al_Rado » Thu Jan 03, 2008 1:20 pm

//Al_Rado// Tachka v0.3 // Теперь с джипом собственной отрисовки =) Файл с данными тут http://slil.ru/25312044
resize_pixi (0,320,240)
set_disk0 ("data.tar")
ballid = load_pixi("0:/jeep.gif")
fon = load_pixi("0:/fon.gif") // "непроходимый" рельеф, отрисован синим на черном фоне
fon_real = load_pixi("0:/fon_real.jpg") // рисованый фон, который будет отображаться
fontan = load_pixi("0:/fontan.gif")
pixi_alpha (fontan,fontan)
x=-30 y=30 z=0 w=100 a=1
zvuk = new_array( 8 )
zvuk[ 0 ] = 1
zvuk[ 1 ] = 6000
zvuk[ 2 ] = 2000
zvuk[ 3 ] = 4000
zvuk[ 4 ] = 1
zvuk[ 5 ] = 6000
zvuk[ 6 ] = 2000
zvuk[ 7 ] = 4000

unu:
pixi( fon, 0, 0, 2 )
OPROS_FON
clear (SNEG)
if z < 0 {z = 31}
handle_hard_keys({OPROS},{})
pixi( fon_real, 0, 0, 1 )
fpixi(ballid,x,y,1,y+120,z)
pixi( fontan, 5, -45, 1 )
y=y+yp
x=x+xp
sound_volume (y+w)
send_sound( zvuk , 400, 1, 1 )
frame (30)
goto unu

OPROS:
if ghk = 264 {w=w+50 a=a+1 if a>2 {a=2 w=250}} // повышение передачи
if ghk = 265 {w=w-50 a=a-1 if a<-1 {a=-1 w=50}} // понижение передачи + задний ход
if ghk = 266 {z-1} // поворот налево
if ghk = 267 {z+1} // поворот направо
xp=((cos(z*16)+64)/128) * a
yp=((sin(z*16)+64)/128) * a
ret

OPROS_FON:
x_opr1 = x+5+xp/a+y/10
y_opr1 = y+5+yp/a+y/10
x_opr2 = x-10+xp/a-y/20
y_opr2 = y-5+yp/a-y/30
B_fon1 = get_blue (get_dot (x_opr1,y_opr1))
B_fon2 = get_blue (get_dot (x_opr2,y_opr2))
if B_fon1>250 {xp=0 yp=0 a=0 w=100}
if B_fon2>250 {xp=0 yp=0 a=0 w=100}
ret
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

goglus
Posts: 122
Joined: Tue Dec 04, 2007 4:19 pm
Contact:

Re: WIP: Tachka

Post by goglus » Thu Jan 03, 2008 2:00 pm

:D ну я то за минимализм и уродов - красивых 3д машинок кругом полно

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: WIP: Tachka

Post by Al_Rado » Thu Jan 03, 2008 2:07 pm

Ну тогда у меня очередная 3д машинка, как везде :) Предлагай свои варианты
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

WIP: Tachka - test

Post by Al_Rado » Fri Jan 04, 2008 5:07 pm

Вот, подобрал прирощения по X и Y соответствующие углу поворота и максимальной управляемости, но вот беда - тачка теперь летает как самолет :( Пробовал уменьшать прирощения делением на 10 например - не выходит, эти значения округляются т.к. Pixilang работает с целыми числами... Как можно это обойти?

//Al_Rado// Tachka v0.31 test// Файл с данными тут http://slil.ru/25315220
resize_pixi (0,320,240)
set_disk0 ("data.tar")
ballid = load_pixi("0:/jeep.gif")
fon = load_pixi("0:/fon.gif") // "непроходимый" рельеф, отрисован синим на черном фоне
fon_real = load_pixi("0:/fon_real.gif") // рисованый фон, который будет отображаться
x=-30 y=30 z=0 w=150 a=0
zvuk = new_array( 8 )
zvuk[ 0 ] = 1
zvuk[ 1 ] = 6000
zvuk[ 2 ] = 2000
zvuk[ 3 ] = 4000
zvuk[ 4 ] = 1
zvuk[ 5 ] = 6000
zvuk[ 6 ] = 2000
zvuk[ 7 ] = 4000

unu:
pixi( fon, 0, 0, 2 )
OPROS_FON
clear (SNEG)
if z < 0 {z = 31}
handle_hard_keys({OPROS},{})
pixi( fon_real, 0, 0, 1 )
fpixi(ballid,x,y,1,1,z)
print ("xp$xp",0,0,SNEG) // вывод прирощения по X
print ("yp$yp",0,10,SNEG) // вывод прирощения по Y
y=y + (yp)
x=x + (xp)
sound_volume (w)
send_sound( zvuk , 400, 1, 1 )
frame (30)
goto unu

OPROS:
if ghk = 264 {w=w+25 a=a+1 if a>4 {a=4 w=250}} // повышение передачи
if ghk = 265 {w=w-25 a=a-1 if a<0 {a=-1 w=50}} // понижение передачи + задний ход
if ghk = 266 {z-1} // поворот налево
if ghk = 267 {z+1} // поворот направо
xp=((cos(z*16))/32) * a
yp=((sin(z*16))/32) * a
ret

OPROS_FON:
x_opr1 = x+5+xp/a+y/10
y_opr1 = y+5+yp/a+y/10
x_opr2 = x-10+xp/a-y/20
y_opr2 = y-5+yp/a-y/30
B_fon1 = get_blue (get_dot (x_opr1,y_opr1))
B_fon2 = get_blue (get_dot (x_opr2,y_opr2))
if B_fon1>250 {xp=0 yp=0 a=0 w=100}
if B_fon2>250 {xp=0 yp=0 a=0 w=100}
ret
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: WIP: Tachka

Post by NightRadio » Fri Jan 04, 2008 6:06 pm

Обойти можно, например, так.
Зададим вначале проги переменную P = 16.
А далее прирост умножаем на P, а реальные координаты машинки на экране делим на P.
Таким образом добиваемся более плавного движения.

Code: Select all

resize_pixi (0,320,240)
set_disk0 ("data.tar")
ballid = load_pixi("0:/jeep.gif")
fon = load_pixi("0:/fon.gif") // "непроходимый" рельеф, отрисован синим на черном фоне
fon_real = load_pixi("0:/fon_real.gif") // рисованый фон, который будет отображаться
P = 16
x=-30*P y=30*P z=0 w=150 a=0
zvuk = new_array( 8 )
zvuk[ 0 ] = 1
zvuk[ 1 ] = 6000
zvuk[ 2 ] = 2000
zvuk[ 3 ] = 4000
zvuk[ 4 ] = 1
zvuk[ 5 ] = 6000
zvuk[ 6 ] = 2000
zvuk[ 7 ] = 4000

unu:
pixi( fon, 0, 0, 2 )
OPROS_FON
clear (SNEG)
if z < 0 {z = 31}
handle_hard_keys({OPROS},{})
pixi( fon_real, 0, 0, 1 )
fpixi(ballid,x/P,y/P,1,1,z)
print ("xp$xp",0,0,SNEG) // вывод прирощения по X
print ("yp$yp",0,10,SNEG) // вывод прирощения по Y
y=y + (yp)
x=x + (xp)
sound_volume (w)
send_sound( zvuk , 400, 1, 1 )
frame (30)
goto unu

OPROS:
if ghk = 264 {w=w+25 a=a+1 if a>4 {a=4 w=250}} // повышение передачи
if ghk = 265 {w=w-25 a=a-1 if a<0 {a=-1 w=50}} // понижение передачи + задний ход
if ghk = 266 {z-1} // поворот налево
if ghk = 267 {z+1} // поворот направо
xp=((cos(z*16))/32) * a
yp=((sin(z*16))/32) * a
ret

OPROS_FON:
x_opr1 = x+5*P+xp/a+y/10
y_opr1 = y+5*P+yp/a+y/10
x_opr2 = x-10*P+xp/a-y/20
y_opr2 = y-5*P+yp/a-y/30
B_fon1 = get_blue (get_dot (x_opr1/P,y_opr1/P))
B_fon2 = get_blue (get_dot (x_opr2/P,y_opr2/P))
if B_fon1>250 {xp=0 yp=0 a=0 w=100}
if B_fon2>250 {xp=0 yp=0 a=0 w=100}
ret

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: WIP: Tachka

Post by Al_Rado » Sat Jan 05, 2008 12:30 am

Честно говоря, не знаю как это работает - но работает! Супер! Спасибо!
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: WIP: Tachka

Post by NightRadio » Sat Jan 05, 2008 10:46 am

Это получилась работа с числами с фиксированной точкой.
0 = 0.0
8 = 0.5
16 = 1.0
32 = 2.0

Вот основные арифметические правила при таком подходе:

умножение числа c1 на c2:
результат = ( c1 * c2 ) / P

деление числа c1 на c2:
результат = ( c1 * P ) / c2

сложение:
результат = c1 + c2

User avatar
Al_Rado
Posts: 239
Joined: Tue Dec 04, 2007 2:33 pm
Location: Krasnodar
Contact:

Re: WIP: Tachka

Post by Al_Rado » Sat Jan 05, 2008 12:14 pm

Спасибо за разъяснения, нужно взять на вооружение данный метод :) Для плавного перемещения спрайтов это очень важно.
ВекторКодПиксельПолигон - ВотЧтоЯЛюблю!

User avatar
NightRadio
Site Admin
Posts: 3118
Joined: Fri Jan 23, 2004 12:28 am
Location: Ekaterinburg. Russia
Contact:

Re: WIP: Tachka

Post by NightRadio » Sat Jan 05, 2008 5:06 pm

Да, это полезный метод. Но, конечно, сходу в него въехать непросто... Поэтому я сейчас серьезно думаю над тем, чтобы в pixilang 2.0 ввести обычные дробные числа

Post Reply