Geek tričko zdarma Python týden
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: Posouvajici se bar

Aktivity (1)
Avatar
Martin Vocet
Člen
Avatar
Martin Vocet:18.10.2017 16:21

Ahoj vsem pritomnym ;)
Zkousim delat hru s potapecem, co se bude ponorovat do vody a zakladem je stupnice (bar) na kterem musite ve spravny cas chytnout dany symbol. Tak trochu jako nejakej slot machine. Zamerovani s pohybem uz mam a tak ted pracuji samostatne prave jen na vymene ikon v tom baru a posouvani a promazavani.
A v tom tam mam problem...

screen
Tady na obrazku je vysvetlen pohyb o ktery se snazim. On vlastne funguje, ale jen po prvnim, druhem kliknuti, pak to jde do kopru.

Tady je i exportovany projekt, je to jen cast kodu co je zkopirovana i zde a ty ikony, takze nic velkeho to neni.
"soubor projektu ":https://drive.google.com/open?…

Ja osobne si myslim, ze nevim jak mam pak pri tom mazani instanci, definovat ktere presne chci smazat. Ze jsou to ty prvni x ikony nahore.
Zaklad mam pres pouzivani ds_listu, kde zadavam cisla a tem pak prirazuji pres switch specifickou grafiku. No a tyto instance pak nemam pod kontrolou, protoze kdyz je posunu, uz je nemam v promene "instances". Teda tak mi to prijde.
Tady je nejdriv kod pri vytvareni:

///creation
room_speed = 60;
hsprite = sprite_get_height (s_obst1);


obstnum = 8; // lenght of a bar (obstacles number)
enenum = 8; // number of obstacle types (enemy number)

instances = undefined; // sprite instances of obstacles
result = 0; //in the future, random number

addlist = true; //part of a code
movelist = false; //part of a code
deletelist = false; //part of a code

a kod pri kazdem stepu:

/// step
var dspos, xpos, ypos, obst;

//MOUSE click
if (mouse_check_button_pressed (mb_left)) {
    addlist= true;
    result = 2;
    show_debug_message ("-------------START---------------");
    }


// ADDLIST
if (addlist == true) {
    show_debug_message ("-------------addlist---------------");

    // create list (first run)
    if (is_undefined (instances)) {
        list = ds_list_create();
        repeat (obstnum) ds_list_add(list, irandom_range(0,enenum) );
        show_debug_message ("list added");
    }

    // add value to ds_list
    repeat (result) ds_list_add(list, irandom_range(0,enenum) );
        show_debug_message ("ds_list_size " + string(ds_list_size(list)));

    // draw icons
    if (is_undefined (instances)) {  // first run
        for (i = 0; i < obstnum; i++) { // testing all positions in list
        dspos = ds_list_find_value(list, i);
        xpos = xstart;
        ypos = (i * hsprite) + ystart;
        switch (dspos) {
                case 0:
                    obst = o_obst0;
                    break;
                case 1:
                    obst = o_obst1;
                    break;
                case 2:
                    obst = o_obst2;
                    break;
                case 3:
                    obst = o_obst3;
                    break;
                case 4:
                    obst = o_obst4;
                    break;
                case 5:
                    obst = o_obst5;
                    break;
                case 6:
                    obst = o_obst6;
                    break;
                case 7:
                    obst = o_obst7;
                    break;
                case 8:
                    obst = o_obst8;
                    break;
            }
        instances = instance_create(xpos,ypos,obst);
        show_debug_message ("FIRST instances " + string(instances));
        }
        movelist = false;
        addlist = false;
        deletelist = false;

    } else {
        for (i = 0; i < result; i++) { // testing all positions in list
        dslast = obstnum + i; // position within ds_list from back
        dspos = ds_list_find_value(list, dslast);
        xpos = xstart;
        ypos = (dslast * hsprite) + ystart;
            switch (dspos) {
                case 0:
                    obst = o_obst0;
                    break;
                case 1:
                    obst = o_obst1;
                    break;
                case 2:
                    obst = o_obst2;
                    break;
                case 3:
                    obst = o_obst3;
                    break;
                case 4:
                    obst = o_obst4;
                    break;
                case 5:
                    obst = o_obst5;
                    break;
                case 6:
                    obst = o_obst6;
                    break;
                case 7:
                    obst = o_obst7;
                    break;
                case 8:
                    obst = o_obst8;
                    break;
            }
        instances = instance_create(xpos,ypos,obst);
        show_debug_message ("NEW instances " + string(instances));

        }
    movelist = true;
    addlist = false;
    deletelist = false;
    }
}

