Usare seno, coseno e resto
Versione 1.0
1. Introduzione
Per: RPG Maker XP/VX/VX Ace, RPG Maker 2000/2003 con patch.
Autore: mikb89.
Descrizione: Per chi programma minigiochi o crea da sé menu e HUD, queste funzioni tornano molto utili ma sono poco conosciute.
Tramite seno e coseno si possono ottenere movimenti particolari come oscillazioni o rotazioni. Menu ad anello, HUD circolari, foglie che cadono si creano tramite questi.
Il resto è utilizzatissimo per limitare un valore entro un certo campo, tipo nelle voci di un menu o per conoscere singole cifre di un numero (es. solo le decine), nel caso si vogliano mostrare valori in menu/bs ad eventi in cui i numeri sono dentro picture.
Con questo tutorial imparerete a fare tutte queste cose.
Ultima modifica: 29/02/2012.
2. Tutorial
sin cos %
.Introduzione
Senza una conoscenza approfondita di matematica e trigonometria, per uno scripter autodidatta è difficile pensare
di andare ad usare queste tre funzioni che, invece, risultano utilissime una volta apprese.
Questo tutorial fornirà una base da cui partire.
.Setup
L'idea che dovremo avere è di una variabile che si va incrementando di una quantità unitaria. Io userò 0.1.
Creare la variabile è semplice:
@var = 0E poi, per incrementarla ad ogni update:
@var += 0.1Questa qui NON è LA tecnica, è solo quella che userò qui per spiegare queste funzioni.
.Seno
Il seno, in trigonometria, è una funzione che, dato un numero, ne fa risultare un altro compreso tra -1 e 1.
La sintassi matematica del seno è sin(x), dove x è il numero. Come vedete, ci sono le parentesi come se fosse una
funzione di programmazione. In RGSS(1,2,3,x), però, la sintassi è diversa:
risultato = Math::sin(@var)in quanto la funzione fa parte del modulo Math.
Questo codice andrà messo nell'update, sotto l'incremento di @var scritto poc'anzi.
Nella figura la x sotto è la nostra @var che aumenta e il grafico mostra il valore restituito da sin a seconda del
cambiamento di questa.
Immaginatevi di essere piatti e di vedere questa figura perpendicolarmente dal punto di inizio di x verso la
direzione in cui va la freccia. Immaginate che non ci siano le linee già disegnate ma che sia un punto a seguirne
il movimento.
Il risultato di sin, che è quello che vedreste, è un movimento oscillante!
Questa cosa ovviamente non è utile solo se vogliamo fare un pendolo, vedremo infatti un esempio molto diffuso
subito dopo la breve spiegazione del coseno.
.Coseno
Il coseno funziona allo stesso modo del seno, solo, a valori 'spostati'.
Cioè, se il seno di 0 è 0, il coseno di 0 è 1.
I valori risultanti però spaziano nello stesso campo, fra -1 e 1.
Il risultato visivo è quindi lo stesso.
Nello stesso punto il valore sarà diverso da quello dato dal seno, ma l'andamento del punto osservato sarà sempre
oscillante.
Allora, a che serve conoscerli entrambi?
.Movimento circolare
L'esempio che avevo anticipato prima è il cerchio, o almeno il movimento necessario per crearlo.
Vi faccio un esempio pratico dettoci da un professore di fisica.
Ficcatevi un disco nel dito.
Poggiateci un oggetto sopra e alzate il dito in modo che il disco stia all'altezza dell'occhio.
Dovrete vedere il disco come una linea o quasi.
Fatelo girare e seguite l'oggetto con l'occhio.
Il movimento dell'oggetto è quello della funzione seno! (O coseno, vabé)
Guardando però il disco dall'alto, il movimento dell'oggetto è in realtà circolare.
Per ottenere questo, semplicemente assegniamo le coordinate ottenute dal risultato dato dallo stesso valore una
volta con seno e una volta con coseno. Codice:
@sprite.y = Math::sin(@var) @sprite.x = Math::cos(@var)Ovviamente @sprite dovrà essere prima creata e disegnata, poi aggiornata e, alla fine, cancellata.
@sprite = Sprite.new @sprite.bitmap = Bitmap.new(30,30) @sprite.bitmap.fill_rect(0,0,30,30,Color.new(255,255,255))va messo all'inizio,
@sprite.updatedentro l'update, mentre:
@sprite.bitmap.dispose @sprite.disposealla fine.
Questo è il codice di un quadrato che gira.
Voi però non lo vedrete.
Come abbiamo detto, i valori risultanti vanno da -1 a 1 e, in questo esempio sono anche non inclusi.
Per non inclusi intendo dire che il risultato ci si avvicina al limite, ma non lo raggiunge.
Immaginateli come -0.999999999999 e 0.999999999999, solo, con un numero di 9 infinito.
In programmazione il numero di 9 non è infinito ma dipende dal tipo di variabile che si usa, ma questi son altri
discorsi.
Quindi, come intero, visto che i pixel sono proprio interi, il risultato sarà sempre 0. O 1 a seconda
dell'arrotondamento.
È quindi necessario moltiplicare il risultato in base allo spazio fra cui vogliamo far muovere l'oggetto.
Mettiamo che vogliamo farlo muovere di 100 pixel, dobbiamo moltiplicare per 50. Otterremo un movimento fra -50 e
50.
In questo modo girerà però attorno al bordo superiore sinistro della finestra. Possiamo spostarlo sommando dei
valori al risulato della funzione. Per metterlo ad esempio al centro dello schermo, per esempio lo schermo del VX:
@sprite.y = 416/2 + Math::sin(@var)*50 @sprite.x = 544/2 + Math::cos(@var)*50Non sarà perfettamente centrato perché le coordinate si riferiscono all'angolo superiore sinistro dell'oggetto e
non al suo centro, si può rimediare con:
@sprite.ox = @sprite.oy = 30/2per fare in modo che il punto di riferimento non sia 0 (ovvero l'angolo) ma il centro. La metà di 30 in quanto 30 è
la grandezza che abbiamo definito prima.
Volendo fare gli sboroni, possiamo anche cambiare l'angolazione del quadrato mentre gira.
@sprite.angle = -@var*360/(2*Math::PI)Non si può passare direttamente @var perché l'angolo va da 0 a 360 mentre i valori che prendono le funzioni
sinusoidali hanno 2 volte pi greco come gamma di valori. Che corrisponde a Math::PI, mi pare chiaro.
Il meno va messo perché il giro è al contrario. I valori matematici litigano con quelli informatici perché nella
prima le y vanno dal basso verso l'alto mentre nella seconda è al contrario. Vabè.
.Resto
Il resto è più semplice e lo trovate spesso usato negli script.
Quello che rappresenta il resto lo sanno tutti. Divido 10 per 4. Mi viene 2,5. Se lo faccio col metodo di divisione
imparato alle elementari, ottengo 2 come risultato intero e un resto di 2.
La particolarità del resto è che non può superare il divisore. Il 4, in questo caso. Faccio esempi numerici.
8/4 = 2, resto 0
9/4 = 2, resto 1
10/4 = 2, resto 2
11/4 = 2, resto 3
12/4 = 3, resto 0
Sarà così all'infinito. 0, 1, 2 e 3.
Se vogliamo limitare un valore a un numero basta quindi valutare il resto.
In rpg maker viene ad esempio usato nelle pagine di equip, status, skill quando premendo PagUp si passa all'eroe
successivo.
def next_actor @actor_index += 1 @actor_index %= $game_party.members.size $scene = Scene_Skill.new(@actor_index) endPer ottenere il resto si usa %. O %= per settare. Con questo codice l'@actor_index non potrà indicare un eroe che
non è nel gruppo in quanto è limitato dalla dimensione di questo (in inglese members = membri [del gruppo], size =
dimensione).
Si poteva di certo mettere una condizione. Se @actor_index è maggiore di x allora impostalo a zero.
Oltre a non essere elegante, questa cosa funziona solo con incremento unitario.
Mettiamo che il party comprenda 3 elementi.
@actor_index è 2 (visto che parte da zero, indica il terzo elemento).
Se @actor_index venisse incrementato di 2, non dovrebbe essere impostato a 0, come fa la condizione, ma dovrebbe
andare a 1.
Con il resto il valore viene impostato correttamente.
Il resto si può usare anche dagli eventi, nel settaggio variabile.
Utilissimo ad esempio per indicare valori numerici via picture.
Come fate a mostrare 973 utilizzando 10 picture che contengono i signoli numeri da 0 a 9?
973%10 = 3
E avete il primo numero. Lo sottraete, dividete per 10 e avrete 97.
97%10 = 7
E così per tutti i numeri.
Poi tramite condizione potete mostrare la picture a seconda del numero.
Probabilmente troverete spiegazioni più approfondite su questa parte in un tutorial per bs ad eventi che, direi,
non è questo qui.
.Conclusione
Non avevo intenzione di creare un testo così lungo e, vedendolo mentre lo scrivevo, ho pensato di togliere la parte
sul resto. Però visto che non è troppo lunga e aggiungendola non cambia di molto il risultato finale l'ho lasciata.
Spero questo tutorial vi sia utile, che si faccia capire e che sia di vostro gradimento.
.Allegati
Ho incluso uno script dimostrativo che funziona su XP, VX e Ace. All'interno c'è scritto come farlo partire.
Modificato da mikb89, 01 March 2012 - 00:26 AM.