Jump to content
Rpg²S Forum

Sleeping Leonhart

Utenti
  • Posts

    569
  • Joined

  • Last visited

Everything posted by Sleeping Leonhart

  1. Uhmmm, sulla falsa riga di quanto suggerito da Flame questo è il massimo che sono riuscito a fare http://img820.imageshack.us/img820/2561/surao.png è un po stortignaccolo ma magari qualcuno lo puo usare come base e migliorarlo
  2. Esperimenti vari con grafica rippata, non badate al mapping, mi servono piu che altro consigli per far addattare meglio i chara dell'XP con questi tileset Direi che le proporzioni e la prospettiva sono ok, probabilmente pero devo cambiare i colori o la saturazione, aspetto consgili :rovatfl: .
  3. Guarda ti associo i parametri a quelli degli eventi cosi capisci http://img248.imageshack.us/img248/8959/immagineme.png chiaro?
  4. Per mostrare una picture devi usare il comando $game_screen.pictures[numeropicture].show(FILE, ORIGINE, X, Y, ZOOM_X, ZOOM_Y, OPACITA, TIPOBLEND) FILE è il nome del file ORIGINE è il punto di origine della picture, se 0 è in alto a sinistra altrimenti è il centro dell picture X e Y sono dove deve essere mostrata la picture ZOOM_X e ZOOM_Y penso si capisce OPACITA è il grado di visibilità della picture che va da 0 a 255 TIPOBLEND può essere 0: normale, 1:aggiungi, 2: sottrrai Per suonare un bgm puoi usare il comando Audio.bgm_play(FILEAUDIO, VOLUME, TIMBRO) FILEAUDIO è il nome del file e deve essere inclusivo di cartella, quindi devi scrivere per esempio "Audio/BGM/001-Battle01" VOLUME va da 0 a 100 TIMBRO va da 50 a 150 Per teletrasportare l'eroe devi usare: $game_temp.player_transferring = true$game_temp.player_new_map_id = IDNUOVAMAPPA$game_temp.player_new_x = X$game_temp.player_new_y = Y$game_temp.player_new_direction = DIREZIONE DIREZIONE se 0 resta quella corrente altrimenti 2:Giu 4:Sinistra 6:Destra 8:Su Se vuoi la transizione devi aggiungere anche Graphics.freeze$game_temp.transition_processing = true$game_temp.transition_name = "" Dimmi se non capisci qualcosa :rox:
  5. @Guardian:Grazie mille, provo a spiegarti megli fai conto di avere all'interno del metodo update tasto = Input.dir8 Ora se premi uno qualsiasi dei tasti movimento (su, giu, destra o sinistra), la variabile tasto assume un valore numerico che identifica la direzione che hai premuto con le frecce. Con direzioni oblique intendevo semplicemente dire quelle direzioni come su/destra, giu/sinistra. La corrispondenza direzione premuta numero dovrebbe essere questa: 1: Giu/Sinistra 4:Sinistra 7: Su/Sinistra2: Giu 8: Su3: Giu/Destra 6:Destra 9: Su/Destra Con dir4 solo Giu/Su/Destra/Sinistra, con dir8 tutte. Spero di essermi spiegato meglio @Master: Grazie anche a te, per qualcosa di piu avanzato non so, volevo fare una sorta di esplorazione degli script di base e con la scusa continuare ad insegnare. Come ho gia scritto con il prossimo tutorial punto ad indagare sugli script riguardanti il menu, quindi Window_MenuStatus, Scene_Menu ecc..., poi chissa forse qualcosa sul sistema di battaglia, anche se prima voglio vedere come gli utenti rispondono a questi "base".
  6. Creazione di una Scena 1.0 1. Introduzione Per: RPG Maker XP/VX. Autore: The Sleeping Leonhart; Descrizione: Questo tutorial descrive come creare una semplice scena in RGSS e fargli fare qualche azione. Ultima modifica: 8/6/2010;). Download: _RGSS__Tutorial_Scene.doc 2. Tutorial Creazione di una scena base Per prima cosa dobbiamo definire il nome della classe della scena che sarà poi il nome con la quale essa verrà richiamata class NOMESCENA end Generalmente le scene vengono chiamate con un nome del tipo Scene_NOMESCENA In Rpg Maker VX esiste la classe Scene_Base, che è un po’ come la classe Window_Base per le finestre, essa contiene infatti dei metodi comuni usati in quasi tutte le scene, per far ereditare questa classe basta anteporre < Scene_Base davanti al nome della scena, così: Scene_NOMESCENA < Scene_Base Nel tutorial non userò la classe Scene_Base, ometterla mi permette di spiegarvi la creazione delle scene sia per VX che per XP. Ora che abbiamo definito la classe dobbiamo iniziare a definire il punto di ingresso di una scena. Il primo metodo richiamato da una classe è il metodo initialize, noi però non utilizzeremo questo metodo ma bensì il metodo main. Perché ciò? Andiamo un attimo a dare un sguardo allo script del main, l'ultimo dello script editor, troveremo il seguente codice while $scene != nil $scene.main end in pratica Rpg Maker, parte ed inizia un ciclo infinito che termina solo se variabile globale $scene è vuota (e all'inizio non lo è in quanto sopra gli è assegnato il titolo) all'interno del ciclo viene chiamato il metodo main della scena, ecco perché noi useremo questo metodo per iniziare a costruire la nostra scena. In realtà non è obbligatorio usare il main per inizializzare le variabili della nostra scena, ma gli script standard e la maggior parte degli script sono strutturati cosi quindi noi li seguiamo a ruota. Capisco che mi spiego da cani ma se avete domande o dubbi chiedete. Quindi: class NOMESCENA def main CREAZIONEFINESTRE Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze DISPOSEFINESTRE endend Si inizia per prima cosa ad inizializzare le finestre, ma questo ve lo spiego dopo. Come potete vedere nel main ce un altro ciclo infinito, in questo ciclo vengono aggiornate Grafica (Graphics.update), Input dei tasti (Input.update) e viene chiamato il metodo update il ciclo termina quando la scena è diversa da se stessa e il main prosegue generalmente effettuando la cancellazione delle finestre. Piccola parentesi: Nel VX una volta che si è ereditato da Scene_Base si può omettere il main in quanto è già definito, per inizializzare le finestre viene usato il metodo start mentre per effettuarne il dispose il metodo terminate Ora per continuare nella spiegazione ho bisogno di almeno una finestra, nel nostro caso ne useremo 2 una selezionabile per le opzioni e una semplice per mostrare lo stato delle nostre azioni. La finestra selezionabile sarà del tipo Window_Command Cosa è una Window_Command, è una semplice finestra selezionabile con una lista di voci, un esempio è la finestra de selezione delle voci del titolo o del menu. La nostra finestra che mostra lo stato delle azioni invece sarà questa: class Window_Valori < Window_Base def initialize super(160, 0, 320, 192) self.contents = Bitmap.new(width - 32, height - 32) refresh end def refresh self.contents.clear self.contents.draw_text(0, 0, 256, 32, "Lo stato della Switch 1 è: #{$game_switches[1]}") self.contents.draw_text(0, 48, 256, 32, "Lo variabile 1 ha valore: #{$game_variables[1]}") self.contents.draw_text(0, 96, 256, 32, "Il party possiede #{$game_party.gold} oro") draw_actor_graphic($game_party.actors[0], 256, 150) self.contents.draw_text(0, 128, 256, 32, "#{$game_party.actors[0].name} è al livello #{$game_party.actors[0].level}") endend In Rpg Maker VX sostituite $game_party.actors con $game_party.members La nostra scena si chiamerà Scene_Opzioni, ora inizializziamo le finestre nel main class Scene_Opzioni def main #Nomi dei comandi comandi = ["Switch 1", "Variabile 1 + 5", "Variabile 1 - 3", "Oro + 100", "#{$game_party.actors[0].name} + 1"] #Inizializzo le finestre @finestra_opzioni = Window_Command.new(160, comandi) @finestra_valori = Window_Valori.new #Ciclo Principale Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze #Effettuo il dispose di tutte le finestre che ho inizializzato @finestra_opzioni.dispose @finestra_valori.dispose end def update endend Osservando lo script si nota la variabile comandi alla quale è assegnato una array di stringhe, questo array di stringhe non è altro che la lista dei comandi che la Window_Command mostrerà per noi sotto assegniamo a delle variabili d'istanza le nostre 2 finestre, Window_Command richiede il passaggio di 2 argomenti, il primo è la larghezza della finestra, il secondo è la lista dei comandi (che noi abbiamo definito sopra) Dopo il ciclo principale effettuiamo il dispose delle finestre chiamando il relativo metodo, ma che cos'è questo dispose? Il dispose non è altro che la cancellazione della nostra finestra dallo schermo, se non lo effettuiamo le nostre finestre rimangono visibili anche dopo la chiusura della scena. Ora andiamo a riempire il metodo update, questo metodo viene chiamato una volta per frame, dentro inseriremo l'update di @finestra_opzioni, necessario per il controllo attraverso i tasti (dell'altra non è necessario), e un controllo tasti: def update #aggiornamento finestra di selezione @finestra_opzioni.update #Se il tasto B è premuto if Input.trigger?(Input::B) #Suona il SE di annullamento $game_system.se_play($data_system.cancel_se) #ritorna alla mappa $scene = Scene_Map.new elsif Input.trigger?(Input::C) #Suona il SE di conferma $game_system.se_play($data_system.decision_se) #Controlla l'indice della selezione case @finestra_opzioni.index when 0 #Inverte lo stato della switch 1 $game_switches[1] = !$game_switches[1] when 1 #Aumenta la variabile 1 di 5 $game_variables[1] += 5 when 2 #Decrementa la variabile 1 di 3 $game_variables[1] -= 3 when 3 #Il party ottiene 100 oro $game_party.gain_gold(100) when 4 #Aumenta il livello del leader di 1 $game_party.actors[0].level += 1 end @finestra_valori.refresh end end Oltre al già citato metodo update di @finestra_opzioni si può notare Input.trigger?(Input::B) Questo metodo controlla se un tasto, in questo caso B (non la lettera il tasto di Rpg Maker), è stato premuto, oltre a trigger? esistono altri due metodi, ve li elenco è spiego tutti e 3 press?(TASTO): Determina se TASTO sta venendo premuto trigger?(TASTO): Determina se TASTO è stato premuto di nuovo, cioè dopo uno stato di premuto e non premuto. repeat?(TASTO): Determina se TASTO è stato premuto e continua ad esserlo. I tasti possono essere: DOWN, LEFT, RIGHT, UP, A, B, C, X, Y, Z, L, R, SHIFT, CTRL, ALT, F5, F6, F7, F8, F9. e devono essere preceduti da Input. in quanto costanti di questo modulo. Inoltre ci sono i metodi dir4 e dir8 che ritornano dei valori numerici in base al tasto direzionale premuto (per i numeri guardate il tastierino numerico), dir8 considera anche le direzioni oblique. Proseguendo verso il basso troviamo select case la cui variabile di controllo è @finestra_opzioni.index, il metodo index, come è facile intuire, indica l'indice del comando selezionato partendo da 0 ora in base a questo indice ho fatto eseguire diverse azioni alla nostra scena, subito dopo aver eseguito una delle 5 azioni la finestra con i valori viene aggiornata attraverso il metodo refresh. La nostra scena è conclusa, essa può essere richiamata attraverso $scene = Scene_Opzioni.new La scena Completa è questa class Scene_Opzioni def main #Nomi dei comandi comandi = ["Switch 1", "Variabile 1 + 5", "Variabile 1 - 3", "Oro + 100", "#{$game_party.actors[0].name} + 1"] #Inizializzo le finestre @finestra_opzioni = Window_Command.new(160, comandi) @finestra_valori = Window_Valori.new #Ciclo Principale Graphics.transition loop do Graphics.update Input.update update if $scene != self break end end Graphics.freeze #Effettuo il dispose di tutte le finestre che ho inizializzato @finestra_opzioni.dispose @finestra_valori.dispose end def update #aggiornamento finestra di selezione @finestra_opzioni.update #Se il tasto B è premuto if Input.trigger?(Input::B) #Suona il SE di annullamento $game_system.se_play($data_system.cancel_se) #ritorna alla mappa $scene = Scene_Map.new elsif Input.trigger?(Input::C) #Suona il SE di conferma $game_system.se_play($data_system.decision_se) #Controlla l'indice della selezione case @finestra_opzioni.index when 0 #Inverte lo stato della switch 1 $game_switches[1] = !$game_switches[1] when 1 #Aumenta la variabile 1 di 5 $game_variables[1] += 5 when 2 #Decrementa la variabile 1 di 3 $game_variables[1] -= 3 when 3 #Il party ottiene 100 oro $game_party.gain_gold(100) when 4 #Aumenta il livello del leader di 1 $game_party.actors[0].level += 1 end @finestra_valori.refresh end endend Ricordatevi di copiarvi anche la finestra che ho inserito sopra. Mi rendo conto che non ho spiegato tutto e non ho spiegato molto chiaramente ma è più semplice di quello che sembra creare una scena. Prossimamente posterò uno snocciolamento degli script che gestiscono il Menu cosi che possa spiegare un po’ meglio il funzionamento delle scene e perché no dare qualche dritta per personalizzarvi i vostri menu. Se ci sono domande, dubbi, volete mostrarmi le vostre scene o chiedere consigli/suggerimenti non esitate a postare.
  7. Mini Menu Descrizione Menu All in One dalle dimensioni contenute. Non è molto customizzabile, provata a cambiare la grafica e qualche altro valore, per altre modifiche sono sempre disponibile. All'interno è incluso anche uno script per mettere i bord i al font, inoltre è compatibile con il mio Time System. Autore The Sleeping Leonhart Demo Download Screenshott Istruzioni per l'uso Per personalizzare lo script andate nella sezione Configurazione. Per personalizzare i vocaboli andate nella sezione Vocabolario. Premere Shift per cambiare personaggio, Pag. Su e Pag. Giu per scorrere i menu. Bugs e Conflitti Noti N/A
  8. Allora prova cos?, linea 380 sotto file.close aggiungi $game_party.actors[0].character_name = "CharaZVB #{i}.png" $game_player.refresh Infine alla fine dello script dopo l'ultimo end aggiungi questo class Game_Actor def character_name=(chara) @character_name = chara end end e dovrebbe andare ;D
  9. Fammi capire bene vuoi usare il chara creato per utilizzarlo come personaggio principale?
  10. No no si deve chiamare DHConf scusa :smile: Comunque mi sono perso una stringa per strada che dovrebbe essere la causa per la quale ti da errore lo script, Devi aggiungere nella configurazione, sotto Event = { blablabla....} questo Event.default = {} ed in teoria non dovrebbe piu darti errore, ora aggiorno lo script nel primo post e piu tardi la demo
  11. Domanda stupidotta prima che parto per la caccia al bug, hai creato qualche decorazione con il programma? Perchè altrimenti non ti crea il file DHConfig.rxdata dentro Data e ti crasha.
  12. Prego :smile: Ma si che ti ricordi, basta che rismanetti un pochino e riprendi subito la mano, io ho fatto cosi Se stai tentando di usare lo spoiler con il tag code insieme non funzionano, non so il perchè, forse non sono compatibili.
  13. Se il salvataggio è precedente all'inserimento dello script è normale l'errore altrimenti non so, ma stai usando la demo che ho postato o hai inserito lo script in un proggetto nuovo? comunque ora controllo bene ;)
  14. Occhio ai doppi post, comunque in quale situazione ti da l'errore?
  15. Ma scusa che errore ti da?? La soluzione che ti ho scritto sopra era per risolvere l'errore se te ne da un altro scrivi il codice dell'errore e la riga in cui te lo da.
  16. Nel main sotto subito sotto begin aggiungi: $fontface = Font.default_name $fontsize = Font.default_sizedovrebbe risolvere il problema ;)
  17. Ops, ho proprio dimenticato di controllare l'eventuale collisione con i chara, risolvo appena ho tempo, grazie della tempestiva segnalazione .
  18. Sinceramente non ho smanettato molto con i colori ma ti posso insegnare come farlo, intanto ecco lo script: # ■ Light Effects XP V.3.2#================================#  By: Near Fantastica# Date: 28.06.05# Version: 3# modified by:SKKY88# DATE: 06.08.09# bug risolto=ora le luci non si muovono più su mappe superiori a 20x15##================================ class Spriteset_Mapalias les_spriteset_map_initalize initializealias les_spriteset_map_dispose disposealias les_spriteset_map_update updatedef initialize@light_effects = []setup_lightsles_spriteset_map_initalizeupdateenddef disposeles_spriteset_map_disposefor effect in @light_effectseffect.light.disposeend@light_effects = []enddef updateles_spriteset_map_updateupdate_light_effectsenddef setup_lightsfor event in $game_map.events.valuesnext if event.list == nilfor i in 0...event.list.sizeif event.list[i].code == 108 and event.list[i].parameters == ["GROUND"]type = "GROUND"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 2light_effects.light.zoom_y = 2light_effects.light.opacity = 100@light_effects.push(light_effects)endif event.list[i].code == 108 and event.list[i].parameters == ["FIRE"]type = "FIRE"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 5light_effects.light.zoom_y = 5light_effects.light.opacity = 100@light_effects.push(light_effects)endif event.list[i].code == 108 and event.list[i].parameters == ["LIGHT"]type = "LIGHT"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 1light_effects.light.zoom_y = 1light_effects.light.opacity = 150@light_effects.push(light_effects)end#MODIFICAif event.list[i].code == 108 && event.list[i].parameters == ["BLUL"]type = "GROUND"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 2light_effects.light.zoom_y = 2light_effects.light.opacity = 100#BLUlight_effects.light.tone = Tone.new(-255, -255, 255, 0)@light_effects.push(light_effects)elsif event.list[i].code == 108 && event.list[i].parameters == ["VERDEL"]type = "GROUND"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 2light_effects.light.zoom_y = 2light_effects.light.opacity = 100#VERDElight_effects.light.tone = Tone.new(-255, 255, -255, 0)@light_effects.push(light_effects)elsif event.list[i].code == 108 && event.list[i].parameters == ["ROSAL"]type = "GROUND"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 2light_effects.light.zoom_y = 2light_effects.light.opacity = 100#ROSAlight_effects.light.tone = Tone.new(255, -174, -201, 0)@light_effects.push(light_effects)elsif event.list[i].code == 108 && event.list[i].parameters == ["ROSSOL"]type = "GROUND"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 2light_effects.light.zoom_y = 2light_effects.light.opacity = 100#ROSSOlight_effects.light.tone = Tone.new(200, -255, -255, 0)@light_effects.push(light_effects)end#====================================================================== if event.list[i].code == 108 and event.list[i].parameters == ["LIGHT2"]type = "LIGHT2"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 1light_effects.light.zoom_y = 1light_effects.light.opacity = 150@light_effects.push(light_effects)endif event.list[i].code == 108 and event.list[i].parameters == ["TORCH"]type = "TORCH"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 1light_effects.light.zoom_y = 1light_effects.light.opacity = 150@light_effects.push(light_effects)endif event.list[i].code == 108 and event.list[i].parameters == ["TORCH2"]type = "TORCH2"light_effects = Light_Effect.new(event,type)light_effects.light.zoom_x = 1light_effects.light.zoom_y = 1light_effects.light.opacity = 150@light_effects.push(light_effects)endendendfor effect in @light_effectscase effect.typewhen "GROUND"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 47effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 47effect.light.blend_type = 1when "FIRE"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 144effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 144effect.light.tone = Tone.new(255,-100,-255, 0)effect.light.blend_type = 1when "LIGHT"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.blend_type = 1when "LIGHT2"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.blend_type = 1when "TORCH"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.tone = Tone.new(255,-100,-255, 0)effect.light.blend_type = 1when "TORCH2"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.tone = Tone.new(255,-100,-255, 0)effect.light.blend_type = 1endendenddef update_light_effectsif $game_switches[1]for effect in @light_effectsnext if effect.type == "FIRE" || effect.type == "TORCH"effect.light.visible = falseendelsefor effect in @light_effectsnext if effect.type == "FIRE" || effect.type == "TORCH"effect.light.visible = trueendendfor effect in @light_effectscase effect.typewhen "GROUND"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 45effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 45when "FIRE"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 144effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 144effect.light.opacity = rand(10) + 90when "LIGHT"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15when "LIGHT2"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15when "TORCH"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.opacity = rand(30) + 70when "TORCH2"effect.light.x = (-0.25 * $game_map.display_x) + (effect.event.x * 32) - 15effect.light.y = (-0.25 * $game_map.display_y) + (effect.event.y * 32) - 15effect.light.opacity = rand(10) + 90endendendend #================================# ■ Light Effects Class#================================ class Light_Effect#--------------------------------------------------------------attr_accessor :lightattr_accessor :eventattr_accessor :type#--------------------------------------------------------------def initialize(event, type)@light = Sprite.new@light.bitmap = RPG::Cache.picture("LE.PNG").clone@light.visible = true@light.z = 1000@event = event@type = typeendend Da dove trovi MODIFICA fino a dove a delimitato è la parte modificata, ora noterai che ti ho messo dei commenti con scritto BLU, VERDE ecc, subito sotto trovi light_effects.light.tone = Tone.new(r, g, b, gr) devi modificare i valori r g b gr secondo i tuoi gusti, dove r è la quantità di rosso, g di verde, b di blu e gr di grigio, tutti i valori vanno da -255 a 255 tranne il grigio che va da 0 a 255. Se hai problemi fammi sapere ;)
  19. Risollevo il topic per dirvi che a quanto pare adesso la firma mi si è modificata, ringrazio Tio per la disponibilità :D
  20. Non sono molto esperto e non vorrei dirti un idiozia ma di solito per far funzionare gli Input esterni nel televisore devi mettere AV.
  21. Decorable House Descrizione Lo script permette di poter posizionare degli elementi all'interno delle proprie mappe cosi da personalizzarle, può inoltre essere associato a ciascuna decorazione più di un evento. Lo script è fornito insieme ad un programma appositamente realizzato per poterlo configurare più comodamente, il programma richiede il .Net Framework 2.0 o superiore. Autore The Sleeping Leonhart Demo Download Script #==============================================================================# ** Decorable House#------------------------------------------------------------------------------# Autore: The Sleeping Leonhart# Versione: 1.1# Data di rilascio: 01/06/2010#------------------------------------------------------------------------------# Descrzione:# Questo script permette di personalizzare la propria casa aggiungendo# oggetti decorativi.#------------------------------------------------------------------------------# Versione:# 1.0 (06/02/2009): Versione Base.# 1.1 (01/06/2010): Aggiunto il supporto al DHConfig.exe.#------------------------------------------------------------------------------# Istruzioni:# Per personalizzare lo script andate nella sezione Configurazione.# Per creare nuovi elementi per la casa e per impostare i tile usare il# programma DHConfig.exe.#============================================================================== #==============================================================================# Configurazione#=============================================================================module Decorable_House #========================================================================= # Decorable_House: Imposta le case che possono essere decorate. #------------------------------------------------------------------------- # Sintassi: # Decorable_House = [map_id, ...] # Parametri: # map_id: id della mappa su cui possono essere effettuate modifiche. #========================================================================= Decorable_House = [2] #========================================================================= # EventSource: Imposta la mappa da cui saranno presi gli eventi. #------------------------------------------------------------------------- # Sintassi: # EventSource = map_id # Parametri: # map_id: id della mappa da cui sono presi gli eventi. #========================================================================= EventSource = 1 #========================================================================= # Event: Imposta gli eventi associabili agli elementi per la casa. #------------------------------------------------------------------------- # Sintassi: # Event = { tileset_id => {item => {[x, y] => event_id, ...}, ...}, ...} # Parametri: # tileset_id: id del tileset da cui prendere gli elementi. # item: nome dell'oggetto decorativio a cui associare l'oggetto. # x: coordinata x, partendo da 0, relativa all'oggetto nella quale verra # posizionato l'oggetto. # y: coordinata y, partendo da 0, relativa all'oggetto nella quale verra # posizionato l'oggetto. # event_id: id dell'evento associato all'oggetto. #========================================================================= Event = { 12 => { "Camino" => {[1, 1] => 1}, #Fuoco per il camino "Letto" => {[0, 1] => 2} #Coperta per il letto } } Event.default = {}end #==============================================================================# ** DHConfig#------------------------------------------------------------------------------# Stuttura di dati che contiene le informazioni dei tiles.#==============================================================================class DHConfig attr_accessor :terrainTag attr_accessor :passability attr_accessor :level def initialize @terrainTag = [] @passability = [] @level = [] endend #==============================================================================# ** DHElement#------------------------------------------------------------------------------# Stuttura di dati che contiene io dati relativi agli elementi decorativi#==============================================================================class DHElement #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :element attr_accessor :name #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize @element = [] @name = [] endend #==============================================================================# ** Game_Party#------------------------------------------------------------------------------# Questa classe gestisce il party.# Include informazioni sull'oro e gli oggetti posseduti.#==============================================================================class Game_Party #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :decoration_gained attr_accessor :decorated_house attr_accessor :decorable_house #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_gmprt_ntzlz initialize #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize tsldcrblhs_gmprt_ntzlz @decoration_gained = {} @decoration_gained.default = [] @decorated_house = {} @decorated_house.default = [{}, {}] @decorable_house = Decorable_House::Decorable_House end #-------------------------------------------------------------------------- # * Ottieni decorazioni. #-------------------------------------------------------------------------- def gain_decoration(map_id, item, number = 1) for i in 0...number @decoration_gained[map_id].push(item) end endend #==============================================================================# ** Spriteset_Map#------------------------------------------------------------------------------# Questa classe contiene la schermata della mappa, sprites, tilemaps, etc.# Viene usata all'interno della classe Scene_Map.#==============================================================================class Spriteset_Map #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :tilemap #-------------------------------------------------------------------------- # * Nasconde gli sprite degli eventi e dell'eroe. #-------------------------------------------------------------------------- def hide_chara for sprite in @character_sprites sprite.visible = false end endend #==============================================================================# ** Scene_Title#------------------------------------------------------------------------------# Questa classe gestisce la schermata del titolo.#==============================================================================class Scene_Title #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_scnttl_mn main #-------------------------------------------------------------------------- # * Caricamento dei dati del database. #-------------------------------------------------------------------------- def main file = File.open("Data/DHConf.rxdata", "rb") $dh_config = Marshal.load(file) $dh_element = Marshal.load(file) file.close tsldcrblhs_scnttl_mn endend #==============================================================================# ** Game_Map#------------------------------------------------------------------------------# Questa classe gestisce le mappe. Include lo scrolling e le funzioni per la # determinazione della passabilità.#==============================================================================class Game_Map #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :map #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_gmmp_stp setup #-------------------------------------------------------------------------- # * Impostazione iniziale della mappa. #-------------------------------------------------------------------------- def setup(*args) tsldcrblhs_gmmp_stp(*args) if $game_party.decorable_house.include?(@map_id) decorate_house end end #-------------------------------------------------------------------------- # * Restituisce l'ID del tileset. #-------------------------------------------------------------------------- def tileset_id return @map.tileset_id end #-------------------------------------------------------------------------- # * Restituisce il terrain tag più alto. #-------------------------------------------------------------------------- def dhterrain_tag(x, y) m1 = $dh_config[tileset_id].terrainTag[@map.data[x, y, 0]] m2 = $dh_config[tileset_id].terrainTag[@map.data[x, y, 1]] m3 = $dh_config[tileset_id].terrainTag[@map.data[x, y, 2]] return [[m1, m2].max, m3].max end #-------------------------------------------------------------------------- # * Applica le decorazioni alla mappa. #-------------------------------------------------------------------------- def decorate_house for i in 0..1 #Lista degli elementi posizionati poselement = $game_party.decorated_house[@map_id][i] for j in poselement.keys #Decorazione da poszionare element = $dh_element[tileset_id].element[poselement[j]] next if element == nil #Scorre gli elementi della decorazione for k in 0...element.size for l in 0...element[k].size #Determina le coordinate e posiziona il tile x = (j % @map.width) + k y = (j / @map.width) + l @map.data[x, y, 1 + i] = element[k][l] #Determina se va posizionato un evento if Decorable_House::Event[tileset_id][$dh_element[tileset_id].name[poselement[j]]] != nil && Decorable_House::Event[tileset_id][$dh_element[tileset_id].name[poselement[j]]][[k, l]] != nil #Carica i dati della mappa da cui prendere l'evente e lo posiziona map = load_data(sprintf("Data/Map%03d.rxdata", Decorable_House::EventSource)) name = "#{element}#{x}#{y}".to_i event = map.events[Decorable_House::Event[tileset_id][$dh_element[tileset_id].name[poselement[j]]][[k, l]]] event.id = name @events[name] = Game_Event.new(@map_id, event) @events[name].moveto(x, y) end end end end end end #-------------------------------------------------------------------------- # * Rimuove una decorazione. #-------------------------------------------------------------------------- def delete_element(level, el, pos) element = $dh_element[tileset_id].element[el] #Scorre gli elementi della decorazione for k in 0...element.size for l in 0...element[k].size #Determina le coordinate e cancella il tile x = (pos % @map.width) + k y = (pos / @map.width) + l @map.data[x, y, 1 + level] = 0 #Determina se va eliminato un evento if Decorable_House::Event[tileset_id][$dh_element[tileset_id].name[el]] != nil && Decorable_House::Event[tileset_id][$dh_element[tileset_id].name[el]][[k, l]] != nil name = "#{element}#{x}#{y}".to_i @events.delete(name) end end end endend class Window_PlacedDecoration < Window_Selectable #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize(width, commands, row_max) super(0, 0, width, [[row_max, commands.size].min * 32 + 32, 64].max) @item_max = commands.size @commands = commands self.contents = Bitmap.new(width - 32, [@item_max * 32, 32].max) refresh self.index = 0 end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh self.contents.clear for i in 0...@item_max draw_item(i) end end #-------------------------------------------------------------------------- # * Disegna Oggetto #-------------------------------------------------------------------------- def draw_item(index) self.contents.font.color = normal_color rect = Rect.new(4, 32 * index, self.contents.width - 8, 32) self.contents.fill_rect(rect, Color.new(0, 0, 0, 0)) self.contents.draw_text(rect, @commands[index]) endend #==============================================================================# ** Window_PutDecoration#------------------------------------------------------------------------------# Finestra selezionabile vuota utilizzata per il posizionamento delle decorazioni.# Contiene tanti elementi selezionabili quanti sono i tile della mappa.#==============================================================================class Window_PutDecoration < Window_Selectable #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize super(-16, -16, 672, 512) self.contents = Bitmap.new($game_map.width * 32, $game_map.height * 32) @column_max = $game_map.width @item_max = $game_map.width * $game_map.height @sprite = Sprite.new @op_count = 0 @sprite.z = self.z self.visible = false self.opacity = 0 self.index = 0 self.active = false end #-------------------------------------------------------------------------- # * Genera la grafica dell'elemento da posizionare. #-------------------------------------------------------------------------- def gen_sprite(e) return if e == nil @sprite.bitmap.dispose if @sprite.bitmap != nil element = $dh_element[$game_map.tileset_id].element[e] max = 0 for i in 0...element.size max = [max, element[i].size].max end @sprite.bitmap = Bitmap.new(element.size * 32, max * 32) for i in 0...element.size for j in 0...element[i].size tile = RPG::Cache.tile($game_map.tileset_name, element[i][j], 0) @sprite.bitmap.blt(i * 32, j * 32, tile, Rect.new(0, 0, tile.width, tile.height)) end end end #-------------------------------------------------------------------------- # * Effettua il dispose della finstra. #-------------------------------------------------------------------------- def dispose super @sprite.bitmap.dispose if @sprite.bitmap != nil @sprite.dispose end #-------------------------------------------------------------------------- # * Aggiorna la finestra. #-------------------------------------------------------------------------- def update x = @index % @column_max * 32 y = @index / @column_max * 32 ix = x - ((320 * (@index % @column_max) / (@column_max / 2)) / 32) * 32 ix = 0 if ix < 0 self.ox = ix iy = y - ((240 * (@index / @column_max) / ((@item_max / @column_max) / 2)) / 32) * 32 iy = 0 if ix < 0 self.oy = iy @sprite.x = x - self.ox @sprite.y = y - self.oy @op_count = (@op_count + 1) % 32 if @op_count < 16 op = (16 - @op_count) * 6 else op = (@op_count - 16) * 6 end @sprite.opacity = 196 - op @sprite.visible = self.visible if self.active and @item_max > 0 and @index >= 0 if Input.repeat?(Input::DOWN) cursor_down elsif Input.repeat?(Input::UP) cursor_up elsif Input.repeat?(Input::RIGHT) cursor_right elsif Input.repeat?(Input::LEFT) cursor_left end end end #-------------------------------------------------------------------------- # * Muove il cursore giu #-------------------------------------------------------------------------- def cursor_down if (@index < @item_max - @column_max) sub = 0 sub = @sprite.bitmap.height / 32 if @sprite.bitmap != nil @index = (@index + @column_max) % @item_max if @index / @column_max != @item_max / @column_max - sub end end #-------------------------------------------------------------------------- # * Muove il cursore su #-------------------------------------------------------------------------- def cursor_up if (@index > @column_max) @index = @index - @column_max end end #-------------------------------------------------------------------------- # * Muove il cursore a destra #-------------------------------------------------------------------------- def cursor_right if (@index < @item_max - 1) sub = 0 sub = @sprite.bitmap.width / 32 if @sprite.bitmap != nil @index = @index + 1 if @index % @column_max != @column_max - sub end end #-------------------------------------------------------------------------- # * Muove il cursore a sinistra #-------------------------------------------------------------------------- def cursor_left if (@index > 0) @index = @index - 1 if @index % @column_max != 0 end endend #==============================================================================# ** Window_DecorativeElement#------------------------------------------------------------------------------# Finestra che mostra la lista delle decorazioni possedute dal party.#==============================================================================class Window_DecorativeElement < Window_Selectable #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize super(0, 0, 128, 160) @column_max = 1 @item_max = $game_party.decoration_gained[$game_map.map_id].size self.contents = Bitmap.new(width - 32, [@item_max * 32, 32].max) refresh self.index = 0 self.visible = false self.active = false end #-------------------------------------------------------------------------- # * Restituisce l'id della decorazione selezionata. #-------------------------------------------------------------------------- def selected for i in 0...$dh_element[$game_map.tileset_id].element.size return i if $dh_element[$game_map.tileset_id].name[i] == @data[self.index] end end #-------------------------------------------------------------------------- # * Effettua un refresh della finestra. #-------------------------------------------------------------------------- def refresh self.contents.clear @data = [] @item_max = $game_party.decoration_gained[$game_map.map_id].size self.height = [192, [@item_max * 32 + 32, 64].max].min self.contents = Bitmap.new(width - 32, [@item_max * 32, 32].max) for i in $game_party.decoration_gained[$game_map.map_id] @data.push(i) end for i in 0...@data.size draw_item(i) end end #-------------------------------------------------------------------------- # * Disegna un elemento. #-------------------------------------------------------------------------- def draw_item(i) return if @data.size == 0 self.contents.draw_text(4, i * 32, 128, 32, @data[i]) endend #==============================================================================# ** Scene_Decorate#------------------------------------------------------------------------------# Scene che gestitsce l'intera operazione di decorazione della mappa.#==============================================================================class Scene_Decorate #-------------------------------------------------------------------------- # * Metodo principale e d'ingresso alla scena. #-------------------------------------------------------------------------- def main #Imposta la mappa come sfondo e nasconde i chara @map = Spriteset_Map.new @map.hide_chara #Inizializza alcuni elementi @selected = [] $game_party.decoration_gained[$game_map.map_id].sort! @level = 1 #Crea le finestre @command = Window_Command.new(128, ["Aggiungi", "Muovi", "Rimuovi"]) @put = Window_PutDecoration.new @elem = Window_DecorativeElement.new draw_pla @pla.active = false @pla.visible = false #Update principale Graphics.transition loop do #Aggiorna grafica ed input e chiama il metodo update Graphics.update Input.update update #Se la scena è nulla esce dal ciclo if $scene != self break end end Graphics.freeze #Effettua il dispose degli elementi grafici @command.dispose @put.dispose @elem.dispose @map.dispose @pla.dispose end #-------------------------------------------------------------------------- # * Aggiorna finestre, sfondo ed in base alle finestre attive richiama # altri metodi di update. #-------------------------------------------------------------------------- def update @put.update @elem.update @command.update @pla.update @map.tilemap.ox = @put.ox if @put.ox != @map.tilemap.ox @map.tilemap.oy = @put.oy if @put.oy != @map.tilemap.oy if @command.active update_command elsif @elem.active update_elem elsif @put.active update_put elsif update_pla end end #-------------------------------------------------------------------------- # * Crea una finestra contenente la lista degli elementi posizionati. #-------------------------------------------------------------------------- def draw_pla value = [] for i in 0..1 for j in $game_party.decorated_house[$game_map.id][i].values value.push($dh_element[$game_map.tileset_id].name[j]) end end @pla = Window_PlacedDecoration.new(128, value, 8) end #-------------------------------------------------------------------------- # * Calcola il numero di elemnti posizionati. #-------------------------------------------------------------------------- def pla_size value = [] for i in 0..1 for j in $game_party.decorated_house[$game_map.id][i].values value.push($dh_element[$game_map.tileset_id].name[j]) end end return value.size end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra dei comandi. #-------------------------------------------------------------------------- def update_command if Input.trigger?(Input::B) $scene = Scene_Map.new return elsif Input.trigger?(Input::C) case @command.index when 0 @command.active = false @command.visible = false @elem.active = true @elem.visible = true when 1..2 return if pla_size == 0 @command.active = false @command.visible = false @pla.dispose draw_pla @pla.active = true @pla.visible = true end return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra degli elementi piazzati. #-------------------------------------------------------------------------- def update_pla if Input.trigger?(Input::B) @command.active = true @command.visible = true @pla.active = false @pla.visible = false return elsif Input.trigger?(Input::C) #Determina l'elemento selezionato s = $game_party.decorated_house[$game_map.map_id][0].size if @pla.index < s @level = 0 @selected = [$game_party.decorated_house[$game_map.map_id][0].keys[@pla.index], $game_party.decorated_house[$game_map.map_id][0].values[@pla.index]] else @level = 1 @selected = [$game_party.decorated_house[$game_map.map_id][1].keys[@pla.index - s], $game_party.decorated_house[$game_map.map_id][1].values[@pla.index - s]] end @put.index = @selected[0] #Rimuove l'elemento dalla mappa $game_party.decorated_house[$game_map.map_id][@level].delete(@selected[0]) $game_map.delete_element(@level, @selected[1], @selected[0]) @level = 1 @pla.active = false @pla.visible = false @put.gen_sprite(@selected[1]) #Determina se l'elemento va mosso o eleminato if @command.index == 1 @put.active = true @put.visible = true elsif @command.index == 2 @command.active = true @command.visible = true $game_party.decoration_gained[$game_map.map_id].push($dh_element[$game_map.tileset_id].name[@selected[1]]) $game_party.decoration_gained[$game_map.map_id].sort! @elem.refresh end return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra degli elementi posseduti. #-------------------------------------------------------------------------- def update_elem if Input.trigger?(Input::B) @command.active = true @command.visible = true @elem.active = false @elem.visible = false return elsif Input.trigger?(Input::C) && $game_party.decoration_gained[$game_map.map_id].size > 0 @elem.active = false @elem.visible = false @put.active = true @put.visible = true @put.gen_sprite(@elem.selected) return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra di posizionamento degli # elementi. #-------------------------------------------------------------------------- def update_put if Input.trigger?(Input::B) @put.active = false @put.visible = false #Se stava effettuando uno spostamento rimette l'elemento dove era if @command.index == 1 $game_party.decorated_house[$game_map.map_id][@level][@selected[0]] = @selected[1] $game_map.decorate_house @command.active = true @command.visible = true elsif @command.index == 0 @elem.active = true @elem.visible = true end return elsif Input.trigger?(Input::C) #Determina se l'elemento è posizionabile e sa sta venendo spostato o posizionato if @command.index == 0 && puttable?(@elem.selected) $game_party.decorated_house[$game_map.map_id][@level - 1][@put.index] = @elem.selected $game_map.decorate_house $game_party.decoration_gained[$game_map.map_id].delete_at(@elem.index) @put.active = false @put.visible = false @elem.index = 0 @elem.refresh @elem.active = true @elem.visible = true @level = 1 elsif @command.index == 1 && puttable?(@selected[1]) $game_party.decorated_house[$game_map.map_id][@level - 1][@put.index] = @selected[1] $game_map.decorate_house @put.active = false @put.visible = false draw_pla @pla.active = true @pla.visible = true @level = 1 end end end #-------------------------------------------------------------------------- # * Determina se l'elemento è posizionabile. #-------------------------------------------------------------------------- def puttable?(el) element = $dh_element[$game_map.tileset_id].element[el] for i in 0...element.size for j in 0...element[i].size x = (@put.index % $game_map.width) + i y = (@put.index / $game_map.width) + j ter = $dh_config[$game_map.tileset_id].passability[element[i][j]] return false unless ter.include?($game_map.dhterrain_tag(x, y)) if $game_map.map.data[x, y, @level] != 0 if $dh_config[$game_map.tileset_id].level.include?(element[i][j]) @level = 2 return false if $game_map.map.data[x, y, @level] != 0 else return false end end end end return true endend Istruzioni per l'uso All'interno della demo è inserito un piccolo file di help in HTML che tenta di spiegare il funzionamento del programma. Per personalizzare lo script andate nella sezione Configurazione. Per creare nuovi elementi per la casa e per impostare i tile usare il programma DHConfig.exe. Bugs e Conflitti Noti Il programma non riscrive alcun metodo ma presenta alcuni aliasing che non dovrebbero interferire con altri script
  22. Io ho questi, vedi se ti possono servire al massimo te li adatti ;)
  23. R: Non ne ho la certezza ma spesso un problema specifico di una determinata versione di Rpg Maker XP, difatti questo problema dovrebbe presentarsi anche in altri script, prova ad usare il Main modificato di DaD o più semplicemente aggiungi al main $defaultfonttype = $fontface = $fontname = Font.default_name = "Arial" $defaultfontsize = $fontsize = Font.default_size = 24 subito sotto begin, dovrebbe risolvere il problema.
  24. Controlla anche l'eventuale presenza di accumuli di polvere nella ventola, o piu in generale nell'intero sistema dato che ci sei. Solitamente si formano dei veri e propri battufoli sotto le ventole che puoi rimuovere con una bomboletta d'aria compressa oppure con l'aspirapolvere (quest'ultimo metodo non sempre funziona in modo efficace).
  25. Decorable House Descrizione Provo a farmi perdonare la mia lunga assenza con uno script che tenevo in caldo da parecchio, ma che ho finalizzato solo ora. Lo script permette di poter posizionare degli elementi all'interno delle proprie mappe cosi da personalizzarle, può inoltre essere associato a ciascuna decorazione più di un evento. Lo script è fornito insieme ad un programma appositamente realizzato per poterlo configurare più comodamente, il programma richiede il .Net Framework 2.0 o superiore. Lo script in versione XP è fermo per ora alla versione 1.0 che è praticamente ingestibile per l'utente comune, appena adatto il programma per la configurazione lo posto. Autore The Sleeping Leonhart Demo Download Script #==============================================================================# ** Decorable House#------------------------------------------------------------------------------# Autore: The Sleeping Leonhart# Versione: 1.1# Data di rilascio: 28/05/2010#------------------------------------------------------------------------------# Descrzione:# Questo script permette di personalizzare la propria casa aggiungendo# oggetti decorativi.#------------------------------------------------------------------------------# Versione:# 1.0 (06/02/2009): Versione Base.# 1.1 (28/05/2010): Aggiunto il supporto al DHConfig.exe.#------------------------------------------------------------------------------# Istruzioni:# Per personalizzare lo script andate nella sezione Configurazione.# Per creare nuovi elementi per la casa e per impostare i tile usare il# programma DHConfig.exe.#============================================================================== #==============================================================================# Configurazione#==============================================================================module Decorable_House #========================================================================= # Decorable_House: Imposta le case che possono essere decorate. #------------------------------------------------------------------------- # Sintassi: # Decorable_House = [map_id, ...] # Parametri: # map_id: id della mappa su cui possono essere effettuate modifiche. #========================================================================= Decorable_House = [1] #========================================================================= # EventSource: Imposta la mappa da cui saranno presi gli eventi. #------------------------------------------------------------------------- # Sintassi: # EventSource = map_id # Parametri: # map_id: id della mappa da cui sono presi gli eventi. #========================================================================= EventSource = 2 #========================================================================= # Event: Imposta gli eventi associabili agli elementi per la casa. #------------------------------------------------------------------------- # Sintassi: # Event = { item => {[x, y] => event_id, ...}, ...} # Parametri: # item: nome dell'oggetto decorativio a cui associare l'oggetto. # x: coordinata x, partendo da 0, relativa all'oggetto nella quale verra # posizionato l'oggetto. # y: coordinata y, partendo da 0, relativa all'oggetto nella quale verra # posizionato l'oggetto. # event_id: id dell'evento associato all'oggetto. #========================================================================= Event = { "Camino" => {[1, 1] => 1}, #Fuoco per il camino "Pendolo" => {[0, 2] => 2} #Messaggio pendolo }end #==============================================================================# ** DHConfig#------------------------------------------------------------------------------# Stuttura di dati che contiene le informazioni dei tiles.#==============================================================================class DHConfig attr_accessor :terrainTag attr_accessor :passability attr_accessor :level def initialize @terrainTag = [] @passability = [] @level = [] endend #==============================================================================# ** DHElement#------------------------------------------------------------------------------# Stuttura di dati che contiene io dati relativi agli elementi decorativi#==============================================================================class DHElement #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :element attr_accessor :name #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize @element = [] @name = [] endend #==============================================================================# ** Game_Party#------------------------------------------------------------------------------# Questa classe gestisce il party.# Include informazioni sull'oro e gli oggetti posseduti.#==============================================================================class Game_Party #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :decoration_gained attr_accessor :decorated_house attr_accessor :decorable_house #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_gmprt_ntzlz initialize #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize tsldcrblhs_gmprt_ntzlz @decoration_gained = {} @decoration_gained.default = [] @decorated_house = {} @decorated_house.default = [{}, {}] @decorable_house = Decorable_House::Decorable_House end #-------------------------------------------------------------------------- # * Ottieni decorazioni. #-------------------------------------------------------------------------- def gain_decoration(map_id, item, number = 1) for i in 0...number @decoration_gained[map_id].push(item) end endend #==============================================================================# ** Spriteset_Map#------------------------------------------------------------------------------# Questa classe contiene la schermata della mappa, sprites, tilemaps, etc.# Viene usata all'interno della classe Scene_Map.#==============================================================================class Spriteset_Map #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :tilemap #-------------------------------------------------------------------------- # * Nasconde gli sprite degli eventi e dell'eroe. #-------------------------------------------------------------------------- def hide_chara for sprite in @character_sprites sprite.visible = false end endend #==============================================================================# ** Scene_Title#------------------------------------------------------------------------------# Questa classe gestisce la schermata del titolo.#==============================================================================class Scene_Title #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_scnttl_lddtbs load_database #-------------------------------------------------------------------------- # * Caricamento dei dati del database. #-------------------------------------------------------------------------- def load_database tsldcrblhs_scnttl_lddtbs file = File.open("Data/DHConf.rvdata", "rb") $dh_config = Marshal.load(file) $dh_element = Marshal.load(file) file.close endend #==============================================================================# ** Game_Map#------------------------------------------------------------------------------# Questa classe gestisce le mappe. Include lo scrolling e le funzioni per la # determinazione della passabilità.#==============================================================================class Game_Map #-------------------------------------------------------------------------- # * Variabili d'istanza. #-------------------------------------------------------------------------- attr_accessor :map #-------------------------------------------------------------------------- # * Aliasing dei metodi. #-------------------------------------------------------------------------- alias tsldcrblhs_gmmp_stp setup #-------------------------------------------------------------------------- # * Impostazione iniziale della mappa. #-------------------------------------------------------------------------- def setup(*args) tsldcrblhs_gmmp_stp(*args) if $game_party.decorable_house.include?(@map_id) decorate_house end end #-------------------------------------------------------------------------- # * Restituisce il terrain tag più alto. #-------------------------------------------------------------------------- def terrain_tag(x, y) m1 = $dh_config.terrainTag[@map.data[x, y, 0]] m2 = $dh_config.terrainTag[@map.data[x, y, 1]] m3 = $dh_config.terrainTag[@map.data[x, y, 2]] return [[m1, m2].max, m3].max end #-------------------------------------------------------------------------- # * Applica le decorazioni alla mappa. #-------------------------------------------------------------------------- def decorate_house for i in 0..1 #Lista degli elementi posizionati poselement = $game_party.decorated_house[@map_id][i] for j in poselement.keys #Decorazione da poszionare element = $dh_element.element[poselement[j]] next if element == nil #Scorre gli elementi della decorazione for k in 0...element.size for l in 0...element[k].size #Determina le coordinate e posiziona il tile x = (j % @map.width) + k y = (j / @map.width) + l @map.data[x, y, 1 + i] = element[k][l] #Determina se va posizionato un evento if Decorable_House::Event[$dh_element.name[poselement[j]]] != nil && Decorable_House::Event[$dh_element.name[poselement[j]]][[k, l]] != nil #Carica i dati della mappa da cui prendere l'evente e lo posiziona map = load_data(sprintf("Data/Map%03d.rvdata", Decorable_House::EventSource)) name = "#{element}#{x}#{y}".to_i event = map.events[Decorable_House::Event[$dh_element.name[poselement[j]]][[k, l]]] event.id = name @events[name] = Game_Event.new(@map_id, event) @events[name].moveto(x, y) end end end end end end #-------------------------------------------------------------------------- # * Rimuove una decorazione. #-------------------------------------------------------------------------- def delete_element(level, el, pos) element = $dh_element.element[el] #Scorre gli elementi della decorazione for k in 0...element.size for l in 0...element[k].size #Determina le coordinate e cancella il tile x = (pos % @map.width) + k y = (pos / @map.width) + l @map.data[x, y, 1 + level] = 0 #Determina se va eliminato un evento if Decorable_House::Event[$dh_element.name[el]] != nil && Decorable_House::Event[$dh_element.name[el]][[k, l]] != nil #map = load_data(sprintf("Data/Map%03d.rvdata", Decorable_House::EventSource)) name = "#{element}#{x}#{y}".to_i @events.delete(name) end end end endend #==============================================================================# ** Cache#------------------------------------------------------------------------------# Questo modula carica tutta la grafica, crea tutti i bitmap, e li conserva.# Per velocizzare e conservare memoria, questo module mantiene i bitmap creati# in un hash interno, permettendo al programma di restituirlo immediatamente# quando questo viene richiesto nuovamente.#==============================================================================module Cache #-------------------------------------------------------------------------- # * Ottiene la grafica del tile. #-------------------------------------------------------------------------- def self.tile(tile_id) key = [tile_id] @cache[key] = Bitmap.new(32, 32) x = (tile_id / 128 % 2 * 8 + tile_id % 8) * 32 y = tile_id % 256 / 8 % 16 * 32 case tile_id when 0...256 tileset = Cache.system("TileB") when 256...512 tileset = Cache.system("TileC") when 512...768 tileset = Cache.system("TileD") when 768...1024 tileset = Cache.system("TileE") when 1536...1664 tileset = Cache.system("TileA5") x = ((tile_id / 256) % 8) * 32 y = tile_id / 256 / 8 * 32 end rect = Rect.new(x, y, 32, 32) @cache[key].blt(0, 0, tileset, rect) return @cache[key] endend #==============================================================================# ** Window_PutDecoration#------------------------------------------------------------------------------# Finestra selezionabile vuota utilizzata per il posizionamento delle decorazioni.# Contiene tanti elementi selezionabili quanti sono i tile della mappa.#==============================================================================class Window_PutDecoration < Window_Selectable #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize super(-16, -16, 576, 448) self.contents = Bitmap.new($game_map.width * 32, $game_map.height * 32) @column_max = $game_map.width @item_max = $game_map.width * $game_map.height @sprite = Sprite.new @op_count = 0 @sprite.z = self.z self.visible = false self.opacity = 0 self.index = 0 self.active = false end #-------------------------------------------------------------------------- # * Genera la grafica dell'elemento da posizionare. #-------------------------------------------------------------------------- def gen_sprite(e) return if e == nil @sprite.bitmap.dispose if @sprite.bitmap != nil element = $dh_element.element[e] max = 0 for i in 0...element.size max = [max, element[i].size].max end @sprite.bitmap = Bitmap.new(element.size * 32, max * 32) for i in 0...element.size for j in 0...element[i].size tile = Cache.tile(element[i][j]) @sprite.bitmap.blt(i * 32, j * 32, tile, Rect.new(0, 0, tile.width, tile.height)) end end end #-------------------------------------------------------------------------- # * Effettua il dispose della finstra. #-------------------------------------------------------------------------- def dispose super @sprite.bitmap.dispose if @sprite.bitmap != nil @sprite.dispose end #-------------------------------------------------------------------------- # * Aggiorna la finestra. #-------------------------------------------------------------------------- def update super x = @index % @column_max * 32 y = @index / @column_max * 32 ix = x - (256 * (@index % @column_max) / (@column_max / 2)) ix = 0 if ix < 0 self.ox = ix iy = y - (192 * (@index / @column_max) / ((@item_max / @column_max) / 2)) iy = 0 if ix < 0 self.oy = iy @sprite.x = x - self.ox @sprite.y = y - self.oy @op_count = (@op_count + 1) % 32 if @op_count < 16 op = (16 - @op_count) * 6 else op = (@op_count - 16) * 6 end @sprite.opacity = 196 - op @sprite.visible = self.visible end #-------------------------------------------------------------------------- # * Aggiorna il cursore. #-------------------------------------------------------------------------- def update_cursor #metodo svuotato per permettere un cursore custom end #-------------------------------------------------------------------------- # * Muove il cursore giu #-------------------------------------------------------------------------- def cursor_down(wrap = false) if (@index < @item_max - @column_max) or (wrap and @column_max == 1) sub = 0 sub = @sprite.bitmap.height / 32 if @sprite.bitmap != nil @index = (@index + @column_max) % @item_max if @index / @column_max != @item_max / @column_max - sub end end #-------------------------------------------------------------------------- # * Muove il cursore a destra #-------------------------------------------------------------------------- def cursor_right(wrap = false) if (@index < @item_max - 1 or (wrap and page_row_max == 1)) sub = 0 sub = @sprite.bitmap.width / 32 if @sprite.bitmap != nil @index = @index + 1 if @index % @column_max != @column_max - sub end end #-------------------------------------------------------------------------- # * Muove il cursore giu a sinistra #-------------------------------------------------------------------------- def cursor_left(wrap = false) if (@index > 0 or (wrap and page_row_max == 1)) @index = @index - 1 if @index % @column_max != 0 end end #-------------------------------------------------------------------------- # * Scorre un pagina giu #-------------------------------------------------------------------------- def cursor_pagedown #metodo svuotato end #-------------------------------------------------------------------------- # * Scorre un pagina su #-------------------------------------------------------------------------- def cursor_pageup #metodo svuotato end end #==============================================================================# ** Window_DecorativeElement#------------------------------------------------------------------------------# Finestra che mostra la lista delle decorazioni possedute dal party.#==============================================================================class Window_DecorativeElement < Window_Selectable #-------------------------------------------------------------------------- # * Inizializzazzione dell'oggetto. #-------------------------------------------------------------------------- def initialize super(0, 0, 124, 180) @column_max = 1 @item_max = $game_party.decoration_gained[$game_map.map_id].size refresh self.index = 0 self.visible = false self.active = false end #-------------------------------------------------------------------------- # * Restituisce l'id della decorazione selezionata. #-------------------------------------------------------------------------- def selected for i in 0...$dh_element.element.size return i if $dh_element.name[i] == @data[self.index] end end #-------------------------------------------------------------------------- # * Effettua un refresh della finestra. #-------------------------------------------------------------------------- def refresh self.contents.clear @data = [] @item_max = $game_party.decoration_gained[$game_map.map_id].size self.height = [180, [@item_max * 24 + 32, 56].max].min create_contents for i in $game_party.decoration_gained[$game_map.map_id] @data.push(i) end for i in 0...@data.size draw_item(i) end end #-------------------------------------------------------------------------- # * Disegna un elemento. #-------------------------------------------------------------------------- def draw_item(i) return if @data.size == 0 self.contents.draw_text(4, i * 24, 128, 24, @data[i]) endend #==============================================================================# ** Scene_Decorate#------------------------------------------------------------------------------# Scene che gestitsce l'intera operazione di decorazione della mappa.#==============================================================================class Scene_Decorate #-------------------------------------------------------------------------- # * Metodo principale e d'ingresso alla scena. #-------------------------------------------------------------------------- def main #Imposta la mappa come sfondo e nasconde i chara @map = Spriteset_Map.new @map.hide_chara #Inizializza alcuni elementi @selected = [] $game_party.decoration_gained[$game_map.map_id].sort! @level = 1 #Crea le finestre @command = Window_Command.new(128, ["Aggiungi", "Muovi", "Rimuovi"]) @put = Window_PutDecoration.new @elem = Window_DecorativeElement.new draw_pla @pla.active = false @pla.visible = false #Update principale Graphics.transition loop do #Aggiorna grafica ed input e chiama il metodo update Graphics.update Input.update update #Se la scena è nulla esce dal ciclo if $scene != self break end end Graphics.freeze #Effettua il dispose degli elementi grafici @command.dispose @put.dispose @elem.dispose @map.dispose @pla.dispose end #-------------------------------------------------------------------------- # * Aggiorna finestre, sfondo ed in base alle finestre attive richiama # altri metodi di update. #-------------------------------------------------------------------------- def update @put.update @elem.update @command.update @pla.update @map.tilemap.ox = @put.ox if @put.ox != @map.tilemap.ox @map.tilemap.oy = @put.oy if @put.oy != @map.tilemap.oy if @command.active update_command elsif @elem.active update_elem elsif @put.active update_put elsif update_pla end end #-------------------------------------------------------------------------- # * Crea una finestra contenente la lista degli elementi posizionati. #-------------------------------------------------------------------------- def draw_pla value = [] for i in 0..1 for j in $game_party.decorated_house[$game_map.id][i].values value.push($dh_element.name[j]) end end @pla = Window_Command.new(128, value, 1, 8) end #-------------------------------------------------------------------------- # * Calcola il numero di elemnti posizionati. #-------------------------------------------------------------------------- def pla_size value = [] for i in 0..1 for j in $game_party.decorated_house[$game_map.id][i].values value.push($dh_element.name[j]) end end return value.size end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra dei comandi. #-------------------------------------------------------------------------- def update_command if Input.trigger?(Input::B) $scene = Scene_Map.new return elsif Input.trigger?(Input::C) case @command.index when 0 @command.active = false @command.visible = false @elem.active = true @elem.visible = true when 1..2 return if pla_size == 0 @command.active = false @command.visible = false @pla.dispose draw_pla @pla.active = true @pla.visible = true end return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra degli elementi piazzati. #-------------------------------------------------------------------------- def update_pla if Input.trigger?(Input::B) @command.active = true @command.visible = true @pla.active = false @pla.visible = false return elsif Input.trigger?(Input::C) #Determina l'elemento selezionato s = $game_party.decorated_house[$game_map.map_id][0].size if @pla.index < s @level = 0 @selected = [$game_party.decorated_house[$game_map.map_id][0].keys[@pla.index], $game_party.decorated_house[$game_map.map_id][0].values[@pla.index]] else @level = 1 @selected = [$game_party.decorated_house[$game_map.map_id][1].keys[@pla.index - s], $game_party.decorated_house[$game_map.map_id][1].values[@pla.index - s]] end @put.index = @selected[0] #Rimuove l'elemento dalla mappa $game_party.decorated_house[$game_map.map_id][@level].delete(@selected[0]) $game_map.delete_element(@level, @selected[1], @selected[0]) @level = 1 @pla.active = false @pla.visible = false @put.gen_sprite(@selected[1]) #Determina se l'elemento va mosso o eleminato if @command.index == 1 @put.active = true @put.visible = true elsif @command.index == 2 @command.active = true @command.visible = true $game_party.decoration_gained[$game_map.map_id].push($dh_element.name[@selected[1]]) $game_party.decoration_gained[$game_map.map_id].sort! @elem.refresh end return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra degli elementi posseduti. #-------------------------------------------------------------------------- def update_elem if Input.trigger?(Input::B) @command.active = true @command.visible = true @elem.active = false @elem.visible = false return elsif Input.trigger?(Input::C) && $game_party.decoration_gained[$game_map.map_id].size > 0 @elem.active = false @elem.visible = false @put.active = true @put.visible = true @put.gen_sprite(@elem.selected) return end end #-------------------------------------------------------------------------- # * Gestisce le azioni effettuabili dalla finestra di posizionamento degli # elementi. #-------------------------------------------------------------------------- def update_put if Input.trigger?(Input::B) @put.active = false @put.visible = false #Se stava effettuando uno spostamento rimette l'elemento dove era if @command.index == 1 $game_party.decorated_house[$game_map.map_id][@level][@selected[0]] = @selected[1] $game_map.decorate_house @command.active = true @command.visible = true elsif @command.index == 0 @elem.active = true @elem.visible = true end return elsif Input.trigger?(Input::C) #Determina se l'elemento è posizionabile e sa sta venendo spostato o posizionato if @command.index == 0 && puttable?(@elem.selected) $game_party.decorated_house[$game_map.map_id][@level - 1][@put.index] = @elem.selected $game_map.decorate_house $game_party.decoration_gained[$game_map.map_id].delete_at(@elem.index) @put.active = false @put.visible = false @elem.index = 0 @elem.refresh @elem.active = true @elem.visible = true @level = 1 elsif @command.index == 1 && puttable?(@selected[1]) $game_party.decorated_house[$game_map.map_id][@level - 1][@put.index] = @selected[1] $game_map.decorate_house @put.active = false @put.visible = false draw_pla @pla.active = true @pla.visible = true @level = 1 end end end #-------------------------------------------------------------------------- # * Determina se l'elemento è posizionabile. #-------------------------------------------------------------------------- def puttable?(el) element = $dh_element.element[el] for i in 0...element.size for j in 0...element[i].size x = (@put.index % $game_map.width) + i y = (@put.index / $game_map.width) + j ter = $dh_config.passability[element[i][j]] return false unless ter.include?($game_map.terrain_tag(x, y)) if $game_map.map.data[x, y, @level] != 0 if $dh_config.level.include?(el) @level = 2 return false if $game_map.map.data[x, y, @level] != 0 else return false end end end end return true endend Istruzioni per l'uso All'interno della demo è inserito un piccolo file di help in HTML che tenta di spiegare il funzionamento del programma. Per personalizzare lo script andate nella sezione Configurazione. Per creare nuovi elementi per la casa e per impostare i tile usare il programma DHConfig.exe. Bugs e Conflitti Noti Il programma non riscrive alcun metodo ma presenta alcuni aliasing che non dovrebbero interferire con altri script
×
×
  • Create New...