Jump to content
Rpg²S Forum

[TUTORIAL] Radice quadrata e distanza tra due punti ad eventi


Recommended Posts

1. Introduzione


Per: RPG Maker XP/VX/Ace


Autore: TheVillAngel


Descrizione: Salve a tutti ragazzi, I'm back, questioni lavorative e universitarie mi hanno tenuto quasi un anno lontano dal making e dal mio progetto, ma questo non mi ha impedito, nei momenti morti, di utilizzare rpg maker per elaborare delle piccole aggiunte che serviranno al prosieguo del mio lavoro e spero possano aiutare anche voi.

Il primo dei due tutorial che vi andrò a proporre tratta, come da titolo, l'implementazione dell'algoritmo per il calcolo della radice quadrata in rpg maker e un esempio del suo utilizzo, ossia il calcolo della distanza tra due punti, che nell'economia di rpg maker è utile per definire cosa succede quando due eventi, oppure l'eroe ed un evento, sono ad una certa distanza l'uno dall'altro, un esempio banale può essere la definizione del range di aggro di un npc ostile.

Per questioni legate all'utilizzo di numeri decimali, purtroppo, questo metodo è utilizzabile solo dall'XP in su, poichè attraverso una piccola modifica via script, che per l'XP troverete QUI, sarà possibile utilizzare i decimali soltanto su questi tools, o almeno credo, se qualcuno è in grado di smentirmi ne sarei felice.

Il prossimo tutorial invece tratterà un metodo di Pathfinding sempre ad eventi, di cui in un certo senso questo sarà propedeutico, ma non necessariamente, in quanto con altri metodi sarà possibile utilizzarlo comunque e, cosa più importante, su tutti i tools, il che è un'ottima cosa a mio avviso, data l'assenza di script su 2k e 2k3.

Detto questo, possiamo iniziare.

 

2. Tutorial

 

2.1 Teoria

 

Partiamo con un po' di teoria, utile a capire la logica che c'è dietro le operazioni che faremo, ma non necessaria, quindi, se volete, saltate al punto 2.2

 

Tra i diversi algoritmi esistenti per il calcolo della radice quadrata, il migliore e più facilmente applicabile al nostro Rpg Maker, nonchè quello usato anche da qualsiasi calcolatrice, è senza dubbio il Metodo di Erone, poichè è l'unico che, solo attraverso le 4 operazioni principali, (le uniche che il tool ci mette a disposizione) ci permette di estrarre la radice quadrata di un numero.

Il metodo di Erone parte dal presupposto che, dato un numero X e costruendo un rettangolo di con lati che misurino L1=X e L2=1, si possa arrivare, con approssimazioni successive, ad un quadrato di lato √X

 

Per fare ciò dovremo dunque calcolarci prima la media aritmetica dei due lati, per ottenere il primo lato del secondo rettangolo che si avicinerà al quadrato, in questo modo:

L1' = (L1+L2)/2

