-
Posts
221 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Posts posted by Lomax_Iced
-
-
Ciao Lomax, trovo fantastici questi tuoi tutorial, ma vorrei farti una domanda...
In caso io ho una variabile, posso cambiare il suo valore in gioco? cioè con un call plugin o un call script?
Scusami! Mi era sfuggita questa..
Ti rispondo anche se è passato un sacco di tempo.
Sì, puoi modificare il valore di una variabile nel gioco utilizzando il comando "Controllo delle Variabili" in RPG Maker MV. Spiego così chi dovesse avere bisogno trova l'informazione che cerca:
Il controllo delle variabili può essere utilizzato in un evento e consente come dicevo di modificare
il valore di una variabile specifica.
Aggiungi un nuovo evento alla mappa del gioco.
Seleziona il comando controllo delle Variabili dal menu degli eventi.
Nella finestra di configurazione del comando, imposti:
Assegna se vuoi dare un valore alla variabile
Aritmetica mi pare fosse comunque l'altra opzione gli fai eseguire un'operazione matematica.
Selezioni il numero della variabile che desideri modificare.
E poi gli assegni o l'operatore logico se vuoi fargli eseguire un'operazione matematica oppure il valore.
Esempio:
Controllo delle Variabili: Assegna, 1, 5
Alla variabile 1 abbiamo assegnato il valore 5.Poi mano a mano che si studia bene il js poi sarete in grado voi stessi con un blocnotes
di:
(function() { // Crea un nuovo comando personalizzato "AssegnaVariabile" PluginManager.registerCommand('AssegnaVariabile', 'AssegnaValore', function(args) { // Ottieni il valore della variabile dal parametro del comando var idVariabile = parseInt(args.idVariabile); // Ottieni il valore da assegnare alla variabile dal parametro del comando var valore = parseInt(args.valore); // Assegna il nuovo valore alla variabile $gameVariables.setValue(idVariabile, valore); }); })();Per usarlo, aggiungi questa istruzione in un evento.Plugin Command: AssegnaVariabile AssegnaValore idVariabile 1 valore 10
Sostituisci "idVariabile" con il numero della variabile che desideri modificare e "valore" con il nuovo valore da assegnare alla variabile.Ultimo accorgimento e poi penso sia tutto:
Bada che il nome del comando personalizzato ("AssegnaVariabile") e il nome del parametro del comando ("AssegnaValore") devono corrispondere a quelli definiti nel plugin. Inoltre, i nomi dei parametri del comando ("idVariabile" e "valore") devono essere gli stessi utilizzati nel plugin.
-
Vorrei approfondire l'argomento se mi è concesso. Perché creare un hud è davvero semplice
cioè si può procedere in tre stili:
1. usi delle iconset cioè immagini esterne da printare a schermo.
2. disegni con il codice delle barre minimali direttamente sulla mappa, nulla di troppo complesso.
3. disegni le immagini più complesse come quelle raffigurate dalle iconset ma senza usare file esterni, disegni direttamente con il JavaScript.
Qui vi mostrerò solo i primi due stili, partendo appunto da:
STILE 1:
Creiamo un oggetto che conterrà al suo interno tutte le funzionalità che vorremmo attribuirgli:
(function() {
// Crea un nuovo sprite per la HUD function CustomHUD() {
this.initialize.apply(this, arguments);
};
CustomHUD.prototype = Object.create(Sprite.prototype); CustomHUD.prototype.constructor = CustomHUD; CustomHUD.prototype.initialize = function() {
Sprite.prototype.initialize.call(this); // Il resto del codice...
};
CustomHUD.prototype.update = function() {
Sprite.prototype.update.call(this); // Il resto del codice...
};
})();
Adesso dentro dobbiamo inserirgli le funzioni:
CustomHUD è una sottoclasse di Sprite, che è la classe madre che gestisce tutti gli sprite presenti in RPG Maker MV.
ATTENZIONE per i niubbi, Sprite non sono le immagini in sé.
Gli Sprite sono degli oggetti fatti apposta per ospitare le immagini, i bitmap.. i disegni. Le bitmap invece sono gli oggetti che ospitano le finestre. Poi c'è la tela ma vabbè non voglio andare fuori tema.
Ad ogni modo, questo concetto è molto utile se si vuole imparare a fare ste cose. :)
Comunque come prima funzione si crea lo strumento initialize che serve per annotare, elencare, ideare, creare tutti gli oggetti grafici (appunto Gli Sprite) che ospiteranno a loro interno
le icone, i font dei testi per identificare gli HP, gli MP, gli EXP da raggiungere e quelli mancanti e altro...
CustomHUD.prototype = Object.create(Sprite.prototype);
CustomHUD.prototype.constructor = CustomHUD;
CustomHUD.prototype.initialize = function() {
Sprite.prototype.initialize.call(this);
// Imposta il nome dell'eroe this._actorName = "";
// Imposta le icone per l'HP, MP e EXP
this._hpIcon = new Sprite(ImageManager.loadSystem("IconSet"));
this._hpIcon.setFrame(96, 0, 32, 32);
this._mpIcon = new Sprite(ImageManager.loadSystem("IconSet")); this._mpIcon.setFrame(128, 0, 32, 32);
this._expIcon = new Sprite(ImageManager.loadSystem("IconSet")); this._expIcon.setFrame(192, 32, 32, 32);
// Imposta i testi per l'HP, MP e EXP this._hpText = new Sprite(new Bitmap(100, 32));
this._mpText = new Sprite(new Bitmap(100, 32));
this._expText = new Sprite(new Bitmap(100, 32));
// Imposta la posizione dei vari elementi this._hpIcon.x = 0; this._hpIcon.y = 0;
this._mpIcon.x = 0;
this._mpIcon.y = 32; this._expIcon.x = 0;
this._expIcon.y = 64;
this._hpText.x = 32;
this._hpText.y = 0;
this._mpText.x = 32;
this._mpText.y = 32; this._expText.x = 32; this._expText.y = 64;
// Aggiungi tutti gli elementi alla HUD this.addChild(this._hpIcon); this.addChild(this._mpIcon); this.addChild(this._expIcon); this.addChild(this._hpText); this.addChild(this._mpText); this.addChild(this._expText);
// Aggiorna la HUD
this.update();
};
Dopo aver ideato gli oggetti (Sprite) e oggetti (bitmap) che ospiteranno le grafiche dell'Hud
Si gioca con loro in modo da sperimentare su di loro condizioni
cicli, altre funzioni di interazione.
Spiego meglio con un esempio:
Poniamo il caso che io creo l'oggetto acqua. Nel metodo inizialize si assegna appunto un valore di inizio associato a questo oggetto acqua. Neutralità...
Con il seguente strumento update invece ci sbizzarriamo e ci divertiamo con il giocare con gli oggetti ideati prima.
Ad esempio possiamo creare un oggetto concettuale acqua appunto che associamo ad un evento globale e facciamo in modo che ogni volta che l'eroe ha sete e beve, la barra della sete si ricarica.
ecc... Veramente in update potete divertirvi a sperimentare.
Adesso vi mostro però, tornando in tema cosa accade:
CustomHUD.prototype.update = function() {
Sprite.prototype.update.call(this);
// Ottieni l'eroe attivo
var actor = $gameParty.leader();
// Aggiorna il nome dell'eroe
if (this._actorName !== actor.name()) {
this._actorName = actor.name();
this._hpText.bitmap.drawText(actor.name(), 0, 0, 100, 32, "left");
}
// Aggiorna l'HP dell'eroe
this._hpText.bitmap.drawText(actor.hp + "/" + actor.mhp, 0, 0, 100, 32, "right");
// Aggiorna il MP dell'eroe
this._mpText.bitmap.drawText(actor.mp + "/" + actor.mmp, 0, 0, 100, 32, "right");
// Aggiorna l'EXP dell'eroe
this._expText.bitmap.drawText(actor.currentExp() + "/" + actor.nextRequiredExp(), 0, 0, 100, 32, "right");
};
La funzione $gameParty.leader(); della classe Sprite e richiamata qui all'occorrenza ci servirà per evidenziare l'eroe. Ossia l'oggetto leader appunto che il party segue e che sta in testa, occupa posizione 1.
Viene verificato se i suoi parametri iniziali sono attivi e se lo sono valuta se i parametri ad essi associati sono cambiare. Se lo sono esegue l'aggiornamento dei nuovi dati di gioco.
FINE STILE 1
STILE 2
QUESTO LO PREFERISCO.
0 immagini esterne, ma tutte le grafiche minimali vengono disegnate tramite codice JavaScript
Pensate sia difficile? No per niente e ora ve lo dimostro:
Stesso iter: vogliamo creare degli oggetti che rappresenteranno HP, MP, EXP, (esempio). E vogliamo che questi appaiano in alto da qualche parte in mappa.
Creiamo l'oggetto CustomHUD e dentro di esso il metodo inizialize:
function CustomHUD() {
this.initialize.apply(this, arguments);
}
function CustomHUD() {
this.initialize.apply(this, arguments);
}
CustomHUD.prototype = Object.create(Sprite.prototype);
CustomHUD.prototype.constructor = CustomHUD;
CustomHUD.prototype.initialize = function() {
Sprite.prototype.initialize.call(this);
this._hpBar = new Sprite(new Bitmap(200, 20));
this._hpBar.bitmap.fillRect(0, 0, 200, 20, '#ff0000');
this._hpBar.x = 10;
this._hpBar.y = 10;
this._mpBar = new Sprite(new Bitmap(200, 20));
this._mpBar.bitmap.fillRect(0, 0, 200, 20, '#0000ff');
this._mpBar.x = 10;
this._mpBar.y = 40;
this._expBar = new Sprite(new Bitmap(200, 20));
this._expBar.bitmap.fillRect(0, 0, 200, 20, '#00ff00');
this._expBar.x = 10;
this._expBar.y = 70;
this.addChild(this._hpBar);
this.addChild(this._mpBar);
this.addChild(this._expBar);
SceneManager._scene.addChild(this);
};
var customHud = new CustomHUD();
Tramite la classe bitmap abbiamo creato tre barre di colore differente proprio per differenziare i tre parametri.
Rosso = HP
Blu = MP
Verde = EXP
un classico.
Con questa prassi potrete crearne di altre. Tanto la tecnica è la stessa.
E poi in update inserite la ciccia.
E per ciccia intendo tipo questa:
CustomHUD.prototype.update = function() {
Sprite.prototype.update.call(this);
var actor = $gameParty.leader();
this._hpBar.scale.x = actor.hp / actor.mhp;
this._mpBar.scale.x = actor.mp / actor.mmp;
if (actor.currentExp() >= actor.nextLevelExp()) {
actor.levelUp();
this.refresh();
}
};
CustomHUD.prototype.refresh = function() {
var actor = $gameParty.leader();
this._expBar.scale.x = (actor.currentExp() - actor.currentLevelExp()) / (actor.nextLevelExp() - actor.currentLevelExp());
};
FINE STILE 2
Ora facciamo una reunion tanto per avere tutte le due possibilità a portata di ✋:
//=============================================================================
// CustomHud.js
//=============================================================================
/*:
* @author Massimo Bivona
* @plugindesc Custom HUD Plugin - Allows you to use icons or bitmap graphics for HP, MP, and EXP gauges on the map. Also includes options to customize position, size, transparency, and visibility. Use the plugin parameters to choose between iconset and bitmap graphics. Note that only one style can be used at a time.
*
* @param Use Iconset
* @desc Whether to use the iconset graphic for HP, MP, and EXP gauges. 1 for yes, 0 for no.
* @type number
* @min 0
* @max 1
* @default 1
*
* @param HP Icon Index
* @desc The index of the HP icon in the iconset graphic.
* @type number
* @min 0
* @default 162
* @parent Use Iconset
*
* @param MP Icon Index
* @desc The index of the MP icon in the iconset graphic.
* @type number
* @min 0
* @default 163
* @parent Use Iconset
*
* @param EXP Icon Index
* @desc The index of the EXP icon in the iconset graphic.
* @type number
* @min 0
* @default 164
* @parent Use Iconset
*
* @param HP X Position
* @desc The X position of the HP gauge on the map.
* @type number
* @default 0
* @min -9999
* @max 9999
*
* @param HP Y Position
* @desc The Y position of the HP gauge on the map.
* @type number
* @default 0
* @min -9999
* @max 9999
*
* @param MP X Position
* @desc The X position of the MP gauge on the map.
* @type number
* @default 0
* @min -9999
* @max 9999
*
* @param MP Y Position
* @desc The Y position of the MP gauge on the map.
* @type number
* @default 30
* @min -9999
* @max 9999
*
* @param EXP X Position
* @desc The X position of the EXP gauge on the map.
* @type number
* @default 0
* @min -9999
* @max 9999
*
* @param EXP Y Position
* @desc The Y position of the EXP gauge on the map.
* @type number
* @default 60
* @min -9999
* @max 9999
*
* @param Gauge Width
* @desc The width of the HP, MP, and EXP gauges.
* @type number
* @default 200
* @min 1
* @max 9999
*
* @param Gauge Height
* @desc The height of the HP, MP, and EXP gauges.
* @type number
* @default 20
* @min 1
* @max 9999
*
* @param Gauge Transparency
* @desc The transparency of the HP, MP, and EXP gauges. 0 is fully transparent, 255 is fully opaque.
* @type number
* @default 192
* @min 1
* @max 9999
*
* @param Hide Gauge with Key
* @desc The key that can be
* pressed to hide the HP, MP, and
* EXP gauges on the map. Leave
* blank to disable this feature.
* @type combo
* @option
* @default
* @help CustomHud.js
* This plugin allows you to use
* either iconset graphics or
* bitmap graphics to
* display the HP, MP, and EXP
* gauges on the map. You can
* customize the
* position, size, transparency, and
* visibility of these gauges using
* the plugin parameters.
*
* Plugin Command:
* ShowCustomHud # Displays the
* custom HUD on the map.
* HideCustomHud # Hides the
* custom HUD on the map.
*/
(function() {
// Get plugin parameters
var params = PluginManager.parameters('CustomHud');
var useIconset = Number(params['Use Iconset'] || 1);
var hpIconIndex = Number(params['HP Icon Index'] || 162);
var mpIconIndex = Number(params['MP Icon Index'] || 163);
var expIconIndex = Number(params['EXP Icon Index'] || 164);
var hpX = Number(params['HP X Position'] || 0);
var hpY = Number(params['HP Y Position'] || 0);
var mpX = Number(params['MP X Position'] || 0);
var mpY = Number(params['MP Y Position'] || 30);
var expX = Number(params['EXP X Position'] || 0);
var expY = Number(params['EXP Y Position'] || 60);
var gaugeWidth = Number(params['Gauge Width'] || 200);
var gaugeHeight = Number(params['Gauge Height'] || 20);
var gaugeTransparency = Number(params['Gauge Transparency'] || 192);
var hideKey = params['Hide Gauge with Key'] || '';
// Create CustomHUD class
function CustomHUD() {
this.initialize.apply(this, arguments);
};
// Set CustomHUD prototype
CustomHUD.prototype = Object.create(Sprite.prototype);
CustomHUD.prototype.constructor = CustomHUD;
// Initialize CustomHUD object
CustomHUD.prototype.initialize = function() {
Sprite.prototype.initialize.call(this);
// Create bitmap graphics for HP, MP, and EXP gauges
this._hpBitmap = new Bitmap(gaugeWidth, gaugeHeight);
this._mpBitmap = new Bitmap(gaugeWidth, gaugeHeight);
this._expBitmap = new Bitmap(gaugeWidth, gaugeHeight);
// Set HP gauge color to red
this._hpBitmap.fillRect(0, 0, gaugeWidth, gaugeHeight, '#ff0000');
// Set MP gauge color to blue
this._mpBitmap.fillRect(0, 0, gaugeWidth, gaugeHeight, '#0000ff');
// Set EXP gauge color to yellow
this._expBitmap.fillRect(0, 0, gaugeWidth, gaugeHeight, '#ffff00');
// Create sprites for HP, MP, and EXP gauges
if (useIconset) {
this._hpGauge = new Sprite(ImageManager.loadSystem('IconSet'));
this._mpGauge = new Sprite(ImageManager.loadSystem('IconSet'));
this._expGauge = new Sprite(ImageManager.loadSystem('IconSet'));
// Set icon index for HP gauge
this._hpGauge.setFrame(hpIconIndex % 16 * 32, Math.floor(hpIconIndex / 16) * 32, 32, 32);
// Set icon index for MP gauge
this._mp.Gauge.setFrame(mpIconIndex % 16 * 32, Math.floor(mpIconIndex / 16) * 32, 32, 32);
// Set icon index for EXP gauge
this._expGauge.setFrame(expIconIndex % 16 * 32, Math.floor(expIconIndex / 16) * 32, 32, 32);
// Set opacity for HP, MP, and EXP gauges
this._hpGauge.opacity = gaugeTransparency;
this._mpGauge.opacity = gaugeTransparency;
this._expGauge.opacity = gaugeTransparency;
} else {
this._hpGauge = new Sprite(this._hpBitmap);
this._mpGauge = new Sprite(this._mpBitmap);
this._expGauge = new Sprite(this._expBitmap);
// Set opacity for HP, MP, and EXP gauges
this._hpGauge.opacity = gaugeTransparency;
this._mpGauge.opacity = gaugeTransparency;
this._expGauge.opacity = gaugeTransparency;
}
// Set position for HP, MP, and EXP gauges
this._hpGauge.x = hpX;
this._hpGauge.y = hpY;
this._mpGauge.x = mpX;
this._mpGauge.y = mpY;
this._expGauge.x = expX;
this._expGauge.y = expY;
// Add HP, MP, and EXP gauges to CustomHUD object
this.addChild(this._hpGauge);
this.addChild(this._mpGauge);
this.addChild(this._expGauge);
// Set initial values for HP, MP, and EXP gauges
this._hp = $gameParty.leader().hp;
this._mp = $gameParty.leader().mp;
this._exp = $gameParty.leader().exp;
this._maxHp = $gameParty.leader().mhp;
this._maxMp = $gameParty.leader().mmp;
this._maxExp = $gameParty.leader().nextLevelExp();
// Update CustomHUD object
CustomHUD.prototype.update = function() {
Sprite.prototype.update.call(this);
// Update HP gauge
var hpRate = this._hp / this._maxHp;
this._hpBitmap.clearRect(0, 0, gaugeWidth, gaugeHeight);
this._hpBitmap.fillRect(0, 0, gaugeWidth * hpRate, gaugeHeight, '#ff0000');
// Update MP gauge
var mpRate = this._mp / this._maxMp;
this._mpBitmap.clearRect(0, 0, gaugeWidth, gaugeHeight);
this._mpBitmap.fillRect(0, 0, gaugeWidth * mpRate, gaugeHeight, '#0000ff');
// Update EXP gauge
var expRate = this._exp / this._maxExp;
this._expBitmap.clearRect(0, 0, gaugeWidth, gaugeHeight);
this._expBitmap.fillRect(0, 0, gaugeWidth * expRate, gaugeHeight, '#ffff00');
};
// Create CustomHUD object
var customHud = new CustomHUD();
// Add CustomHUD object to map scene
Scene_Map.prototype.createCustomHud = function() {
this.addChild(customHud);
};
// Call createCustomHud function when map scene is created
var _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Scene_Map.prototype.createAllWindows = function() {
_Scene_Map_createAllWindows.call(this);
this.createCustom;
// Add hideCustomHud function to map scene
Scene_Map.prototype.hideCustomHud = function() {
customHud.visible = false;
};
// Add showCustomHud function to map scene
Scene_Map.prototype.showCustomHud = function() {
customHud.visible = true;
};
// Add toggleCustomHud function to map scene
Scene_Map.prototype.toggleCustomHud = function() {
customHud.visible = !customHud.visible;
};
// Add updateCustomHud function to map scene
Scene_Map.prototype.updateCustomHud = function() {
customHud.update();
};
// Add hideCustomHud function to map scene
Scene_Map.prototype.hideCustomHud = function() {
customHud.visible = false;
};
// Add showCustomHud function to map scene
Scene_Map.prototype.showCustomHud = function() {
customHud.visible = true;
};
// Add toggleCustomHud function to map scene
Scene_Map.prototype.toggleCustomHud = function() {
customHud.visible = !customHud.visible;
};
// Add updateCustomHud function to map scene
Scene_Map.prototype.updateCustomHud = function() {
customHud.update();
};
// Add refreshCustomHud function to map scene
Scene_Map.prototype.refreshCustomHud = function() {
customHud.refresh();
};
// Call createCustomHud function and add customHud to update and refresh lists
var _Scene_Map_createSpriteset = Scene_Map.prototype.createSpriteset;
Scene_Map.prototype.createSpriteset = function() {
_Scene_Map_createSpriteset.call(this);
this.createCustomHud();
this._spriteset._updateCustomHudSprites.push(customHud);
this._spriteset._refreshCustomHudSprites.push(customHud);
};
// Add CustomHud to Spriteset_Map
var _Spriteset_Map_createUpperLayer = Spriteset_Map.prototype.createUpperLayer;
Spriteset_Map.prototype.createUpperLayer = function() {
_Spriteset_Map_createUpperLayer.call(this);
this.addChild(customHud);
};
// Add hideCustomHud function to Scene_Battle
Scene_Battle.prototype.hideCustomHud = function() {
customHud.visible = false;
};
// Add showCustomHud function to Scene_Battle
Scene_Battle.prototype.showCustomHud = function() {
customHud.visible = true;
};
// Add refreshCustomHud function to Scene_Battle
Scene_Battle.prototype.refreshCustomHud = function() {
customHud.refresh();
};
// Call createCustomHud function and add customHud to update and refresh lists
var _Scene_Battle_createSpriteset = Scene_Battle.prototype.createSpriteset;
Scene_Battle.prototype.createSpriteset = function() {
_Scene_Battle_createSpriteset.call(this);
this.createCustomHud();
this._spriteset._updateCustomHudSprites.push(customHud);
this._spriteset._refreshCustomHudSprites.push(customHud);
};
// Add CustomHud to Spriteset_Battle
var _Spriteset_Battle_createUpperLayer = Spriteset_Battle.prototype.createUpperLayer;
Spriteset_Battle.prototype.createUpperLayer = function() {
_Spriteset_Battle_createUpperLayer.call(this);
this.addChild(customHud);
};
})();
FINE.
Spero di aver risolto la richiesta e anche essere riuscito a spiegare qualche nozione di ciò che ho appreso analizzando gli script e le librerie di base del RPGMMV.
-
Scusami se sono in ritardo di qualche anno, ma ho la soluzione :
// Metodo di inizializzazione per il GabWindow function GabWindow() { this.initialize.apply(this, arguments); } GabWindow.prototype.initialize = function(x, y, width, height, color, text) { // Imposta le opzioni del GabWindow this._x = Number(x) || 0; this._y = Number(y) || 0; this._width = Number(width) || 400; this._height = Number(height) || 100; this._color = color || "white"; this._text = text || ""; // Inizializza le proprietà del GabWindow this._faceName = ""; this._faceIndex = 0; this._spriteName = ""; this._spriteIndex = 0; this._actorId = 0; this._endSwitchId = 0; // Crea l'elemento HTML del GabWindow this.createWindow(); // Aggiorna la posizione del GabWindow this.setPosition(this._x, this._y); }; // Metodo per impostare la posizione del GabWindow GabWindow.prototype.setPosition = function(x, y) { // Imposta le nuove coordinate del GabWindow this._x = Number(x) || 0; this._y = Number(y) || 0; // Aggiorna la posizione del GabWindow sullo schermo this.updatePlacement(); }; // Aggiungi i parametri editabili nell'editor di RPG Maker MV /*: * @param X * @text X Position * @desc The X position of the GabWindow. * @type number * @default 0 * * @param Y * @text Y Position * @desc The Y position of the GabWindow. * @type number * @default 0 * * @param Width * @text Width * @desc The width of the GabWindow. * @type number * @default 400 * * @param Height * @text Height * @desc The height of the GabWindow. * @type number * @default 100 * * @param Color * @text Color * @desc The color of the GabWindow background. * @type select * @option White * @value white * @option Blue * @value blue * @option Green * @value green * @default white * * @param Text * @text Text * @desc The initial text to display in the GabWindow. * @type note * @default "" */ // Funzione che legge i parametri editabili dall'editor di RPG Maker MV GabWindow.prototype.readParams = function(params) { this._x = Number(params["X"]) || 0; this._y = Number(params["Y"]) || 0; this._width = Number(params["Width"]) || 400; this._height = Number(params["Height"]) || 100; this._color = params["Color"] || "white"; this._text = params["Text"] || ""; }; -
QuestJournal.js
Ecco la risorsa:
// Definizione delle variabili e degli array necessari var activeQuests = []; // Array di missioni attive var completedQuests = []; // Array di missioni completate var failedQuests = []; // Array di missioni fallite // Funzione per aggiungere una missione attiva function addActiveQuest(questName, questDescription) { activeQuests.push({name: questName, description: questDescription, status: "in corso"}); }; // Funzione per aggiungere una missione completata function addCompletedQuest(questName, questDescription) { completedQuests.push({name: questName, description: questDescription, status: "completata"}); }; // Funzione per aggiungere una missione fallita function addFailedQuest(questName, questDescription) { failedQuests.push({name: questName, description: questDescription, status: "fallita"}); }; // Funzione per mostrare le missioni attive nell'interfaccia utente del Quest Journal function showActiveQuests() { for (var i = 0; i < activeQuests.length; i++) { console.log(activeQuests[i].name + " - " + activeQuests[i].description + " - " + activeQuests[i].status); } }; // Funzione per mostrare le missioni completate nell'interfaccia utente del Quest Journal function showCompletedQuests() { for (var i = 0; i < completedQuests.length; i++) { console.log(completedQuests[i].name + " - " + completedQuests[i].description + " - " + completedQuests[i].status); } }; // Funzione per mostrare le missioni fallite nell'interfaccia utente del Quest Journal function showFailedQuests() { for (var i = 0; i < failedQuests.length; i++) { console.log(failedQuests[i].name + " - " + failedQuests[i].description + " - " + failedQuests[i].status); } }; // Funzione per aggiornare lo stato di una missione function updateQuestStatus(questName, newStatus) { for (var i = 0; i < activeQuests.length; i++) { if (activeQuests[i].name === questName) { activeQuests[i].status = newStatus; break; } } }; -
Ti mostro come:
//crea il file BerserkMode.js e salvalo nella cartella ./js/plugins del tuo progetto var Imported = Imported || {}; Imported.Berserk_Mode = true; var Berserk_Mode = BerserkMode || {}; //creiamo una variabile che tenga traccia della % degli Hp del personaggio: var HPxCent = 0; //creiamo una variabile che tenga traccia del limite del danno massimo: var berserkLimit = 0.5; //calcoliamo la % di Hp del personaggio: function calcoloHPxCent() { HPxCent = this._hp / this.mhp; }; //gestiamo i danni del personaggio: Game_Actor.prototype.gainHp = function(value){ this.hp += value; if (this._hp > this.mhp){ this._hp = this.mhp; } calcoloHPxCent(); //verifichiamo se la % di HP sia inferiore al 25%: if (HPxCent <= 0.25){ //assegna lo stato Berserk: this.addState(berserkStateId); } }; // Game_Actor.prototype.loseHp = function(value){ this._hp -= value; if (this._hp < 0){ this._hp = 0; } calcoloHPxCent(); //verifichiamo se la % di HP sia inferiore al 25%: if (HPxCent <= 0.25){ //assegna lo stato Berserk: this.addState(berserkStateId); } }; //Rimozione Berserk: Game_Actor.prototype.removeBerserk = function(){ this.removeState(berserkStateId) //OPZIONALE: ripristina le statistiche originarie del Personaggio //this._atk = this._originalAtk; //this._def = this._originalDef; //this._spd = this._originalSpd; //ecc... };Spiegazione:
CI SONO 4 FUNZIONI PRINCIPALI nel Plugin che ti sto proponendo: 1.Determinare la % di hp del personaggio. 2.Gestire i danni che subisce. 3.Assegnargli lo status Berserk al raggiungimento di una certa %. 4.Rimuovere lo status terminata la battaglia. (OPZIONALE) 5.recupera le caratteristiche originali terminato lo status.
Adesso occorre recarsi in rpg_manager.js riga 2679.
In pratica occorre modificare questa parte di codice:
BattleManager.endBattle = function(result) { this._phase = 'battleEnd'; if (this._eventCallback) { this._eventCallback(result); } if (result === 0) { $gameSystem.onBattleWin(); } else if (this._escaped) { $gameSystem.onBattleEscape(); } };Ottenendo quest'altro risultato:
BattleManager.endBattle = function(result) { this._phase = 'battleEnd'; if (this._eventCallback) { this._eventCallback(result); } if (result === 0) { $gameSystem.onBattleWin(); } else if (this._escaped) { $gameSystem.onBattleEscape(); } this.allBattleMembers().forEach(function(battler) { battler.removeBerserk(); }, this); };Come vedi abbiamo aggiunto questa porzioncina di qua:
this.allBattleMembers().forEach(function(battler) { battler.removeBerserk(); }, this);
Demo.....ehm sono in una panchina al parco, adesso mi viene un po' complicato
però appena sarò a casa, se è necessario ne creerò una. Comunque spero di aver soddisfatto la richiesta.
Fammi sapere se va e se non va lo correggerò.
-
Darò un'occhiata anch'io una volta tornato a casa e toglierò quel manuale che in effetti è un pugno in un occhio, hai ragione, meglio farlo automatico.
-
Super! Ti ho risposto anche nell'altro topic sul QTE a proposito, ma prima di aver letto qui! Pardon!
Nulla di cui debba perdonarti. Hai fatto benissimo a correggere. Ti spiego scrivo tramite il Cell durante i tragitti, casa lavoro e viceversa, quindi il fatto è che non ho avuto modo di aprire né sublime e né Rpgmaker. Le funzioni sono compatibili lo so per certo, però hai ragione di quanto detto farò una demo.
Grazie mille anche a Ischenderun che mi fa notare ciò che mi dimentico. Darò un'impostazione più chiara anche per quell'aspetto.
-
Scusa, non voglio assolutamente offendere, anzi, ti dò di nuovo un parere: no, non è easy! xD
Se fosse un forum di professionisti dell'informatica andrebbe anche bene ma, a mio onesto e modesto parere, qui nelle sezioni di donazione scripts è buona norma presentarli con chiarezza e con una demo esempio allegata, perché la maggior parte degli utenti è composta non da programmatori ma da amatori (in fondo usano rpg maker, che ora, nulla togliere alle immense potenzialità, ma non è un caso se i dev usano ben altro).
Io per esempio JS lo capisco un pochino pochino, ma anche seguendo gli steps qui sopra non avrei la minima idea di dove mettere cosa, come e quando.
Crei una variabile. Dove? Cosa? In editor? oppure tutta sta cosa va creata su un foglio poi salvato js e importato?
Trovo che sia fantastico che tu sia volenteroso, credimi, ma perché non usare queste bellissime occasioni per creare pacchettini completi con DEMO allegate?
Avranno sicuramente molto più utilizzo che non delle risposte ad altri post che poi si perdono per forza di cose.
E mi scuso anche io per il necroposting, mi fustigo.
No hai fatto benissimo a correggermi. Anche perché ero intenzionato a risolvere quasi tutte le richieste irrisolte della sezione e lo avrei fatto con l'impostazione sbagliata.
Invece così so come è gradito e mi prodigherò rispettando le regole.
Per quanto riguarda l'obbrobrio che ho scritto lì, è stato fatto sulla metro con il cell, non ho avuto modo di aprire l'editor rpgmaker.
Ma fra poco ora vedo di fare qualche piccola demo, sia per il QTE ma anche per l'altra richiesta dell'utente che voleva uno script che gli dividesse la schermata in due screen distinti.
A sto punto faccio un post con annessa demo. Oppure sto pensando...hm...Spiego tutto nella demo (che idea originale gli americani lo fanno da sempre )
Per non fare doppi post cose voglio rispondere anche a @Ischenderun si hai ragione. nella mia testa era che ti ho fatto un esempio spiccio ma hai ragione perché avrei dovuto destinarlo al controllo generico di tutti i tasti attivi.
Ma dovevo scendere alla fermata.
A sto punto per evitare il necroposting vi chiedo è più gradito che io scriva qui? Oppure direttamente nella sezione plugin con un richiamo al post della richiesta tramite collegamento link? Credo che sia più pulita la seconda opzione. Farò così.
Ad ogni modo scusate il trambusto volevo fare bene ma come mio solito creo casini
-
Salve a tutti...
Come da titolo c'è uno script che funga da QTE plugin?
Lo so il topic è un po vecchiotto però volevo scrivere uno script al volo per le persone che passeranno di qui e magari ..bu voglio fare la mia parte.
Dunque richiesta interessante spiego subito,creare un quick time event è davvero molto semplice su RMMV
in pratica si procede così:
1. crei una variabile che ti serve per tracciare lo stato del QTE
let qteActive = false;
2. crei la funzione apposita che ha il compito di avviarla:
function inizioQTE() { qteActive = true; }da qui in poi vi potete sbizzarrire, dentro gli potete implementare un sacco di funzioni
esempio:
function inizioQTE() { qteActive = true; //le mettiamo un timer: setTimeout(fineQTE, 5000); //è settato a 5 secondi }3.creiamo qualcosa che si occupa di gestire l'input:
function handlerQTEInput(key) { if (!qteActive) { return; } //verifica del tasto if (key === 'A') { fineQTE(true); }else{ fineQTE(false); } }4.creiamo una funzione che gestisce l'esito di fine QTE
function fineQTE(successo){ qteActive = false; if (successo){ //è andato a buon fine alert("QTE COMPLETATO!"); }else{ alert("QTE FALLITO!"); } }RIEPILOGO:
3 funzioni principali - inizioQTE si occupa di startare; hendlerQTEInput se l'azione è stata eseguita bene; fineQTE(successo) che si occupa dell'esito.
Come lo usi?
evochi inizioQTE() attivare la cosa; e poi con lui hendlerQTEInput(key) giochi.
Infine per controllare se il giocatore sta premendo correttamente il tasto richiami la funzione hendlerQTEInput.
easy no?!
-
ah ottimo grazie

-
Avete ragione. Provvedo. Aggiorno il primo post e faccio un lavoro certosino.
-
Tanto tempo fa avevo chiesto come si potesse creare un oggetto di gioco che fungesse da Diario, ove il quale il giocatore avesse la possibilità oltreché di salvare i propri progressi, anche quella di annotare le proprie considerazioni. in più ho deciso adesso di conferire allo script la possibilità di poter caricare la partita anche da lì, implementando la funzionalità load.
vi spiego un pò, è facile:Metodo Initialize:
// buttiamo giù un'idea dell'oggetto Scene_Diario con dentro le voci: pagina, maxNumPag e inserimento Scene_Diario.prototype.initialize = function(){ Scene_MenuBase.prototype.initialize.call(this); this._pagina = 0; //la singola pagina in cui ci si trova this._mxNumPag = 0; //il numero massimo di pagine this._inserimento = false; //la facoltà di poter inserire le annotazioni. };Metodo Create:
//Qua creeremo la sezione destinata al Diario & quella per immettere l'input. Scene_Diario.prototype.create = function() { Scene_MenuBase.prototype.create.call(this); this.creaFinestraDiario(); this.creaFinestraInput(); this.refreshDiario(); };Metodo creaFinestraDiario:
//tutto ciò che riguarderà questa sezione: Scene_Diario.prototype.creaFinestraDiario = function() { this._finestraDiario = new Finestra_Diario(); this._finestraDiario.setHandler('cancel', this.popScene.bind(this)); this._finestraDiario.setHandler('pagedown', this.nextPage.bind(this)); this._finestraDiario.setHandler('pageup', this.prevPage.bind(this)); this.addWindow(this._finestraDiario); };Metodo creaFinestraInput:
//tutto ciò che lo riguarda: Scene_Diario.prototype.creaFinestraInput = function() { this._finestraInput = new FinestraDiarioInput(); this._finestraInput.setHandler('ok', this.onInputOk.bind(this)); //conferma input this._finestraInput.setHandler('cancel', this.onInputCancel.bind(this)); // annulla input this.addWindow(this._finestraInput); this._finestraInput.hide(); };Adesso dato che ho desiderio che sia un Diario destinato anche ad essere oggetto per il salvataggio dei progressi di gioco, implementiamo il Metodo corrispettivo, ovvero il Save.
Metodo Save:
//richiamiamo la funzione salvataggio e specifichiamo che la stiamo implementando dentro Scene_Diario Scene_Diario.prototype.save = function() { DataManager.saveGame(1); //salva il gioco nello slot numero 1 this.popScene(); //ritorna alla scena precedente };Ultima chicca fresca fresca... Ho deciso di poter far avere al giocatore la possibilità di poter caricare un altro salvataggio
utilizzando lo strumento Diario. Per farlo, anche in questo caso, si implementa il metodo corrispondente, ovvero Load.
Metodo Load:
//Anche in questo caso richiamiamo e avvisiamo che lo stiamo implementando in Scene_Diario. Scene_Diario.prototype.load = function() { DataManager.loadGame(1); //carica il gioco dal file di salvataggio numero 1. this.popScene(); //torna alla scena precedente. //dopo avere attivato il comando load, si accingerà a caricare la partita selezionata e.. SceneManager.goto(Scene_Map); //va alla mappa corrispondente a quel salvataggio. };Risorsa assembrata:
//specifica che la classe Scene_Diario è figlia di Scene_MenuBase function Scene_Diario() { this.initialize.apply(this, arguments); } Scene_Diario.prototype = Object.create(Scene_MenuBase.prototype); Scene_Diario.prototype.constructor = Scene_Diario; //Progetta la scena: Scene_Diario.prototype.initialize = function() { Scene_MenuBase.prototype.initialize.call(this); this._pagina = 0; this._maxNumPag = 0; this._inserimento = false; }; //Organizza la scena: Scene_Diario.prototype.create = function() { Scene_MenuBase.prototype.create.call(this); this.creaFinestraDiario(); //sezione in cui leggeremo le nostre annotazioni this.creaFinestraInput(); //sezione dove digiteremo i nostri pensieri,intuizioni. this.creaFinestraCmd(); //sezione in cui ci saranno i comandi di salvataggio/carica partita this.refreshDiario(); //pulisce tutte cose }; //...........creiamo quelle sezioni in organizza scena uno ad uno........ //Finestra Diario: Scene_Diario.prototype.creaFinestraDiario = function() { this._finestraDiario = new Finestra_Diario(); this._finestraDiario.setHandler('cancel', this.popScene.bind(this)); this._finestraDiario.setHandler('pagedown', this.nextPage.bind(this)); this._finestraDiario.setHandler('pageup', this.prevPage.bind(this)); this.addWindow(this._finestraDiario); }; //Finestra Input: Scene_Diario.prototype.creaFinestraInput = function() { this._finestraInput = new FinestraDiarioInput(); this._finestraInput.setHandler('ok', this.onInputOk.bind(this)); //conferma input this._finestraInput.setHandler('cancel', this.onInputCancel.bind(this)); // annulla input this.addWindow(this._finestraInput); this._finestraInput.hide(); }; //Finestra Comandi Save/Load: Scene_Diario.prototype.creaFinestraCmd = function() { this.finestraCmd.setHandler('save',this.save.bind(this)); this.finestraCmd.setHandler('load',this.load.bind(this)); this.finestraCmd.setHandler('cancel',this.popScene.bind(this)); this.addWindow(this._creaFinestraCmd); }; //Pulisci tutto: Scene_Diario.prototype.refreshDiario = function() { this._pagina = 0; this._maxNumPag = Math.ceil($gameSystem.diario.length / this.finestraDiario.maxLines()); this.finestraDiario.refresh(); };
Ora...we..tutto molto bello tecnico freddo calcolato come piace a noi programmatori..MA!
Anche l'occhio vuole la sua parte, pertanto lo rendiamo personalizzabile anche graficamente? avanti dai su
Bisogna recarci nella sezione create o come piace definirla a me 'organizza scena' e una volta lì aggiungere l'implementazione.
//tra la stringa Scene_MenuBase.prototype.create.call(this); //Inserite queste istruzioni: this.creaSfondo(); this.creaCornice(); //e la stringa this.creaFinestraDiario(); //sezione in cui leggeremo le nostre annotazioniUna volta chiamate le due funzioni, occorre definirne i due Metodi.
Metodo creaSfondo://creiamo la possibilità di inserire un immagine in Background: Scene_Diario.prototype.creaSfondo = function() { this._sfondo = new Sprite(); this._sfondo.bitmap = ImageManager.loadSystem('img/system/SfondoDiario.png'); this.addChild(this._sfondo); };Metodo creaCornice:
//creiamo la possibilità di inserire un immagine in Foreground: Scene_Diario.prototype.creaCornice = function() { this._cornice = new Sprite(); this._cornice.bitmap = ImageManager.loadSystem('img/system/CorniceDiario.png'); this.addChild(this._cornice); };Adesso che abbiamo assegnato lo sfondo e la cornice a tutta la scena Diario, perché non assegnare anche uno sfondo e una cornice alle singole finestre che compongono la scena. Lo facciamo? ..e famo!

Rechiamoci in FInestra DIario:
Scene_Diario.prototype.creaFinestraDiario = function() { this._finestraDiario = new Finestra_Diario(); this._finestraDiario.setBackgrounImage('img/system/sfondoFinestraDiario.png'); this._finestraDiario.setForegrounImage('img/system/corniceFinestraDiario.png'); this._finestraDiario.setHandler('cancel', this.popScene.bind(this)); this._finestraDiario.setHandler('pagedown', this.nextPage.bind(this)); this._finestraDiario.setHandler('pageup', this.prevPage.bind(this)); this.addWindow(this._finestraDiario); };Rimaniamo in FInestra Diario. Poiché che ne dite se assegnassimo delle immagini che rappresentano i tre tasti lì hm?
Scene_Diario.prototype.creaFinestraDiario = function() { this._finestraDiario = new Finestra_Diario(); this._finestraDiario.setBackgrounImage('img/system/sfondoFinestraDiario.png'); this._finestraDiario.setForegrounImage('img/system/corniceFinestraDiario.png'); this._finestraDiario.setHandler('cancel', this.popScene.bind(this)); this._finestraDiario.setCancelItemImage('cancel', 'img/system/IconaCancel.png'); this._finestraDiario.setHandler('pagedown', this.nextPage.bind(this)); this._finestraDiario.setPagedownItemImage('pagedown', 'img/system/IconaPagedown.png'); this._finestraDiario.setHandler('pageup', this.prevPage.bind(this)); this._finestraDiario.setPageupItemImage('pageup', 'img/system/IconaPageup.png'); this.addWindow(this._finestraDiario); };
Rechiamoci in FInestra Input:Scene_Diario.prototype.creaFinestraInput = function() { this._finestraInput = new FinestraDiarioInput(); this._finestraInput.setBackgrounImage('img/system/sfondoFinestraInput.png'); this._finestraInput.setForegrounImage('img/system/corniceFinestraInput.png'); this._finestraInput.setHandler('ok', this.onInputOk.bind(this)); //conferma input this._finestraInput.setOkItemImage('ok', 'img/system/IconaOk.png'); this._finestraInput.setHandler('cancel', this.onInputCancel.bind(this)); // annulla input this._finestraInput.setCancelItemImage('cancel', 'img/system/IconaCancel.png'); this.addWindow(this._finestraInput); this._finestraInput.hide(); };Rechiamoci in Finestra Comandi Save/Load:
Scene_Diario.prototype.creaFinestraCmd = function() { this._finestraCmd = new FinestraCmd(); this._finestraCmd.setBackgrounImage('img/system/sfondoFinestraCmd.png'); this._finestraCmd.setForegrounImage('img/system/corniceFinestraCmd.png'); this.finestraCmd.setHandler('save',this.save.bind(this)); this._finestraCmd.setSaveItemImage('save', 'img/system/IconaSave.png'); this.finestraCmd.setHandler('load',this.load.bind(this)); this._finestraCmd.setLoadItemImage('load', 'img/system/IconaLoad.png'); this.finestraCmd.setHandler('cancel',this.popScene.bind(this)); this._finestraCmd.setCancelItemImage('cancel', 'img/system/IconaCancel.png'); this.addWindow(this._creaFinestraCmd); };Per quanto riguarda la grafica rimarrebbe soltanto creare un'animazzioncina inerente il rendere i tasti dinamici e soprattutto mi piace l'idea che il Diario venisse sfogliato, quindi ci sia questa animazione. Ho un po di sonno adesso, però mi piace l'idea e la completerò in giornata stessa. Ho solo un po di sonnolenza e non vorrei fare errori stupidi.
Un'altra cosa che potrebbe essere carina è inserire all'interno della nostra scena Diario degli elementi sonori e
fondamentalmente si fa così:Rechiamoci in organizza Scena:
Scene_Diario.prototype.create = function() { Scene_MenuBase.prototype.create.call(this); this.creaSfondo(); //assegna immagine sfondo Diario this.creaCornice(); //assegna immagine cornice Diario this.creaFinestraDiario(); //sezione in cui leggeremo le nostre annotazioni this.creaFinestraInput(); //sezione dove digiteremo i nostri pensieri,intuizioni. this.creaFinestraCmd(); //sezione in cui ci saranno i comandi di salvataggio/carica partita this.refreshDiario(); //pulisce tutte cose this.playBgm(); //riproduce musica di sottofondo this.playBgs(); //riproduce suoni di sottofondo this.playMe(); //riproduce effetti musicali this.playSe(); //riproduce effetti sonori };Adesso dobbiamo implementare i metodi che ci serviranno per riprodurre i file audio.
Quindi iniziamo con il definire il Metodo playBGM://musica di sottofondo: Scene_Diario.prototype.playBgm = function() { AudioManager.playBgm({ name: 'Diario_Bgm', volume: 90, pitch: 100, pan: 0, src: 'audio/bgm/Diario_Bgm.mp3' }); };Metodo playBGS:
//suono di sottofondo: Scene_Diario.prototype.playBgs = function() { AudioManager.playBgs({ name: 'Diario_Bgs', volume: 90, pitch: 100, pan: 0, src: 'audio/bgs/Diario_Bgs.mp3' }); };Metodo playMe:
//effetti musicali: Scene_Diario.prototype.playMe = function() { AudioManager.playMe({ name: 'Diario_Me', volume: 90, pitch: 100, pan: 0, src: 'audio/me/Diario_Me.mp3' }); };Metodo playSe:
//effetti sonori: Scene_Diario.prototype.playSe = function() { AudioManager.playSe({ name: 'Diario_Se', volume: 90, pitch: 100, pan: 0, src: 'audio/se/Diario_Se.mp3' }); };per il momento mi fermo qua. ma in giornata implementerò le animazioni dei tasti.

-
Per creare uno script che sincronizzi l'ora di gioco con l'ora del mondo reale in RPG Maker MV, dovrai utilizzare l'oggetto JavaScript "Date" per ottenere l'ora corrente e quindi aggiornare l'orologio di gioco di conseguenza.
Ecco un esempio di come potresti creare uno script che sincronizzi l'ora del gioco con l'ora del mondo reale in RPG Maker MV:
// Get the current real-world timevar currentTime = new Date();// Get the current hour, minute, and second from the real-world timevar hour = currentTime.getHours();var minute = currentTime.getMinutes();var second = currentTime.getSeconds();// Set the in-game clock to the current real-world time$gameSystem.setRealTime(hour, minute, second);
Questo script ottiene l'ora corrente del mondo reale utilizzando l'oggetto JavaScript "Date", quindi estrae l'ora, i minuti e i secondi dall'ora. Quindi imposta l'orologio di gioco sull'ora reale corrente utilizzando la funzione "setRealTime" dallo script "game_system.js".Puoi quindi chiamare questo script a intervalli regolari (ad esempio ogni minuto) per mantenere l'ora del gioco sincronizzata con l'ora del mondo reale.
Spero che possa esservi di aiuto. Buon Anno 😁
-
Si ovvio l'Inglese è pur sempre l'inglese ... però se ad esempio qualcuno non lo conosce bene e preferisce usarlo nella propria lingua madre, oppure io ho pensato ai miei amici russi che hanno tutto un altro tipo di alfabeto, sono un po' penalizzati. Beh, con questo metodo si può ovviare al problema.
Poi tal altro ho potuto constatare che non occorre nemmeno perderci troppo tempo nel tradurre i file.csv, perché ho dato in pasto tutti i loro contenuti a google traslate di cui ha tradotto i testi senza intaccare le istanze e quindi le traduzioni sono avvenute in modo abbastanza celere. -
Salve gente. Eccomi approdato in questa sezione ancora giovine. Ma sono sicuro che presto si riempirà di mirabolanti contenuti interessanti.
Domandine:
Come vi state trovando con l'MZ?
Avete già usato il tool Effekseer per creare nuove animazioni particellari?
Ancora non l'ho usato affondo, però ho già notato una pecca..non è in lingua italiana. (o francese; spagnola; tedesca; ecc..)
Non disperate! La soluzione c'è e la potrete trovare in questo video:
https://youtu.be/QlKqt07qMxk
Ho Realizzato un tutorial che spiega appunto come implementare la lingua italiana (o qualsivoglia idioma voi vorreste).
Facciamo così: la procedura ve la spiego io... la traduzione l'affido a voi .
Scherzi a parte spero che possa tornarvi utile. Ciaoo
MODIFICA:
ECCO LA RISORSA TOTALMENTE TRADOTTA IN ITALIANO
https://www.mediafire.com/file/ow55m82dt1sr6cn/Effekseer161eWin.7z/file
Nel video ho dimenticato di dirvi che per switchare fra una lingua e l'altra, avviando il programma, occorrerà recarvi alla voce Window; poi selezionare la voce Options ed infine è facile alla voce Language selezionare l'opzione apposita. La modifica subentrerà riavviando il programma.
Adesso è proprio tutto tutto :) -
Nuovo topic, nuovo format. Così con 0 preavviso e così puff dal nulla.
Riprendendo un po' il programma della Slim Dogs ma riproponendolo in chiave nostrana..
Io quest'oggi voglio sapere COME..?! Come 'bip' hanno fatto a realizzare WILD ARMS per playstation 1?!
PRESENTAZIONE:
Io sono Massimo Bivona anche conosciuto come Lomax_Iced è in questo spazio web mi piacerebbe parlare dei videogiochi che più mi piacciono.
Ma nello specifico vorrei condividere con voi i miei studi riguardante il COME sono state realizzate certe scene (ossia momenti di gioco) e cercare di imparare insieme a riprorle.
Ultimamente ho messo un po da parte il javascrit perché avevo nostalgia del buon vecchio ruby e del mio primo Rpg Maker (rmxp appunto) e questo solo per darvi la motivazione del perché ho deciso di rispolverare l'rgss. Fatti i convenevoli.. che ne dite? Iniziamo? :)
EPISODIO PILOTA:...WILD ARMS.
[video=https://www.youtube.com/XE6_bF-b87o]
Analizziamo un po' questa sequenza di Scene:
Badate da qui in avanti le potrei chiamare anche Momenti.
Momento1 -> show loghi
Momento2 -> show video opening
Momento3 -> show Nodo (se premete start vi rimanda al suo Scene_Title, se invece lasciate che il BGM si concluda vi rimanda allo Scene_Prologo)
Momento4b -> show Prologo.
Momento4a -> show Scene_Title (load - New Game - Memory Card)
Momento5a -> load
Momento5c -> show Scene_Memory Card
Momento5b -> Show Scena scelta personaggio con cui iniziare
Per il momento soffermiamoci a questi e proviamo a realizzare questa successione di momenti, partendo dal primo:
MOMENTO1 #LOGHI:
Esistono 2 modi per poter realizzare uno Scene_Loghi.
IL PRIMO -> Lo chiamerò 'metodo Easy' ovvero realizzare una scena che piloti un vettore che mostra a video una serie di immagini, tante quanto lo sono i loghi da mostrare.
METODO_EASY:
1. Creiamo la struttura vuota di una scena avviabile:
module IMP #IMPOSTAZIONI end class Show_Loghi def main loop do Graphics.update update if $scene != self break end Graphics.transition end Graphics.freeze end endOcchio è opportuno che abbiate un po' di infarinatura con la programmazione, ad ogni modo proverò ad accennare qualcosa ma è meglio che approfondiate i concetti base in altro modo.
Comunque qui in questo forum ci sono ottimi tutorial da spulciare. Torniamo a noi..
Creata la struttura convenzionale di una scena, adesso armiamola di variabili e costanti:
module IMP #IMPOSTAZIONI FRAMES = 3 #DUE IMMAGINI end class Momento1 #Show Loghi def main #carichiamo le variabili globali di sistema ci faranno comodo. $data_system = load_data("Data/System.rxdata") $game_system = Game_System.new @index = 1 @counter = 0 #creiamo lo strumento show_Loghi show_loghi("logo",100) end # costruiamo il metodo show_loghi def show_loghi(nome, frames) @nome = nome @frames = frames @sprite = Sprite.new loop do Graphics.update @counter += 1 # adesso definiamo il cuore del nostro script if @counter == @frames @counter = 0 @frames += 1 if @index == IMP::FRAMES #ossia l'equivalente di 2 immagini. @sprite.bitmap.dispose @sprite.dispose $scene = Momento2.new("opening", 132, 0, 0, 0, 0) end end if $scene != self break end @sprite.bitmap = RPG::Cache.title(@name + @index.to_s) Graphics.transition end Graphics.freeze end endIn giro troverete degli script strutturati in maniera simile, daltronde sono gli stessi da cui ho imparato a fare questa cosa.
Però il mio è diverso, ha annesso un diPiù, ossia ho implementato dentro di esso il modulo IMPOSTAZIONI così da poter modificare i parametri in modo più easy.
Ora questo metodo per usarlo al meglio potete fare in modo che invece di realizzare 1frame a logo. Provate a generare una serie di frames a logo. Esempio 5 frames dedichate a logo1, altre 5 dedicate al logo successivo e così via, in questo modo si greano delle gift e il risultato verrebbe più bello, che il mostrare le singole immagini statiche. Non serve modificare lo script per una cosa del genere, basta solo mettere le immagini ordinate in sequenza.
METODO PRO:
adottare sempre la filosofia del frame to frame però questa volta pre-registrando una piccola clip.avi e farla eseguire dal programma.
Vediamo come:
class Momento1 #Show Clip.avi def initialize(movie,length,x,y,x2,y2) @readini = Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l' @movie_name = Dir.getwd()+"\\Video\\"+movie+".avi" @counter = length end def main game_name = "\0" * 256 @readini.call('Game','Title','',game_name,255,".\\Game.ini") game_name.delete!("\0") Graphics.transition @wnd = Win32API.new('user32','FindWindowEx','%w(l,l,p,p)','L') @temp = @wnd.call(0,0,nil,game_name).to_s @movie = Win32API.new('winmm','mciSendString','%w(p,p,l,l)','V') @movie.call("open \""+@movie_name+"\" alias FILE style 1073741824 parent " + @temp.to_s,0,0,0) @message = Win32API.new('user32','SendMessage','%w(l,l,l,l)','V') @detector = Win32API.new('user32','GetSystemMetrics','%w(l)','L') @width = @detector.call(0) if @width sleep(1) Graphics.update sleep(1) Graphics.update sleep(1) end @movie.call("play FILE", 0,0,0) loop do sleep(1) @message.call(@temp.to_i,11,0,0) Graphics.update @message.call(@temp.to_i,11,1,0) Input.update if Input.trigger?(Input::C) @movie.call("close FILE",0,0,0) break end @counter = @counter - 1 if @counter <= 0 break end end @movie.call("close FILE",0,0,0) $scene = Momento2.new Graphics.freeze end endIn questo modo lo script richiamerà le api del sistema operativo, creerà un player che assumerà le grandezze del vostro Game.ini ed eseguirà la piccola clip. Volendo si potrebbe unire
Momento1 con Momento2 ossia permettendo a questo script di gestire oltre che al mostra loghi anche la scena successiva in cui viene mostrato il video di opening, sigla iniziale del gioco.
basta un po di ingegno e fantasia. Ad ogni modo i due metodi sono entrambi validi per adempiere a tale scopo. Volendo ancora possiamo unire i due script in modo che possiate avere la possibilità di scelta e poter switchare fra il preferire il metodo easy o sbrigativo. A voi la decisione qual'è meglio. :)
Passiamo ora al Momento3 o Scena_PushBottonStart è mediamente semplice da realizzare. Perché con molta onestà ho dimenticato come impostare la condizione che decida che quando il brano conclude il tempo di esecuzione e viene sentito tutto nella sua interezza poi in automatico l'eseguibile convoca il momento prologo. Beh questo ancora non mi è noto ANZI se avete idee sono bene accolte :)
Per quanto riguarda invece creare una scena semplice di premi start in stile retrò, toh:
# ** Scene_Title #------------------------------------------------------------------------------ # This class performs title screen processing. #============================================================================== module IN IM = true PSB = "" #PUSH START BOTTON TF = false #Transizione finestra OPF = 160 #Opacità Finestra WF = 192 #Larghezza Finestra AF = 2 #Allineamento orizzontale Finestra PXF = 0 #Posizione X Finestra VAF = 0 #Allineamento Verticale Finestra PYF = 288 #Posizione Y Finestra PSB = ["psbOFF","psbON"] #Tasto PSB nonselezionato/selezionato PX = 0 #Posixione X tasto s1 PY = 0 #Posizione Y tasto s1 BT = 0 #BLEND_TYPE end class Scene_Node < Scene_Title #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main $data_common_events = load_data("Data/CommonEvents.rxdata") $data_system = load_data("Data/System.rxdata") # Make system object $game_system = Game_System.new $game_animaPictures = Game_AnimPicture # Make title graphic @background = Sprite.new @background.bitmap = RPG::Cache.title("WATitle") @background.x = 0 @background.y = 0 # Make a Font: Font.default_name = "Filgaia" # Make a FontSize Font.default_size = 28 # Make command window s1 = "PUSH START BUTTON" w = IN::WF @command_window = Window_CommandNode.new(192, [s1]) if IT::TF @command_window.opacity = 0 else @command_window.back_opacity = IT::OPF end case IN::AF when 0 @command_window.x = IN::PXF when 1 @command_window.x = 0 when 2 @command_window.x = (640 - @command_window.width ) / 2 when 3 @command_window.x = 640 - @command_window.width end case IT::VAF when 0 @command_window.y = IN::PYF when 1 @command_window.y = 0 when 2 @command_window.y = (480 - @command_window.height ) / 2 when 3 @command_window.y = 480 - @command_window.height end if IN::IM @command_window.visible = false #LOAD #s1 nonselezionato @command_img1 = Sprite.new @command_img1.blend_type = IT::BT @command_img1.bitmap = RPG::Cache.title(IN::PSB[0]) @command_img1.x = IN::PX @command_img1.y = IN::PY end # Play title BGM Audio.bgm_play("Audio/BGM/ms",100,100) # Stop playing ME and BGS Audio.me_stop Audio.bgs_stop # Execute transition Graphics.transition # Main loop loop do @command_img1.bitmap = RPG::Cache.title(IN::PSB[1]) # Update game screen Graphics.update # Update input information Input.update # Frame update update # Abort loop if screen is changed if $scene != self break end end # Prepare for transition Graphics.freeze # Dispose of command window @command_img1.dispose @command_window.dispose # Dispose of node graphic @background.bitmap.dispose end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # If C button was pressed if Input.trigger?(Input::C) command_push_start_botton end if ! Input.trigger?(Input::C) antefatto end end #-------------------------------------------------------------------------- # * Command: Push Start Botton #-------------------------------------------------------------------------- def command_push_start_botton # Play decision SE Audio.se_play("Audio/SE/OkOp",100,100) # Stop BGM Audio.bgm_stop # Reset frame count for measuring play time Graphics.frame_count = 0 # Make each type of game object $game_temp = Game_Temp.new $game_system = Game_System.new =begin $game_switches = Game_Switches.new $game_variables = Game_Variables.new $game_self_switches = Game_SelfSwitches.new $game_screen = Game_Screen.new $game_actors = Game_Actors.new $game_party = Game_Party.new $game_troop = Game_Troop.new $game_map = Game_Map.new $game_player = Game_Player.new =end # Dispose of title graphic @command_img1.dispose @background.bitmap.dispose # Switch to title screen $scene = Scene_Start.new end def antefatto # Ferma BGM Audio.bgm_stop # Riproduci BGS #Audio.bgs_play("Audio/BGS/",100,100) # Resetta il frame count (serve per calcolare il tempo di gioco) Graphics.frame_count = 0 # Crea gli oggetti $game_temp = Game_Temp.new $game_system = Game_System.new $game_switches = Game_Switches.new $game_variables = Game_Variables.new $game_self_switches = Game_SelfSwitches.new $game_screen = Game_Screen.new $game_actors = Game_Actors.new $game_party = Game_Party.new $game_troop = Game_Troop.new $game_map = Game_Map.new $game_player = Game_Player.new # Imposta il party iniziale $game_party.setup_starting_members # Imposta la mappa iniziale $game_map.setup($data_system.start_map_id) # Coordinate iniziali $game_player.moveto($data_system.start_x, $data_system.start_y) # Refresh del giocatore $game_player.refresh # Riproduce i BGM e BGS propri di quella mappa $game_map.autoplay # Aggiorna mappa (per gli eventi in parallelo) $game_map.update # Vai alla Scene_Map $scene = Scene_Map.new end endAttualmente vi anticipo che questo script vi darà errore alla riga 20, questo perché le mie prove sul renderlo esattamente come quello di wild arms sono ancora work in progress.
Però se si preme il tasto invio si accede al momento successivo ossia lo Scene_Title (ossia il menu composto dai tasti LOAD - NEW GAME - MEMORYCARD).
Momento4a
Questo scene_title è composto dal tasto load se esiste una partita salvata; poi il tasto New Game; e infine il tasto memorycard che noi dato che non abbiamo, ho immaginato che quella potesse essere la sezione dedicata ai crediti e ai ringraziamenti e riferimenti al gioco originario (chiamandola appunto Memory).
Ad ogni modo:
#============================================================================== # ** Scene_Start #------------------------------------------------------------------------------ # ad immagini (load - New Game - Memories) che rimanda a selezione personaggio #============================================================================== module IT #IMPOSTAZIONI TITLE IM = true BACKGROUND = "" #Sfondo LOAD = "" #carica partita salvata NEWGAME = "" #rimanda a selezione personaggio (avviando una n.partita MEMORY = "" #rimanda alla schermata dei crediti e ringraziamenti TF = false #Transizione finestra OPF = 160 #Opacità Finestra WF = 192 #Larghezza Finestra AF = 2 #Allineamento orizzontale Finestra PXF = 0 #Posizione X Finestra VAF = 0 #Allineamento Verticale Finestra PYF = 288 #Posizione Y Finestra BACKGROUND = ["tmpot"] #Sfondo BGX = 0 #Posizione X tasto Background BGX = 0 #Posizione Y tasto Background LOAD = ["loadOFF","loadON"] #Tasto LOAD nonselezionato/selezionato LX = 0 #Posixione X tasto s1 LY = 0 #Posizione Y tasto s1 NEWGAME = ["newgameOFF","newgameON"] #Tasto NEWGAME nonselezionato/selezionato NGX = 0 #Posixione X tasto s2 NGY = 0 #Posizione Y tasto s2 MEMORY = ["memoryOFF","memoryON"] #Tasto MEMORY nonselezionato/selezionato MX = 0 #Posixione X tasto s3 MY = 0 #Posizione Y tasto s3 BT = 0 #BLEND_TYPE end class Scene_Start #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main $data_system = load_data("Data/System.rxdata") # Make system object $game_system = Game_System.new # Make a graphic @background = Sprite.new @background.bitmap = RPG::Cache.title(IT::BACKGROUND[0]) @background.x = 0 @background.y = 0 # Make command window s1 = IT::LOAD s2 = IT::NEWGAME s3 = IT::MEMORY w = IT::WF @start = Window_CommandStart.new(w, [s1, s2, s3]) if IT::TF @start.opacity = 0 else @start.back_opacity = IT::OPF end case IT::AF when 0 @start.x = IT::PXF when 1 @start.x = 0 when 2 @start.x = (640 - @start.width ) / 2 when 3 @start.x = 640 - @start.width end case IT::VAF when 0 @start.y = IT::PYF when 1 @start.y = 0 when 2 @start.y = (480 - @start.height ) / 2 when 3 @start.y = 480 - @start.height end # Continue enabled determinant # Check if at least one save file exists # If enabled, make @continue_enabled true; if disabled, make it false @load_enabled = false for i in 0..3 if FileTest.exist?("Memories/Save#{i+1}.rxdata") @load_enabled = true end end # If continue is enabled, move cursor to "Continue" # If disabled, display "Continue" text in gray if @load_enabled @start.index = 1 else @start.disable_item(1) end if IT::IM @start.visible = false #LOAD #s1 nonselezionato @start1 = Sprite.new @start1.blend_type = IT::BT @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start1.x = IT::LX @start1.y = IT::LY #NEWGAME #s2 nonselezionato @start2 = Sprite.new @start2.blend_type = IT::BT @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) @start2.x = IT::NGX @start2.y = IT::NGY #MEMORY #s3 nonselezionato @start3 = Sprite.new @start3.blend_type = IT::BT @start3.bitmap = RPG::Cache.title(IT::MEMORY[0]) @start3.x = IT::MX @start3.y = IT::MY if @load_enabled @start2.bitmap = RPG::Cache.title(IT::LOAD[1]) @start3.bitmap = RPG::Cache.title(IT::NEWGAME[0]) else @start2.opacity = 160 @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) end end # Play title BGM $game_system.bgm_play($data_system.title_bgm) # Stop playing ME and BGS Audio.me_stop Audio.bgs_stop # Execute transition Graphics.transition # Main loop loop do # Update game screen Graphics.update # Update input information Input.update # Frame update update # Abort loop if screen is changed if $scene != self break end end # Prepare for transition Graphics.freeze # Dispose of start @start.dispose @background.dispose if IT::IM @start1.dispose @start2.dispose @start3.dispose end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update @start.update @start1.update @start2.update @start3.update if @start.active update_start return end end def update_start # If RIGHT button ware repeat if Input.repeat?(Input::RIGHT) # Play buzzer SE $game_system.se_play($data_system.cursor_se) # Branch by command window cursor position case @start.index += 1 when 0 # LOAD @start1.bitmap = RPG::Cache.title(IT::LOAD[1]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[0]) when 1 # NEWGAME @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[1]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[0]) when 2 # MEMORY @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[1]) end return end #If LEFT button ware repeat if Input.repeat?(Input::LEFT) # Play buzzer SE $game_system.se_play($data_system.cursor_se) # Branch by command window cursor position case @start.index += -1 when 0 # LOAD @start1.bitmap = RPG::Cache.title(IT::LOAD[1]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[0]) when 1 # NEWGAME @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[1]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[0]) when 2 # MEMORY @start1.bitmap = RPG::Cache.title(IT::LOAD[0]) @start2.bitmap = RPG::Cache.title(IT::NEWGAME[0]) @start3.bitmap = RPG::Cache.title(IT::MEMORY[1]) end return end # If C button was pressed if Input.trigger?(Input::C) # Play buzzer SE $game_system.se_play($data_system.decision_se) # Branch by command window cursor position case @start.index when 0 load when 1 newgame when 2 memory end end end #-------------------------------------------------------------------------- # * Command: LOAD #-------------------------------------------------------------------------- def load # If continue is disabled unless @start1_enabled # Play buzzer SE $game_system.se_play($data_system.buzzer_se) return end # Play decision SE $game_system.se_play($data_system.decision_se) # Switch to load screen $scene = Scene_Load.new end #-------------------------------------------------------------------------- # * Command: NEWGAME #-------------------------------------------------------------------------- def newgame if @start2_enabled != 0 # Play decision SE $game_system.se_play($data_system.decision_se) # Reset frame count for measuring play time Graphics.frame_count = 0 $scene = Test.new else # Play buzzer SE $game_system.se_play($data_system.buzzer_se) return end end #-------------------------------------------------------------------------- # * Command: MEMORY #-------------------------------------------------------------------------- def memory if @start3_enabled != 0 # Play decision SE $game_system.se_play($data_system.decision_se) # Reset frame count for measuring play time Graphics.frame_count = 0 $scene = Scene_Crediti.new else # Play buzzer SE $game_system.se_play($data_system.buzzer_se) return end end endSe si va al New Game, si passa al Momento di scelta con che giocatore iniziare conoscendo le loro vite prima ancora che il party si formasse.
Bene per realizzare questa cosa, ci viene in aiuto lo script di SelezionaCampagnia realizzato da un utente di questo forum di cui io non ricordo il nickname (voglia perdonarmi)
Ad ogni modo, fatte le dovute modifiche e migliorie, eccovi ricostruite queste prime fasi di Wild Arms.
Successivamente annoterò i miei sviluppi e vi terrò aggiornati.
Se questo format vi è piaciuto e vorreste che lo continuassi fatemelo sapere nei commenti. :)
-
Irael! xD scusa le mie solite gaffe e dislessie/grafie
No in sostanza è il generatore di DoubleAlex, solo che io l'ho reso un po' più ordinato.
Adesso i colori generati vanno a depositarsi nella cartella Colori e le scene in un'altra (RisultatoFinale)
Forse ho inserito una chicca utile.
Quando si va nell'editor di scene, l'utente può inserire un immagine di riferimento che si sostituisce allo sfondo.
A me serviva così perché avevo disegnato con Paint lo schema delle windows e in questo modo potevo allocarle e dimensionarle in modo più preciso.
Piccole cose insomma. :)
Tanto per ripassare l'rgss che era da tanto tempo che non lo usavo.
Inviato dal mio NOTE 20 PRO utilizzando Tapatalk
-
Salve gente, non avrei mai mai mai pensato che nel 2021 avrei scritto un nuovo topic in questa sezione. Ma mai dire mai. Giusto?
Molti di voi non sanno nemmeno chi io sia e spesso nemmeno io xD Ma eccomi qua, di nuovo in questo sito, chissà se Guardian of Ariel è ancora uno dei moderatori..
Chissà Flame. So che ultimamente fa collaborazioni importanti con FraFrog, le auguro tutto il bene. Ma comunque.. non voglio assolutamente andare offtopic e presentarvi lui!
Lo conoscete già! So che esiste una versione 2.0 ufficiale (che io non ho) ma ho lavorato non ufficialmente alla 1.0, l'ho resa più ordinata, più composta.
Resta comunque uno strumento utile.
Ecco la risorsa:
https://www.mediafire.com/file/pvrqksecezjsple/Generatore+di+Scene.7z/file
vi mostro un po di immagini:
-
Ciao Anime!
Ultimamente mi sto occupando nella formulazione di un videogioco che ha due caratteristiche emulate dal celeberrimo Dark Souls ovvero. La prima è narrare la trama e le lore solo a coloro realmente interessati nel conoscerle quindi sfruttando molto la naturalezza dei dialoghi, i dettagli di scenario e anche il cosiddetto "si dice e non si dice" così da permettere anche al giocatore di generare le proprie ipotesi.
Ma scrivo questo topic per un altro motivo che riguarda la seconda caratteristica di Dark Souls che mi ha fatto amare talmente tanto questo gioco che ne voglio conferire un tributo implementando questo sistema nel mio. Apro parentesi il mio progetto sarà un free game dove al massimo ci sarà qualche pubblicità qua e là in game, proposta in una nuova formula sperimentale non invasiva che non andrà a rovinare l'esperienza di gioco.
Detto ciò la seconda caratterista è per l'appunto il Sistema di Livellamento tecnocratico dove appunto il giocatore può sbizzarrire la propria passione nel gestire i propri tecnicismi così da creare una Build del personaggio con tutti i crismi. Ora la domanda è se esiste già qualcosa di simile online oppure no?
Se non esiste mi evitate di cercare inutilmente, così inizio a gettare le basi perla formulazionedi uno script io. Se invece esiste già qualcosa,posso basarmi su quel qualcosa e poi vedere cosa apprendere e implementare.
Cosa importante da specificare è che il mio progettonon sarà una copia di D.S. la storia è nettamente diversa così come l'ambiente e lo stile. L'unica cosa che lo potrebbe ricordare ma non mi vergogno anzi sono io stesso ad evidenziarne la cosa perché appunto è voluto, sono appunto questi due dettagli tecnici in cui desidero impostare la struttura dell'idea di approccio gioco.
E nulla. Ringrazio in anticipo :)
-
WOW! Ho visto i video il secondo ha una resa spettacolare. Mi ha ricordato tanto un vecchio gioco horror di un utente credo Another life.e il gioco era la fine di Another life (ma non vorrei sbagliarmi) in cui appunto utilizzava questa tecnica.
Rispondendo a ReturnOfHylian :
Penso che tu abbia ragione. Però non è una cosa impossibile. E' senz'altro complesso, poiché bisogna costruire gli elementi che faranno parte della scena in maniera armonica tra loro in modo che tutto abbia una resa conforme.In una sorta di scena anziché scriptata, "Graficata" (passatemi il termine).
Sto già provando , magari anche qui stesso posterò qualche immagine dei miei esperimenti.
-
Si avrei una domanda...ehm...il link al canale?.. hai dimenticato di inserirlo xD
-
-MAGICAVOXEL-
Ricordate che qualche giorno fa ho creato un post in sezione richieste plugin in cui cercavo di trovare una soluzione ottimale per donare alle mappe immersività con l'effetto Blur. Effetto tipicamente usato da Square-enix per inscenare il mondo di gioco di Octopath Traveler.
Ora secondo me (posso sbagliarmi) ma lo stile di mappatura è un Falso "Falso 3d",
ovvero in alcuni casi modelli tridimenzionali con indosso delle texture in pixel-art.
Quindi di norma si prende Blender (o analoghi) si crea la mash e poi Photoshop si crea la texture e tramite civil gli si appoggia il node. Ok. però qui si parla di pixel-art.
Esiste questo tool che permette di creare opere in pixel-art in 3d con un'estrema facilità.
Per chi non dovesse conoscerlo, (come me qualche giorno fa), recatevi al sito ufficiale, provate a scaricarlo e installarlo e veramente si riescono a creare delle modellazioni molto belle. Provare per credere.
Sarebbe bello che Rpg Maker mv potesse implementare modelli di grafica 3d in modo da poter mappare in quello stile li. Ma ho una mezza idea di come fare su RPGMV devo soltanto mettermi a pixellare una scena scriptata e vediamo se il reso può avvicinarsi allo stesso impatto grafico immersivo.
Niente volevo farvi conoscere questo programma.
E chiacchierare un po sula questione Effetto Blur.
-
Grazie ragazzi per le risposte :)
Seguirò le vostre dritte. -
Lo so..mi trovo nella sezione plugin e javascript.. però il motivo della mia richiesta non è quella di cercare le texture che mettono in scena lo stile grafico di un gioco simile. Bensì la struttura in script che permette ad uno stile simile di visualizzarsi.
In pochè parole sto cercando dei plugin o delle linee di codice che possano emulare questo effetto grafico molto immersivo.
Questo sfocare il foreground e il background e lasciare in chiaro solo l'area in cui risiede il personaggio controllabile.
Questo dare l'effetto di profondità tramite un corretto uso delle luci e delle ombre.
Voglio capire se esiste qualcuno che è in grado di poter ottenere un reso simile anche per giochi amatoriali.
Se esiste vorrei conoscere come ha fatto e studiare il come ha fatto.
Per tanto eccomi qua a chiedere.

Testi come pictures
in Richieste PLUGIN e Javascript
Posted · Edited by Lomax_Iced
Sì ora esiste:
(function() { // Crea un nuovo comando personalizzato "ShowWordPicture" PluginManager.registerCommand('WordPictureDisplay', 'Show', function(args) { // Ottieni il testo dal parametro del comando var text = args.text; // Crea un'immagine utilizzando la funzione personalizzata "createImageFromText" var image = createImageFromText(text); // Visualizza l'immagine utilizzando il comando "Show Picture" $gameScreen.showPicture(args.pictureId, args.name, args.origin, args.x, args.y, args.scaleX, args.scaleY, args.opacity, args.blendMode); }); // Crea una funzione personalizzata per creare un'immagine dal testo function createImageFromText(text) { // Crea una canvas HTML5 var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); // Imposta le dimensioni della canvas canvas.width = 200; // Larghezza dell'immagine canvas.height = 50; // Altezza dell'immagine // Imposta lo stile del testo context.font = '30px Arial'; context.fillStyle = '#FFFFFF'; // Colore del testo context.textAlign = 'center'; // Allineamento del testo context.textBaseline = 'middle'; // Disegna il testo sulla canvas context.fillText(text, canvas.width / 2, canvas.height / 2); // Crea un'immagine a partire dalla canvas var image = new Image(); image.src = canvas.toDataURL(); return image; }; })();Per richiamarlo:Sostituisci "testo da visualizzare con immagine" con ciò che ti pare e ho risolto il tuo quesito.COSA ANDAVA FATTO?
Ho creato un nuovo comando personalizzato chiamato "ShowWordPicture" in onore di quello script da te citato buon anima Rpg Maker 2003 che utilizza la funzione personalizzata "createImageFromText" per creare un'immagine dal testo e la visualizza utilizzando il comando "Show Picture" di RPG Maker MV.
Stop fine