[ARHIIV] mängumeistrid
Pole sisse logitud. [Logi sisse ]
Mine lehekülje algusesse
Prinditav versioon | Telli teema e-mailile | Lisa lemmikutesse  
Midagi õpetlikku: draw_sprite kombineeritud arrayst (Lahendatud!!!)
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




thumbup.gif postitati 23.12.2008 19:14 Tsiteeri
Midagi õpetlikku: draw_sprite kombineeritud arrayst (Lahendatud!!!)



Et niimoodi:
Näiteks mul on 2 spritet. "pall" ja "punane_pall"

üks objekt.

Muutujas "pilt" hoiame tema sprite nime:

pilt = pall;

ja joonistame muutuja "pilt" sisu:

draw_sprite(pilt,0,x,y);

Lihtne ja töötab, eks?

Aga nüüd ma tahan valemi abil muuta "pilt" sisu.


pilt = "punane_"+pilt

tulemuseks peaks olema "punane_" + "pall" = "punane_pall"
Ja ongi. Aga miskipärast draw_sprite enam ei mõista, et tema muutja "pilt" sees on sprite nimi. Ja kogu lugu ei tööta. sellise nimega sprite on olemas, kogu loogika järgi peaks draw_sprite aru saama, et tahetakse joonistada spritet sellise nimega. Aga ei saa!

Mida teha?

Üks loogiline lahendus on kasutada GM sprite nimede asemel pildifailide nimesid, need on päris kindlasti stringid. Aga ma ei taha, pilte on üle saja, "nimi_" variatsioone ka väga palju ja laadmine muutuks tülikaks.

Niisiis, miks see ei tööta, nagu peaks? Kas ma peaks "pilt"
muutuja enne stringist millekski muuks konvertima?

Keegi?

EDIT: Miskipärast, muutuja =
ei tekita muutujale string-väärtust, ehk siis stringi ei saagi joonistada draw_spritega. Millist tüüpi väärtuse ta tekitab/mida SAAB joonistada siis?

[Muudetud: 2-1-2009 InCreator]
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
Crypton

Avatar

Liitunud: 18.12.2005
Postitusi: 1604
[EEMAL]




postitati 23.12.2008 21:13 Tsiteeri


Sinu Edit osa ma tahtsin teksti lugedes just mainida.

Üritasin ise ka midagi. Tähelepanu pälvis sprite_get_name funktsioon. Kuigi see võib osutuda suhteliselt ebaotstarbekaks.

Vb tegema siis midagi sellist, et igakord kui see nö stringi moodustamine tehakse laetakse vastav sprite sisse:

part1 = 'minu_' ;
part2 = 'sprite' ;
name = part1 + part2 ;

//Järgneva võib panna ka skripti mis annab vastutasuks sprite nö nime mida saab joonistada
sprite = sprite_add(working_directory + '/images/' + name + '.jpg',0,0,0,0,1,0,0)
//Või kui kaustas pole pilte (testisin see töötas)
sprite = sprite_add(working_directory +'/'+ string(spr) + '.jpg',0,0,0,0,1,0,0);

Draw:

draw_sprite(sprite,0,x,y)


Lisasin kui kaustas pilti pole siis ei tohi seda / ära unustada


[Muudetud: 23-12-2008 Crypton]

Maze I: CryptonRalli III: Crypton<br>
Vaata kasutaja profiili Külasta kasutaja kodulehte Otsi kasutaja postitusi Saada privaatsõnum
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




postitati 23.12.2008 23:35 Tsiteeri


sprite_get_name intrigeeris mind ka.

Sain seda proovides nii targaks, et -- nagu objektilgi, spritedel samamoodi ei ole nimiväärtust ehk stringi.


Et objekt "mees" nimi on lihtsalt muutuja.
ja tegelikult

mees = mees.id või täpsemalt mingi number üle 100000

tuleb välja, et kui ma ütlen esimest tehtud spritet kasutades, et

pilt = sprite0

