Doppie 9MM

Hai una curiosità o un problema con Game Maker? Domanda e ti sarà risposto!
Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Doppie 9MM

Messaggio da Paperpaint »

Apro un altro posto perché effettivamente nell'ultimo non ha più risposto nessuno.
Intanto sono comparsi nuovi problemi.

1.Come fare in modo che una volta raccolta la 9mm, se sé ne trova un'altra, si possano unire in un solo slot ed usarle con entrambe le mani.
2.Evitare che la stessa arma occupi più slot se già presente nell'inventario(non posso avere nell'inventario più volte la stessa arma).
3.
[code]if pickupkey {
if inventory[0] != 0 {

if (inventory[0]==1) or (inventory[1]==1)
or (inventory[2]==1) or (inventory[3]==1){
instance_create(x,y,_9mm);
}
if(place_meeting(x,y,_9mm)){
if (inventory[0]==3) or (inventory[1]==3)
or (inventory[2]==3) or (inventory[3]==3)
{
instance_create(x,y,_shotgun);
}
}[/code]

Questo codice dovrebbe, creare un istanza, un 'arma diciamo. Quest'ultima dipende da un array (il fucile è 3).
Dovrei fare in modo che SE il player preme il pulsante P + uno dello slot, in qualsiasi posto si trovi il fucile, viene creata un'istanza. simulando l'azione di sostituzione.
Il fatto qual'è? Che lì c'è scritto SE incontri una 9mm, avviene lo scambio, ma visto che le armi sono tantissime, non posso fare un bordello di codice.

4.Dal momento che sarà un Roguelike, mi servirà un oggetto che spawni oggetti/powerup/armi a caso.

Devo fare inventory[0] = choose etc?
Grazie :)

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Doppie 9MM

Messaggio da Wolfrost »

Paperpaint ha scritto:Apro un altro posto perché effettivamente nell'ultimo non ha più risposto nessuno.
Intanto sono comparsi nuovi problemi.

1.Come fare in modo che una volta raccolta la 9mm, se sé ne trova un'altra, si possano unire in un solo slot ed usarle con entrambe le mani.
2.Evitare che la stessa arma occupi più slot se già presente nell'inventario(non posso avere nell'inventario più volte la stessa arma).
3.
[code]if pickupkey {
if inventory[0] != 0 {

if (inventory[0]==1) or (inventory[1]==1)
or (inventory[2]==1) or (inventory[3]==1){
instance_create(x,y,_9mm);
}
if(place_meeting(x,y,_9mm)){
if (inventory[0]==3) or (inventory[1]==3)
or (inventory[2]==3) or (inventory[3]==3)
{
instance_create(x,y,_shotgun);
}
}[/code]

Questo codice dovrebbe, creare un istanza, un 'arma diciamo. Quest'ultima dipende da un array (il fucile è 3).
Dovrei fare in modo che SE il player preme il pulsante P + uno dello slot, in qualsiasi posto si trovi il fucile, viene creata un'istanza. simulando l'azione di sostituzione.
Il fatto qual'è? Che lì c'è scritto SE incontri una 9mm, avviene lo scambio, ma visto che le armi sono tantissime, non posso fare un bordello di codice.

4.Dal momento che sarà un Roguelike, mi servirà un oggetto che spawni oggetti/powerup/armi a caso.

Devo fare inventory[0] = choose etc?
Grazie :)
Puoi postare tutto il codice che ormai non ricordo più? Inoltre potresti spiegare meglio quello che vuoi? Se vuoi un sistema più "sofisticato" di inventario, non è a me che devi rivolgerti, il mio codice è molto grezzo :asd: (e poi sono uno schifo a codare).
Immagine

Immagine

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

Codice: Seleziona tutto

pickupkey = keyboard_check(ord('P'));


call_slot0 = keyboard_check(vk_space);
call_slot1 = keyboard_check_pressed(ord("1"));
call_slot2 = keyboard_check_pressed(ord("2"));
call_slot3 = keyboard_check_pressed(ord("3"));
call_slot4 = keyboard_check_pressed(ord("4"));

 
 

   if place_meeting(x,y,_9mm) { 
    if pickupkey { 
    if (inventory[0]==0) {inventory[0] = 1;}
   if(inventory[0] != 1){
   if inventory[1]==0 {inventory[1] = 1;}
      if(inventory[1] != 1){
   if inventory[2]==0 {inventory[2] = 1;}
      if(inventory[2] != 1){
   if inventory[3]==0 {inventory[3] = 1;} else exit;
            }
        }
   

   }}}
     
   

    



if place_meeting(x,y,mannaia) {
   if pickupkey { if inventory[0]==0 inventory[0] = 2;
   {
   if inventory[4]==0 inventory[4] = 2;

}
}
}
if place_meeting(x,y,_shotgun) { 
    if pickupkey { 
    if (inventory[0]==0) {inventory[0] = 3;}
   if(inventory[0] != 3){
   if inventory[1]==0 {inventory[1] = 3;}
      if(inventory[2] != 3){
   if inventory[2]==0 {inventory[2] = 3;}
      if(inventory[3] != 3){
   if inventory[3]==0 {inventory[3] = 3;} else exit;
            }
        }
   

   }}}

 if(pickupkey){
if (inventory[0] == 1){

  if(place_meeting(x,y,_shotgun))
{
   inventory[0] = 3;
   instance_create(x,y,_9mm);
}
}
if(inventory[0] == 3){
  if(place_meeting(x,y,_9mm))
{
   inventory[0] = 3;
   instance_create(x,y,_shotgun);
}
}

        }
        
    
    else if inventory[0] == 0 {
        if inventory[1] != 0 {
            if inventory[1] == 1 instance_create(x,y,_9mm);
            else if inventory[1] == 3 instance_create(x,y,_shotgun);
            //else if inventory[1] == 4 instance_create(x,y,obj_AssaultRifle);
            //else if inventory[1] == 5 instance_create(x,y,obj_Mitra);
         
        }
      }
        
    
if call_slot0 called_slot = 0;
if call_slot1 called_slot = 1;
if call_slot2 called_slot = 2;
if call_slot3 called_slot = 3;
if call_slot4 called_slot = 4;

switch (called_slot) {
    case 0:
    
        if(inventory[4]==2){
        mann =true
        }
    
    break;
    
    case 1:
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 2:
         
   
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 3:
    
  
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 4:
   
   
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
      
        break;
  
    default: exit;
}



Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Doppie 9MM

Messaggio da Wolfrost »

Paperpaint ha scritto:

Codice: Seleziona tutto

pickupkey = keyboard_check(ord('P'));


call_slot0 = keyboard_check(vk_space);
call_slot1 = keyboard_check_pressed(ord("1"));
call_slot2 = keyboard_check_pressed(ord("2"));
call_slot3 = keyboard_check_pressed(ord("3"));
call_slot4 = keyboard_check_pressed(ord("4"));

 
 

   if place_meeting(x,y,_9mm) { 
    if pickupkey { 
    if (inventory[0]==0) {inventory[0] = 1;}
   if(inventory[0] != 1){
   if inventory[1]==0 {inventory[1] = 1;}
      if(inventory[1] != 1){
   if inventory[2]==0 {inventory[2] = 1;}
      if(inventory[2] != 1){
   if inventory[3]==0 {inventory[3] = 1;} else exit;
            }
        }
   

   }}}
     
   

    



if place_meeting(x,y,mannaia) {
   if pickupkey { if inventory[0]==0 inventory[0] = 2;
   {
   if inventory[4]==0 inventory[4] = 2;

}
}
}
if place_meeting(x,y,_shotgun) { 
    if pickupkey { 
    if (inventory[0]==0) {inventory[0] = 3;}
   if(inventory[0] != 3){
   if inventory[1]==0 {inventory[1] = 3;}
      if(inventory[2] != 3){
   if inventory[2]==0 {inventory[2] = 3;}
      if(inventory[3] != 3){
   if inventory[3]==0 {inventory[3] = 3;} else exit;
            }
        }
   

   }}}

 if(pickupkey){
if (inventory[0] == 1){

  if(place_meeting(x,y,_shotgun))
{
   inventory[0] = 3;
   instance_create(x,y,_9mm);
}
}
if(inventory[0] == 3){
  if(place_meeting(x,y,_9mm))
{
   inventory[0] = 3;
   instance_create(x,y,_shotgun);
}
}

        }
        
    
    else if inventory[0] == 0 {
        if inventory[1] != 0 {
            if inventory[1] == 1 instance_create(x,y,_9mm);
            else if inventory[1] == 3 instance_create(x,y,_shotgun);
            //else if inventory[1] == 4 instance_create(x,y,obj_AssaultRifle);
            //else if inventory[1] == 5 instance_create(x,y,obj_Mitra);
         
        }
      }
        
    
if call_slot0 called_slot = 0;
if call_slot1 called_slot = 1;
if call_slot2 called_slot = 2;
if call_slot3 called_slot = 3;
if call_slot4 called_slot = 4;

switch (called_slot) {
    case 0:
    
        if(inventory[4]==2){
        mann =true
        }
    
    break;
    
    case 1:
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 2:
         
   
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 3:
    
  
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
        break;
    case 4:
   
   
        if(inventory[0]== 1)  or (inventory[1] == 1) or (inventory[2] == 1) or (inventory[3] == 1){
    novemm = true;
    
    }
     if(inventory[0]== 3) or (inventory[1] == 3) or (inventory[2] == 3) or (inventory[3] == 3){
    shotgun = true;
    }
      
        break;
  
    default: exit;
}


Sì, c'è bisogno di rendere tutto questo codice più sofisticato, il problema è che neanche io saprei come fare, anzi lo renderei solo più complicato inutilmente :furioso: Di conseguenza c'è bisogno di qualcuno più bravo di me, e fidati in questo forum ce ne sono parecchi :asd:
Immagine

Immagine

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

Grazie :)[/quote] Se vuoi un sistema più "sofisticato" di inventario, non è a me che devi rivolgerti, il mio codice è molto grezzo :asd: (e poi sono uno schifo a codare).[/quote]

