-
Posts
646 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Posts posted by Keroro
-
-
Ciao
In Rgss3 esistono 3 variabili globali che hanno la lista di tutti gli oggetti esistenti:
$data_weapons con le armi
$data_armors con le armature
$data_items per tutti gli altri oggetti
Gli oggetti che vedi nel menù sono quelli del Game_Party nelle variabili @weapons,@armors, @items.
Il trucco quindi è aggiungere un metodo in Game_Party per cancellare tutti gli oggetti che soddisfino la condizione di non essere oggetto chiave
Il metodo key_item?, che restituisce vero se è l'oggetto chiave, è nella classe RPG::Item
class Game_Party def clear_simple_items @items.delete_if{|item_id| !$data_items[item_id].key_item? } end end -
Benvenuto,
Penso che tanta pratica unita a mettersi sempre in discussione sia il modo più veloce di migliorare.
Il demone capellone è carino ma non ha volto, e ha una scarpa molto più grande dell'altra non giustificabile con la prospettiva.
La mamma di ben10 è carina ma le darei un altro sopracciglio e smusserei un po' la coscia alla nostra sinistra
Il guerriero zombie è il tipico palestrato che salta il giorno delle gambe (se voluto va bene).
Il diavoletto rosso è carino, la bestiolina bianca molto carina.
Ci sono tante cose su cui potresti lavorare e specializzare, ad esempio:
A) potresti prendere uno spritesheet di un personaggio con una stazza simile a uno dei tuoi e modificarlo per creare le animazioni del tuo, avendo uno scheletro di riferimento.
B) potresti lavorare sul viso dei personaggiC) Come A, ma animazione dedicata a qualcosa di particolare (es. Battler, oppure personaggi per un platform quindi salto, crouching, oppure pugno, animazione di un'arma).
Tutto parte secondo me da scegliere che tipo di gioco e trama realizzare, trovare uno stile grafico obiettivo alla portata delle tue capacità, e portare avanti il progetto -
Per Alice:
Ma no xD sono bellissime le mappe del tuo minigioco!
Il problema del creare png per la luce è dover decidere prima di che forma fare le finestre... Ci penserò domani ^^Io uso da sempre GraphicsGale, ora è stato pure rilasciato gratis (pure prima lo era, ma non faceva le gif animate...).
Grazie! Ho scaricato GraphicsGale e l'ho utilizzato per fare tutti i sopra-muro, è stato abbastanza intuitivo per le poche funzioncine che ho scoperto.

Ho ascoltato i vostri consigli e allargato la stanza ma la devo arredare meglio perché sembra molto più spoglia e devo trovare qualche mobile da mettere ad angolo, in più devo decidere come far entrare la luce da sinistra.
Quindi l'ho messo più che altro per il sopra-colonne e ho un po' di alternative, potrei farle tutte integrate con il muro come avviene in alto a destra, oppure come muro separato come avviene a metà, oppure isolato come le due colonne all'ingresso, non so se sia più bello farle piene o bucate. -
Aseprite non lo conoscevo, sembra molto promettente dai video, mi ci butto :D
-
Grazie a tutti per le risposte, dentro e fuori il topic
Volevo rispondervi oggi con un nuovo screen ma non ce l'ho fatta, conto di metterlo giovedì.Per Guardian
- Tiled non sa usare l'autotile
quindi vanno scomposti i quadrati a metà (16x16 se 32x32, 24x24 se 48x48) per creare un tileset apposito con tutte le combinazioni
super-sbatti, quindi forse creerò uno script per farlo ma non volevo perdere troppo tempo su ciò che non è direttamente connesso al making. - Grazie per il link con il botto di tileset
- Studierò tutto!
- Grazie per i consigli, stacco un po' dai muri e cerco un po' di mobilio da disporre in verticale ai lati (o al massimo lo creo).
Per Alice
- Grazie mille per il tuo contributo e per l'ispirazione, inizierò con la pixel art per realizzare dei bordi simili a quelli del tuo screen. Ho notato che utilizzi dei muri alti tre volte i personaggi, è per dare un senso di solennità e regalità agli edifici?
- L'idea del pavimento nasceva dal fatto che non ho idea di come realizzare un sistema di luci/ombre, stavo dando un'occhiata ai vari script e sistemi di particelle o blending ma non ho ancora trovato una soluzione che mi faccia dire: cavolo l'ho trovata! Anche in questo caso sei stata di ispirazione: ho giocato al tuo minigioco su Archimede e ho visto che fai entrare le luci dalle finestre con pictures semi-trasparenti, e sembra un ottimo compromesso.
- Per le ombre potrei mettere un layer dedicato fra il terreno e gli oggetti e deformarlo (traslarlo e accorciarlo) tramite codice in-game con il passare della giornata (senza troppi dettagli, na roba rozza alla Duccio). Anche se per gli interni basta anche una versione per il giorno e una per la notte.
Per Ische
Grazie per la cordialità e disponibilità! Avrò sicuramente bisogno di feedback per completare il battle system (su cui al momento non anticipo nulla, mi sono imposto di non dedicarmi alla programmazione finché non completo la grafica del clan e degli interni).
Domande per tutti
- Per la pixel art pensavo di acquistare Pyxel Edit ( https://www.pyxeledit.com/, 9$), qualcuno di voi lo usa?
- Il bon-ton dice che il lampadario va messo possibilmente al centro del tavolo da pranzo e deve essere proporzionato alla grandezza dello stesso (grazie a Csaba di Cortesie per gli ospiti). Il problema è che mettere un lampadario sul tavolo con questa prospettiva crea confusione, pensavo quindi di metterlo con un canale alpha, qualcuno di voi ha fatto qualcosa di simile nei suoi progetti?
- Tiled non sa usare l'autotile
-
Buonasera,
In questi ultimi due giorni mi sono riavvicinato al making, grazie a Facebook e agli interventi di Ischenderun che mi hanno incuriosito.
Mi piacerebbe fare un videogioco a tema 武侠 (wuxia), cioè fantasy ambientato in una Cina mitica in cui il/la protagonista è l'ultima ruota del carro in una setta (clan).
Grazie ad un evento fortuito, inizierà un viaggio avventuroso costellato di esplorazioni di dungeon, amicizia, pratica delle arti marziali, tecniche di coltivazione spirituale, alchimia, spiritual arrays, 锻造 (forgiatura), con l'obiettivo di raggiungere l'immortalità.
Saranno presenti molti caratteri cinesi perché vuole essere anche un gioco educativo per occidentali, sia per imparare a leggere alcuni semplici termini e arricchirsi con proverbi e massime di Confucio, sia perché penso abbiano il loro fascino dal punto di vista calligrafico e mi piacerebbe trasmetterli.C'è tante carne al fuoco ma non ho fretta, sto scrivendo su carta l'ambientazione e la struttura del clan.
Per quanto riguarda la grafica, volevo dedicarmi alle varie zone della setta e agli interni; pensavo di usare una risoluzione stretta e alta, anche perché siamo abituati così dai cellulari.
Per le mappe ho scoperto e sto utilizzando Tiled ( https://www.mapeditor.org/ ), programma gratuito, molto fico, ed è possibile esportare per RPG maker MV/Z (c'è un plugin di
vuvuzelavisustella).La cosa buona è che a quanto ho capito non ci sono vincoli di numero di layer, né sul numero/tipo di tileset.
Il difetto è che gli autotile non funzionano e bisognerebbe prima "svilupparli", cioè creare un tileset ricostruendo ogni pezzetto, ho provato a leggere qualche guida ieri su reddit ma non ci ho capito molto.
Al momento sono alla ricerca di:
- autotile "sviluppati" per fare il bordo degli interni
- chipset/tileset orientali tradizionali o portrait/charset/oggettistica con simboli o caratteri orientali (che poi penserò a convertire in cinese).
- tutorial su mapping e pixel art
- commenti
Vi metto un primo screen base di una abitazione, anticipo che sono una sega nel mapping e che da più di dieci anni che non tocco nulla di grafico, ho letto/riletto i tutorial di mapping su questo sito (quelli che avevano le immagini funzionanti) e dopo un po' di video youtube e qualche ora di trial and error, sono arrivato a questo.

Come anticipato, mancano gli autotile.
Non capisco come gestire i muri dell'ingresso e le zone di accesso alle stanze (caselle legno scuro sulla destra).Per la luce ho usato pavimenti di colore diverso per simulare due finestre su un lato.
Devo dire che il 2d ortogonale è una grande fregatura perché posso decorare solo il muro di sfondo, tanti anni fa mi ero dedicato all'isometrico proprio per avere almeno due muri da decorare. Se iniziassi la pixel art probabilmente tornerei all'isometrico, ma magari vedremo settimana prossima se mi viene l'ispirazione.
(I quadri sono in giappo mentre in futuro saranno in cinese.)
Aspetto indicazioni e possibilmente risorse per il mapping, grazie!
-
Ti conviene procurarti la documentazione dell'rgss3 in formato chm.
Puoi anche consultarla online in formato html, ad esempio su http://fixato.org/rpgmaker/Manual/RPGVXAce/rgss/gc_bitmap.html
-
Su questo avrei molto da ridire. XD Ingegneria informatica e facoltà di informatica sono due rami distinti. In informatica si fa molta più programmazione e progettazione di algoritmi e ottimizzazione del software, in ingegneria c'è più circuitazione (l'architettura degli elaboratori è colossale in ingegneria) e meno programmazione.
C'è la qualità oltre che la quantità XD.
Sul fatto che ci si dedichi molto alle architetture ti do ragione ma spesso i due insiemi coesistono: per risolvere un problema di architetture sto impazzendo da un mese per cercare le strutture dati ottimali per costruire delle reti bayesiane in c++... piango ;_;
@Holy87 hai dei consigli su come posso fare?
-
Ti risponde un laureando in ingegneria informatica, che, come natura vuole, ne sa a pacchi e programma meglio di un becero laureando in informatica
La differenza principale sta nel fatto che un linguaggio di scripting è interpretato a run-time mentre un sorgente passando attraverso il processo detto compilazione viene tradotto in linguaggio macchina.
Ciò implica che un linguaggio interpretato è generalmente più lento di uno compilato.
Il linguaggio Ruby è letto da un interprete scritto in C.
Il linguaggio C è compilato da un compilatore scritto in C.
Il linguaggio C++ è compilato da un compilatore scritto in C++.
Il linguaggio Ruby è un linguaggio ad oggetti puro (tutto è un oggetto).
Il linguaggio C non ha oggetti.
Il linguaggio C++ è un linguaggio orientato agli oggetti (è possibile usarli così come farne totalmente a meno, usando i costrutti C-like).
Il linguaggio Ruby ha un modulo predefinito per il Garbage collection.
Il linguaggio C++ non ha un garbage collector.
Il linguaggio Ruby è ad alto livello, ciò significa che un software si sviluppa in breve tempo.
Il linguaggio C è a medio-basso livello, è semplice e necessita di più tempo per lo sviluppo, poco adatto per progetti di grande dimensioni.
Il linguaggio C++ è ad un livello leggermente più alto del C per l'astrazione data da classi e template, è molto difficile da usare e richiede un tempo di sviluppo più lungo del C, perché se sbagli il design degli oggetti puoi dover essere costretto a ricominciare da capo.
-
Si può tentare un altro approccio di spiegazione, in corsivo i termini tecnici, in semplice grassetto quelli figurati:
Le classi sono come le formine per fare i dolci.
Le variabili e i metodi dichiarati all'interno sono gli ingredienti.class Crostata def mangia msgbox("Mangio la crostata") end endScrivi NomeClasse.new per prendere la formina, riempita degli ingredienti, e accendere il forno.
la_mia_nuova_crostata = Crostata.new
Quello che ottieni è un dolcetto, cioè il programma ha riservato una zona della memoria per questa istanza.
Ogni dolcetto è unico dal momento in cui nasce, e sarà soltanto simile ad altri dolcetti provenienti dalla stessa formina (istanze della stessa classe).
Il dolcetto appena uscito dal forno però sarà semplice semplice, abbiamo bisogno di farcirlo e decorarlo!
Quindi il forno va istruito su come personalizzarlo specificando dei parametri al metodo newcrostata_di_albicocche = Crostata.new("albicocche",500)Il metodo new, dopo che alloca la memoria per la nuova istanza, chiama il metodo initialize passando gli eventuali parametri.
Questa è un'operazione che fa il forno in automatico e noi non vediamo.
Però dobbiamo istruire il sistema su come intepretare i parametri migliorando la formina :Dclass Crostata def initialize(marmellata,grammi) @marmellata = marmellata @grammi = grammi end def mangia msgbox("Mangio la crostata di "+ @marmellata + "da "+ @grammi.to_s + " grammi") end endMigliorata la formina possiamo creare il dolcetto, farcirlo e mangiarlo :D
crostata_di_albicocche = Crostata.new("albicocche",500) crostata_di_albicocche.mangia
-
Ti consiglio di pubblicare solo a progetto finito, pubblicare prima significa inconsciamente accettare l'idea di lasciarlo incompiuto
-
Il primo script, Quest, ha un metodo include? in Window_ItemList molto più accurato.
Pertanto se li vuoi tenere entrambi senza curarti dell'ordine, eliminerei la modifica della classe succitata dallo script di victor.
Domani poi controllo il resto con più attenzione ^^
-
Personalmente è un po' troppo realistico per i miei gusti e non ho una scheda grafica tale da permettermi di godere di tutte le caratteristiche del motore :)
Ho entrambi i the witcher installati, e preferisco l'1 :O
-
Oh cavolo... dai torna, non mi lasciare solo :33333
Ho vinto un concorso per l'agenzia delle entrate e mi hanno assegnato questa sede ^-^
-
Buongiorno Forum,
L'ultima volta che loggavo ero appassionato al VX ACE... poi mi sono perso un po' per impegni personali e sia perché, come sempre, punto troppo in alto... ma vedrò di riprendere presto :D
Il succo di questo topic è che tra 2 settimane dovrò trasferirmi a Cagliari, dove probabilmente rimarrò per molti anni, e l'ho saputo qualche giorno fa...
Il problema è che non conosco nessuno e mi sto agitando per cercare una camera singola in un appartamento di studenti o un monolocale/bilocale economico, situati in Cagliari città possibilmente in un buon quartiere con poca criminalità e lontano dall'odore di pesce del porto (?).
Se siete maker sardi e cercate un coinquilino o avete amici/parenti che affittano e mi date una mano vi faccio lo script che volete XD
O se anche vogliamo vederci per bere un tè e fare due chiacchiere accetto molto volentieri :3
-
Avevo fatto qualcosa anni fa :)
-
Il Menu di default permette di interagire solo con i membri del party.
-
Ti salvi la lista dei personaggi sbloccati, quelli che non combattono li porti fuori dal party
-
2.0 Strumenti di base - [struttura di un programma C++ - Compilazione - Variabili]
1.0 Strumenti di base
Come compilatore utilizzerò Dev C++. Per creare un nuovo progetto, basterà andare in file à nuovo progetto à console application.
1.1 Struttura di un programma C++
Ogni programma C++ ha una parte principale, chiamata main, che contiene le istruzioni da eseguire. Le sue istruzioni sono racchiuse all’interno di parentesi graffe { }. Le parentesi tonde ( ) , indicano che si tratta di una funzione. Quindi il nostro programma partirà da questo codice:
main ()
{
}
In questo paragrafo scriviamo il nostro primo “Hello World!”. Per fare ciò dobbiamo inserire all’interno delle parentesi graffe il seguente codice:
cout << “Hello World” ;
Analizziamo il codice:
- cout significa “consolle output” e sta ad indicare il monitor.
- Hello World, è la nostra frase, definita “stringa”, ed una stringa è racchiusa tra virgolette “ “.
- << è l’operatore usato per inviare la stringa a cout, quindi per inviarla al monitor.
- ; (punto e virgola) indica la fine di un’istruzione.
A questo punto, se provassimo ad eseguire il programma, riceveremo un errore. Infatti il comando cout, risulterà essere underclear, cioè non riconosciuto. Per far risultare il comando riconosciuto, dobbiamo includere delle librerie. La libreria viene inserita fuori dal main, all’inizio del programma. Includiamo la libreria:
# include <iostream.h>
Il cancelletto # , serve per includere un qualcosa. Include significa includere, incorporare, mentre iostream.h è la libreria che si vuole includere. Il nome della libreria viene racchiusa tra i tag < > .
La libreria iostream permette di effettuare scritture sul monitor, e letture dalla tastiera.
Un altro modo per stampare una scrittura sullo schermo è utilizzare la seguente istruzione:
printf(“Hello World”);
Il comando printf , è costituito da due parole:
- print, che deriva dall’inglese (stampa), quindi stampa su schermo, ciò che trovi all’interno delle parentesi tonde.
- f, abbreviazione di formatted, che significa (formattato). Con l’aggiunta di f, potremo stampare: stringhe, numeri reali, caratteri ecc.
Ora il programma completo è questo:
#include <iostream.h>
main ()
{
cout << “Hello World!” << endl;
printf(“Ciao Mondo!”);
getchar();
}
Il comando getchar(); rimane il programma in pause, affinché non venga premuto il tasto INVIO.
endl, è un abbreviazione di “end line” (fine riga), e serve per mandare a capo il testo.
1.2 Compilazione
Ogni programma, per poter essere eseguito, deve essere scritto in un file mediante un editor e poi compilato, cioè tradotto in un formato numerico eseguibile dal processore. La traduzione viene effettuata da un programma detto compilatore, il quella legge il file contenente il programma da tradurre (detto programma sorgente) e produce un nuovo file contenente il programma tradotto in formato numerico (detto programma eseguibile). Esempio:
- Possiamo scrivere il programma e salvarlo in “.cpp” (c plus plus)
- Possiamo compilarlo creando il suo file eseguibile “.exe”.
1.3 Variabili
Il linguaggio C+++ consente di manipolare dati. I dati possono essere letti dalla tastiera, mostrati sullo schermo, mantenuti nella memoria del calcolatore e utilizzati all’interno di espressioni. Esistono diversi tipi di dati, ma i principali sono:
- int numeri interi
- float numeri decimali (detti volgarmente con la virgola)
- char caratteri
- bool di tipo booleano
Per poter memorizzare e utilizzare un dato è necessario effettuare una dichiarazione, che specifichi il tipo e il nome di tale dato. Il nome è formato da caratteri alfanumerici e il primo carattere deve obbligatoriamente essere una lettera.
Esempio:
int a = 12;
Viene dichiarata la variabile a, di tipo int (integer), e il suo valore o contenuto è 12, che potrà essere modificato nel tempo quindi può variare . Per questo motivo è chiamata “variabile”.
La memoria del calcolatore è organizzati in locuzioni, alla quale ad ognuna è associata una variabile .
float lunghezza, larghezza;
Non è stato associato alcun valore alle variabili. (I numeri con la virgola si scrivono con il punto . Per esempio 5,6 viene scritto 5.6)
char k2 = “f”;
alla variabile “k2” gli è stato associato il valore “f”.
bool ciao = “true”;
questa è una variabile di tipo boolenana, e può essere assumere solo due valori “true “ (vero) o “false” (falso)
Per sovrascrivere il valore di una variabile viene scritto;
ciao = 5;
Analizziamo questo codice:
int a = 5, b = 10; c;
a = 15;
c = a + b;
Abbiamo dichiarato nella prima riga true variabili di tipo integer, di cui ai primi due sono stati definiti i loro valori, e la terzo alcun valore. Quindi il valore di a all’ inizio sarà 5, mentre di b sarà 10, di c invece “indefinito” (se volessimo stampare su schermo il valore di c, uscirà un numero spropositato, proprio perché il contenuto di esso non è stato dichiarato).
Nella riga sottostante viene assegnato ad a il valori di 15, qui da adesso in poi, il valore di a non sarà più 5, ma 15.
La riga successiva definisce il valore di c, che non era stato ancora dichiarato. Il valore di c è uguale al risultato della somma dei valori di a e quello di b. Quindi c sarà uguale a 25. (15+10).
Per svolgere altre operazioni vengono usati:
+ per sommare
- per sottrarre
* per moltiplicare (asterisco)
/ per dividere (slash)
Se avremmo che a = 5, per modificare il suo valore possiamo utilizzare altri operatori:
a = 20 sovrascrive il valore della variabile a
a += 5 aggiunge al valore della variabile a, (ammettiamo il caso che fosse 10), il numero 5, quindi a = 15
a -= 5 sottrae il valore di a di 5. (10-5=5)
a *= 5 moltiplica il valore di a per 5. (10*5=50)
a/=5 divide il valore di a per 5. (100:5=2)
Creiamo un piccolo programma che ci permette di calcolare la somma fra due numeri interi.
#include <iostream.h>
main ()
{
int num1, num2;
cout << “Scrivi il primo numero intero: “;
cin >> num1;
cout <<”Scrivi il secondo numero intero: “;
cin >> num2;
cout <<”La somma fra due numeri è: “ << num1+num2 << endl << endl;
system(“PAUSE”);
}
Viene inclusa la libreria iostream.h . Poi è stata inserita la funzione main, e all’interno sono state dichiarate due variabili di tipo integer, senza essere definito il loro contenuto. Poi con cout è stato stampato su schermo la stringa che segue, e con cin (consolle input) è stato immagazzinato nella variabile num2, ciò che avevamo digitato. La stessa cosa vale per le due istruzioni successive, e alla fine abbiamo inserito il cout , il quale stampa sullo schermo, la somma di num1+num2, e infine system(“PAUSE”); che mette in pausa il programma, finché non sarà premuto il tasto invio.
Correzioni:
1) E' buona prassi che main restituisca un valore, quindi la base sarà
int main() { return 0; }2)L'header iostream.h è obsoleto.
L'header corretto è iostream senza estensione e le funzioni sono dentro il namespace std, per poterle usare senza cambiare il resto del codice va aggiunto using namespace std;
Quindi in ogni esempio
#include <iostream.h>
Va sostituito con
#include <iostream> using namespace std;
-
impara a mettere nomi decenti agli alias, non si capisce una mazza :P
-
Potresti iniziare trasferendo i rens di tuo fratello sul tuo user o.o
-
La "colpa" è mia che volevo farvi lavorare un pochettino :)
-
Per bloccare il movimento e l'attivazione di eventi (sia a contatto che su tasto azione) basta che movable? restituisca false
Questa informazione la si ricava esaminando move_by_input e update_nonmoving, se si è miscredenti basta che facciate un test ^-^.
Per rimuovere il menù mi sento male a modificare quando esiste già l'interruttore $game_system.menu_disabled=true che disabilita il menù.
Se lo usiamo però non possiamo attivare il sistema da switch ma è necessario scrivere un metodo (se lasciassimo l'attivazione da switch dovremmo mettere un processo parallelo = +lag).
Propongo qui una versione, adattata allo stile di WrathRook, del codice che uso per il mio bs su mappa :)
module FreezePlayer Switch = 10 def self.freeze $game_switches[FreezePlayer::Switch] = true $game_system.menu_disabled = true end def self.unfreeze $game_switches[FreezePlayer::Switch] = false $game_system.menu_disabled = false end end class Game_Player < Game_Character alias my_player_not_movable? movable? def movable? !$game_switches[FreezePlayer::Switch] && my_player_not_movable? end end
Per bloccare il personaggio chiamo in un evento
FreezePlayer.freeze
Per sbloccarlo:
FreezePlayer.unfreeze
Anche se mi piacerebbe che da uno script così il player finisse in posa da break dance :s
-
In Rpg Maker VX Ace alla schermata del titolo hai già tutti i file caricati:
Scenemanager.run prima chiama DataManager.init e poi carica la prima scena
E' un bell'esperimento per chi vuole imparare a scriptare, copiati questo codice in una nuova finestra di materiali e cambia il contenuto di @sprite1 e @sprite2 in create_background.
Ti allego un metodo random per comodità :)
#============================================= # Kero Workshop 1: Personalizzare il titolo! #============================================= class Scene_Title < Scene_Base #-------------------------------------------------------------------------- # * Create Background #-------------------------------------------------------------------------- def create_background @sprite1 = Sprite.new @sprite1.bitmap = Cache.title1($data_system.title1_name) @sprite2 = Sprite.new @sprite2.bitmap = Cache.title2($data_system.title2_name) center_sprite(@sprite1) center_sprite(@sprite2) end end module Util #-------------------------------------------------------------------------- # * Restituisce un numero intero compreso nell'intervallo, estremi inclusi # # Esempio: Util.random(3,10) #-------------------------------------------------------------------------- def self.random(minimo,massimo) [rand(massimo+1),minimo].max end end

Rimuovere solo gli oggetti normali dall'inventario con uno script call
in Supporto RGSS3 (VX-Ace)
Posted
Sì hai ragione, @items è un hash!
È possibile estrarre meno elementi all'interno dei blocchi, in questo caso scorriamo l'hash come se fosse una lista di chiavi.
Ti lascio un esempio banale che puoi testare:
h = { "a" => 100, "b" => 200 } puts h.select{|key| key < "b"}Quindi l'aggiungere _quantity rende il codice più comprensibile a chi lo vede per la prima volta, ma è superfluo se conosci le strutture dati