siis see on petekas. Tegelikult saab GML aru, et

pilt = 0;

ehk siis

pilt = esimese sprite index

sama tulemuse annaks

draw_sprite(0,image_single,x,y)

...mistõttu ei saagi teha "blabla" + pilt, sest see oleks sama mis "blabla" + 0 ja seega type mismatch
Kurat küll. Kuidas ma küll saan siis automatiseerida sprited?

Võib ju teha mingi haige array mapi või käsitsi IGA pilt defineerida...

Mul on tegelane, kes

kõnnib
kõnnib ja tulistab
roomab
roomab ja tulistab
ujub vees
ujub vees ja tulistab
jookseb
jookseb ja tulistab
on surnud
sureb mitut moodi

ja nii edasi. Igast "asendist" on 8 spritet 8 framega, ehk siis mees saab 8-sse suunda vaadata, tulistada, kõndida, joosta jne igatepidi, vees ja roomates jne

Kogu seda jama käsitsi defineerida tähendaks meeeeeeletut ületegemist iga väikese muutuse korral... :(

Enda mõte oli hoida muutujas joonistamise pilti, vormistada spritenimed nii, et näiteks

pilt = mees_alla

ja joostes oleks

pilt = jookseb_mees_alla

ja samal ajal veel tulistades oleks

pilt = jookseb_tulistab_mees alla

ja pärast oleks koba teha, et


if (jookseb = 1) && (tulistab = 1)
{
maalipilt = "jookseb_" + "tulistab_" + pilt;
draw_sprite(maalipilt,image_single,x,y);
}


--Kuramuse hea mõte JÄLLE game makeri puuduste konksu taga!

Võib-olla saab kuidagi numbritega? Proovin nii ka.

[Muudetud: 23-12-2008 InCreator]
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
Pilvemees
Moderator
Avatar

Liitunud: 28.7.2007
Postitusi: 791
[EEMAL]




postitati 24.12.2008 08:45 Tsiteeri


Üks moodus oleks konstante kasutada.
Kui GM mängu kompileerib, siis ta unustab ära mängusisesed sprite'de nimed. Annab neile vaid id'd, kõik mis sa koodides oled kasutanud muudetakse samuti
id-deks.
A kui mäng algab, siis need väärtused peaks ju saama konstantidesse tõmmata, või massiivi, vahet ei, väärtused muudetakse ika ära.

http://mangulooja.dragon.ee/lahinguatid/lahinguatid.gifhttp://mangulooja.dragon.ee/lembitu/lembitu_sig.pnghttp://mangulooja.dragon.ee/sigs/kindlus_sig.jpghttp://mangulooja.dragon.ee/keskaeg/sig.png
Aasta mäng 2009: Pilvemees, valter<br>
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
Crypton

Avatar

Liitunud: 18.12.2005
Postitusi: 1604
[EEMAL]




postitati 24.12.2008 09:22 Tsiteeri


mjh massiive saab ka käigupealt luua.
variable_set_array vms.

Mina isiklikult seda palju kasutanud. Töötab nagu võluväel. Array nimede loomisel saad kasutada stringe (saadki kasutada oma stringi kombineerimist) ja väärtuseks anda sprite id.

Maze I: CryptonRalli III: Crypton<br>
Vaata kasutaja profiili Külasta kasutaja kodulehte Otsi kasutaja postitusi Saada privaatsõnum
h0lx
Kohalik sitapea
Avatar

Liitunud: 10.4.2006
Postitusi: 1826
[EEMAL]




postitati 26.12.2008 14:48 Tsiteeri


execute_stringiga peaks toimima, aga kiirus kannatab veidi.
http://i47.tinypic.com/x0w83p.gif
Moonwalk
Platform II: -DMI-; H0lx&jorssJõulumäng I: h0lx&jorss
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




postitati 2.1.2009 23:06 Tsiteeri


Lahendus
Lahendasin asja, aga omamoodi. Ilgelt loogiline tuli lõpuks!

Panen kirja ka! Äkki keegi saab aru ja seisab isegi sarnase probleemi ees!

Mul on 4 olulist muutujat (võimalikud väärtused sulgudes)

roomab (1 või 0)
laseb (palju)
suund (0-7 päripäeva)
vees (1 või 0)

Kõigepealt deklareerisin hunniku arraysid, mille indeksis on kõik 4 muutujat.

Ehk siis

pilt[lasebroomabsuundvees] = sprite nimi

(Need asjad, mille väärtus võib olla ka 0, asendasin 9-ga, arvutamise tarbeks. Sest näiteks pilt[0001] on VIST sama mis pilt[1] ja see tekitaks segadust.)


tuli näiteks

pilt[9109] = roomab_s_u;
pilt[9119] = roomab_s_ur;
pilt[9129] = roomab_s_r;
...jne

Sellist listi on sigalihtne teha, sama 8-t rida copypasteda ja igal real tilluke muutus teha

"s_" on siin lihtsalt tähis "sprite"

Et rida

Kood:
pilt[1121] = laseb_roomab_s_r_v;


ütleb, et mees 1-laseb 1-roomab 2-vaatab paremale ja 1-on vees
Lihtne, onju.


Draw eventis, enne joonistamist tuleb arrayle indeks (ja need 9-d) lahti seletada ja 10-astmega läbi korrutada, et järjekord jääks indeksis samaks:

Kood:
var muut1, muut2, muut3, muut4;

if (laseb = 1) muut1 = 1000 else muut1 = 9000;
if (roomab = 1) muut2 = 100 else muut2 = 900;
muut3 = (suund*10);
if (vees = 1) muut4 = 1 else muut4 = 9;


Nagu näha, korrutan nad järjekorra hoidmiseks lihtsalt kümne astmega läbi... tuleb meelde mingi 4-da klassi matemaatika nurisünnitis, "sajalised", "kümnelised"... mida lollust küll ei saanud õpitud omal ajal!

Ja polegi muud kui liita kokku muutujad ja saame õige indeksiga array

Kood:
draw_sprite(pilt[muut1+muut2+muut3+muut4], image_single,x,y);


Sigalihtne! Muuta ka!

Nii et üksainus draw_sprite rida, ja üksainus array lõputu hulga piltide jaoks ja samas peaaegu täisautomaatne (kui eeldefineermine välja arvata), loogiline ja loetav süsteem.

Algselt kasutatud if-ide tšekkimine võttis SADU ridu. Midagi ei saanud enam aru ja nurksulud läksid segi kogu aeg. Midagi muuta - täispõrgu.

Nüüd ainult 6 rida! Saan isegi lisada veel jooksmise muutuja (array indeksi limiit viiekohaline) vaid paari rea abil ja ikka funksib!
2-mõõtmeline array lubaks veel 5 muutujat... :evil:

:happy:

[Muudetud: 2-1-2009 InCreator]
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
Crypton

Avatar

Liitunud: 18.12.2005
Postitusi: 1604
[EEMAL]




postitati 4.1.2009 17:37 Tsiteeri


dünaamilisus ruulib :)
Maze I: CryptonRalli III: Crypton<br>
Vaata kasutaja profiili Külasta kasutaja kodulehte Otsi kasutaja postitusi Saada privaatsõnum
kurihiir
miks nii, kuis nii?
Avatar

