Posouvajici se bar

Pokud si nevíte s něčím rady ohledně tvorby v Game Makeru - pište sem!
Odpovědět
marvoc
Příspěvky: 1
Registrován: říjen 18, 2017, 11:30 am
Facebook: http://facebook.com/

Posouvajici se bar

Příspěvek od marvoc » říjen 18, 2017, 2:24 pm

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...

OBRAZEK
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 *.gmz

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:

Kód: Vybrat vše

///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:

Kód: Vybrat vše

/// 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. :)

Goblin
Příspěvky: 134
Registrován: červenec 2, 2014, 2:42 pm

Re: Posouvajici se bar

Příspěvek od Goblin » listopad 13, 2017, 8:32 am

Ahoj. Nejsem si úplně jistý, jak by měl tvůj kód fungovat, sám nepoužívám datové struktury, jen arraye. Ale možná Ti můžu poradit, co udělat, abys tu chybu našel sám.

1. Zbav se těch ošklivých objektů. Nepotřebuješ 10 různých objektů, pokud se liší jenom obrázkem. Měj jeden, kterému na začátku ten obrázek (případně nějakou odpovídající hodnotu) náhodně (nebo nějakou smyčkou) přiřadíš při vytvoření. Tím se pak zbavíš těch switch casů...

2. Zdá se, že hra spadne, když tvá datová struktura odkazuje k neexistující instanci. Tedy instanci jsi nejspíš zničil pomocí instance_destroy(), ale zapomněl jsi ji vymazat ze seznamu, nebo jsi vymazal jinou. Jestli to chceš zazáplatovat, abys to mohl dál testovat a na chybu přijít, vlož do toho kódu "if instance_exists(id)", která ověří jestli instance existuje.

3. Jak říkám, moc nerozumím tvému používání struktur, ale máš někde vůbec vytvořenou nějakou mřížku, na které by ty objekty byly umístěny?
"Understanding is not required. Only obedience."

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti