Jump to content
Rpg²S Forum

Keroro

Utenti
  • Posts

    646
  • Joined

  • Last visited

Posts posted by Keroro

  1. 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
  2. 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
  3. 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 personaggi

    C) 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

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

    mappa-base1.png

     

    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.

     

  5. Grazie a tutti per le risposte, dentro e fuori il topic :biggrin:
    Volevo rispondervi oggi con un nuovo screen ma non ce l'ho fatta, conto di metterlo giovedì.

    Per Guardian

    1. Tiled non sa usare l'autotile :sad: quindi vanno scomposti i quadrati a metà (16x16 se 32x32, 24x24 se 48x48) per creare un tileset apposito con tutte le combinazioni :what: super-sbatti, quindi forse creerò uno script per farlo ma non volevo perdere troppo tempo su ciò che non è direttamente connesso al making.
    2. Grazie per il link con il botto di tileset
    3. Studierò tutto!
    4. 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?
  6. 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 vuvuzela visustella).

    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:

    1. autotile "sviluppati" per fare il bordo degli interni
    2. chipset/tileset orientali tradizionali o portrait/charset/oggettistica con simboli o caratteri orientali (che poi penserò a convertire in cinese).
    3. tutorial su mapping e pixel art
    4. 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.

    mappa-base.png

     

    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!

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

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

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

    Scrivi 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 new

    crostata_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 :D

    class Crostata
      def initialize(marmellata,grammi)
        @marmellata = marmellata
        @grammi = grammi
      end
      def mangia
        msgbox("Mangio la crostata di "+ @marmellata + "da "+ @grammi.to_s + " grammi")
      end
    end

    Migliorata la formina possiamo creare il dolcetto, farcirlo e mangiarlo :D

    crostata_di_albicocche = Crostata.new("albicocche",500)
    crostata_di_albicocche.mangia


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

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

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

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

×
×
  • Create New...