Sleeping Leonhart
-
Posts
569 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Posts posted by Sleeping Leonhart
-
-
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
http://img821.imageshack.us/img821/2140/map001.png
http://img541.imageshack.us/img541/5497/map002.png
http://img25.imageshack.us/img25/9813/map003.png
http://img714.imageshack.us/img714/7792/map004.png
http://img526.imageshack.us/img526/7880/map005t.png
Direi che le proporzioni e la prospettiva sono ok, probabilmente pero devo cambiare i colori o la saturazione, aspetto consgili :rovatfl: .
-
Guarda ti associo i parametri a quelli degli eventi cosi capisci
http://img248.imageshack.us/img248/8959/immagineme.png
chiaro?
-
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:
-
@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".
-
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: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}") endendIn 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 endendOsservando 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 endendRicordatevi 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.
- press?(TASTO): Determina se TASTO sta venendo premuto
-
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 LeonhartDemo
Screenshott
http://img215.imageshack.us/img215/4019/ghjg.png
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 -
Allora prova cos?, linea 380 sotto
file.close
aggiungi
$game_party.actors[0].character_name = "CharaZVB #{i}.png" $game_player.refreshInfine 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
-
Scusate se dò ancora fastidio ma vorrei sapere come utilizzare il character creato, perchè anche se io riavvio il gioco, non cambia.
Fammi capire bene vuoi usare il chara creato per utilizzarlo come personaggio principale?
-
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

-
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.
-
Prego :smile:
chissà se mi ricordo ancora qualcosa di ruby!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.
-
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 ;)
-
Occhio ai doppi post, comunque in quale situazione ti da l'errore?
-
Ma scusa che errore ti da?? La soluzione che ti ho scritto sopra era per risolvere l'errore
quando vado ad attivare l'evento mi dice " errore di script 'Chara Maker ZVB' sulla linea 47 del tipo 'TypreError' no implicit conversion from nil to integer"se te ne da un altro scrivi il codice dell'errore e la riga in cui te lo da.
-
Nel main sotto subito sotto begin aggiungi:
$fontface = Font.default_name $fontsize = Font.default_size
dovrebbe risolvere il problema ;)
-
Ops, ho proprio dimenticato di controllare l'eventuale collisione con i chara, risolvo appena ho tempo, grazie della tempestiva segnalazione
.
-
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 = typeendendDa 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 ;)
-
Risollevo il topic per dirvi che a quanto pare adesso la firma mi si è modificata, ringrazio Tio per la disponibilità :D
-
Non sono molto esperto e non vorrei dirti un idiozia ma di solito per far funzionare gli Input esterni nel televisore devi mettere AV.
-
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
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 -
Io ho questi, vedi se ti possono servire al massimo te li adatti ;)
http://img192.imageshack.us/img192/4920/sleepingl.png
http://img25.imageshack.us/img25/5185/knockedout.png
http://img708.imageshack.us/img708/5697/bedanimation02.png
http://img72.imageshack.us/img72/4540/bedanimation01.png
-
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.
-
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).
-
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
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

Un face di un chara
in Richiesta risorse grafiche XP
Posted
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