Skocz do zawartości

Generator


Młody

Rekomendowane odpowiedzi

Ponieważ funkcja exit przerywa eventa więc reszta kodu nie będzie wykonana, dla tego muszę wykonać with jeszcze raz.

Edie, no po tobie takiego głupiego posta się nie spodziewałem ;) .

 

W ogóle, czy ty nie miałeś na myśli "break", a nie "exit"? Nie mam siły ingerować w kod.

Odnośnik do komentarza
Udostępnij na innych stronach

Ok sprawdziłem i rzeczywiście sernat miał rację(niestety xP) poprawka:

GML
o_plecak.visible = true;

with(o_plecak) {

var ext;

for(j=0;j<=7;j+=1) {

for(i=0;i<=3;i+=1) {

if inventory[i,j] = 0 {

inventory[i,j].visible = true;

inventory_stack[i,j] += 1;

inventory[i,j] = id;

inventory[i,j].visible = false;

ext = true;

break;

}

}

if (ext) break;

}

}

o_plecak.visible = false;

EDIT: Tylko nie jestem pewien czy if ext powinno być przed "if inventory[i,j] = 0 {" czy po.

Odnośnik do komentarza
Udostępnij na innych stronach

Ponieważ z niewiadomych mi przyczyn Edie zamiast sprawdzać, czy item jest, to sprawdza, czy go nie ma, a zamiast jego ilość zmniejszać, jego ilość zwiększa. Dodatkowo zamiast go wywalać z ekwipunku na ziemię, on czyni go przez chwilę niewidzialnym, czego wciąż nie rozumiem. Jakoś tak na opak :) .

Odnośnik do komentarza
Udostępnij na innych stronach

Edie, fakt, nie skumałem, co ma na myśli autor. Mój błąd.

 

Ale ty także nie do końca. Patrz:

GML
if inventory[i,j] = 0 {

inventory[i,j].visible = true;

inventory_stack[i,j] += 1;

inventory[i,j] = id;

inventory[i,j].visible = false;

ext = true;

break;

}

Bierzesz pod uwagę tylko slot, który jest pusty. A jeśli nie jest, a znajduje się w nim obiekt o takiej samej klasie?

Odnośnik do komentarza
Udostępnij na innych stronach

GML
o_plecak.visible = true;

o_plecak.item = id;

with(o_plecak) {

var ext;

for(j=0;j<=7;j+=1) {

for(i=0;i<=3;i+=1) {

if inventory[i,j] = 0 {

inventory[i,j].visible = true;

inventory_stack[i,j] += 1;

inventory[i,j] = item;

item = 0;

inventory[i,j].visible = false;

ext = true;

break;

}

else

{

if object_get_name(inventory[i,j].object_index) = object_get_name(item.object_index)

{

inventory[i,j].visible = true;

inventory_stack[i,j] += 1;

with(item)

{

instance_destroy();

}

item = 0;

inventory[i,j].visible = false;

}

}

}

if (ext) break;

}

}

o_plecak.visible = false;

Ok poprawiłem, ogólnie to zapomniałem że kod jest w with i trzeba używać other fail.

Odnośnik do komentarza
Udostępnij na innych stronach

Zacina się ze względu na other. Other to id obiektu, z którym kolidujesz. Jeśli niczego nie dotykasz, other = noone, a to oznacza, że odwołujesz się do obiektu, który nie istnieje.

 

Zasada ograniczonego zaufania mówi, że other można używać tylko w evencie kolizji. W innych przypadkach - podobnie jak tu - nie ma zazwyczaj sensu.

 

@EdiePl Spoko. Wieczorem ciężko cokolwiek ogarnąć ;) .

Odnośnik do komentarza
Udostępnij na innych stronach

Z resztą, za te inventory to się wziąłeś od du py strony...

GML
// Create kontrolera

global.inventory = ds_grid_create( 8, 4 );

ds_grid_clear( global.inventory, -1 );

 

global.inventory_offset_x = 0;

global.inventory_offset_y = 0;

 

// Dodawanie do ekwipunku przedmiotu

var _n, _to, _cell;

 

_to = ds_grid_width( global.inventory )*ds_grid_height( global.inventory );

 