Liitunud: 17.10.2006
Postitusi: 396
[EEMAL]




postitati 8.6.2009 00:21 Tsiteeri


Ja ma ei jõua teid ära tänada. : D
see asi tuli mulle vägagi kasuks praegu.
Peale 60t rida ainult animatsiooni jaoks hakkasin ka mõtlema et kurat, kuidagi peab lihtsamalt ka saama ju.
5+(y)

god deemit. :(
ei saa ikka päris hakkama.
üks pisike näide oleks väga hea.

http://komportaal.eu/portaal/foorum/bannah.png

Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




postitati 8.6.2009 02:52 Tsiteeri


Mida siin hakkama saada?
1) loe kokku muutujad, mille järgi muutub pilt.

NÄITEKS...

püssiga, kükitab, mütsiga, elus

nii. Iga muutuja on 0 või 1. Sellest oleneb sprite.
Nüüd esimene asi, kui miski on 0, teed nii, et array nimes oleks hoopis 9 (või mingi muu number)

pilt[püssiga,kükitab,mütsiga,elu] = sprite nimi

näiteks
pilt[1199] = mees_püssiga_kükitab_mütsita_surnud
ja
pilt[1111] = mees_püssiga_kükitab_mütsiga_elus

Siiani saad aru? Edasi on veel lihtsam.

