Jump to content
Rpg²S Forum

Sleeping Leonhart

Utenti
  • Posts

    569
  • Joined

  • Last visited

Posts posted by Sleeping Leonhart

  1. 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: .

  2. 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:

  3. @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 :sisi:

     

    @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".

  4. 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}")  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.

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

     

    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

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

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

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

  9. 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 :sisi:

    Se stai tentando di usare lo spoiler con il tag code insieme non funzionano, non so il perchè, forse non sono compatibili.

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

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

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

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

     

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

  16. 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).
  17. 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

×
×
  • Create New...