Czy masz zarejestrowanego GM-a lub podstawową wiedzę w C?
Przytoczę mój stary artykuł:
Aby móc zrobić grę opisaną w artykule, musisz posiadać zarejestrowanego Game Makera 6.1. Cena rejestracji: 60zł.
Najpierw trzeba dodać 3 sprity do naszej gry - pierwszy ma przedstawiać okrąg w rozmiarze 32*32 pikseli, drugi kwadrat w rozmiarze 128*128 pikseli, a trzeci - okrąg w rozmiarze 64*64. Origin spritów z kołami musi znajdować się w ich środku.
Jeśli już zrobiłeś powyższe sprity użytkowniku, pora zabrać się za dźwięki. Pierwszy ma być dźwiękiem skakania, najlepiej sympatycznym "boing". Drugi ma być odgłosem skończenia levelu, trzeci - zebrania monety, a czwarty - muzyczką.
Robimy backgroundy. Backgroundy w 3D obsługuje się zwykle jako tekstury. Tekstury muszą mieć rozmiary 8*8, 16*16, 32*32, 64*64, 128*128, 256*256 i 512*512 pikseli.
Pierwsza tekstura ma być czerwonym kolorem, najlepiej gradientem. Druga musi być żółtym, trzecia ma przedstawiać... marmur (chyba). Jeśli nie masz skąd wziąć tej tekstury, zajrzyj do bibliotek GM-a. W katalogu z twoim GM-em znajdziesz folder Backgrounds. W nim jest plik gray2, który należy wziąć do naszej gry, ale potem powiększyć tą teksturę z rozmiaru 100*100 na 128*128 pikseli. 4 ma być niebem, a 5 zielonym gradientem.
Kończymy z teksturami, a zaczynamy z najtrudniejszym: objektami. Robimy więc pierwszy objekt i nazywamy go kamera. W evencie Room Start musi znajdować się skrypt:
Kod:
d3d_start();
sound_loop(muzyczka);
d3d_start to komenda startująca 3D, a sound_loop to znany wam skrypt do odtwarzania dźwięków i zapętlania ich. W miejscu muzyczka powinna znajdować się nazwa dźwięku z muzyczką w waszej grze.
W evencie Room End:
Kod:
d3d_end();
Doskonale wiesz, że to skrypt skończenia 3D.
W evencie draw - skrypt:
Kod:
d3d_set_projection(bohater.x,bohater.y+256,bohater.z+256,bohater.x,bohater.y,boh
ater.z,0,0,1)
Powyżej jest skrypt ustalenia pozycji kamery.
W evencie draw - jeszcze jeden skrypt:
Kod:
ttt=background_get_texture(niebo)
draw_set_color(c_white)
d3d_draw_ellipsoid(-640,-640,-640,room_width+640,room_height+640,800,ttt,11,11,24)
Tu jest skrypt rysowania nieba.
Robimy nowy objekt: ziemia. Nadajemy mu sprite kwadratu.
W evencie draw - skrypt:
Kod:
ttt=background_get_texture(marmur)
draw_set_color(c_white)
d3d_draw_block(x,y,z-10,x+sprite_width,y+sprite_height,z,ttt,1,1)
Tak, to skrypt rysowania marmurowego klocka.
Tworzymy kolejny objekt: bohater. Dajemy mu sprite koła w rozmiarze 32*32. W evencie create - skrypt:
Kod:
z=0
zspeed=0
zspeed to szybkość spadania, a z chyba już nie trzeba tłumaczyć?
W evencie step - skrypt:
Kod:
zspeed+=1
if zspeed>12 then zspeed=12
z-=zspeed
if z<-128 then room_restart()
Pierwsze trzy linijki obsługują grawitację, ostatnia śmierć w przepaści.
W evencie collision with ziemia - skrypt:
Kod:
if zother.z-6
{
z=other.z
zspeed=0
if keyboard_check(vk_space)
{
sound_play(sound0)
z+=12
zspeed=-12
}
}
if zother.z-13
{
x=xprevious
y=yprevious
}
if zother.z-26
{
z+=3
zspeed=3
}
Kolizja z ziemią + skok.
W evencie keyboard right - skrypt:
Kod:
direction-=10
W evencie keyboard left - skrypt:
Kod:
direction+=10
Obydwa skrypty to obracanie się bohatera.
W evencie keyboard up - skrypt:
Kod:
speed=4
Bohater może iść do przodu.
W evencie keyboard down - skrypt:
Kod:
speed=-2
Bohater może iść do tyłu.
W eventach keyrelease up i keyrelease down - ten sam skrypt:
Kod:
speed=0
Czyli zatrzymanie się po puszczeniu strzałki w górę albo w dół.
Event draw - skrypt:
Kod:
ttt=background_get_texture(herotekstura)
draw_set_color(c_white)
d3d_transform_set_identity()
d3d_transform_add_rotation_z(direction)
d3d_transform_add_rotation_y(zspeed)
d3d_transform_add_translation(x,y,z)
d3d_draw_block(-16,-8,0,16,8,8,ttt,1,1)
d3d_transform_set_identity()
Tu się ukazuje prawdziwe oblicze bohatera... jest klockiem. Tu trzeba było użyć skryptów transformacji. Aby działały poprawnie trzeba było ustawić origin sprita z kołem w jego środku.
Tworzymy nowy objekt i nazywamy go moneta. Dajemy mu sprite koła w rozmiarze 32*32. W evencie step piszemy skrypt:
Kod:
direction+=5
Dzięki temu skryptowi, moneta będzie ciągle zmieniać variable direction.
Event draw - skrypt:
Kod:
ttt=background_get_texture(kasa)
draw_set_color(c_white)
d3d_transform_set_identity()
d3d_transform_add_rotation_z(direction)
d3d_transform_add_translation(x,y,z)
d3d_draw_ellipsoid(-8,-2,0,8,2,16,ttt,1,1,24)
d3d_transform_set_identity()
Rysujemy dzięki temu skryptowi złotą, ciągle się obracającą monetę.
Evenct collision with bohater - skrypt:
Kod:
if other.zz-16
{
sound_play(zebranie)
score+=10
instance_destroy()
}
Czyli monetę można zebrać.
Robimy ostatni już objekt - koniec. Dajemy mu sprite koła w rozmiarze 64*64.
Skrypt draw:
Kod:
ttt=background_get_texture(roomend)
draw_set_color(c_white)
d3d_draw_ellipsoid(x-32,y-32,z,x+32,y+32,z+64,ttt,1,1,24)
Czyli rysowanie dużej kuli.
Skrypt collision with bohater:
Kod:
if other.zz-32
{
sound_play(sound1)
sleep(1000)
game_end()
}
Czyli koniec levelu.
Uff. Robimy room. Jako pierwszy musimy wstawić objekt kamera. Potem można designować room. Aby zmienić wysokość ziemi, końca levelu i monety, klikamy na niego prawym klawiszem myszy trzymając control i wybieramy Creation Code. Tam wpisujemy skrypt:
z=wymyśl sobie wysokość
W Game Options trzeba kliknąć zakładkę Errors i zaznaczyć opcję "Treat uninitialized variables as 0".
To już koniec artykułu.
Jeśli zrozumiałeś go, to znaczy, że możesz się za to zabrać, jeśli nie, odłóż projekt na później.