-
Posts
221 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Posts posted by Lomax_Iced
-
-
Cavolo è vero! Ho dimenticato la ciccia
Ora dovrebbe andare:
/*: * @target MZ * @plugindesc Permette di attivare combo in battaglia basate sulla presenza di specifici personaggi nel party. * @author Massimo Bivona * * @param ComboSkillID * @text ID Skill Combo * @desc L'ID della skill che i personaggi possono attivare in combo. * @type skill * @default 1 * * @param ComboMPCost * @text Costo MP Combo * @desc Il costo in MP per attivare la combo. * @type number * @default 20 * * @help * Utilizza il tag <ComboMember> nelle note dei personaggi per indicare chi può attivare la combo. * Esempio di uso nella nota del personaggio: <ComboMember> */ (() => { const parameters = PluginManager.parameters('ComboPlugin'); const comboSkillID = Number(parameters['ComboSkillID'] || 1); const comboMPCost = Number(parameters['ComboMPCost'] || 20); Game_Party.prototype.canUseCombo = function() { // Verifica se ci sono abbastanza MP e se i membri con <ComboMember> sono nel party. return this.members().some(member => member.actor().meta.ComboMember && member.mp >= comboMPCost); }; const _Game_BattlerBase_canUse = Game_BattlerBase.prototype.canUse; Game_BattlerBase.prototype.canUse = function(item) { if (item.id === comboSkillID && this.isActor()) { return $gameParty.canUseCombo() && _Game_BattlerBase_canUse.call(this, item); } return _Game_BattlerBase_canUse.call(this, item); }; const _Game_Action_apply = Game_Action.prototype.apply; Game_Action.prototype.apply = function(target) { if (this.item().id === comboSkillID) { // Riduci gli MP di tutti i membri idonei per la combo. $gameParty.members().forEach(member => { if (member.actor().meta.ComboMember) { member.gainMp(-comboMPCost); } }); } _ Game_Action_apply.call(this, target); }; })();Ora ho fornito più spiegazioni su come utilizzarlo in modo corretto. Comunque per il discorso richieste passate, io non guardo l'anno di pubblicazione, di solito leggo la richiesta e poi provo a soddisfarla, per me è anche una sorta di esercizio per vedere se sono migliorato con la programmazione. Magari migliorando lo stile di scrittura dei plugin che creo e soprattutto anche velocizzarmi nel realizzarne uno.
Però ovvio hai ragione devo seguire le regole del sito e fornirvi anche una demo.
-
Ho realizzato lo stesso plugin sia per quanto riguarda i progetti realizzati con RPG Maker MV che con MZ. Ovviamente ho dovuto fare delle modifiche ma la funzione è praticamente la stessa ovvero conferire l'effetto profondità alla camminata dei personaggi simulando appunto l'effetto di avvicinarsi e allontanarsi da noi quando ci si sposta in mappa.
Se vi ricordate in Finale Fantasy 8 c'era una cosa del genere. Ma adesso veniamo al plugin:
/*: * @target MZ * @plugindesc Simula l'effetto profondità di camminata. * @author Massimo Bivona * * @param Scala Minima * @text Scala Minima * @type number * @decimals 2 * @default 0.50 * @desc La scala minima applicata ai personaggi nella parte alta della mappa. * * @param Scala Massima * @text Scala Massima * @type number * @decimals 2 * @default 1.00 * @desc La scala massima applicata ai personaggi nella parte bassa della mappa. * * @help Questo plugin permette di simulare un effetto di profondità scalando i personaggi basandosi sulla loro posizione Y sulla mappa. */ (() => { const pluginName = "DepthScaling"; const parameters = PluginManager.parameters(pluginName); const minScale = Number(parameters['Scala Minima'] || 0.5); const maxScale = Number(parameters['Scala Massima'] || 1.0); const _Sprite_Character_updateScale = Sprite_Character.prototype.updateScale; Sprite_Character.prototype.updateScale = function() { _Sprite_Character_updateScale.call(this); this.updateDepthScale(); }; Sprite_Character.prototype.updateDepthScale = function() { var mapHeight = $gameMap.tileHeight() * $gameMap.height(); var charY = this.y; // Calcolo della posizione relativa sullo schermo (0.0 = alto, 1.0 = basso) var relativePosition = charY / Graphics.height; // Calcola la scala basata sulla posizione Y con interpolazione lineare tra Scala Minima e Scala Massima var scale = (maxScale - minScale) * relativePosition + minScale; // Applica la scala modificata allo sprite del personaggio this.scale.x = scale; this.scale.y = scale; }; })(); -
Buona Pasqua gente! 🍷
Oggi vorrei proporvi uno script simpatico.
Avete presente l'effetto profondità donato ai personaggi in Finale Fantasy 8 ?! Ossia quell'effetto che li mostrava piccoli piccoli se lontani da noi e più definiti se vicini a noi...?! Ecco questo plugin permette di dare questo effetto ai vostri progetti realizzati con RPG Maker MV.
/*: * @plugindesc Modifica la scala dei personaggi in base alla loro posizione Y per simulare l'effetto profondità in RPG Maker MV. * @author Massimo Bivona * * @param Scala Minima: * @desc La scala minima applicata ai personaggi nella parte alta della mappa. * @default 0.5 * * @param Scala Massima: * @desc La scala massima applicata ai personaggi nella parte bassa della mappa. * @default 1.0 * * @help Questo plugin permette di simulare un effetto di profondità scalando i personaggi basandosi sulla loro posizione Y s/nella mappa. */ (function() { var parameters = PluginManager.parameters('DepthScaling'); var minScale = Number(parameters['Scala Minima'] || 0.5); var maxScale = Number(parameters['Scala Massima'] || 1.0); var _Sprite_Character_updateScale = Sprite_Character.prototype.updateScale; Sprite_Character.prototype.updateScale = function() { _Sprite_Character_updateScale.call(this); this.updateDepthScale(); }; Sprite_Character.prototype.updateDepthScale = function() { var mapHeight = $gameMap.height() * $gameMap.tileHeight(); var charY = this.character.screenY(); // Calcolo della posizione relativa sulla mappa (0.0 = alto, 1.0 = basso) var relativePosition = charY / mapHeight; // Calcola la scala basata sulla posizione Y con interpolazione lineare tra Scala Minima e Scala Massima var scale = (maxScale - minScale) * relativePosition + minScale; // Applica la scala modificata allo sprite del personaggio this.scale.x = scale; this.scale.y = scale; }; })();Spero possa esservi utile 😎
-
Ma guarda che non occorre smanettare troppo. Occorre solo inserire un .hide nelle finestre che non si vogliono far visualizzare.
Ad ogni modo ecco uno script che penso possa facilitare le cose:
(function() { // Sovrascrivi il metodo create della scena di equipaggiamento const _Scene_Equip_create = Scene_Equip.prototype.create; Scene_Equip.prototype.create = function() { // Esegui il metodo originale _Scene_Equip_create.call(this); // Nascondi o rimuovi le finestre che non vuoi this._statusWindow.hide(); // Nasconde la finestra dello stato this._commandWindow.hide(); // Nasconde la finestra dei comandi this._slotWindow.hide(); // Nasconde la finestra degli slot this._itemWindow.hide(); // Nasconde la finestra degli oggetti }; })(); -
-
// == Plugin Parameters == /*:it * @plugindesc Plugin per combo tra due personaggi nel party. * * @param ComboSkillID * @text ID Combo Skill * @desc ID della skill che i personaggi possono attivare in combo. * @type skill * @default 1 * * @param ComboMPCost * @text Costo MP Combo * @desc Costo in MP per attivare la combo. * @type number * @default 20 * * @help Questo plugin consente ai personaggi di attivare combo in battaglia * spendendo un tot di MP per attivare una skill speciale. * * Per utilizzare la combo, aggiungi la tag <Combo> alla descrizione della skill * che desideri sia disponibile solo tramite combo. */ (function() { var parameters = PluginManager.parameters('ComboPlugin'); var comboSkillID = parseInt(parameters['ComboSkillID']) || 1; var comboMPCost = parseInt(parameters['ComboMPCost']) || 20; // Override per verificare se la skill è disponibile solo tramite combo var _Game_BattlerBase_canUse = Game_BattlerBase.prototype.canUse; Game_BattlerBase.prototype.canUse = function(item) { if (item.meta.Combo) { return false; } return _Game_BattlerBase_canUse.call(this, item); }; // Override per verificare se i personaggi hanno abbastanza MP per attivare la combo var _Game_ActionTest = Game_Action.prototype.testComboSkill; Game_Action.prototype.testComboSkill = function() { if (this.isCombo()) { var subject = this.subject(); var action = this.item(); var comboSkill = $dataSkills[comboSkillID]; if (subject.mp >= comboMPCost && subject.isStateAffected(1) && comboSkill) { this.setSkill(comboSkillID); this.setSubject(subject); return true; } } return _Game_ActionTest.call(this); }; })();Spero sia utile senza troppo togliere a yanfli
-
// ==Plugin Name==
// Fusione Plugin
// Author: Massimo Bivona
// ==/Plugin Name==
(function() {
// Aggiungi un nuovo comando al menu principale per la fusione di oggetti
const _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
Scene_Menu.prototype.createCommandWindow = function() {
_Scene_Menu_createCommandWindow.call(this);
this._commandWindow.setHandler('fusione', this.commandFusione.bind(this));
};
// Definisci l'azione del comando di fusione
Scene_Menu.prototype.commandFusione = function() {
SceneManager.push(Scene_FusioneItems);
};
// Definisci la scena per la fusione di oggetti
function Scene_FusioneItems() {
this.initialize(...arguments);
}
Scene_FusioneItems.prototype = Object.create(Scene_MenuBase.prototype);
Scene_FusioneItems.prototype.constructor = Scene_FusioneItems;
Scene_FusioneItems.prototype.initialize = function() {
Scene_MenuBase.prototype.initialize.call(this);
};
Scene_FusioneItems.prototype.create = function() {
Scene_MenuBase.prototype.create.call(this);
this.createFusioneWindow();
};
Scene_FusioneItems.prototype.createFusioneWindow = function() {
this._fusioneWindow = new Window_Fusione(0, 0);
this.addWindow(this._fusioneWindow);
};
// Finestra per la fusione di oggetti
function Window_Fusione() {
this.initialize(...arguments);
}
Window_Fusione.prototype = Object.create(Window_Selectable.prototype);
Window_Fusione.prototype.constructor = Window_Fusione;
Window_Fusione.prototype.initialize = function(x, y) {
const width = Graphics.boxWidth;
const height = Graphics.boxHeight;
Window_Selectable.prototype.initialize.call(this, x, y, width, height);
this.refresh();
};
Window_Fusione.prototype.maxItems = function() {
return $gameParty.numItems($dataItems[1]); // Cambia l'ID dell'oggetto se necessario
};
Window_Fusione.prototype.item = function() {
return $dataItems[1]; // Cambia l'ID dell'oggetto se necessario
};
Window_Fusione.prototype.drawItem = function(index) {
const item = this.item();
const rect = this.itemRectForText(index);
this.drawText(item.name, rect.x, rect.y, rect.width);
};
// Aggiorna la finestra
Window_Fusione.prototype.refresh = function() {
this.createContents();
this.drawAllItems();
};
})();
Spero può essere utile
-
Sì, sembra una buona implementazione. Tu fa comunque dei test.
-
Ah ok. Vabbè nel caso di scene_title intesa come libreria, diverrà una libreria, pian piano dopo aver spiegato la struttura dello script di base in modo chiaro e chiave, introducendone anche la sua logica e quant'altro, facendo anche degli esempi, caricando delle minidemo, o dei link YouTube dove mostro i risultati visivi di quel che si è fatto.
Insomma mi piace coinvolgere e fare appassionare. Ora vi racconto un aneddoto mio, tempi del liceo, la prof stava spiegando le funzioni, ed io le chiesi a che servono e lei non mi seppe rispondere, non potete capire quanto oggi la maledico ancora.
Perché se mi avesse detto che mi sarebbero servite per fare ciò che faccio da ormai quasi vent'anni circa, io di sicuro iniziavo ad appassionarmi prima alla programmazione.
Quindi alla base ho questo alimentare la curiosità di chi desidera appassionarsi alla programmazione, specie chi è ancora uno scolaro anzi, sono fortunati che certi concetti li hanno freschi in testa e l'apprendimento dovrebbe essere più lesto per loro.
Comunque se dovessi ad un certo punto annoiare, fatemelo sapere. Presto inizierò, mi dispiace averlo pubblicato eliminando l'effetto sorpresa. Volevo pubblicarlo già pronto e strutturato.
-
Mi piace l'idea di fare capire a chi fosse interessato a capire, la logica semplice che ci sta alla base di un progetto complesso. Io, ad esempio, studiando e facendo pratica nel corso degli anni ho capito che nulla è davvero ostico ed impossibile da realizzare. Bisogna solo dare la giusta chiave di lettura. Poi la parte più bella, prendere la teoria e darla in pasto alla pratica e veder crescere il codice da che è un piccolo girino
function(){};non ancora definito a che diventa, nel caso stretto una libreria compatibile con i progetti realizzati con RPG Maker MV capace di implementare le circa 195 funzioni che permetteranno agli utenti di personalizzare i loro Scene_Title.Intanto, durante il percorso, ad un certo punto, a chi seguirà, di sicuro gli si sbloccherà qualcosa, come è successo a noi, che di colpo abbiamo iniziato a generare script complessi in modo abbastanza direi naturale.
E poi perché mi va. :)
Spero sempre di non annoiare. Ovvio e se così fosse fermatemi.
-
Ciao a tutti,
ho installato due plugin nel mio progetto che, per quanto possa capirne con il mio inglese, dovrebbero fare la medesima cosa... solo che non sono sicuro che sia effettivamente così e nemmeno di quale lo faccia meglio...
Chi di voi se ne intende, potrebbe aiutarmi a capire se meglio uno o l'altro e per quale motivo?
Grazie per ogni aiuto che potete darmi. :D
YEP_FpsSynchOption: http://yanfly.moe/2016/03/10/yep-81-fps-synch-option/
TDDP_FluidTimestep: https://forums.rpgmakerweb.com/index.php?threads/fluidtimestep-fix-the-game-speed.50709/
Sono utilizzati per gestire le irregolarità del frame rate dei giochi di RPG Maker MV, ma utilizzano approcci leggermente diversi.
YEP_FpsSynchOption.js
consente di impostare la velocità del gioco in base al frame rate. In pratica, questo plugin sincronizza la velocità del gioco con il frame rate, in modo che il gioco si muova alla stessa velocità su tutti i computer.
Questo plugin offre anche la possibilità di disattivare la sincronizzazione del frame rate in determinate situazioni.
TDDP_FluidTimestep.js
utilizza un approccio leggermente diverso. Invece di sincronizzare il gioco con il frame rate, questo plugin utilizza un sistema di passi temporali (timestep) per calcolare il movimento degli oggetti nel gioco.
In pratica, il plugin divide il tempo del gioco in piccoli intervalli (timestep) e calcola il movimento degli oggetti in base a questi intervalli. Questo metodo rende il gioco meno dipendente dal frame rate e migliora la fluidità del gioco in situazioni in cui il frame rate è instabile.
Traendo delle somme non c'è un plugin migliore rispetto che l'altro. La scelta è dipesa da ciò che tu reputi migliore per il tuo gioco.
Vuoi che sia compatibile scattante con tutti i dispositivi? ..allora scegli Yanfly.
Vuoi più fluidità? ... allora scegli TDDP.
-
Giochi indiepad... Interessante. Comunque ho letto dopo che aveva già risolto con lo script del coniglio. Ad ogni modo vorrei aggiungere qualcosa in più ...
Intanto risolvo la richiesta già risolta da Guardian. Solo perché l'avevo giusto scritta:
Io l'ho pensata così:
Mi creo una libreria (che posso estendere quanto mi pare e quando ne ho voglia) a cui il plugin che a breve vi mostrerò ne è dipendente. Pertanto:
ItalianKeyboard.js
//============================================================================= // ItalianKeyboard.js //============================================================================= /*: * @plugindesc Libreria di keyCode per la tastiera italiana per InputPersonalizzato.js * @version 1.0.0 * @author Massimo Bivona * * @help * Questa libreria fornisce una lista di keyCode per la tastiera italiana, che * possono essere utilizzati con il plugin InputPersonalizzato.js per assegnare tasti * personalizzati. * * Utilizzo: * * Per utilizzare questa libreria, basta includerla nel tuo progetto dopo il * plugin InputPersonalizzato.jsl. Puoi poi accedere ai keyCode di ogni tasto utilizzando * il seguente formato: * * ItalianKeyboard.NOME_TASTO * * Ad esempio, per assegnare il tasto "A" alla chiave "jump", puoi utilizzare il * seguente codice in un evento o in un comando di plugin: * * CustomInput.assignInput(ItalianKeyboard.A, 'jump'); * * Puoi utilizzare anche l'input personalizzato nel gioco utilizzando la funzione * `Input.isTriggered(inputName)` con il nome dell'input che hai assegnato. Ad * esempio, per controllare se l'input "jump" è stato attivato, puoi utilizzare * il seguente codice in una branca condizionale o in un comando di plugin: * * if (Input.isTriggered('jump')) { * // Fai qualcosa quando l'input "jump" viene attivato * } */ var ItalianKeyboard = ItalianKeyboard || {}; (function() { ItalianKeyboard.ZERO = 48; ItalianKeyboard.UNO = 49; ItalianKeyboard.DUE = 50; ItalianKeyboard.TRE = 51; ItalianKeyboard.QUATTRO = 52; ItalianKeyboard.CINQUE = 53; ItalianKeyboard.SEI = 54; ItalianKeyboard.SETTE = 55; ItalianKeyboard.OTTO = 56; ItalianKeyboard.NOVE = 57; ItalianKeyboard.A = 65; ItalianKeyboard.B = 66; ItalianKeyboard.C = 67; ItalianKeyboard.D = 68; ItalianKeyboard.E = 69; ItalianKeyboard.F = 70; ItalianKeyboard.G = 71; ItalianKeyboard.H = 72; ItalianKeyboard.I = 73; ItalianKeyboard.J = 74; ItalianKeyboard.K = 75; ItalianKeyboard.L = 76; ItalianKeyboard.M = 77; ItalianKeyboard.N = 78; ItalianKeyboard.O = 79; ItalianKeyboard.P = 80; ItalianKeyboard.Q = 81; ItalianKeyboard.R = 82; ItalianKeyboard.S = 83; ItalianKeyboard.T = 84; ItalianKeyboard.U = 85; ItalianKeyboard.V = 86; ItalianKeyboard.W = 87; ItalianKeyboard.X = 88; ItalianKeyboard.Y = 89; ItalianKeyboard.Z = 90; ItalianKeyboard.F1 = 112; ItalianKeyboard.F2 = 113; ItalianKeyboard.F3 = 114; ItalianKeyboard.F4 = 115; ItalianKeyboard.F5 = 116; ItalianKeyboard.F6 = 117; ItalianKeyboard.F7 = 118; ItalianKeyboard.F8 = 119; ItalianKeyboard.F9 = 120; ItalianKeyboard.F10 = 121; ItalianKeyboard.F11 = 122; ItalianKeyboard.F12 = 123; })();Ora creiamo il plugin dipendente:
InputPersonalizzato.js
//============================================================================= // InputPersonalizzato.js //============================================================================= /*: * @plugindesc Plugin per l'assegnazione di input personalizzati ai tasti della tastiera. * @author Massimo Bivona * * @help Questo plugin permette di assegnare input personalizzati ai tasti della tastiera. * * Per assegnare un input personalizzato, utilizza il seguente comando in un evento: * * InputPersonalizzato assign [tasto] [input] * * Dove [tasto] è il keyCode del tasto che vuoi assegnare (puoi trovare la lista completa dei keyCode online) * e [input] è il nome dell'input che vuoi assegnare a quel tasto. Ad esempio: * * InputPersonalizzato assign 65 "MioInput1" * * Assegna l'input "MioInput1" al tasto "A" (keyCode 65). * * Per richiamare l'input personalizzato in un altro evento, utilizza il seguente comando: * * InputPersonalizzato call [input] * * Dove [input] è il nome dell'input che vuoi richiamare. Ad esempio: * * InputPersonalizzato call "MioInput1" * * Richiama l'input "MioInput1". * * Per rimuovere un'assegnazione di input, utilizza il seguente comando: * * InputPersonalizzato remove [tasto] * * Dove [tasto] è il keyCode del tasto che vuoi rimuovere dall'assegnazione. Ad esempio: * * InputPersonalizzato remove 65 * * Rimuove l'assegnazione del tasto "A" (keyCode 65). * */ var InputPersonalizzato = InputPersonalizzato || {}; InputPersonalizzato._map = {}; InputPersonalizzato.assign = function(keyCode, inputName) { this._map[keyCode] = inputName; }; InputPersonalizzato.call = function(inputName) { var keyCode = this.getKeyCode(inputName); if (keyCode) { Input._currentState[this._map[keyCode]] = true; } }; InputPersonalizzato.remove = function(keyCode) { delete this._map[keyCode]; }; InputPersonalizzato.getKeyCode = function(inputName) { for (var keyCode in this._map) { if (this._map.hasOwnProperty(keyCode)) { if (this._map[keyCode] === inputName) { return keyCode; } } } return null; }; (function() { var alias_Input_onKeyDown = Input._onKeyDown; Input._onKeyDown = function(event) { if (InputPersonalizzato._map[event.keyCode]) { event.preventDefault(); var inputName = InputPersonalizzato._map[event.keyCode]; Input._currentState[inputName] = true; } else { alias_Input_onKeyDown.call(this, event); } }; var alias_Input_onKeyUp = Input._onKeyUp; Input._onKeyUp = function(event) { if (InputPersonalizzato._map[event.keyCode]) { event.preventDefault(); var inputName = InputPersonalizzato._map[event.keyCode]; Input._currentState[inputName] = false; } else { alias_Input_onKeyUp.call(this, event); } }; })();Come utilizzarlo nel modo migliore? Una sintesi.. i dettagli sono già stati scritti all'interno.
Ovviamente sia la libreria che il plugin occorre che stiano entrambi nella cartella '*/js/plugins'
Attiva InputPersonalizzato.js e tramite un evento in mappa puoi usare il plugin command per fargli fare qualcosa, tipo:
InputPersonalizzato assign 65 "MioInput1"
OppureInputPersonalizzato call "MioInput1"
Per rimuovere un'assegnazione invece dovrete scrivere:InputPersonalizzato remove 65
Se volessimo creare delle situazioni soggette a condizionio creare nuovi plugins traendo spunto dalla libreria, potremmo utilizzare il plugin "InputPersonalizzato.js" insieme a un'istruzione "if" in un evento o in un altro plugin per controllare se un input personalizzato è stato premuto o rilasciato. Esempio:
InputPersonalizzato assign 65 "MioInput1"
Per controllare se l'input "MioInput1" è stato premuto, puoi utilizzare il seguente codice in un evento oppure in un plugin:if (Input._currentState["MioInput1"]) { // l'input "MioInput1" è stato premuto }Se invece vuoi controllare se l'input "MioInput1" è stato rilasciato, puoi utilizzare il seguente codice:if (!Input._currentState["MioInput1"]) { // l'input "MioInput1" è stato rilasciato }Ed ecco qua. Penso sia semplice e intuitivo da poter essere usato anche a scopo didattico. Per capire sempre di più che fare questo genere di cose alla fine è facile. Occorre solo ragionarci un po' su. -
Up:
Ok dopo un piccolo raginamento ho trovato l'inghippo! Pensavo che l'interpreter rilevasse da solo il tipo di dato degli argomenti di comando (args[0] e args[1]) invece così pare non sia! Mi è bastato inserire una funzione di conversione a numero (Number()) e tutto si è risolto! :)
Ecco il codice funzionante:
Tuo codice:
/* *============================================================================= * Random Gold MV Version * By Nortas * rnd_Gold.js * Version: 1.0 * Free for commercial and non commercial use. *============================================================================= */ /*: * @help * Plugin Commands *============================================================================= * * █ Genera un valore random di oro da assegnare al gruppo * * Help: * Oro Minimo = Il valore minimo di oro * Oro Massimo = Il valore massimo di oro * Esempio: * 1) Seleziona la funzione "Comando Plugin" * 2) Inserisci il comando: * rndGold 20 100 * Il gruppo otterrà un valore random compreso tra 20 e 100 * *============================================================================= * @plugindesc Genera un valore random di oro da assegnare al gruppo. * * @author Nortas * * @param Messaggio * @desc Selezion ON se vuoi visualizzare un messaggio e OFF se non lo vuoi. * @default OFF *============================================================================= */ parametri = PluginManager.parameters('rnd_Gold'); const comandoBase = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function (command, args) { comandoBase.apply(this); if (command === 'rndGold') { if (args[0] >= 0) { if (args[1] >= args[0]){ var minG = Number(args[0]); var maxG = Number(args[1]); var rnd = Math.random(); var numOro=Math.floor(rnd * (maxG - minG + 1)) + minG; $gameParty.gainGold(numOro); if (String(parametri['Messaggio'])==="ON") { $gameMessage.add("Ricevute n° "+numOro+" monete d'oro!"); } } } } }Se vi piace lo posso postare nella sezione di release dei plugin! :)
Secondo me il tuo codice va aggiustato. È ammirevole che tu da che avevi un problema a che l'hai risolto con le tue capacità. Questo ti fa onore. Ma non accontentarti. Piuttosto spingi di più.
Essere programmatori è bello perché oh noi vogliamo che le cose vadano in un modo e facciamo in modo che ci vadano. Quindi insistiamo finché non escogitiamo la forma migliore che ci porta a realizzare ciò che ci necessità.
Quindi avendo seguito fedelmente le tue idee ora ho appena creato questo:
Mio script:
/** * Aggiunge un valore casuale di oro al personaggio del giocatore, in base a un valore minimo e massimo specificato. * * @function * @name addRandomGold * @param {number} [minValue=0] - Il valore minimo dell'oro casuale da aggiungere, definito nel plugin di RPG Maker MV. * @param {number} [maxValue=0] - Il valore massimo dell'oro casuale da aggiungere, definito nel plugin di RPG Maker MV. * @throws {Error} Solleva un'eccezione se i valori minimo e massimo non sono numeri validi. */ function addRandomGold(minValue = 0, maxValue = 0) { const minValuePlugin = Number(PluginManager.parameters('NomeDelPlugin')['minValue']) || 0; const maxValuePlugin = Number(PluginManager.parameters('NomeDelPlugin')['maxValue']) || 0; // Imposta i valori di input con i valori del plugin, se non vengono specificati if (minValue === 0 && maxValue === 0) { minValue = minValuePlugin; maxValue = maxValuePlugin; } // Verifica se i valori di input sono numeri validi if (typeof minValue !== 'number' || typeof maxValue !== 'number') { throw new Error('I valori minimo e massimo devono essere numeri validi'); } // Calcola un valore casuale di oro compreso tra minValue e maxValue const randomGold = Math.floor(Math.random() * (maxValue - minValue + 1) + minValue); // Aggiunge il valore casuale di oro al personaggio del giocatore $gameParty.gainGold(randomGold); };Così MIN e MAX puoi sceglierli dal tool. Non appena carichi lo script.Spero di essere stato utile.
-
Plugin non ne conosco, ma piuttosto so qualche trucchetto.Ecco, il mio guaio è che, a quanto pare, non è possibile affidare il valore di questo ID ad una variabile °-°
Conoscete qualche plugin che permetta ciò?
Ora se ho ben capito tu vorresti assegnare un ID immagine ad una variabile.
Le immagini qui vengono gestite dagli Sprite, che sono oggetti grafici.
Nel nostro caso possiamo utilizzarli da ponte per bypassare le limitazioni del tool e arrivare ad assegnare un ID immagine ad una variabile.
È facile e furbesco guarda:
Crea l'oggetto Sprite e lo lasci vuoto:
var mySprite = new Sprite();
Poi crei una sua var ambasciatrice:var myvariabile = 42;
Tramite il comando meta assegni un ID alla variabile:mySprite.meta.variabileID = 'myVarID';
Ora associamo la variabile all'oggetto Sprite$gameVariables.setValue(mySprite.meta.variableId, myVariable);
E adesso dovremmo aver bypassato la limitazioneaccedendo alla variabile tramite l'ID dell'oggetto Sprite:
var retrievedVariable = $gameVariables.value(mySprite.meta.variableId);
Non ci resta che avviare un console.log e vedere che cosa ci rimanda indietro.Se stamperà 42 allora ce l'avremmo fatta!
console.log(retrievedVariable);
È un metodo, nulla preclude che ce ne siano di altri migliori. -
Io non capisco perché anziché soffermarvi al vediamo come si fa, piuttosto si perda tempo a rovistare fra variabili e metodologie di altri utenti che magari si hanno creato delle risorse wow ma che non soddisfano la richiesta e allora tutto muore lì. Cioè non c'è fin'ora nessuno che intanto setaccia le funzioni di base, il codice JavaScript compatibile con Rpg maker mv, tutti a dire Ah yanfly non ci ha pensato quindi niente pazienza. No. Invece.
Yanfly non ci ha pensato e allora ci penso io, quanto meno ci ragioniamo su.
È una piccola critica la mia non per offendere ma piuttosto per spronarvi.
Siete d'accordo?
Fatta questa premessa un po' così doverosa ora vi dirò la mia, vi mostro come può essere strutturato uno pseudo plugin che si occupa di gestire l'orientamento dello schermo in un gioco per smartphone.
Creiamo dunque l'oggetto ScreenOrientation.js
e destiniamolo nella cartella plugins del tuo progetto.
function ScreenOrientation(){};Dentro di esso creiamo una sua var ambasciatrice.function ScreenOrientation(){var ScreenOrientation {};};Adesso è opportuno usare l'oggetto funzione setup. Ossia quel metodo che serve per verificare varie cose all'avvio del gioco. Nel nostro caso controllerà se il gioco è orientato in modo corretto.ScreenOrientation.setup = function() { if (window.innerWidth > window.innerHeight) { // Imposta l'orientamento su orizzontale screen.orientation.lock("landscape"); } else { // Imposta l'orientamento su verticale screen.orientation.lock("portrait"); } };Ora esportiamo e come si suol dire, il gioco è fatto!module.exports = ScreenOrientation;
Attiva il plugin dall'apposita sezione in RPG Maker MVe poi crea un evento che avvia la funzione tramite script.
Digitando
ScreenOrientation.setup();
In questo modo, quando il gioco verrà avviato, il metodo "setup" dell'oggetto ScreenOrientation verrà chiamato e l'orientamento dello schermo verrà impostato in base alle dimensioni del dispositivo.Fai tante prove su dispositivi differenti e valuta se le cose funzionano bene per dispositivi di varia tipologia. Buon Making.
-
No no sto costruendo un tutorial . mi è scappato il tasto e si è inviato per sbaglio ma volevo fare anteprima messaggio.
Mi sto dedicando a Scene_Title siccome ho visto che nella sezione richieste plugin sento spesso chiedere come modificare il title appunto per personalizzarlo. Voglio spiegarlo in modo minuzioso prima, narrando bene la sua logica e poi così passare ad implementare sempre più funzionalità nuove che possono rendere quest'oggetto veramente potente.
Contiamo circa ben 195 funzioni che possono essere applicate oltre a quelle presenti di default. Potrei inserirle e basta ma a me piace l'idea di spiegarne appunto la logica in dettagliato e chiaro. Ti faccio un esempio:
Questo è:function Scene_Title(){};Questo è l'oggetto in se. Ma quanti sanno davvero qual'è la logica di doverlo scrivere così ? Siamo pochi.
Così come è rappresentato, per ora, indica che è una funzione che ne riceve e ne trasmette NULLA. Però c'è.
Dalle () riceve argomenti/istruzioni esterne. Dalle graffe trasmette cosa gli si vuole far trasmettere. e quindi poi si procede. ...
Che ne pensi? A me sembra interessante.
-
/** * Oggi verrà analizzato in tutte le sue beltà lo Scene_Title * in modo che chiunque ma proprio chiunque oggi ne capirà il suo funzionamento */
PER I + NABBI: Lo Scene_Title è un oggetto che contiene, dentro di se, cose. (altri oggetti)
-
Salve,
Ho creato un Launcher in VB, (molto semplice) e vorrei che il mio gioco si avvii solamente con quello.
Vorrei che mi aiutaste a fare un JS che mi permetta di avviarlo solo con quell'applicazione da me creata.
(Nel concreto)
Vorrei che all'avvio di Game.exe (mio gioco) il JS facesse una cosa del genere
checkLauncher();
load intro
load menu intro
load music etc}
function checkLauncher (){if (launcher != blalauncher.exe) {alert(apri il gioco tramite il launcher); shutdown()} else {return=true}}
Quindi in sostanza prima dell'avvio di tutto lui faccia il controllo che se non è aperto con il launcher mandi un messaggio con scritto, Apri il gioco tramite launcher, e chiude il gioco quando si preme l'ok, altrimenti prosegue con l'avvio.
E' fattibile?
Sì ma prima ti devo dare delle informazioni:
Se vuoi creare un gioco online quanto segue non funziona.
Se vuoi creare un gioco offline allora segui questa prassi:
Nella cartella plugins del tuo progetto inserisci il file
MsgBox.js è una libreria che ti potrà essere utile sempre
in questo caso per fare visualizzare un popup di allerta.
che ti comunica che tutto è ok oppure no.
Dentro MsgBox.js scrivi queste istruzioni:
//============================================================================= // MsgBox.js //============================================================================= function MsgBox() { throw new Error('This is a static class'); } MsgBox.msgBox = function(message, title) { if (typeof nw !== 'undefined') { var gui = require('nw.gui'); var win = gui.Window.get(); win.setAlwaysOnTop(true); gui.Window.open('index.html', { frame: false, width: 500, height: 150, position: 'center', resizable: false, show: false }, function(new_win) { var document = new_win.window.document; document.title = title || 'Message'; document.getElementById('message').innerHTML = message; document.getElementById('ok').addEventListener('click', function() { new_win.close(); win.setAlwaysOnTop(false); }); new_win.show(); }); } else { console.log(title || 'Message', message); } };Può essere evocata così:MsgBox.msgBox('Il gioco è stato avviato correttamente!', 'Avviso');Ora crea launcher.js e inserisci queste altre istruzioni:function checkLauncher() { var nomeLauncher = "launcher.exe"; // Inserisci qui il nome del launcher var lineaComandoCompleta = process.argv.join(" "); if (lineaComandoCompleta.indexOf(nomeLauncher) === -1) { alert("Apri il gioco tramite launcher!"); window.close(); } }; checkLauncher(); // Continua con l'avvio del giocoPer farlo partire inserisci questa sintassi in index.html:<script type="text/javascript" src="js/launcher.js"></script>
Eccoti accontentato. -
"vorrei una piccola modifica" xD
Ad ogni modo devi fare così:
Vai nella cartella css del tuo progetto
Trova il file Window_TP.css
Aprilo con un buon code editor e
Cerca la classe tpGauge
Aggiungi queste istruzioni:
.tpGauge { font-size: 0; /* Nasconde il numero di TP */ }; .tpGauge .gauge { background-color: #fff; /* Colore di sfondo della barra */ border: 2px solid #666; /* Bordo della barra */ height: 8px; /* Altezza della barra */ margin: 0 6px; /* Margine della barra */ width: 92%; /* Larghezza della barra */ };Salva e chiudiPoi
Recati nella cartella js e trova il main.js
Dentro la funzione Window_TP.prototype.drawTpGauge
Inserisci questo:
Window_TP.prototype.drawTpGauge = function() { var gaugeHeight = this.contentsHeight() - 4; var rate = $gameParty.tpRate(); var color1 = this.tpGaugeColor1(); var color2 = this.tpGaugeColor2(); this.contents.clearRect(this.gaugeX(), this.gaugeY(), this.gaugeWidth(), gaugeHeight); if (Imported.YEP_CoreEngine) { var currentTp = Yanfly.Util.toGroup($gameParty.tp()); var maxTp = Yanfly.Util.toGroup($gameParty.maxTp()); var text = currentTp + ' / ' + maxTp; this.drawText(text, this.textPadding(), 0, this.contentsWidth(), 'left'); } this.drawGauge(this.gaugeX(), this.gaugeY(), this.gaugeWidth(), rate, color1, color2); if ($gameParty.tp() === 100) { if (this._gaugeFlash === undefined) { this._gaugeFlash = false; } this._gaugeFlash = !this._gaugeFlash; this.changeTextColor(this.systemColor()); this.drawText(this.tpRate() * 100 + '%', 0, 0, this.contentsWidth(), 'right'); this.changeTextColor(this.normalColor()); if (this._gaugeFlash) { this.drawGauge(this.gaugeX(), this.gaugeY(), this.gaugeWidth(), rate, '#ffff00', '#ffff00'); } else { this.drawGauge(this.gaugeX(), this.gaugeY(), this.gaugeWidth(), rate, color1, color2); } } else { this.changeTextColor(this.systemColor()); this.drawText } Window_Base.prototype.drawTpGauge = function(x, y, width) { var color1 = this.tpGaugeColor1(); var color2 = this.tpGaugeColor2(); var rate = $gameParty.tpRate(); if ($gameParty.tp() === 100) { if (this._gaugeFlash === undefined) { this._gaugeFlash = false; } this._gaugeFlash = !this._gaugeFlash; if (this._gaugeFlash) { this.drawGauge(x, y, width, rate, '#ffff00', '#ffff00'); } else { this.drawGauge(x, y, width, rate, color1, color2); } } else { this.drawGauge(x, y, width, rate, color1, color2); } };Ora alla classe Window_TP aggiungiamo la funzione 'Brillare'e più o meno bisogna fa così:
/** * Classe che rappresenta la finestra dei TP del gioco */ function Window_TP() { this.initialize.apply(this, arguments); } Window_TP.prototype = Object.create(Window_Base.prototype); Window_TP.prototype.constructor = Window_TP; /** * Inizializza la finestra dei TP */ Window_TP.prototype.initialize = function() { var width = this.windowWidth(); var height = this.windowHeight(); Window_Base.prototype.initialize.call(this, 0, 0, width, height); this.opacity = 0; this._tp = 0; this._maxTp = 0; this.brillare = false; // Nuovo attributo per la gestione dell'illuminazione della barra this.update(); }; /** * Imposta il numero di TP e il massimo di TP */ Window_TP.prototype.setTp = function(tp, maxTp) { if (this._tp !== tp || this._maxTp !== maxTp) { this._tp = tp; this._maxTp = maxTp; this.refresh(); } }; /** * Restituisce la larghezza della finestra */ Window_TP.prototype.windowWidth = function() { return 240; }; /** * Restituisce l'altezza della finestra */ Window_TP.prototype.windowHeight = function() { return this.fittingHeight(1); }; /** * Disegna la finestra dei TP */ Window_TP.prototype.refresh = function() { this.contents.clear(); var width = this.width - this.padding * 2; var rate = this._tp / this._maxTp; this.drawGauge(0, 0, width, rate, this.tpGaugeColor1(), this.tpGaugeColor2()); }; /** * Restituisce il colore 1 della barra dei TP */ Window_TP.prototype.tpGaugeColor1 = function() { return this.textColor(28); }; /** * Restituisce il colore 2 della barra dei TP */ Window_TP.prototype.tpGaugeColor2 = function() { return this.textColor(29); }; /** * Aggiorna la finestra dei TP */ Window_TP.prototype.update = function() { Window_Base.prototype.update.call(this); this.updateBlink(); // Chiamiamo il nuovo metodo per l'aggiornamento dell'illuminazione }; /** * Aggiorna l'illuminazione della barra dei TP quando questa è piena */ Window_TP.prototype.updateBlink = function() { if (this._tp >= this._maxTp) { this.brillare = !this.brillare; if (this.brillare) { this.contents.gradientFillRect(0, 0, this.width, this.height, this.tpGaugeColor1(), this.tpGaugeColor2(), true); } else { this.refresh(); } } };Dopo aver preparato la tavola se magnaDiamo 2 proprietà nuove a Window_Base
Per la precisione dentro la funzione Window_Base.prototype.updateTpb.
Esempio: Hide TP
Window_Base.prototype.drawActorTp = function(actor, x, y, width) { width = width || 186; var color1 = this.tpGaugeColor1(); var color2 = this.tpGaugeColor2(); this.drawGauge(x, y, width, actor.tpRate(), color1, color2); };Show TP a 100 punti.Window_Base.prototype.updateTpb = function() { if (this._actor && this._actor.canMove()) { if (this._tpbTurnCount !== $gameParty.tpbTurnCount()) { this._tpbTurnCount = $gameParty.tpbTurnCount(); this.refresh(); if (this._actor.tp >= this._actor.maxTp()) { this.contents.clearRect(0, 0, this.contentsWidth(), this.contentsHeight()); var color = [this.textColor(30), this.textColor(31)]; var flashCount = 0; var flashInterval = 30; var gaugeWidth = this._width - 130; this._animationCount++; if (this._animationCount % flashInterval < flashInterval / 2) { this.contents.fillRect(0, 0, gaugeWidth, this.lineHeight(), color[0]); } else { this.contents.fillRect(0, 0, gaugeWidth, this.lineHeight(), color[1]); } } } } };Spero di aver soddisfatto la richiesta. ;) -
mi sa che mi tocca aspettare che qualche bravo scripter con il cuore d'oro, si prenda a cuore la mia causa Y__Y
A distanza di anni passava quasi per caso un Baldo... Coff coff...ehm...
Vabbè ecco ciò che hai chiesto:
//============================================================================= // Cambio grafica pagina //============================================================================= Game_Event.prototype.page_graphic = function(page, graphic, index = 0) { this.event().pages.image.characterName = graphic; this.event().pages.image.characterIndex = index; this.refresh(); }; Game_Event.prototype.page_priority = function(page, priority) { this.event().pages.priorityType = priority; this.refresh(); }; Game_Event.prototype.page_move = function(page, speed, freq, type = null) { const pageData = this.event().pages.moveRoute.list; pageData[0].code = 45; pageData[0].parameters = [type || 0]; pageData[1].code = 16; pageData[1].parameters = [speed]; pageData[2].parameters = [freq]; this.refresh(); }; Game_Interpreter.prototype.page_graphic = function(ev, page, graphic, index = 0) { $gameMap.event(ev).page_graphic(page, graphic, index); }; Game_Interpreter.prototype.page_priority = function(ev, page, priority) { $gameMap.event(ev).page_priority(page, priority); }; Game_Interpreter.prototype.page_move = function(ev, page, speed, freq, type = null) { $gameMap.event(ev).page_move(page, speed, freq, type); }; -
Salve ragazzi, volevo sapere se era disponibile avere un plugin con l'active time battle ! Una demo sarebbe anche meglio ! Grazie !!!
Ecco qua, fammi sapere se va bene:
//============================================================================= // ATB.js //============================================================================= /*: * @plugindesc Plugin per il sistema di battaglia Active Time Battle (ATB). * Versione: 1.0.0 * Autore: Massimo Bivona * Licenza: TeamFox-ExclusiveUse * * @param Velocità iniziale * @desc Velocità iniziale di tutti i personaggi in battaglia. * @default 50 * * @param Velocità massima * @desc Velocità massima di tutti i personaggi in battaglia. * @default 100 * * @help * Questo plugin permette di implementare il sistema di battaglia Active Time Battle (ATB) * in un gioco creato con RPG Maker MV. Il plugin gestisce il tempo di caricamento * dell'azione dei personaggi, il cambio del turno in base alla velocità e la pausa * del tempo di caricamento durante la selezione dell'azione. * * Questo plugin è stato creato da me ed è rilasciato con licenza TeamFox-ExclusiveUse. * * Per personalizzare il plugin, è possibile modificare i parametri: * * - Velocità iniziale: velocità di caricamento iniziale di tutti i personaggi. * - Velocità massima: velocità di caricamento massima di tutti i personaggi. * * Maggiori informazioni su come utilizzare questo plugin sono disponibili nella * documentazione online. */ (function() { // Dichiarazione dei parametri del plugin var parametri = PluginManager.parameters('ATB'); var velocitàIniziale = parseInt(parametri['Velocità iniziale']) || 50; var velocitàMassima = parseInt(parametri['Velocità massima']) || 100; // Dichiarazione della classe di battaglia function Battaglia() { this._personaggi = []; this._turno = null; } Battaglia.prototype.aggiungiPersonaggio = function(personaggio) { this._personaggi.push(personaggio); }; Battaglia.prototype.avanzaTempo = function(tempo) { this._personaggi.forEach(function(personaggio) { personaggio.avanzaTempo(tempo); }); }; Battaglia.prototype.selezionaProssimoTurno = function() { var minTempo = Infinity; var prossimoTurno = null; this._personaggi.forEach(function(personaggio) { if (personaggio.tempoCaricamento < minTempo) { minTempo = personaggio.tempoCaricamento; prossimoTurno = personaggio; } }); this._turno = prossimoTurno; this._turno.resettaTempoCaricamento(); }; // Dichiarazione della classe di personaggio function Personaggio(nome, velocità) { this._nome = nome; this._velocità = velocità; this._tempoCaricamento = 0; } Object.defineProperty(Personaggio.prototype, 'nome', { get: function() { return this._nome; }, configurable: true }); Object.defineProperty(Personaggio.prototype, 'velocità', { get: function() { return this._velocità; }, configurable: true }); Object.defineProperty(Personaggio.prototype, 'velocita', { get: function() { return this._velocita; }, set: function(value) { this._velocita = value; }, configurable: true }); return Personaggio; })();È una base di partenza, niente di che. Se hai delle richieste particolari. Scrivi(Messaggio rivolto a tutti) se ho tempo e quando ho tempo rispondo.
-
ahahah lo stai aspettando pure tu ? XD comunque non proprio...anche se il genere sarebbe quello, dici che è possibile con rpg mv o non si puo' proprio ?
Sì. È possibile. Creerò qui qualcosa che realizzai io qualche anno fa e ora beh..
cerco di sfoltire il codice oppure spiegarvi giusto la prassi.
In primo luogo occorre acquisire le Geo-Api del browser
if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(successCallback, errorCallback); } else { alert("La geolocalizzazione non è supportata dal tuo browser."); } function successCallback(position) { // qui possiamo accedere alle coordinate della posizione attuale dell'utente var lat = position.coords.latitude; var lng = position.coords.longitude; }; function errorCallback(error) { alert("Errore durante l'accesso alla posizione GPS."); };Questo vi permetterà di ricevere la posizione del client o utente.Possiamo quindi ora poter utilizzare le sue coordinate per posizionarlo sulla mappa del mondo reale.
Per utilizzare una MapQuest potremmo creare...ma non sarà questo il caso...
possiamo utilizzare uno script già compilato che è lo'OrangeMapQuest.js si occupa proprio di mettere a disposizione mappe reali a coloro che vogliono realizzare giochi online per Rpg maker mv.
Queste mappe hanno il brutto vizio di geolocalizzare ma noi le useremo proprio a tale scopo quindi
Fatte queste due cose possiamo già iniziare a creare il gioco.
Occhio che si dovrebbe anche tutelare la sicurezza del giocatore.
Quindi è prassi creare funzioni che si occupano di questo e di analizzare la connessione internet.
Sono istruzioni minimalissime ma spero che vi abbiano riacceso l'entusiasmo.
Rpg Maker MV è sottovalutato, date retta a me.
È un foglio bianco. Spetta a voi fare un disegno wow oppure uno scarabocchio o lasciarlo in bianco.
-
Salve ragazzi, sto convertendo il mio vecchio progetto per VX per MV, però ho notato che così facendo rimango senza due script importantissimi: il primo riguarda una barra generica (che io uso come barra della vita per l'eroe, che ogni volta che viene colpito cala la vita, fino al game over) e il sistema degli achievements con il quale veniva fuori il popup dei trofei guadagnati per le varie imprese :) Nulla di simile? :(
Sì. Forse ho qualcosa:
BarraVita.js
//============================================================================= // BarraVita.js //============================================================================= /*: * @plugindesc Plugin per la creazione di una barra personalizzabile per la vita del personaggio. * @author Massimo Bivona * * @param Larghezza * @desc La larghezza in pixel della barra vita. * @type number * @min 1 * @default 200 * * @param Altezza * @desc L'altezza in pixel della barra vita. * @type number * @min 1 * @default 20 * * @param Colore di sfondo * @desc Il colore di sfondo della barra vita in formato esadecimale. * @default #333333 * * @param Colore della barra * @desc Il colore della barra vita in formato esadecimale. * @default #ff0000 * * @param Colore testo * @desc Il colore del testo della barra vita in formato esadecimale. * @default #ffffff * * @param Dimensione testo * @desc La dimensione del testo della barra vita. * @type number * @min 1 * @default 12 * * @param Font testo * @desc Il nome del font del testo della barra vita. * @default GameFont * * @help * Per visualizzare la barra vita in gioco, basta inserire il tag <barraVita> nella descrizione del personaggio. * La barra vita verrà visualizzata automaticamente quando il personaggio verrà selezionato. * * È possibile personalizzare i seguenti parametri: * - Larghezza: la larghezza in pixel della barra vita (valore minimo: 1). * - Altezza: l'altezza in pixel della barra vita (valore minimo: 1). * - Colore di sfondo: il colore di sfondo della barra vita in formato esadecimale. * - Colore della barra: il colore della barra vita in formato esadecimale. * - Colore testo: il colore del testo della barra vita in formato esadecimale. * - Dimensione testo: la dimensione del testo della barra vita (valore minimo: 1). * - Font testo: il nome del font del testo della barra vita. * * Esempio di personalizzazione dei parametri: * * <BarraVita> * Larghezza: 300 * Altezza: 30 * Colore di sfondo: #111111 * Colore della barra: #00ff00 * Colore testo: #ffffff * Dimensione testo: 20 * Font testo: Arial * </BarraVita> */ var Imported = Imported || {}; Imported.BarraVita = true; var BarraVita = BarraVita || {}; BarraVita.Parametri = PluginManager.parameters('BarraVita'); // Default parameters BarraVita.LARGHEZZA = parseInt(BarraVita.Parametri['Larghezza']) || 200; BarraVita.ALTEZZA = parseInt(BarraVita.Parametri['Altezza']) || 20; BarraVita.COLORE_SFONDO = BarraVita.Param // Default parameters BarraVita.LARGHEZZA = parseInt(BarraVita.Parametri['Larghezza']) || 200; BarraVita.ALTEZZA = parseInt(BarraVita.Parametri['Altezza']) || 20; BarraVita.COLORE_SFONDO = BarraVita.Parametri['Colore Sfondo'] || 'black'; BarraVita.COLORE_BARRA = BarraVita.Parametri['Colore Barra'] || 'red'; BarraVita.TESTO_VISIBILE = BarraVita.Parametri['Testo Visibile'].toLowerCase() === 'true'; BarraVita.TESTO_COLORE = BarraVita.Parametri['Testo Colore'] || 'white'; BarraVita.TESTO_DIMENSIONE = parseInt(BarraVita.Parametri['Testo Dimensione']) || 14; BarraVita.TESTO_SFONDO = BarraVita.Parametri['Testo Sfondo'] || 'black'; BarraVita.TESTO_X = parseInt(BarraVita.Parametri['Testo X']) || 0; BarraVita.TESTO_Y = parseInt(BarraVita.Parametri['Testo Y']) || 0; /** Gestore della barra di vita. @constructor */ BarraVita.Gestore = function() { this.initialize.apply(this, arguments); }; BarraVita.Gestore.prototype.constructor = BarraVita.Gestore; /** Inizializza il gestore della barra di vita. @param {number} x - La coordinata x della barra di vita. @param {number} y - La coordinata y della barra di vita. @param {number} valoreMassimo - Il valore massimo della barra di vita. */ BarraVita.Gestore.prototype.initialize = function(x, y, valoreMassimo) { this._x = x; this._y = y; this._valoreMassimo = valoreMassimo; this._valoreCorrente = valoreMassimo; this._immagineSfondo = new Sprite(new Bitmap(BarraVita.LARGHEZZA, BarraVita.ALTEZZA)); this._immagineBarra = new Sprite(new Bitmap(BarraVita.LARGHEZZA, BarraVita.ALTEZZA)); this._testoValore = new Sprite(new Bitmap(BarraVita.LARGHEZZA, BarraVita.ALTEZZA)); this._immagineSfondo.bitmap.fillAll(BarraVita.COLORE_SFONDO); this._immagineBarra.bitmap.fillAll(BarraVita.COLORE_BARRA); this._testoValore.bitmap.fontSize = BarraVita.TESTO_DIMENSIONE; this._testoValore.bitmap.fillAll(BarraVita.TESTO_SFONDO); this._testoValore.bitmap.drawText( this._valoreCorrente + '/' + this._valoreMassimo, BarraVita.TESTO_X, BarraVita.TESTO_Y, BarraVita.LARGHEZZA, BarraVita.ALTEZZA, this._velocitaTransizione = BarraVita.TRANSITION_SPEED; 'center' ); this._testoValore.visible = BarraVita.TESTO_VISIBILE; this._testoValore.bitmap.textColor = BarraVita.TESTO_COLORE; this._testoValore.x = this._x; this._testoValore = new PIXI.Text("0", { font: BarraVita.Parametri['Dimensione Font'], fill: BarraVita.Parametri['Colore Font'] }); this._testoValore.y = (BarraVita.ALTEZZA - this._testoValore.height) / 2; this._testoValore.anchor.x = 0.5; this._testoValore.anchor.y = 0.5; this._testoValore.visible = BarraVita.Parametri['Mostra Testo']; // Aggiungiamo gli elementi alla barra della vita this.addChild(this._sfondo); this.addChild(this._barra); this.addChild(this._testoValore); }; // Aggiornamento della barra della vita BarraVita.prototype.update = function (valore, valoreMax) { // Aggiornamento del valore visualizzato this._testoValore.text = valore + "/" + valoreMax; // Calcolo la percentuale attuale var percentuale = valore / valoreMax; // Aggiorno la larghezza della barra this._barra.width = BarraVita.LARGHEZZA * percentuale; // Cambio il colore della barra in base alla percentuale var coloreBarra = BarraVita.Parametri['Colore Barra']; if (percentuale < 0.3) { coloreBarra = BarraVita.Parametri['Colore Barra Critico']; } else if (percentuale < 0.6) { coloreBarra = BarraVita.Parametri['Colore Barra Medio']; } this._barra.tint = coloreBarra; // Aggiorno la posizione del testo se richiesto if (BarraVita.Parametri['Mostra Testo']) { this._testoValore.x = this._x + BarraVita.LARGHEZZA / 2; } }; // Esportiamo la classe BarraVita window.BarraVita = BarraVita; })(window); // Esportiamo la classe BarraVita if(typeof module !== 'undefined' && typeof module.exports !== 'undefined') { module.exports = BarraVita; } else { window.BarraVita = BarraVita; } })(); // Inizializziamo la barra della vita var barraVita = new BarraVita(); // Aggiungiamo la barra alla scena corrente SceneManager._scene.addChild(barraVita); // Eventi /** Aggiorna la barra della vita con il valore fornito. @param {number} valore - Il nuovo valore da mostrare. */ BarraVita.prototype.aggiornaValore = function(valore) { // Limitiamo il valore al range della barra della vita valore = valore.clamp(this._valoreMinimo, this._valoreMassimo); // Aggiorniamo la barra della vita this._barra.scale.x = valore / this._valoreMassimo; // Aggiorniamo il testo del valore this._testoValore.text = valore.toFixed(0) + "/" + this._valoreMassimo.toFixed(0); }; /** Nasconde la barra della vita. */ BarraVita.prototype.nascondi = function() { this.visible = false; }; /** Mostra la barra della vita. */ BarraVita.prototype.mostra = function() { this.visible = true; }; /** Imposta il valore minimo della barra della vita. @param {number} valore - Il nuovo valore minimo. */ BarraVita.prototype.impostaValoreMinimo = function(valore) { this._valoreMinimo = valore; }; /** Imposta il valore massimo della barra della vita. @param {number} valore - Il nuovo valore massimo. */ BarraVita.prototype.impostaValoreMassimo = function(valore) { this._valoreMassimo = valore; }; /** Imposta il colore di sfondo della barra della vita. @param {number} colore - Il nuovo colore di sfondo. */ BarraVita.prototype.impostaColoreSfondo = function(colore) { this._barraSfondo.tint = colore; }; /** Imposta il colore della barra della vita. @param {number} colore - Il nuovo colore della barra. */ BarraVita.prototype.impostaColoreBarra = function(colore) { this._barra.tint = colore; }; /** Imposta il font del testo del valore. @param {string} font - Il nuovo font del testo. */ BarraVita.prototype.impostaFontTesto = function(font) { this._testoValore.style.fontFamily = font; }; /** Imposta la dimensione del testo del valore. @param {number} dimensione - La nuova dimensione del testo. */ BarraVita.prototype.impostaDimensioneTesto = function(dimensione) { this._testoValore.style.fontSize = dimensione; }; /** Imposta il colore del testo del valore. @param {number} colore - Il nuovo colore del testo. */ BarraVita.prototype.impostaColoreTesto = function(colore) { this._testoValore.style.fill = colore; }; BarraVita.Parametri = PluginManager.parameters('BarraVita'); BarraVita.TRANSITION_SPEED = parseFloat(BarraVita.Parametri['Velocità transizione']) || 0.1; // Esportiamo la classe BarraVita window.BarraVita = BarraVita;Spero che questo diverrà il tuo nuovo preferito.
È completamente modificabile da editor, puoi modificare davvero qualsiasi cosa che riguarda l'indicatore di vita. Spero vi piaccia.
-
Ciao anche se in ritardo sto mantenendo la mia promessa. (dovevo imparare) anche se in questo caso specifico c'è più da interpretare.
Ecco qua: -occhio è parte dello script di IAVRA.Vorrei che il bonus sia letto in modo esplicito
questo poi va inserito al suo interno.
// Aggiungere una nuova opzione di menu "Equipaggiamento" // Nella classe Scene_Menu createCommandWindow: function() { this._commandWindow = new Window_MenuCommand(0, 0); this._commandWindow.setHandler('equipment', this.commandEquipment.bind(this)); // ... }, // Quando il giocatore seleziona l'opzione di menu "Equipaggiamento" // Nella classe Scene_Menu commandEquipment: function() { // Creare una finestra di lista per visualizzare gli oggetti equipaggiati dal giocatore this._equipmentWindow = new Window_EquipmentList(0, 0); this._equipmentWindow.setHandler('cancel', this.closeEquipment.bind(this)); this.addWindow(this._equipmentWindow); }, // Quando il giocatore seleziona un oggetto nell'elenco degli oggetti dell'equipaggiamento // Nella classe Window_EquipmentList onItemOk: function() { var item = this.item(); // Verificare se l'oggetto appartiene a un set di equipaggiamento var sets = IAVRA.SETS.setsForItem(item); if (sets.length > 0) { // Creare una finestra di dialogo per visualizzare il nome del set e i bonus forniti dal set var set = sets[0]; // Supponiamo che ogni oggetto appartenga a un solo set di equipaggiamento var bonus = set.applicableTraits($gameParty.leader()).map(function(trait) { return trait.name + " +" + trait.value; }).join(", "); var message = set.name + ": " + bonus; this._helpWindow.setText(message); } else { this._helpWindow.clear(); } }, // Chiudere la finestra degli oggetti dell'equipaggiamento // Nella classe Scene_Menu closeEquipment: function() { this._equipmentWindow.close(); this._commandWindow.activate(); },

Effetto Profondità Camminata (in stile Finale Fantasy 8)
in PLUGIN e Javascript
Posted
Wo calmatevi con le offese. E soprattutto con le vili illazioni. Tratto programmazione dapprima che inventassero il machine learning. Siete fastidiosi e maleducati. Una demo...la stavo preparando. Ma francamente non perderò più tempo dentro questo sito.