Ehh, il fatto è che non mi risponde nessuno su questo forum. :furiosomedio:

Shark, non mi risponde poi :(

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da gameplay_extreme »

come avrei fatto io (scusa il ritardo):
(non testato, almeno per il momento)

creazione di un inventario a 5 slot (ma il numero si può facilemente estendere fino a un numero maggiore)
Spoiler
scr: inventory_init() //main initialization (inventario inizialmente vuoto)

Codice: Seleziona tutto

var k;
global.max_slots = 5 // dichiaro il numero di slot che deve avere l'inventario
for (k = 1, global.max_slots, k += 1)
 { global.inv[k] = "empty" } // tuttti inizialmente vuoti
global.slot_sel = 0 //nessuno slot selezionato

scr: [b]inventory_find_first_empty()[/b] //trova il primo slot vuoto, se non ce ne sono restituisce -1
var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == "empty"
  break
 }
if k <= global.max_slots
 return k
else
 return -1 //inventario già pieno 
scr: inventory_find_first("nome arma" ) //trova il primo slot contenente nome arma, se non c'è l'arma richiesta restituisce -1

Codice: Seleziona tutto

var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == argument0
  break
}
if k <= global.max_slots
 return k
else
 return -1 //arma non presente
scr: sel_inventory_slot(numero slot)