Per ottenere, invece, il secondo lato, dovremo dividere il lato originario L1 (che corrisponde ovviamente all'area del rettangolo, poichè L1 x L2= L1 x 1 = L1) per il nuovo lato L1', quindi avremo che

L2' = L1/L1'

questa operazione andrebbe ripetuta finchè L1n non sia uguale a L2n, ossia finchè i lati del quadrato siano uguali e corrispondano, quindi, alla radice quadrata del primo lato che era anche area del rettangolo, ma, per un'approssimazione già ottimale, basterà ripetere l'operazione circa 9 volte.

Confusi?

 

Facciamo un esempio numerico: troviamo la √4

ora sappiamo che L1 = 4 e L2 =1, quindi facciamo:

L1' = (4 + 1) / 2 = 5/2 = 2,5

L2'= 4/2,5 = 1,6

continuiamo

L1'' = (2,5 + 1,6) / 2 = 4,1/2 = 2,05

L2'' = 4/2,05 = 1,95

ancora

L1''' = (2,05 + 1,95) / 2 = 2

L2''' = 4/2 = 2

abbiamo trovato la radice quadrata di 4, cioè 2, allora perchè andare avanti, e soprattutto, cosa succede se andiamo avanti?

Per numeri più grandi, le 3 approssimazioni non sono sufficenti, ma continuare ad approssimare non avrà alcun effetto sulla radice già trovata, vediamo perchè:

L1'''' = (2 + 2) /2 = 2

L2'''' = 4/2 = 2

questa operazione dovrà essere quindi svolta 9 volte.

 

2.2 Implementazione

 

Passiamo all'implementazione via codice

 

avremo bisogno di un solo piccolo evento e di alcune variabili:

poniamo la variabile L2 = 1

la variabile L1 invece assumerà il valore del numero del quale vogliamo trovare la radice (chiamiamolo X)

L1 = X

creiamo poi la variabile contatore, inizializzandola uguale a 0. Questa ci servirà a sapere quante volte è stata fatta l'operazione di approssimazione e quindi quando il ciclo dovrà fermarsi.

contatore = 0

Ciclo

Aggiungiamo 1 alla variabile 'contatore'

contatore + 1

Poniamo la variabile L1' uguale alla variabile X, poichè X ci serve integro, utilizzeremo L1' per le operazioni

L1' = X

Sommiamo L1 ad L2 e dividiamo per 2 per ottenere il primo lato

L1+L2

L1/2

Dividiamo L1' per L1 per ottenere il secondo lato

L1'/L1

Poniamo L2 uguale a L1' per memorizzare il secondo lato

L2 = L1'

Ora diciamo al programma che se l'operazione è stata fatta 9 volte, può rompere il ciclo.

If contatore = 8

rompi ciclo

fine

 

2.3 Evento

 

ricapitolando, l'evento sarà

var L2 = 1

var L1 = X

var contatore = 0

loop

var contatore + 1

var L1' = X

var L1+ var L2

var L1 / 2

var L1'/ var L1

var L2 = var L1'

If var contatore = 8

break loop

end

 

2.4 Distanza tra due punti

 

Ora che abbiamo la nostra funzione per il calcolo della radice quadrata, l'implementazione della formula della distanza tra 2 punti sarà un giochetto da ragazzi, supponiamo di voler calcolare tale distanza tra il nostro eroe e l'evento 1

 

avremo bisogno di :

 

2.4.1 Evento su mappa

un evento su mappa in processo parallelo che rilevi le coordinate dell'eroe e dell'evento, quindi

 

var x = hero x

var y = hero y

var EV x = Ev001 x

var EV y = Ev002 y

 

2.4.2 Evento Comune

un evento comune in processo parallelo in cui impostare la nostra formula, che sappiamo essere √[(x2-x1)^2 + (y2-y1)^2]

 

dove

x2 = var x

x1 = var EV x

y2 = var y

y1 = var EV y

 

Ora, dato che, come sempre, i valori ci servono integri e non modificati dalle varie operazioni, eguaglieremo due nuove variabili (var distX e var distY) a var x e var y

var distX = var x

var distY = var y

successivamente faremo x2 - x1

var distX - var EV x

al quadrato

var distX * var distX

e y2 - y1

var distY - var EV y

al quadrato

var distY * var distY

ed ora l'addizione

var distX + var distY.

A questo punto ci basterà richiamare la funzione radice quadrata e sostituire a 'var L1 = X', 'var L1= var dist X'

common event: radice quadrata

 

2.4.3 Ricapitolando

gli eventi saranno quindi

 

Evento su mappa, processo parallelo

var x = hero x

var y = hero y

var EV x = Ev001 x

var EV y = Ev002 y

 

Evento comune in processo parallelo

var distX = var x

var distY = var y

var distX - var EV x

var distX * var distX

var distY - var EV y

var distY * var distY

var distX + var distY.

common event: radice quadrata

 

Evento radice quadrata modificato in questo modo

var L2 = 1

var L1 = var dist X

var contatore = 0

loop

var contatore + 1

var L1' = var dist X

var L1+ var L2

var L1 / 2

var L1'/ var L1

var L2 = var L1'

If var contatore = 8

break loop

end

 

ora nella variabile L1 avrete la vostra distanza tra i due eventi, con cui potrete fare quello che volete, ad esempio far si che se la distanza è minore di 5 tile, e quindi di 5, l'evento si avvicini all'eroe o viceversa, che si senta un determinato suono, ecc.

 

Bene, questa è la fine, sempre disponibile per qualsiasi domanda e a presto col nuovo tutorial.

premi(o XD)http://rpg2s.net/gif/SCContest1Oct.gif

Progetto in corso:

Light and Decay

 

 

My hysterical dog is watching you

Link to comment
Share on other sites

Lunghetto! Per ora non posso provare, ma sicuramente interessante ed utile, soprattutto per la distanza action tra due pg :D :D

^ ^

 

Di questi tutorial c'è bisogno! ^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

Interessante e banale, ma molto utile per chi non se la cava con gli eventi.

Ricordo di averlo fatto in C++ su console. Feci un banale programmino, che facevano inserire all'utente le coordinate x,y del primo punto, e le coordinate x,y del secondo. Alla fine ho costruito un triangolo rettangolo sfruttando la distanza tra i due punti come l'ipotenusa di tale triangolo. Alla fine conoscendo l'altezza e la base, la quale si ricavava con una sottrazione delle due coordinate x e y, applicavo il teorema di pitagora. Sfizioso come cosa xD

Link to comment
Share on other sites

Lunghetto! Per ora non posso provare, ma sicuramente interessante ed utile, soprattutto per la distanza action tra due pg :D :D

^ ^

 

Di questi tutorial c'è bisogno! ^ ^

 

E' più lunga la spiegazione che tutto il procedimento in realtà, alla fine son tre eventini, mi sono concentrato molto sulo spiegare la logica perchè alla fine è quella che aiuta i maker a crescere e a capire le potenzialità del tool.

Comunque sono cose belle e stimolanti da fare, mi piacerebbe che ci fosse un topic dove si possano porre delle questioni da tradurre in eventi che esulino dalle quelle classiche riproposte troppo spesso, perchè alla fine i miei tutorial vengono fuori dalle mie esigenze, con le esigenze di tutti può venire fuori tanta roba utile se si collabora.

 

 

Interessante e banale, ma molto utile per chi non se la cava con gli eventi.

Ricordo di averlo fatto in C++ su console. Feci un banale programmino, che facevano inserire all'utente le coordinate x,y del primo punto, e le coordinate x,y del secondo. Alla fine ho costruito un triangolo rettangolo sfruttando la distanza tra i due punti come l'ipotenusa di tale triangolo. Alla fine conoscendo l'altezza e la base, la quale si ricavava con una sottrazione delle due coordinate x e y, applicavo il teorema di pitagora. Sfizioso come cosa xD

Concordo, molte volte cose che possono sembrare difficili possono essere risolte in modo banale, e il bello della programmazione (anche se con rpg maker) sta proprio lì.

premi(o XD)http://rpg2s.net/gif/SCContest1Oct.gif

Progetto in corso:

Light and Decay

 

 

My hysterical dog is watching you

Link to comment
Share on other sites

E' più lunga la spiegazione che tutto il procedimento in realtà

Visto! XD Era quella che dicevo lunga! XD Ma meglio così ^ ^

 

 

Comunque sono cose belle e stimolanti da fare, mi piacerebbe che ci fosse un topic dove si possano porre delle questioni da tradurre in eventi che esulino dalle quelle classiche riproposte troppo spesso, perchè alla fine i miei tutorial vengono fuori dalle mie esigenze, con le esigenze di tutti può venire fuori tanta roba utile se si collabora.

Potresti aprirlo in parlando del making (od avevi già fatto una cosa del genere? Mi par ci fosse! ^ ^) chiedendo specificatamente quali eventi chiedere e linkando i tuoi tutorial come esempio! ^ ^

(\_/)
(^ ^) <----coniglietto rosso, me!
(> <)


Il mio Tumblr dove seguire i miei progetti, i progetti della Reverie : : Project ^ ^

http://i.imgur.com/KdUDtQt.png disponibile su Google Play, qui i dettagli! ^ ^

http://i.imgur.com/FwnGMI3.png completo! Giocabile online, qui i dettagli! ^ ^

REVERIE : : RENDEZVOUS (In allenamento per apprendere le buone arti prima di cominciarlo per bene ^ ^) Trovate i dettagli qui insieme alla mia intervista (non utilizzerò più rpgmaker) ^ ^

 

SUWOnzB.jpg 🖤
http://www.rpg2s.net/dax_games/r2s_regali2s.png E:3 http://www.rpg2s.net/dax_games/xmas/gifnatale123.gif
http://i.imgur.com/FfvHCGG.png by Testament (notare dettaglio in basso a destra)! E:3
http://i.imgur.com/MpaUphY.jpg by Idriu E:3

Membro Onorario, Ambasciatore dei Coniglietti (Membro n.44)

http://i.imgur.com/PgUqHPm.png
Ufficiale
"Ad opera della sua onestà e del suo completo appoggio alla causa dei Panda, Guardian Of Irael viene ufficialmente considerato un Membro portante del Partito, e Ambasciatore del suo Popolo presso di noi"


http://i.imgur.com/TbRr4iS.png<- Grazie Testament E:3
Ricorda...se rivolgi il tuo sguardo ^ ^ a Guardian anche Guardian volge il suo sguardo ^ ^ a te ^ ^
http://i.imgur.com/u8UJ4Vm.gifby Flame ^ ^
http://i.imgur.com/VbggEKS.gifhttp://i.imgur.com/2tJmjFJ.gifhttp://projectste.altervista.org/Our_Hero_adotta/ado2.png
Grazie Testament XD Fan n°1 ufficiale di PQ! :D

Viva
il Rhaxen! <- Folletto te lo avevo detto (fa pure rima) che non
avevo programmi di grafica per fare un banner su questo pc XD (ora ho di
nuovo il mio PC veramente :D)

Rosso Guardiano della
http://i.imgur.com/Os5rvhx.png

Rpg2s RPG BY FORUM:

Nome: Darth Reveal

 

PV totali 2
PA totali 16

Descrizione: ragazzo dai lunghi capelli rossi ed occhi dello stesso colore. Indossa una elegante giacca rossa sopra ad una maglietta nera. Porta pantaloni rossi larghi, una cintura nera e degli stivali dello stesso colore. E' solito trasportare lo spadone dietro la schiena in un fodero apposito. Ha un pendente al collo e tiene ben legato un pezzo di stoffa (che gli sta particolarmente a cuore) intorno al braccio sinistro sotto la giacca, copre una cicatrice.
Bozze vesti non definitive qui.

Equipaggiamento:
Indossa:
60$ e 59$ divisi in due tasche interne
Levaitan

Spada a due mani elsa lunga

Guanti del Defender (2PA)
Anello del linguaggio animale (diventato del Richiamo)

Scrinieri da lanciere (2 PA)

Elmo del Leone (5 PA)

Corazza del Leone in Ferro Corrazzato (7 PA)

ZAINO (20) contenente:
Portamonete in pelle di cinghiale contenente: 100$
Scatola Sanitaria Sigillata (può contenere e tenere al sicuro fino a 4 oggetti curativi) (contiene Benda di pronto soccorso x3, Pozione di cura)
Corda
Bottiglia di idromele
Forma di formaggio
Torcia (serve ad illuminare, dura tre settori)

Fiasca di ceramica con Giglio Amaro (Dona +1PN e Velocità all'utilizzatore)
Ampolla Bianca

Semi di Balissa

 

CAVALLO NORMALE + SELLA (30 +2 armi) contentente:
66$
Benda di pronto soccorso x3
Spada a due mani

Fagotto per Adara (fazzoletto ricamato)


 

Link to comment
Share on other sites

Potresti aprirlo in parlando del making (od avevi già fatto una cosa del genere? Mi par ci fosse! ^ ^) chiedendo specificatamente quali eventi chiedere e linkando i tuoi tutorial come esempio! ^ ^

Io no, se l'ha fatto qualcun altro me lo son perso, ci vado a dare un'occhiata, nel caso lo apro io. Prima però posto il prossimo tutorial di cui sono orgogliosissimo, perchè mi ha fatto penare, anche se sarà lunghetto da scrivere :(

premi(o XD)http://rpg2s.net/gif/SCContest1Oct.gif

Progetto in corso:

Light and Decay

 

 

My hysterical dog is watching you

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...