2) Draw eventis loed muutujate väärtused kokku:

var a,b,c,d;

if (püssiga = 0) a = 9000 else a = 1000;
if (kükitab = 0) b = 900 else b = 100;
if (mütsiga = 0) c = 90 else c = 10;
if (elus = 0) d = 9 else d = 1;

Lihtne. 9 asemel näe mõttes nulli.
Näed, iga kord võtan 10 korda väiksema arvu. Kui olulisi muutujaid oleks viis, siis alustaks muutuja * 10 000. Kui kuus, siis muutuja * 100 000 jne. Asja mõte on selles, et liitmisel tekiks üks pikk arv


3) Nüüd siis liidad

a + b + c + d

Ütleme et mees on püssiga, kükitab, ilma mütsita ja surnud
Eelneva tehte järgi siis

a = 1000, b = 100, c = 90 ja d = 9

Kui nüüd 9-t poleks nulli asemel kasutanud, tekiks segadus. Seepärast see 9.

a+b+c+d = 1199

loogiline?
Aga nii näitasid ka arrays pilti!

draw_sprite(pilt[a+b+c+d],0,x,y)
ehk
draw_sprite(pilt[1199],0,x,y)

Ja pilt[1199] ju võrdub mees_püssiga_kükitab_mütsita_surnud!
Ja game maker joonistabki õige pildi.
______________________________________
Või teeme lihtsamalt, 2 muutujaga

4 spritet:

pall_sinine_suur
pall_sinine_väike
pall_punane_suur
pall_punane_väike

Nii: 2 muutujat: sinine ja suur
Loogika: Kui pall ei ole sinine, on ta punane, kui pall ei ole suur, on ta väike

4 arrayd:

pall[11] = pall_sinine_suur // (sinine = 1 ja suur = 1)
pall[19] = pall_sinine_väike // (sinine = 1 ja suur = 0)
pall[91] = pall_punane_suur // (sinine = 0 ja suur = 1)
pall[99] = pall_punane_väike // (sinine = 0 ja suur = 0)

Liidad:

var a,b

if (sinine = 1) a = 10 else a = 90
if (suur = 1) b = 1 else b = 9

Nende 2 ifi kohaselt võib tehe a+b olla kas
10 + 9 = 19
10 + 1 = 11
90 + 1 = 91
90 + 9 = 99

Ja täpselt sellise indexiga neli arrayd hoiavadki spritede nimesid