for( _n = 0; _n < _to; _n += 1 )

{

_cell = ds_grid_get( global.inventory, _n mod 8, _n div 4 );

 

if( _cell != -1 ) // Slot nie jest wolny

{

if( ds_map_find_value( _cell, 'type' ) == object_index ) // Czy to nie przypadkiem ten sam typ?

{ ds_map_add( _cell, 'count', 1 ); instance_destroy(); break; }

else

continue;

}

 

_cell = ds_map_create();

ds_map_add( _cell, 'type', object_index );

ds_map_add( _cell, 'index', scr_get_indexof( object_index ) ); // *1

ds_map_add( _cell, 'count', 1 );

 

ds_grid_set( global.inventory, _n mod 8, _n div 4, _cell );

instance_destroy();

 

break;

}

 

// Usuwanie przedmiotu z ekwipunku

var _x, _y, _cell;

_x = scr_inventory_cell_x( mouse_x ); // *2

_y = scr_inventory_cell_y( mouse_y );

 

if( _x == -1 || _y == -1 ) exit;

 

_cell = ds_grid_get( global.inventory, _x, _y );

 

// Edit : Jeśli nic się nie znajduje w slocie

if( _cell == -1 ) exit;

 

with( instance_create( objPlayer.x, objPlayer.y, ds_map_find_value( _cell, 'type' ) ) )

{

vspeed = 1 - random( 2 ); // Taki sobie efekt 'rzucania'

hspeed = 1 - random( 2 );

}

 

ds_map_add( _cell, 'count', -1 );

 

if( ds_map_find_value( _cell, 'count' ) == 0 )

{

ds_map_destroy( _cell );

ds_grid_set( global.inventory, _x, _y, -1 );

}

Myślę, że trochę lepiej powinno się prezentować.

 

*1 - Skrypt scr_get_indexof pobiera indeks subimage spritea przedmiotów.

GML (scrgetindexof)
switch( argument0 )

{

case objItem_WoodenSword: return 1;

case objItem_SilverSword: return 2;

default: return 0; // Pod indeksem 0 kryje się placeholder :)

}

 

*2 - Skrypty scr_inventory_cell_x i scr_inventory_cell_y pobierają indeks komórki, nad którą znajduje się kursor.

GML (scrinventorycellx)
var _n;

 

for( _n = 0; _n < ds_grid_width( global.inventory ); _n += 1 )

{

if( argument0 > _n*32 + global.inventory_offset_x && argument0 < _n*32+32 + global.inventory_offset_x ) // Wielkość slota na itemy = 32px

return _n;

}

 

return -1;

Analogicznie co do scr_inventory_cell_y

 

Pisałem wszystko bez GMa, więc mogą być drobne/większe problemy.

Odnośnik do komentarza
Udostępnij na innych stronach

Zasada ograniczonego zaufania mówi, że other można używać tylko w evencie kolizji. W innych przypadkach - podobnie jak tu - nie ma zazwyczaj sensu.
Nie tylko:

 

GML
zmienna = 123;

with( objCostam )

{

if( zmiennaOdCostam == 3 )

other.zmienna = 321;

}

Powinno działać...

 

E: Sorki za dubla...

Odnośnik do komentarza
Udostępnij na innych stronach

Faktycznie. Dziwna sprawa.

 

With w innych językach to taki blok, wewnątrz którego jest użycie przestrzeni nazw - co oznacza, że nie musimy, a nawet nie możemy, zapisywać odpowiedniego przedrostka. W GMie other oznacza id obiektu, z którym aktualnie kolidujemy. Jaki więc sens ma jego drugie działanie :P ?

Odnośnik do komentarza
Udostępnij na innych stronach

Jak dla mnie bardzo fajnie że to działa nie tylko w eventach kolizji :)

 

Jeszcze jedno:

GML (objA)
// Create

zmienna = "Jakis tekst";

 

// Jakis tam inny event np. mouse button pressed

with( objB )

event_perform( ev_alarm, 0 );// Nie musi być alarm, może być userdefined lub jakiś inny event np. kolizji</span>

GML (objBAlarm0)
show_message( other.zmienna );
Też będzie działać, dlatego other jest bardzo fajne ;)
Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...