Zničitelný terén pomocí surface

Ostatní jazyky GameMaker Efekty Zničitelný terén pomocí surface

K pochopení je potřeba umět aspoň základy GML a povrchy (surfaces). Pokusím se je trochu přiblížit, ale k tomu slouží jiné návody. Surfacy umožňují vykreslovat nepřímo na obrazovku, do vlastního neviditelného plátna. Toto plátno se dá později použít ve hře.

Vytvoření terénu

Nejdříve vytvoříme objekt, který nazveme třeba surf_obj. Ten se bude starat o terén. Do eventu Create přidáme následující kody:

global.ground=surface_create(room_width,room_height);

Vytvoří nový surface o velikosti roomu

surface_set_target(global.ground);
 draw_clear(c_white);

Funkce surface_set_target aktivuje vykreslování do surfacu. draw_clear vyplní nový surface zvolenou barvou. Surfacy se nečistí automaticky, proto je nutné používat draw_clear před jejich použitím.

Teď můžeme do nově vytvořeného povrchu vykreslovat. Pro vygenerování země po celém roomu můžete použít jednoduchý kod, který používá 2 sprity o velikosti 48x48 s názvy trava_spr a hlina_spr. V první úrovni země vykreslí sprit s trávou, a zbytek zaplní hlínou.

tráva
Hlína
vyska=200;
for(i = 0 ; i < room_width;i += 48)
       {
       draw_sprite (trava_spr,0,i,vyska);
       }
for(s=(vyska) + 48; s < room_height;s += 48)
       {
               for(e=0;e < room_width;e += 48)
               {
               draw_sprite(hlina_spr,0,e,s);
               }
       }

Proměnná vyska představuje výšku, od které se začne země generovat. Můžete použít i sprity jiné velikosti, stačí jenom upravit velikost 48 v kodu na vlastní. Stejně tak můžete přímo vytvořit a vykreslit sprit terénu, místo generování.

Aby byl výsledný sprit terénu průhledný, musíme do levého dolního rohu vykreslit bílou tečku určující průhlednou barvu.

draw_set_color(c_white);
draw_point(0,room_height-1);

Pro ukončení vykreslování do povrchu použijeme

surface_reset_target();

Nakonec z tohoto povrchu vytvoříme sprite a nastavíme pozici objektu na 0, aby měl terén správné kolize.

global.ground_spr=sprite_create_from_surface;

(global.ground,0,0,room_width,room_height,1,0,0,0);
 x=0;
 y=0;

V eventu Create je to všechno. Teď se přesuneme do eventu Step, kde zajistíme přiřazování spritu terénu k objektu surf_obj.

sprite_index=global.ground_spr

Nakonec přidáme do Draw eventu samotné vykreslení terénu:

if sprite_exists("global.round_spr")
draw_sprite(global.ground_spr,0,0,0);

Podmínka zaručuje, že se vykreslí jenom když existuje.

Vykreslení terénu je hotové. Měl by vypadat nějak takto:

screen1

Ničení

Zbývá dodělat to nejdůležitější, ničení terénu. K tomuto účelu vytvoříme objekt, který do země udělá díru a zničí se. Nazveme ho třeba dira1_obj. Do eventu Create vložíme kod:

surface_set_target(global.ground);
draw_set_color(c_white);
draw_circle(x,y,30,0);
surface_reset_target();

Tento kod přepne režim vykreslování opět na povrch, a vykreslí do něj bílý kruh. Protože bílá je v povrchu průhledná, vznikne díra. Takto se dá vykreslovat i jiné bílé tvary a sprity.

Nakonec nahradíme sprit terénu za nový a objekt odstraníme:

sprite_delete(global.ground_spr);
 global.ground_spr=sprite_create_from_surface(global.ground,0,0,room_width, room_height,1,0,0,0);
 instance_destroy();

Pro test můžeme vytvořit objekt rakety raketa_obj, která po dopadu udělá díru. V creatu nastavíme gravitaci

gravity=0.8;

A při kolizi s surf_obj

instance_create(x,y,dira1_obj);
instance_destroy();

Rakety se můžou vytvářet levým tlačítkem myši, v surf_obj (nebo vlastním objektu) přidáme do Stepu:

if mouse_check_button_pressed(mb_left);
instance_create(mouse_x,mouse_y,raketa_obj);

Hotovo, tady je výsledek

screen2

 

Stáhnout

Staženo 419x (320.45 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal Satik64
Avatar
Autor se věnuje základům game designu, programování her v Game Makeru a Unity a práci v grafických nástrojích. Občas tvoří módy do jiných her.

Jak se ti líbí článek?
Celkem (3 hlasů) :
55555


 


Miniatura
Všechny články v sekci
GameMaker - Efekty
Miniatura
Následující článek
Nekonečný sprite - GameMaker

 

 

Komentáře

Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Udělal jsem to přesně podle toho a nefunguje to.
Ukazuje mi to: Trying to draw non-existing sprite.
(Potřebuji jen převod surfacu na sprite)

Odpovědět 1.3.2013 12:28
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
TomBen:

A proč převádíš surface na sprite?

Odpovědět 1.3.2013 12:33
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Abych ho mohl vykreslit pomocí

draw_set_blend_mode( );
Odpovědět 1.3.2013 12:38
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
TomBen:

Není důvod,proč by to nemělo fungovat.
Můžu to večer vyzkoušet, jestli se chyba do té doby neobjeví.
Kdybys měl nějaký kus kódu, tak ho sem hoď.

Odpovědět 1.3.2013 12:47
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Zdeněk Pavlátka:

Create:

global.light_surface=surface_create(640,480)
global.lights=sprite_create_from_surface(global.light_surface,0,0,640,480,0,0,0,0);

Begin step:

surface_set_target(global.light_surface)
draw_clear(c_white)
surface_reset_target()

Step: vykreslení věcí
End step:

sprite_index=global.lights

Draw:

draw_set_blend_mode(bm_src_color);
draw_sprite(sprite_index,0,0,0);
draw_set_blend_mode(bm_normal)
Editováno 1.3.2013 12:55
Odpovědět 1.3.2013 12:55
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Zdeněk Pavlátka
TomBen:

Vracím se po 22:00, tak to pak prozkouším.
Zítra ráno tu budeš mít výsledek.

Odpovědět 1.3.2013 13:15
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
TomBen
Redaktor
Avatar
TomBen:

Nejspíš máš jenom nějaký jmenný překlep nebo špatné pořadí
jednotlivých bloků kódů. U mě jede všechno podle očekávání.
Jinak mám vyzkoušeno, že blend funguje i na draw_surface funkce,
takže sprite vlastně vůbec nemusíš dělat.
Každopádně jede všechno včetně sprite ze surface:
http://www.ulozto.cz/…m-sprite-zip

Odpovědět 2.3.2013 1:43
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
STETHEM
Člen
Avatar
STETHEM:

Na lite nič nejde či čo?

 
Odpovědět 10. ledna 18:15
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.