Oppure

Loading
22/05/14 8:35
Thejuster
Salve gente.

Ho un estremo bisogno del vostro aiuto riguardante questo algoritmo per un mio gioco.
Vi spiego un pò la questione.

Ho 3 Valori fissi


int modello = 500;
int aggiunta = 500;
int correzzione = 500;
int livello = 1;
int exp = 0;
int exp_arrivo = 1500;
int vecchia_exp = 0;

In base a questi 3 valori io creo una curva di esperienza formando una tabella
esempio


[ LV 1 EXP 0 / 1500 ]


Algoritmo di calcolo
modello + (aggiunta * livello) + correzione


quindi facendo un calcolo abbiamo


500 + ( 500 ) + 500 + vecchia_exp = 1500;


la vecchia exp ora dovrà memorizzare l'exp di completamento del livello
quindi la vecchia_exp diventa 1500 invece di 0

quindi per il successivo livello


[ LV 2 EXP 1500 / 3500 ]

perché

500 + ( 500 * LV ) + 500 + vecchia_exp = 3500

e così via

quindi continuando per i vari livelli avrei una tabella del genere


0
1500
3500
6000
9000
12500
16500
21000

ecc. ecc.


Questo e per quanto riguarda l'algoritmo di calcolo per i punti di esperienza.

Ora il problema sorge in questo punto.

Io devo riuscire a ricavare tra l'exp iniziale del nuovo livello, all'exp finale del nuovo livello
ottenere la percentuale tra i due numeri e visionarla tramite una progressbar.

Ho provato tantissime volte con tanti metodi ma ottengo sempre valori errati non corrispondenti.

Questo è il codice che ho usato io.

Ditemi dove sbaglio



//Questa funzione consente di ottenere l'exp
//rimanente tra un livello e l'altro.
//Esempio se da LV 2  exp 1500 a lv 3 3500  ed io ho 500 exp
//Mi restituisce l'exp rimanente per raggiungere il livello.
int Calcolo(int id)
{
// modello + (aggiunta * livello) + correzione


int modello = RPG::dbActors[id]->expPrimary;
int aggiunta = RPG::dbActors[id]->expSecondary;
int correzzione = RPG::dbActors[id]->expTertiary;
int livello = RPG::actors[id]->level;

int calc1 = aggiunta * livello;
int calc2 = modello + correzzione;
int tot = calc1 + calc2;

return tot;

}





   //Eroe 1
        if(eroi == 1)
        {


  int modello = 500;
  int aggiunta = 500;
  int correzzione = 500;


  int exp_massima=0;
  int exp_minima=0;

  int exp_rimanente=0;

  int livello = 1;

  int c1 = 0,c2 = 0;
  // modello + (aggiunta * livello) + correzione

  if(livello != RPG::actors[1]->level)
  {
       c1 = aggiunta * livello;
       vecchia_exp = c1 + modello + correzzione;
       livello++;
  }


  for(int i = 0; i < RPG::actors[1]->level; i++)
  {
     c1 = aggiunta * livello;
     exp_rimanente = modello + c1 + correzzione + vecchia_exp;

  }





Lo sò, il codice potrebbe essere sicuramente errato.

Per i primi 2 livelli funziona
0 -> 1500 -> 3500.

Poi stranamente non si smuove più.


1° Come posso tenere memorizzato il lavore della vecchia exp se essa può essere usata solo
ed esclusivamente in un clico di rendering?


successivamente avere una percentuale che poi devo andarla ad abbinare ad una progressbar di max
63 pixel.

NB: L'applicazione non accetta numeri decimali o valori float.

Ultima modifica effettuata da Thejuster 22/05/14 8:57
mire.forumfree.it/ - Mire Engine
C# UI Designer
22/05/14 18:29
Roby94
Scusa se non ho capito bene il problema, ma perche non crei un metodo statico in una classe eroe che dato il livello ti restituisce l'exp necessaria per arrivarci, dopo di che fai un semplice calcolo tra explv(lv-1) explv(lv) e exp attuale?
aaa
25/05/14 14:55
pierotofy
Non capisco cosa intendi per "tenere memorizzato il valore della vecchia exp".

Per la percentuale:

((Valore exp attuale - Valore exp minimo) / (Valore exp massimo - Valore exp minimo)) * 100.

Ad esempio, su un range 1500 -> 3500, se l'eroe ha 2000:

2000 - 1500 = 500

3500 - 1500 = 2000

500 / 2000 = 0.25

0.25 * 100 = 25%

Non capisco cosa intendi per "non accetta valori decimali o float"; stai dicendo che il software che stai usando permette di usare solamente interi? :om:

In quel caso dovresti moltiplicare per 100 prima di dividere.

((Valore exp attuale - Valore exp minimo) * 100) / (Valore exp massimo - Valore exp minimo)
Il mio blog: piero.dev
26/05/14 8:02
Thejuster
Si in realtà è un hook.
Ovvero una Dll Injection che permette di manipolare le scene del draw.
Ma essendo un software di vecchia data, non permette di utilizzare valori float.



PS: Grande piero funziona :D

l'unico errore che ora mi dà, e quando sale di livello.

Questo calcolo viene fatto ovviamente nella scena di rendering per tenere aggiornata la progressbar.

Quando l'eroe cambia di livello, e la barra teoricamente si resetterebbe partendo dall'exp minima mi dà
error division by 0

ho corretto anche con questa verifica


valore_barra = ((exp_attuale - exp_minima)  * 100) / (exp_massima - exp_minima);

if(valore_barra <= 0) { valore_barra = 1; }

RPG::variables[11] = valore_barra;



ho provato anche con un try catch ma nulla anche con la verifica del try mi crasha per l'errore di divisione
Ultima modifica effettuata da Thejuster 26/05/14 8:28
mire.forumfree.it/ - Mire Engine
C# UI Designer
26/05/14 15:01
pierotofy
if (exp_massima - exp_minima > 0) valore_barra = ((exp_attuale - exp_minima)  * 100) / (exp_massima - exp_minima);
else valore_barra = 0;
Il mio blog: piero.dev
26/05/14 15:25
Thejuster
Grazie mille piero!!!

geniale come sempre :cheer:
mire.forumfree.it/ - Mire Engine
C# UI Designer