Diskuze: Neposlušný surface

Ostatní jazyky GameMaker GameMaker Neposlušný surface

Avatar
Martin
Člen
Avatar
Martin:

Pekný večer. Potrebujem poradiť ohľadne surface, vytvorím ho no pri vykreslení sa chová ako keby vytvorený nebol a hodí to error:

Trying to use non-existing surface.
 at gml_Object_oSeno_DrawEvent_1 (line 1) - draw_surface(surSeno,x,y);

event create:

surSeno = surface_create(sprite_width,sprite_height);
surface_set_target(surSeno);
draw_set_blend_mode(bm_normal);
draw_set_alpha(1);
draw_self();
surface_reset_target();

event draw:

draw_surface(surSeno,x,y);

Samozrejme podľa chyby som usúdil, čím to môže byť tak som skúsil aj

if(surface_exists(surSeno)) then draw_surface(surSeno,x,y);

No v tomto prípade bohužial nevykreslí vôbec nič, v objekte mám nastavený sprite na ten ktorý chcem vykresliť v draw_self() takže na nič také som nezabudol. Žiadny sprite ani objekt ani miestnosť ani nič nemá rovnaký názov ako ten surface, vie niekto poradiť ako to opraviť? o_O Vopred ďakujem.

 
Odpovědět 4.10.2015 21:08
Avatar
martinov9
Člen
Avatar
martinov9:

Pokud se snažíš jen vykreslit obrázek tak postačí draw_sprite(na­zev_obrazku,0,x,y) ale pokud tam potřebuješ surface tak s tím ti nepomůžu.

 
Nahoru Odpovědět 5.10.2015 15:58
Avatar
Martin
Člen
Avatar
Martin:

Ano, potrebujem surface, pretože chcem aby s toho obrázku "sSeno" ubúdalo, teda vyrezávalo mi do ňho podľa nejakého iného spritu zase. Lenže k tomu som sa ani nedostal, kedže som nevyriešil ani tento začiatočný problém. 8-|

 
Nahoru Odpovědět 5.10.2015 20:48
Avatar
martinov9
Člen
Avatar
Odpovídá na Martin
martinov9:

Jednoduše si vytvoř globální a pár nových spritů Vytvoříš: global.sSeno = 0
Do draw eventu hodíš už jen tohle :

if global.sSeno < hodnota1
{
draw_sprite(spri­te_kousek_sena1,0,x,y,)
}
else
if global.sSeno < hodnota 2 (hodnota2 je menší než hodnota1)
{
draw_sprite(spri­te_kousek_sena2,0,x,y)
}
else
A takto pokračuješ podle toho kolik chceš obrázků

Je to možná složitější ale nepotřebuješ surface.

PS: Hodnota1 musí být největší Hodnota2 musí být menší než Hodnota1 a takto postupně dáváš menší a menší čísla.

 
Nahoru Odpovědět 7.10.2015 14:28
Avatar
Martin
Člen
Avatar
Martin:

Hmm, hej z tohto pohľadu skúsiť to vymyslieť nejak inak a obísť daný problém som sa nato nepozeral, rútil som sa do toho iba s tým, že to chcem opraviť, ďakujem za odpoveď takto by to ísť malo aj keď to síce po grafickej stránke nebude také pekné! ;-)

 
Nahoru Odpovědět 7.10.2015 14:36
Avatar
martinov9
Člen
Avatar
 
Nahoru Odpovědět 9.10.2015 14:02
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Martin
TomBen:

V některých verzích GMS se stává, že surface zadaný k vytvoření v Create se prostě nevytvoří a pak tedy ani není, co vykreslit. Řeší se to tak, že se surface vytvoří přímo v Draw a vypodmínkuje. V Create klidně necháš kód na vytvoření, ale přesto v Draw ověříš, jestli existuje.

Create:

surSeno = surface_create(sprite_width,sprite_height); //první pokus o vytvoření

 //pokud je střed centrovaný, jinak třeba přenastavit
w=sprite_width/2;
h=sprite_height/2; //dělení se do Draw nedává kvůli rychlosti

Draw:

//ověření a případný druhý pokus
if !surface_exists(surSeno) surSeno = surface_create(sprite_width,sprite_height);

//a pak stále v Draw to, cos měl původně v Create:
 //fakt už jen pro jistotu ověřit - teoreticky totiž nemusí surface získat přidělenou paměť
if surface_exists(surSeno)
{
surface_set_target(surSeno);

draw_set_blend_mode(bm_normal); //poněkud nadbytečně, ale měls to tam
draw_set_alpha(1); //totéž
//změněné podmínky je lépe vracet do normálu přímo v kódu, který je měnil

// draw_self kreslí podle x,y což není dobrý nápad, protože surface má levý horní v 0,0
//takže spíše něco jako:
draw_sprite(sprite_index,image_index,w,h);

surface_reset_target();
draw_surface(surSeno,x,y);
}
Nahoru Odpovědět 9.10.2015 21:20
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
Martin
Člen
Avatar
Odpovídá na TomBen
Martin:

Ďakujem, momentálne nemám čas ale akonáhle ho budem mat vyskúšam a dám vedieť ako to dopadlo :-)

 
Nahoru Odpovědět 11.10.2015 21:38
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.