Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - movimenti*32
Forum - C# / VB.NET - movimenti*32

Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 10:56
Sabato, 19/11/2016
Ragazzi scusate ho un piccolo problema.
Magari la soluzione è proprio sotto al mio naso ma non riesco a trovarla
(forse anche per la stanchezza)

Alla pressione di un tasto, un NPC provvede a muoversi nella coordinata assegnata in m_iMove.
quando m_Pos raggiunge m_iMove si può concludere completato lo spostamento.

Ma se tengo premuto esempio Giu, m_iMove viene costantemente aumentata e non riesco
a rendermi conto fin dove andrà a finire.

Perché una pressione, equivale a tot spostamenti di pixel.
Quando completato quello spostamento si ferma
ma se sono più spostamenti, l'NPC Continua a spostarsi per fatti suoi.

Sapete darmi un indizio su come bloccare gli altri movimenti fin quando quello precedente non viene completato?
Vorrei escludere le liste se e possibile.
VOrrei fare tutto tramite variaibli.


Codice sorgente - presumibilmente C++

  1. public void Update()
  2.               {
  3.  
  4.                   if (m_iMoveX != 0 || m_iMoveY != 0)
  5.                       m_iFrame = (m_iFrame + 1) % 16;
  6.                   else
  7.                       m_iFrame = 0;
  8.  
  9.                   if (m_iPause > 0)
  10.                       --m_iPause;
  11.  
  12.                   if (m_iMoveX > 0)
  13.                   {
  14.                       m_iPosX += 2;
  15.                       m_iMoveX -= 2;
  16.                   }
  17.  
  18.                   if (m_iMoveX < 0)
  19.                   {
  20.                       m_iPosX -= 2;
  21.                       m_iMoveX += 2;
  22.                   }
  23.  
  24.                   if (m_iMoveY > 0)
  25.                   {
  26.                       m_iPosY += 2;
  27.                       m_iMoveY -= 2;
  28.                   }
  29.  
  30.                   if (m_iMoveY < 0)
  31.                   {
  32.                       m_iPosY -= 2;
  33.                       m_iMoveY += 2;
  34.                   }
  35.               }



PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 11:44
Sabato, 19/11/2016
Scusa ma se m_iMove rappresenta la fine dello spostamento è normale che se la aumenti in corso d'opera cambia l'ultima posizione  ....forse se ho capito bene hai bisogno di una variabile di transazione che rappresenta l'ultima posizione dello spostamento in quel momento.

Cioè m_iMove diventerebbe un Array che contiene i vari spostamenti inviati da tastiera e la variabile ?MUOVO? è l'effettiva cordinata dello spostamento.


PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:00
Sabato, 19/11/2016
ho risolto questo problema inserendo questa verifica

in pratica l'NPC si muove su una griglia di blocchi che misurano 32x32 pixel

Codice sorgente - presumibilmente C# / VB.NET

  1. pl.m_iMoveY += 32;  //Incremento il movimento da eseguire                        
  2.  
  3.  pl.m_npcDirection = NPCDirection.Dowm; //Imposto la faccia
  4.  if (pl.m_iMoveY > 32)  //Se premendo GIU l'npc supera lo spostamento consentito di 32 pixel
  5.  pl.m_iMoveY = 32; //Forzo a fargli eseguire lo spostamento di 32 pixel e non di più




con questo ho risolto il problema dello spostamento ma ora mi ritrovo un'altro bug

mostro la screen

https://s13.postimg.org/sap94oe1z/Cattura.png

Guarda le coordinate sulla barra del titolo
Musirano

iMoveY 0  (Nessun spostamento in corso)
iPos = 96 (Blocchi di 32 * 3 = 96 )

e qui ci siamo

L'algoritmo dell'NPC
incrementa di +2 la coordinata guarda sopra.
mentre incrementa la coordinata iPos, sottrae lo spostamento a iMove
e qui ci siamo.

Alla pressione del Tasto Giu

Codice sorgente - presumibilmente C# / VB.NET

  1. pl.m_iMoveY += 32;                          
  2.                                 pl.m_npcDirection = NPCDirection.Dowm;
  3.                                 if (pl.m_iMoveY > 32)
  4.                                     pl.m_iMoveY = 32;



Incremento il Movimento di 32 pixel
se continuo o tengo premuto GIU facendo superare il valore di iMove esempio >32, la condizione sottostante,
riporta iMove allo spostamento consentito ovvero di 32.
quindi dovrebbe in questo caso spostarsi di 32 pixel.

ma ciò non accade, mi ritrovo uno spostamento sballato di diversi pixel

https://s18.postimg.org/wp8rk2tex/Cattura.png

La coordinata precedente era di 96  +  32 (per il nuovo spostamento) = 128

nella screen mi ritrovo 132
non capisco come sia possibile una cosa del genere.
idee al riguardo?


PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 12:45
Sabato, 19/11/2016
Noto che lo sballamento è di 4 pixel ....è incrementale? se continuo a spostarlo aumenterà o diminuirà a seconda di dove sposti il personaggio?


PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 16:29
Sabato, 19/11/2016
Si

in diverse occasioni mi sono ritrovato un incremento anche di 8 pixel a volte.
non è sempre di 2.


PM Quote
Avatar
Snogar (Normal User)
Pro


Messaggi: 130
Iscritto: 09/01/2012

Segnala al moderatore
Postato alle 10:21
Lunedì, 21/11/2016
Scusa se rispondo solo ora ....cmq vorrei capire se l'incremento partendo dalla casella zero (cioè subito dopo che parte il programma la posizione del personaggio senza che tu faccia nulla) ....ho come il sospetto che oltre allo spostamento tu gli infili dentro anche i pixel relativi alla griglia di spostamento.


PM Quote
Avatar
Thejuster (Member)
Guru^2


Messaggi: 1704
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:17
Lunedì, 21/11/2016
Ciao Snogar,

Abbiamo provato ieri tutto il pomeriggio io e TheDarkJuster mentre eravamo in Chat.
Nulla.

Non siamo riusciti a venirne a capo.

L'NPC parte dalla posizione Fissa Y =  96

La matematica non è un opinione questo lo sappiamo tutti.
Di fatti se gli dico di muoversi di 32, non lo fà, incrementa di qualche pixel il risultato finale.

Ma ho notato una cosa.

Debuggando step by step la funzione dello spostamento.
ad ogni interrupt, funziona tutto perfettamente,

Sottrae 2 a iMove e incrementa 2 ad iPos.

Debuggando passo dopo passo funziona, mentre in RunTime sballa i pixel.

L'unica soluzione plausibile che mi è venuto in mente, e che il gestore dei tasti tramite le DirectX
è nettamente superiore e molto più veloce di qualsiasi altro gestore.

In alcune parti del codice, per gestire bene i tasti, sono stato costretto ad inserire un ciclo di pausa.
altrimenti tipo, Se premo ENTER e come se lo avrei premuto 10 volte consecutivamente.
anche con un piccolissimo tocco.

Per farlo incrementare di 1 dovevi proprio sfiorare il tasto.
penso che il problema sia causato proprio da questo fattore.

Stasera provo a cambiare la gestione dei tasti.
Anziché sfruttare l'input delle DirectX provo a sfruttare l'input del Form al KeyDown.
Essendo molto più lento, dovrebbe funzionare.

Ho appena fatto un test qui da dove lavoro nei 5 minuti di pausa, e col gestore dei tasti del Form
Non sballa. prosegue senza problemi.


PM Quote