Codice: Seleziona tutto

if argument0 >= 1 && argument0 <= global.max_slots
 global.slot_sel = argument0
else
 {
  if argument0 == 0
    {
     if global.slot_sel != 0
       show_message("slot selezionato: nessuno")
    }    
   else
     show_message("tentativo di selezione slot fallito: slot inesistente")
 }

per sapere quale è l'arma correntemente selezionata:

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato

Codice: Seleziona tutto

restituisce "nessuna"

if global.slot_sel >= 1 && global.slot_sel <= global.max_slots
 return global.inv[global.slot_sel]
else
 return "nessuna"
per aggiungere all' inventario (in modo che si possa raccogliere solo 2 armi per tipo) puoi usare questo script:
scr: inventory_weapon_add("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0) != -1
 {
   global.inv[inventory_find_first(argument0)] = argument0 + " double"
  show_message("adesso hai una arma doppia") 
  exit //esco da questo script = salto le rimanenti istruzioni di questo script
}
else  
 { 
  if inventory_find_first_empty != -1 // controllo se c'è posto
   if inventory_find_first(argument0 + "double") != -1
   {
    global.inv[inventory_find_first_empty] = argument0 //aggiungo l'arma
    show_message("aggiunta arma singola")
    exit
    } 
}
show_message("arma non aggiunta)
per cancellare una data arma (singola o doppia che sia) dall' inventario:
scr inventory_weapon_delete("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0)  != -1  // controllo l'arma è presente in inventario
 {
   global.inv[inventory_find_first(argument0)] = "empty" //cancello l'arma
   exit 
 }
if inventory_find_first(argument0+" double") != -1  // controllo l'arma è presente in inventario
  {  
   global.inv[inventory_find_first(argument0+ " double")] = "empty" //cancello l'arma
   exit
  }
show_message("attenzione!: si sta cercando di cancellare dall' inventario un'arma che non è presente) 
per disegnare gli slot usa:
scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)

Codice: Seleziona tutto

for (k = 1, global.max_slots, k += 1)
 {
  // è previsto che il gioco funzioni con una sola view o senza view, se così non è editare il codice
  // coordinate dei vari slot
  X = (k-1)* dimensione_slot + dimensione_slot div 2 + view_xview + argument0
  Y = dimensione_slot div 2 + view_yview + argument1
  // slot (box rettangolare)
  draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true) 
   if k = global.slot_sel
     draw_set_color(c_red)
   else
     draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true)
  // contenuto del box: sprite arma, se le armi sono 2, numero da premere per richiamare lo slot
   if string_pos("arma1",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma1)
  if string_pos("arma2",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma2)
  if string_pos("arma3",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma3)
  if string_pos("arma4",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma4)
  draw_halign(fa_left)  // impostazioni allineamento testo
  draw_valign(fa_top)
  draw_set_font(font0) // impostazione font, font0 deve esistere
  if string_pos("double",global.inv[k) != 0
   draw_text(X - sp, Y - sp,  "2") // negli slot in cui compare "2" significa che c'è la doppia arma
  draw_text(X - sp, Y + sp,  string(k))
 }
se ti capita di usare questo code, fammi sapere se funge, ciao!
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Wolfrost
Membro super
Messaggi: 692
Iscritto il: 03/08/2014, 13:08
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Una galassia lontana lontana...
Contatta:

Re: Doppie 9MM

Messaggio da Wolfrost »

gameplay_extreme ha scritto:come avrei fatto io (scusa il ritardo):
(non testato, almeno per il momento)

creazione di un inventario a 5 slot (ma il numero si può facilemente estendere fino a un numero maggiore)
Spoiler
scr: inventory_init() //main initialization (inventario inizialmente vuoto)

Codice: Seleziona tutto

var k;
global.max_slots = 5 // dichiaro il numero di slot che deve avere l'inventario
for (k = 1, global.max_slots, k += 1)
 { global.inv[k] = "empty" } // tuttti inizialmente vuoti
global.slot_sel = 0 //nessuno slot selezionato

scr: [b]inventory_find_first_empty()[/b] //trova il primo slot vuoto, se non ce ne sono restituisce -1
var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == "empty"
  break
 }
if k <= global.max_slots
 return k
else
 return -1 //inventario già pieno 
scr: inventory_find_first("nome arma" ) //trova il primo slot contenente nome arma, se non c'è l'arma richiesta restituisce -1

Codice: Seleziona tutto

var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == argument0
  break
}
if k <= global.max_slots
 return k
