Personaggi
Come definire, usare e personalizzare i personaggi in Pixi’VN, inclusi archiviazione, emozioni e proprietà personalizzate.
Cosa sono i characters? I personaggi sono gli attori che appaiono in una visual novel. In Pixi’VN, i personaggi vengono creati usando la classe CharacterBaseModel o una classe personalizzata.
Inizializzazione
Per inizializzare un personaggio, crea una nuova istanza della classe CharacterBaseModel (o della tua classe personalizzata) e aggiungila al dizionario dei personaggi del gioco durante l'inizializzazione del gioco.
È consigliato importare le istanze all'avvio del progetto.
RegisteredCharacters.add è obbligatorio per salvare i personaggi nel gioco.
import { CharacterBaseModel, RegisteredCharacters } from "@drincs/pixi-vn";
export const liam = new CharacterBaseModel("liam", {
name: "Liam",
surname: "Smith",
age: 25,
icon: "https://example.com/liam.png",
color: "#9e2e12",
});
export const emma = new CharacterBaseModel("emma", {
name: "Emma",
surname: "Johnson",
age: 23,
icon: "https://example.com/emma.png",
color: "#9e2e12",
});
RegisteredCharacters.add([liam, emma]);Ottenere
Per ottenere un personaggio tramite il suo id, usa la funzione RegisteredCharacters.get.
import { RegisteredCharacters } from "@drincs/pixi-vn";
const liam = RegisteredCharacters.get("liam");Ottenere tutti
Per ottenere tutti i personaggi, usa la funzione RegisteredCharacters.values.
import { RegisteredCharacters } from "@drincs/pixi-vn";
const characters = RegisteredCharacters.values();Usare
ink
Puoi usare questo metodo con la sintassi ink. Vedi di più qui.
Puoi usare un personaggio del gioco, ad esempio, per collegarlo al dialogo corrente. Puoi usare l'id del personaggio o l'istanza del personaggio, ma è consigliato usare l'istanza.
import { liam } from "@/content/characters";
narration.dialogue = { character: liam, text: "Hello" };
// or
narration.dialogue = { character: "liam_id", text: "Hello" };Modificare
ink
Puoi usare questo metodo con la sintassi ink. Vedi di più qui.
CharacterBaseModel è una classe memorizzata, il che significa che le sue proprietà vengono salvate nell'archivio del gioco. Ad esempio, se cambi il nome del personaggio durante il gioco, il nuovo nome verrà salvato nell'archivio del gioco e collegato al suo id.
Se l'id del personaggio viene modificato da una versione all'altra, il sistema non sposterà i dati collegati al precedente id verso il nuovo id.
Per ottenere le proprietà usate durante l'istanziazione della classe, puoi usare le proprietà default.
Ecco un'implementazione semplificata della classe CharacterBaseModel per meglio comprendere le proprietà memorizzate nell'archivio del gioco:
export default class CharacterBaseModel
extends StoredClassModel
implements CharacterBaseModelProps
{
constructor(id: string, props: CharacterBaseModelProps) {
super();
// ...
this.defaultName = props.name;
this.icon = props.icon;
// ...
}
// name property is stored in the game storage
private defaultName: string = "";
get name(): string {
return this.getStorageProperty<string>("name") || this.defaultName;
}
set name(value: string) {
this.setStorageProperty("name", value);
}
// icon property is not stored in the game storage
icon: string = "";
// ...
}Emozioni dei personaggi
ink
Puoi usare questo metodo con la sintassi ink. Vedi di più qui.
È spesso utile avere più tipi dello stesso personaggio. Ad esempio, un personaggio "Alice" e un sottotipo legato al suo stato emotivo, come "Alice arrabbiata". Il personaggio e il sottotipo hanno le stesse caratteristiche, eccetto per una o più proprietà, come l'icona.
Con Pixi’VN, puoi creare un "personaggio con un'emozione" passando un oggetto invece dell'id:
import { CharacterBaseModel, RegisteredCharacters } from "@drincs/pixi-vn";
export const alice = new CharacterBaseModel("alice", {
name: "Alice",
icon: "https://example.com/alice.png",
color: "#9e2e12",
});
export const angryAlice = new CharacterBaseModel(
{ id: "alice", emotion: "angry" },
{
icon: "https://example.com/angryAlice.png",
},
);
RegisteredCharacters.add([alice, angryAlice]);console.log(alice.name); // Alice
alice.name = "Eleonora";
console.log(alice.name); // Eleonora
console.log(angryAlice.name); // Eleonora
angryAlice.name = "Angry Eleonora";
console.log(alice.name); // Eleonora
console.log(angryAlice.name); // Angry EleonoraClasse personalizzata
Modelli
In tutti i template, la classe Character è già definita nel file models/Character.ts. Puoi usarla direttamente o modificarla in base alle tue esigenze.
È consigliato creare la propria classe Character che estende CharacterStoredClass e "sovrascrive" l'interfaccia CharacterInterface per aggiungere, modificare o rimuovere proprietà o metodi.
Ad esempio, se vuoi creare una classe Character, devi "sovrascrivere" l'interfaccia CharacterInterface per usare le tue proprietà o metodi. (Vedi il file pixi-vn.d.ts)
Ora puoi creare una classe Character che estende CharacterStoredClass e implementa CharacterInterface. (Per ulteriori informazioni su come creare una classe in TypeScript, leggi la documentazione ufficiale)
Per creare una proprietà che memorizza il suo valore nell'archivio del gioco, puoi creare Getters/Setters e usare i metodi this.getStorageProperty()/this.setStorageProperty(). (Vedi il file Character.ts)
import { CharacterInterface, CharacterStoredClass } from "@drincs/pixi-vn";
export class Character
extends CharacterStoredClass
implements CharacterInterface
{
constructor(
id: string | { id: string; emotion: string },
props: CharacterProps,
) {
super(
typeof id === "string" ? id : id.id,
typeof id === "string" ? "" : id.emotion,
);
this._icon = props.icon;
this._color = props.color;
this.defaultName = props.name;
this.defaultSurname = props.surname;
this.defaultAge = props.age;
}
// Not stored properties
readonly icon?: string;
readonly color?: string | undefined;
// Stored properties
private defaultName?: string;
get name(): string {
return (
this.getStorageProperty<string>("name") ||
this.defaultName ||
this.id
);
}
set name(value: string | undefined) {
this.setStorageProperty("name", value);
}
private defaultSurname?: string;
get surname(): string | undefined {
return (
this.getStorageProperty<string>("surname") || this.defaultSurname
);
}
set surname(value: string | undefined) {
this.setStorageProperty("surname", value);
}
private defaultAge?: number | undefined;
get age(): number | undefined {
return this.getStorageProperty<number>("age") || this.defaultAge;
}
set age(value: number | undefined) {
this.setStorageProperty("age", value);
}
}
interface CharacterProps {
/**
* The name of the character.
*/
name?: string;
/**
* The surname of the character.
*/
surname?: string;
/**
* The age of the character.
*/
age?: number;
/**
* The icon of the character.
*/
icon?: string;
/**
* The color of the character.
*/
color?: string;
}