...draw_sprite(pall[a+b]...

Näide kah, olgugi et pole midagi näidata nii lihtsa asjaga:

Lisatud fail: dyna.gmk (15.92kb)
123 korda tõmmatud
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




postitati 29.7.2009 11:39 Tsiteeri


EDIT: Tõstsin Näidete foorumisse loo, sest lahenes suht õpetlikult.
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum
Hyena
Level 6
Avatar

Liitunud: 5.11.2007
Postitusi: 281
[EEMAL]




postitati 7.8.2009 12:20 Tsiteeri


Milleks on vaja 4 sprite indexi hoidmiseks 100-elemendilist massiivi?!

isegi kui bithaaval arvutuste abil analoogiline lahendus vormistada, saaks 4 sprite kõikide kombinatsioonide kirjeldamiseks hakkama 1+2+4+8+1 = 16-elemendilise massiiviga. GM registreeritud versioonis on juba iidamast aadmast dynamic listid ja mapid. Siinkohal soovitan mape, sest igas mapi elemendis on võti (key) ja väärtus (value), mida on imelihtne võtme abil üles leida.

ma lahendaks probleemi hoopis sedasi:

// defineerida konstandid:
DO_RUN 1
DO_WITH_KNIFE 2
DO_WALK 4
DO_SWIM 8
// iga j2rgmine DO_? peab olema eelmise korrutis arvuga 2

/* kuhugi createsse siis selliselt: */
running=false;
walking=true;
swimming=false;
using_knife=true;

sprited=ds_map_create();

ds_map_add(sprited, DO_RUN, spr_jookseb);
ds_map_add(sprited, DO_WALK, spr_k6nnib);
ds_map_add(sprited, DO_SWIM, spr_ujub);
ds_map_add(sprited, DO_RUN+DO_WITH_KNIFE, spr_jookseb_noaga);
ds_map_add(sprited, DO_WALK+DO_WITH_KNIFE, spr_k6nnib_noaga);
ds_map_add(sprited, DO_SWIM+DO_WITH_KNIFE, spr_ujub_noaga);
// kui keegi ei saa aru, aga siiski hullult tahab teada, miks siin see liitmine töö ära teeb, siis küsige nii ja ma seletan.

/* end of create event */


/* draw eventis siis toredasti kasutame: */
var buf; // millist spritet meil siis antud juhul vaja oleks?
buf=0;

if (running) buf+=DO_RUN;
if (swimming) buf+=DO_SWIM;
if (walking) buf+=DO_WALK;
if (using_knife) buf+=DO_WITH_KNIFE;

// kindluse m6ttes ikka kontrollime ka, kas võti on üldse defineeritud
if (ds_map_exists(sprited, buf)) {
draw_sprite(ds_map_find_value(sprited, buf),-1,x,y); // ja viimaks joonistame, peaks töötama
}
/* end of draw event */


/* destroy eventis tuleks enda tagant praht ka ära koristada: */

ds_map_destroy(sprited); // 2rge kasutage seda koodi, kui te oma m2ngu m2lulekkeid tahate! :D

/* end of destroy event */


Ausaltöelda on üleüldse idiootne teha iga kombinatsiooni jaoks eraldi sprite, sest sedasi saab teil olema miljardeid spritesid. Antud olukorras oleks palju targem eraldada ntx noa sprite mehe spritest ja nad lihtsalt vajaduse korral üksteise peale blittida. Küsige ja ma võin täpsemalt seletada seda süsteemi (DiabloII obviously kasutab seda ntx).

Ma pole seda koodi GMis läbi testinud, sest mu arvutis pole seda enam ammu :D.
Võimalik et GM'is if (true) ei tööta, ei mäleta. Muidu peaks kõik tibens tobens olema, sest aastatepikkune GM kogemus on paratamatult oma jälje jätnud :P

http://www.hyena.net.ee/Pic/medium_banner.gif

Vaata kasutaja profiili Külasta kasutaja kodulehte Otsi kasutaja postitusi Saada privaatsõnum Vaata kasutaja MSN-i
InCreator
baksjor!
Avatar

Liitunud: 18.12.2005
Postitusi: 1230
[EEMAL]




postitati 11.2.2010 16:45 Tsiteeri


maisaa mitte essugi aru...

hyena pakutud ds_mappimine on tegelt mõistlikum
Emo2: InCreator
Vaata kasutaja profiili Otsi kasutaja postitusi Saada privaatsõnum

Hetkel loevad seda teemat:
Mitte ühtegi - 1 külaline

Mine lehekülje lõppu





Foorumi algbaas põhineb XMB mootoril, modifitseeritud Valter Pundi poolt
Kodulehekülg on tehtud Valter Pundi poolt vpundi ät gmail punkt komm