else
 return -1 //arma non presente
scr: sel_inventory_slot(numero slot)

Codice: Seleziona tutto

if argument0 >= 1 && argument0 <= global.max_slots
 global.slot_sel = argument0
else
 {
  if argument0 == 0
    {
     if global.slot_sel != 0
       show_message("slot selezionato: nessuno")
    }    
   else
     show_message("tentativo di selezione slot fallito: slot inesistente")
 }

per sapere quale è l'arma correntemente selezionata:

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato

Codice: Seleziona tutto

restituisce "nessuna"

if global.slot_sel >= 1 && global.slot_sel <= global.max_slots
 return global.inv[global.slot_sel]
else
 return "nessuna"
per aggiungere all' inventario (in modo che si possa raccogliere solo 2 armi per tipo) puoi usare questo script:
scr: inventory_weapon_add("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0) != -1
 {
   global.inv[inventory_find_first(argument0)] = argument0 + " double"
  show_message("adesso hai una arma doppia") 
  exit //esco da questo script = salto le rimanenti istruzioni di questo script
}
else  
 { 
  if inventory_find_first_empty != -1 // controllo se c'è posto
   if inventory_find_first(argument0 + "double") != -1
   {
    global.inv[inventory_find_first_empty] = argument0 //aggiungo l'arma
    show_message("aggiunta arma singola")
    exit
    } 
}
show_message("arma non aggiunta)
per cancellare una data arma (singola o doppia che sia) dall' inventario:
scr inventory_weapon_delete("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0)  != -1  // controllo l'arma è presente in inventario
 {
   global.inv[inventory_find_first(argument0)] = "empty" //cancello l'arma
   exit 
 }
if inventory_find_first(argument0+" double") != -1  // controllo l'arma è presente in inventario
  {  
   global.inv[inventory_find_first(argument0+ " double")] = "empty" //cancello l'arma
   exit
  }
show_message("attenzione!: si sta cercando di cancellare dall' inventario un'arma che non è presente) 
per disegnare gli slot usa:
scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)

Codice: Seleziona tutto

for (k = 1, global.max_slots, k += 1)
 {
  // è previsto che il gioco funzioni con una sola view o senza view, se così non è editare il codice
  // coordinate dei vari slot
  X = (k-1)* dimensione_slot + dimensione_slot div 2 + view_xview + argument0
  Y = dimensione_slot div 2 + view_yview + argument1
  // slot (box rettangolare)
  draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true) 
   if k = global.slot_sel
     draw_set_color(c_red)
   else
     draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true)
  // contenuto del box: sprite arma, se le armi sono 2, numero da premere per richiamare lo slot
   if string_pos("arma1",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma1)
  if string_pos("arma2",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma2)
  if string_pos("arma3",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma3)
  if string_pos("arma4",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma4)
  draw_halign(fa_left)  // impostazioni allineamento testo
  draw_valign(fa_top)
  draw_set_font(font0) // impostazione font, font0 deve esistere
  if string_pos("double",global.inv[k) != 0
   draw_text(X - sp, Y - sp,  "2") // negli slot in cui compare "2" significa che c'è la doppia arma
  draw_text(X - sp, Y + sp,  string(k))
 }
se ti capita di usare questo code, fammi sapere se funge, ciao!
I for ho sempre avuto paura ad usarli con il game maker :asd: C'ho la ciclo-fobia su GM
EDIT: Gran bel codice, però
Immagine

Immagine

Avatar utente
Alv
Membro
Messaggi: 133
Iscritto il: 14/11/2014, 22:33
Specialità: Programmazione
Uso: GM:Studio 1.4 Pro
Località: Sicilia
Contatta:

Re: Doppie 9MM

Messaggio da Alv »

Io realizzerei l'inventario tramite una serie di script.

Script "inv_init": inizializza l'inventario, dato il numero di slot.

Codice: Seleziona tutto

nslots=argument0;
var i;
for (i=0;i<nslots;i+=1)
    inv[i]=-1;
count=0;
La variabile "count" indica il numero di armi presenti nell'inventario (inizialmente 0). Ogni arma è identificata da un numero (esempio: 0 pistola, 3 fucile). -1 significa slot vuoto. Inizialmente tutti gi slot sono posti a -1. Trucchetto: consideriamo la doppia 9mm come un'arma a sé stante. (Quindi il numero 0 identifica la 9mm, il numero 1 la doppia 9mm.)

Ci serve un altro script: 'inv_find'. Dato il numero di un'arma, cerca l'arma nell'inventario, e restituisce il numero dello slot in cui l'arma si trova. Restituisce -1 se l'arma non viene trovata.

Codice: Seleziona tutto

var i;
for (i=0;i<count;i+=1)
   if (inv[i]==argument0)
        return i;
return -1;
Ultimo script: 'inv_add'. Aggiunge un'arma all'inventario, dato il numero.

Codice: Seleziona tutto

inv[count]=argument0;
count+=1;
Prendiamo l'oggetto Player; nell'evento Create, chiamiamo inv_init. Aggiungiamo un evento collision per ogni arma. Collisione con fucile: se il fucile non è presente nell'inventario, lo aggiunge, e distrugge l'oggetto fucile con cui il player è entrato in collisione.

Codice: Seleziona tutto

if (inv_find(3)==-1) {
    inv_add(3);
    with (other)
        instance_destroy();
}
Collisione con 9mm: il codice è un po' più complicato.

Codice: Seleziona tutto

var gun_index;
if (inv_find(1)==-1) {
    gun_index=inv_find(0);
    if (gun_index==-1) {
        inv_add(3);
    else
        inv[gun_index]=1;
    with (other)
        instance_destroy();
}
Spiegazione: cerca la doppia 9mm. Se la doppia è nell'inventario, fine. Altrimenti, cerca la 9mm singola. Se non è presente, la aggiunge. Se la trova, la muta in una doppia 9mm.

Il codice l'ho ricontrollato ma non l'ho testato. Spero funzioni! Ma nel gioco le armi si possono scartare? Perchè in tal caso bisognerebbe implementare anche degli script per rimuovere le armi...
Ultima modifica di Alv il 18/01/2021, 16:56, modificato 10 volte in totale.

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

Alv ha scritto:Io realizzerei l'inventario tramite una serie di script.

script 'inv_init': inizializza l'inventario, dato il numero di slot

Codice: Seleziona tutto

nslots=argument0;
var i;
for (i=0;i<nslots;i+=1)
    inv[i]=-1;
count=0;
La variabile 'count' indica il numero di armi presenti nell'inventario (inizialmente 0).
Ogni arma è identificata da un numero. Es. 0 pistola, 3 fucile. -1 significa slot vuoto. Inizialmente tutti gi slot sono posti a -1.
Trucchetto: consideriamo la doppia 9mm come un'arma a se stante. (Quindi il numero 0 identifica la 9mm , il numero 1 la doppia 9mm.)

Ci serve un altro script, 'inv_find':
Dato il numero di un'arma, cerca l'arma nell'inventario e restituisce il numero dello slot in cui l'arma si trova.
Restituisce -1 se l'arma non viene trovata.

Codice: Seleziona tutto

var i;
for (i=0;i<count;i+=1)
   if (inv[i]==argument0)
        return i;
return -1;
Ultimo script: 'inv_add'. Aggiunge un'arma all'inventario, dato il numero:

Codice: Seleziona tutto

inv[count]=argument0;
count+=1;
Prendiamo l'oggetto Player, nell'evento Create chiamiamo inv_init.
Aggiungiamo un evento collision per ogni arma (quindi: collision with 9mm, collision with fucile).
Collisione con fucile: se il fucile non è presente nell'inventario, lo aggiunge e distrugge l'oggetto fucile con cui il player è entrato in collisione.

Codice: Seleziona tutto

if (inv_find(3)==-1) {
    inv_add(3);
    with (other)
        instance_destroy();
}
Collisione con 9mm, il codice è un pò più complicato.

Codice: Seleziona tutto

var gun_index;
if (inv_find(1)==-1) {
    gun_index=inv_find(0);
    if (gun_index==-1) {
        inv_add(3);
    else
        inv[gun_index]=1;
    with (other)
        instance_destroy();
}
Spiegazione: cerca la doppia 9mm. Se la doppia è nell'inventario, fine.
Altrimenti cerca la 9mm singola. Se non è presente, la aggiunge.
Se la trova, la muta in una doppia 9mm.

Il codice l'ho ricontrollato ma non l'ho testato. Spero funzioni.
Ma nel gioco le armi si possono scartare? Perchè in tal caso bisognerebbe implementare anche degli script per rimuovere le armi.
Certo che si scartano.
Basta tenere premuto uno slot da 1 a 4 e poi premere P, per sostituire un arma: ho fucile, ho per terra pistola = comando = prendo pistola, lascio fucile.

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da gameplay_extreme »

Alv ha scritto:Ma nel gioco le armi si possono scartare?
Paperpaint ha scritto:Certo che si scartano.
il code che ho postato io a già questa feature :cappa:
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:
Alv ha scritto:Ma nel gioco le armi si possono scartare?
Paperpaint ha scritto:Certo che si scartano.
il code che ho postato io a già questa feature :cappa:
SCUSA!

Non l'avevo visto :spat:
Lo provo subito!

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:come avrei fatto io (scusa il ritardo):
(non testato, almeno per il momento)

creazione di un inventario a 5 slot (ma il numero si può facilemente estendere fino a un numero maggiore)
Spoiler
scr: inventory_init() //main initialization (inventario inizialmente vuoto)

Codice: Seleziona tutto

var k;
global.max_slots = 5 // dichiaro il numero di slot che deve avere l'inventario
for (k = 1, global.max_slots, k += 1)
 { global.inv[k] = "empty" } // tuttti inizialmente vuoti
global.slot_sel = 0 //nessuno slot selezionato

scr: [b]inventory_find_first_empty()[/b] //trova il primo slot vuoto, se non ce ne sono restituisce -1
var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == "empty"
  break
 }
if k <= global.max_slots
 return k
else
 return -1 //inventario già pieno 
scr: inventory_find_first("nome arma" ) //trova il primo slot contenente nome arma, se non c'è l'arma richiesta restituisce -1

Codice: Seleziona tutto

var k; 
for (k = 1, global.max_slots, k += 1)
 { 
  if global.inv[k] == argument0
  break
}
if k <= global.max_slots
 return k
else
 return -1 //arma non presente
scr: sel_inventory_slot(numero slot)

Codice: Seleziona tutto

if argument0 >= 1 && argument0 <= global.max_slots
 global.slot_sel = argument0
else
 {
  if argument0 == 0
    {
     if global.slot_sel != 0
       show_message("slot selezionato: nessuno")
    }    
   else
     show_message("tentativo di selezione slot fallito: slot inesistente")
 }

per sapere quale è l'arma correntemente selezionata:

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato

Codice: Seleziona tutto

restituisce "nessuna"

if global.slot_sel >= 1 && global.slot_sel <= global.max_slots
 return global.inv[global.slot_sel]
else
 return "nessuna"
per aggiungere all' inventario (in modo che si possa raccogliere solo 2 armi per tipo) puoi usare questo script:
scr: inventory_weapon_add("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0) != -1
 {
   global.inv[inventory_find_first(argument0)] = argument0 + " double"
  show_message("adesso hai una arma doppia") 
  exit //esco da questo script = salto le rimanenti istruzioni di questo script
}
else  
 { 
  if inventory_find_first_empty != -1 // controllo se c'è posto
   if inventory_find_first(argument0 + "double") != -1
   {
    global.inv[inventory_find_first_empty] = argument0 //aggiungo l'arma
    show_message("aggiunta arma singola")
    exit
    } 
}
show_message("arma non aggiunta)
per cancellare una data arma (singola o doppia che sia) dall' inventario:
scr inventory_weapon_delete("nome arma")

Codice: Seleziona tutto

if inventory_find_first(argument0)  != -1  // controllo l'arma è presente in inventario
 {
   global.inv[inventory_find_first(argument0)] = "empty" //cancello l'arma
   exit 
 }
if inventory_find_first(argument0+" double") != -1  // controllo l'arma è presente in inventario
  {  
   global.inv[inventory_find_first(argument0+ " double")] = "empty" //cancello l'arma
   exit
  }
show_message("attenzione!: si sta cercando di cancellare dall' inventario un'arma che non è presente) 
per disegnare gli slot usa:
scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)

Codice: Seleziona tutto

for (k = 1, global.max_slots, k += 1)
 {
  // è previsto che il gioco funzioni con una sola view o senza view, se così non è editare il codice
  // coordinate dei vari slot
  X = (k-1)* dimensione_slot + dimensione_slot div 2 + view_xview + argument0
  Y = dimensione_slot div 2 + view_yview + argument1
  // slot (box rettangolare)
  draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true) 
   if k = global.slot_sel
     draw_set_color(c_red)
   else
     draw_set_color(c_white)
  draw_rectangle(X - sp, Y - sp, X + sp, Y + sp, true)
  // contenuto del box: sprite arma, se le armi sono 2, numero da premere per richiamare lo slot
   if string_pos("arma1",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma1)
  if string_pos("arma2",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma2)
  if string_pos("arma3",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma3)
  if string_pos("arma4",global.inv[k) != 0
    draw_sprite(X, Y, spr_arma4)
  draw_halign(fa_left)  // impostazioni allineamento testo
  draw_valign(fa_top)
  draw_set_font(font0) // impostazione font, font0 deve esistere
  if string_pos("double",global.inv[k) != 0
   draw_text(X - sp, Y - sp,  "2") // negli slot in cui compare "2" significa che c'è la doppia arma
  draw_text(X - sp, Y + sp,  string(k))
 }
se ti capita di usare questo code, fammi sapere se funge, ciao!
Ma dove li devo mettere scusa?

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da gameplay_extreme »

Ma dove li devo mettere scusa?
allora, cerco di chiarire la faccenda...

scr: inventory_init() //main initialization (inventario inizialmente vuoto)
mettilo all' AVVIO del gioco o quando vuoi svuotare/azzerare TUTTO l'inventario

scr: sel_inventory_slot(numero slot)
usalo per selezionare/eveidenziare uno slot (un solo slot può essere evidenziato). Adesso che ci penso non c'è n controllo che evita di selezionare uno slot vuoto...va beh...prima o poi correggo...

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato
usalo per sapere il nome dell' arma selezionata

scr: inventory_weapon_add("nome arma")
usalo per aggiungere un' arma all'inventairo (nel primo slot vuoto a partire da destra)

scr: inventory_weapon_delete("nome arma")
usalo per cancellare un'arma specifica dall'inventario, per azzerare tutto l'inventario invece puoi usare semplicemente inventory_init( ) come già detto all'inizio del post

scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)
mettilo in draw_event di un oggetto che sia presente in tutte le stanze dove deve apparire il disegno dell' inventario

diciamo che gli script inventory_find_first_empty( ) e inventory_find_first("nome arma") sono ad uso interno...
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:
Ma dove li devo mettere scusa?
allora, cerco di chiarire la faccenda...

scr: inventory_init() //main initialization (inventario inizialmente vuoto)
mettilo all' AVVIO del gioco o quando vuoi svuotare/azzerare TUTTO l'inventario

scr: sel_inventory_slot(numero slot)
usalo per selezionare/eveidenziare uno slot (un solo slot può essere evidenziato). Adesso che ci penso non c'è n controllo che evita di selezionare uno slot vuoto...va beh...prima o poi correggo...

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato
usalo per sapere il nome dell' arma selezionata

scr: inventory_weapon_add("nome arma")
usalo per aggiungere un' arma all'inventairo (nel primo slot vuoto a partire da destra)

scr: inventory_weapon_delete("nome arma")
usalo per cancellare un'arma specifica dall'inventario, per azzerare tutto l'inventario invece puoi usare semplicemente inventory_init( ) come già detto all'inizio del post

scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)
mettilo in draw_event di un oggetto che sia presente in tutte le stanze dove deve apparire il disegno dell' inventario

diciamo che gli script inventory_find_first_empty( ) e inventory_find_first("nome arma") sono ad uso interno...
Ma vuoi dire che devo metterli nello step Event dell'avatar?

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da gameplay_extreme »

Ma vuoi dire che devo metterli nello step Event dell'avatar?
dici a me ?? :confuso:
(le parole "step event" e "avatar" non ci sono da nessuna parte...)
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:
Ma vuoi dire che devo metterli nello step Event dell'avatar?
dici a me ?? :confuso:
(le parole "step event" e "avatar" non ci sono da nessuna parte...)
Devo creare un nuovo script nella cartella script e basta?

Avatar utente
gameplay_extreme
GMI VIP
Messaggi: 3824
Iscritto il: 13/11/2010, 16:23
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da gameplay_extreme »

no, il mio code è formato da 8 script

scusa, avevo letto "ma che vuol dire che devo metterli nello step Event dell'avatar?" al posto di "Ma vuoi dire che devo metterli nello step Event dell'avatar?", ma per avatar intendi il giocatore per caso ?
Immagine
clicca sul logo qui sopra per info e download riguardo ai miei software o per sapere come si crea un videogioco!

iscriviti qui gratuitamente a GMI !
Spoiler
- Una curiosità: come mai quell' ordine ?
- Perché formava una scaletta molto carina da vedere.


"ah ah...grazie alla annotazione scientifica ti ho fregato!"
(come disse la calcolatrice al display)

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:no, il mio code è formato da 8 script

scusa, avevo letto "ma che vuol dire che devo metterli nello step Event dell'avatar?" al posto di "Ma vuoi dire che devo metterli nello step Event dell'avatar?", ma per avatar intendi il giocatore per caso ?

Avatar utente
Paperpaint
Membro attivo
Messaggi: 375
Iscritto il: 02/01/2014, 16:19
Specialità: Visionario lol
Uso: GameMaker 8.1
Contatta:

Re: Doppie 9MM

Messaggio da Paperpaint »

gameplay_extreme ha scritto:no, il mio code è formato da 8 script

scusa, avevo letto "ma che vuol dire che devo metterli nello step Event dell'avatar?" al posto di "Ma vuoi dire che devo metterli nello step Event dell'avatar?", ma per avatar intendi il giocatore per caso ?
Oh, ma ce se' remasto? :fapensare:

Avatar utente
Vallo92
GMI Advanced
Messaggi: 1508
Iscritto il: 15/07/2011, 20:26
Specialità: Grafico
Uso: GM:Studio 2
Contatta:

Re: Doppie 9MM

Messaggio da Vallo92 »

gameplay_extreme ha scritto:no, il mio code è formato da 8 script
Mi pare sia stato abbastanza chiaro. Sono 8 script differenti.
Dovrai poi richiamare ogni script quando ti serve (ed anche qui gameplay è stato chiarissimo):
gameplay_extreme ha scritto: scr: inventory_init() //main initialization (inventario inizialmente vuoto)
mettilo all' AVVIO del gioco o quando vuoi svuotare/azzerare TUTTO l'inventario

scr: sel_inventory_slot(numero slot)
usalo per selezionare/eveidenziare uno slot (un solo slot può essere evidenziato). Adesso che ci penso non c'è n controllo che evita di selezionare uno slot vuoto...va beh...prima o poi correggo...

scr: inv_slot_sel() // restituisce la stringa che identifica l'arma presente nello slot selezionato, se nessuno slot è selezionato
usalo per sapere il nome dell' arma selezionata

scr: inventory_weapon_add("nome arma")
usalo per aggiungere un' arma all'inventairo (nel primo slot vuoto a partire da destra)

scr: inventory_weapon_delete("nome arma")
usalo per cancellare un'arma specifica dall'inventario, per azzerare tutto l'inventario invece puoi usare semplicemente inventory_init( ) come già detto all'inizio del post

scr: draw_inventory_slots(distanza dell' inventario dalla sinistra dello screen di gioco, distanza dell' inventario dall' alto dello screen di gioco)
mettilo in draw_event di un oggetto che sia presente in tutte le stanze dove deve apparire il disegno dell' inventario

diciamo che gli script inventory_find_first_empty( ) e inventory_find_first("nome arma") sono ad uso interno...
-Questi occhiali da sole le stanno benissimo. Vuole provarli con le lenti più scure?
- Si vede che le sto guardando le tette?
- Si
- Allora si

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 152 ospiti