// MOVELIST
if (movelist == true) {
    show_debug_message ("---------movelist-----------");

    //movement
    for (i = 0; i < obstnum; i++) {
        if (instances[result].y > self.ystart) {
            instances.vspeed = -6;
        } else {
            instances.vspeed = 0;
            movelist = false;
            deletelist = true;
        }
    }
}

// DELETELIST
if (deletelist == true) {
    show_debug_message ("-------------deletelist---------------");

    // delete instances
    show_debug_message ("problem with deleting");

    for (i = 1; i < result + 1; i++) {
        instance_destroy(instance_id); //I would like to delete first "result" instances
        show_debug_message ("deleting instances... ");
        }

    //delete list postions
    if ds_list_size(list) > obstnum {
        repeat (result) ds_list_delete(list, 0);
        show_debug_message ("ds_list_size " + string(ds_list_size(list)));
        }
    deletelist = false;
    show_debug_message ("-------------END---------------");
}

zaroven jsem se chtel zeptat, jak bych tu cast "switch" mohl dat do scriptu, abych to tam nemel zbytecne 2x napsane a mel ten kod tak kratsi.. ?

a jinak dekuji jestli mi s tim nekdo poradi. :)

 
Odpovědět 18.10.2017 16:21
Avatar
TomBen
Redaktor
Avatar
Odpovídá na Martin Vocet
TomBen:19.10.2017 18:28

Je to docela zajímavé cvičení. Určitě bych to řešil jinak - myslím, že se to zbytečně komplikuje, když máš každou ikonu jako sólo objekt. Viděl bych to spíše na jeden objekt Bar. Ten by obstaral vykreslení a vracel kliknutou hodnotu. Velice se to tím zpřehlední - viz ukázka.
https://www.dropbox.com/…ovingBar.zip?dl=0

Nahoru Odpovědět 19.10.2017 18:28
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
mlin
Člen
Avatar
mlin:19.10.2017 22:23

Moc dekuji :)
Ted jsem na to rychle koukal a nestacim se divit jak je to o tolik jednoduzssi. Jeste se tim proctu vic v nedeli, ale uz ted na to neprestavam myslet ;) Jsou tam veci ktere ani neznam, ale rad se nove veci priucim. Ses opravdu trida.
Jeste se chci zeptat kde se meni hodnota o kolik se bar po kliknuti ma posunout?

Jinak si to projdu vic a dam urcite vedet, moc si vazim tve pomoci. Psal jsem to na radu for i na ten od Yoyo a ani jeden uzivatel neodpovedel.

Prijemny vikend
Martin

 
Nahoru Odpovědět 19.10.2017 22:23
Avatar
TomBen
Redaktor
Avatar
Odpovídá na mlin
TomBen:20.10.2017 16:39

Proměnná, která určuje aktuální posun se jmenuje offset a je v pixelech plus i mínus. Automatické řízení změny offsetu jsem udělal alarmem. Když nastavíš alarm[0] na nějaké číslo, tak se offset bude snižovat o jeden pixel tak dlouho, dokud ten alarm nedoběhne do nuly. Podobně alarm[1] offset zvyšuje. Takže stačí kdekoli v kódu dát

Bar.alarm[0]=128;

a ikony pojedou nahoru tak dlouho, než se posunou o 128 pixelů. Důležité je, nesmazat eventy alarmů i přesto, že neobsahují žádný kód.

Možná trochu zajímavější je alarm[2], který umí změnit obsah ikon celého baru a to zase tehdy, až uplyne nastavený čas alarmu. Užitečné je, že je to celé Fire & Forget. Nastavíš a už se nestaráš, protože až dojde správný čas, věci se stanou samy. 8-)

Nahoru Odpovědět 20.10.2017 16:39
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
mlin
Člen
Avatar
mlin:28.10.2017 20:15

Dekuji moc, az ted jsem se k tomu dostal, takze ted se tomu budu venovat o trochu vic;) kdyby neco zeptal bych se. Jsem moc rad za veskerou tvou pomoc.

 
Nahoru Odpovědět 28.10.2017 20: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 5 zpráv z 5.