eloipuertas / ES2013Dimarts

VideoJoc del Grup de Dimarts d'Enginyeria del Software del Grau en Enginyeria Informàtica de la Universitat de Barcelona
http://eloipuertas.github.io/ES2013Dimarts/
Other
9 stars 6 forks source link

La velocidad de las plataformas depende del framerate #248

Closed dcorto closed 10 years ago

dcorto commented 11 years ago

Cuando el juego funciona en modo ventana, el movimiento es relativamente bueno, ya que se ejecuta el motor gráfico a 80FPS.

En modo, full screen, en mi máquina está corriendo a 800FPS por lo que las plataformas se mueven a mucha velocidad.

Vídeo -> http://youtu.be/zblvqsHNk8U?t=1m20s

En codiPlataformaCs.cs se debe usar la funcion "time.DeltaTime" (http://docs.unity3d.com/Documentation/ScriptReference/Time-deltaTime.html) para hacer uniforme el movimiento independientemente del framerate del motor gráfico.

hiroCat commented 10 years ago

@DavidOrlaz això és teu o és del @AlcoholNahMas ?

DavidOrlaz commented 10 years ago

En principi es cosa de @AlcoholNahMas, que es qui toca el codi aquest.

AlcoholNahMas commented 10 years ago

El problema que tinc es que tot i que ho poso tot a Delta.Time per moure en metres en comptes de frames, el contador que tinc creat per fer canviar el sentit del moviment de les plataformes depen del frame. I tot i que ho poso en X metres a recorre en quan arriba al frame Y em canvia el sentit. La solucio seria que el canvi de sentit es crides quan ha recorregut tots els metres que havia pero no conec cap recurs d'alguna biblioteca de unity que serveixi. Estic buscan altres solucions a veure si trobo algo que sigui bo.

AlcoholNahMas commented 10 years ago

Tinc un dubte que m'esta tornan boig, perque segons tinc entes i com creia com funcionava el update no pot ser. Si us fixeu en el video de @DCorto la plataforma tot i anar a una velocitat superior degut a que es criden mes frames per segon segueix arriban a la distancia que se li ha introduit (a no ser que tu david aixi canviat la distancia per fer les proves), pero no pot ser, perque el contador que utilitzo per detectar la distancia a recorre s'incrementa en cada frame a la funcio "update()". Per logica com que es criden mes frames per segon la variable hauria d'augmentar mes rapid fent que la distancia que li dona temps a recorre a la plataforma sigui menor. Algu em pot dir perque en el video del david recorre la distancia correcte? Soc jo que m'estic confonen? No ho entenc com es que funciona en el video.

La solucio que he penjat es canviar el codi per Delta.Time perque si la distancia recorre sempre independenment dels frames nomes s'hauria d'arreglar la velocitat i amb aixo ja ho soluciona.

dcorto commented 10 years ago

Ahora no te puedo mirar el código, estoy fuera, mañana intento verlo y te echo un cable si eso. Pero creo, que es como dices. La funcion delta.time sirve exactamente para generar eventos con independencia del framerate si no me equivoco.

Mañana te digo algo. ;)

dcorto commented 10 years ago

Y no, no cambié nada para las pruebas. Simplemente está grabado a full screen.

dcorto commented 10 years ago

@AlcoholNahMas mira en la documentación de la función Time.DeltaTime -> http://docs.unity3d.com/Documentation/ScriptReference/Time-deltaTime.html Tienes un ejemplo:

function Update () { // Move the object 10 meters per second! var translation : float = Time.deltaTime * 10; transform.Translate (0, 0, translation); }

dcorto commented 10 years ago

@AlcoholNahMas este bug sigue latente actualmente. Demo -> http://youtu.be/rNWSNSGeiu0?t=2m49s (Minuto 2:49)

En la parte superior izquierda del vídeo se ven los frames del motor gráfico (unos 700) a pantalla completa. Y claramente la plataforma no funciona.

En cambio, grabado en modo ventana (80 fps de media), baja más la plataforma pero aún no es suficiente. Se puede ver aquí -> http://www.youtube.com/watch?v=TNIrNHRDUv4&feature=youtu.be

Es fallo mio por no probarlo antes de la integración y hacer saltar las alarmas en el momento adecuado. También dí por hecho de que el código qué comentamos hace 1 semana funcionaba y todo lo contrario :(

Así pues, la mejor solución, es modificar la parte siguiente:

cont++; if(distancia==cont){ direccio = !this.direccio; cont=0; }

por una comprobación de la posición actual (x / y / z, en funcion del eje que debe moverse en cada plataforma ) contra la posición final deseada y si es superior (o inferior) hacer el cambio de sentido, idem, para cuando la posición sea superior (o inferior) a la posición inicial.

El tema del DeltaTime está perfecto en el sentido de que cada incremento de posición es independiente del frame rate, pero lo que no es independiente es la comprobación actual del contador.

AlcoholNahMas commented 10 years ago

Exactament aixo es el k deia missatges anteriors k no podia ser que el contador funciones si navem a mes frames per segon, provare aixo k dius, es la millor solucio i no tindra res a veure amb els frames ja que la velocitat ja nava be. El que no entenc es perque quan ho vam provar en una build va funcionar. En principi quan la vam crear no era a mes frames de lo normal? @DCorto

dcorto commented 10 years ago

@AlcoholNahMas no te preocupes, hazlo como hemos comentado mirando la posición inicial y final, pide ayuda a @casals90 si es necesario y hacemos pruebas a full.

dcorto commented 10 years ago

Muevo la issue al Sprint 5 milestone para no perderle la pista :P

AlcoholNahMas commented 10 years ago

sisi moula al sprint 5 aixi la tenim clixada. ara em posare a ferla, segurament acabi a les tantes pero amb la calma dema to mires, sino ho acabes akesta matinada dema ho fai amb un plis aprofitan k no tenim ADE

AlcoholNahMas commented 10 years ago

Estimacio: 8 Condicio finalitzacio: que compleixi els punts "Que ha de fer la plataforma"

Bufff per fi sembla que ho he aconseguit, me tornat boig amb aixo... pensava que seria cosa facil pero ni de broma... A nivell algorismic es una obra d'art, els "waitforseconds" no es poden utilitzar tan lliurament com sembla i barrejar-los amb funcions que es criden a cada "update" no es gens bona idea (el problema l'algorisme de les plataformes es crida a cada update), us ho dic per a que ho eviteu ni intenteu fero si en un futur feu mes coses amb Unity. Kuan vulguis mires els resultats @DCorto, ni gastis temps en mirarte el codi, simplement mira que funcioni tot com es demana ;)

Que ha de fer la plataforma:

Problemes que he trobat i pregunta aver si algu em sap dir el perque: Al posar la posicio final de la plataforma em baso amb el que veig a la pantalla de Unity sobre la informacio de l'objecte. Per exemple la plataforma1 esta a Y=-10.5 incial segons la finestra "transform" de l'objecte en Unity, pero al agafar la posicio inicial de la plataforma en el script em posa que la Y es 7.6 positiu. Aixo te un perque? o es la finestra transform de l'objecte no et diu la posicio real? He deixat un debug per a que quan executis el codi et vagi imprimin la posicio Y a veure si em saps dir que pasa. El problema aquest tampoc li donaria molta importancia perque igualment funciona i si cal jo mateix colocare una per una totes les plataformes del mapa i ajustare les distancies, pero ja era mes per curiositat, saber que pasa.

Qualsevol cosa mo dieu!

DavidOrlaz commented 10 years ago

Potser m'equivoco, però crec que això de les posicions té a veure amb que les plataformes estan dins d’un objecte “PlataformesLliscants” i llavors aquest Y=-10.5 que et surt és en relació a “PlataformesLliscants”. Mentre que el Y=7.6 positiu és la posició real en relació a tota l’escena.

dcorto commented 10 years ago

Lo valido lo antes posible ;)

dcorto commented 10 years ago

En principio las plataformas ya son frame independientes, pero no acaban de ir del todo bien ya que la primera por ejemplo, a veces, se queda en el suelo y no vuelve a subir nunca más :(

La segunda plataforma no he conseguido hacerla funcionar.

dcorto commented 10 years ago

Sigo haciendo pruebas, el tema es qué no se como reproducir el error, es raro :P

dcorto commented 10 years ago

@AlcoholNahMas si en lugar de usar el método: this.transform.position.x para obtener la posición de la plataforma, tiras del método this.transform.localPosition.x ya no te pasa lo que comentaste ayer sobre las coordenadas.

Y además con el localPosition es más facil programar los recorridos para @DavidOrlaz, debugar y hacerlo más preciso.

DavidOrlaz commented 10 years ago

David lo que decías de que no habías conseguido hacer funcionar la segunda plataforma creo que he visto el fallo mientras colocaba todos los botones nuevos. Lo que pasaba, al menos en el segundo botón, era que el trigger que activaba la plataforma estaba a 5km del botón por algún motivo que desconozco. Ahora con los nuevos botones no debería pasar, pues tienen todos los triggers en su sitio.

Aún así, no he colocado las plataformas en su sitio a espera de que esta issue se dé por finalizada :)

AlcoholNahMas commented 10 years ago

Val, primer fare el canvi a "this.transform.localPosition.x" aixo es un plis. Pero la part que em dius que no saps com as aconseguit que la plataforma es quedi avaix sempre, saps com ho as fet? aixi miro que pot pasar pero en principi no es normal que pasi, comensare a revisar casos derrors aver k trobo

dcorto commented 10 years ago

Perfecto! Hoy terminamos esto seguro ;)

dcorto commented 10 years ago

Gerard, aún lo he podido reproducir el bug y saber qué pasa exactamente, pero cambiamos eso que he comentado de la detección del cambio de posición y probamos de nuevo. Nice work.

AlcoholNahMas commented 10 years ago

Ja he canviat que utlitzi el "this.transform.localPosition.x" i he afegit que no comprovi les posicion duna direccio si no esta activada. @DCorto

L'error diria k ja se kuan pasa, quan clices molts cops seguits i rapidament el boto, exemple 10 cops en 1.5 segons i es dona el cas que la plataforma esta en la posicio inicial o final del recorregut li pilla un bug i es descoloca, deu ser que al anar canvian la variable "botoActvat" i narse cridan l'update tot el rato algun boolea del codi es deu posa en un valor incorrecte. Assignatura de SO2 amb les variables goblals, semaforts,etc. Almenys aixo es el k crec i els cops k em dona lerror es a una posicio final o incial.

Solucio k crec jo: He estat intentan mil i una coses, amb valors absoluts, canvian el metode de recorre, de tot. No ho he pogut solucionar. I si simplement fem que el player no pugui clicar el boto fins que no acaba la animacio? aixi impedim k clicli N cops en un periode curt de temps i de pas queda mes realista l'animacio. Desde player poseu un delay a una variable del pal "potClicarBoto" i kuan es crida a un boto que akesta es posi en "false" i fins k no pasin 3 segons o algo k no torni a estar "true". Sino relament no se solucionaro. Si no s'arregles jo mateix parlo amb el @eloipuertas i li explico que no entenc que pasa i que si pot evitar de clicar molts cops. Perque per lo demes funciona perfecte la plataforma.

dcorto commented 10 years ago

Tranquilo, voy a seguir haciendo pruebas para intentar depurar el error. Funcionan bien, solamente es lo que comentas, que en unos casos se quedan "paradas" y ni bajan ni suben, pero seguro que es un detalle sutil qué no vemos. Le doy yo mismo un vistazo yo mismo y comento qué tal.

dcorto commented 10 years ago

@AlcoholNahMas le he dado una vuelta más, falta probarlo al 100% con todas las plataformas. Sólo he forzado la dirección en cada caso para que no se queden "pilladas" en los límites. Tenemos la suerte de que todas empiezan siempre desplazando en el mismo sentido ( y -> -y x -> -x y z -> -z).

Lo ideal sería disponer una variable que indique el sentido de inicio de cada plataforma, pero de momento, ahora mismo no hace falta.

AlcoholNahMas commented 10 years ago

Quan dius forzar la direccio vols dir que quan una plataforma arriba al final la mous tu manualment cap al sentit que hauria de fer despres? Val ja mestic miran els malabars que as fet al codi. Si dius que funciona ja podem donar el bug per soluciontat, merci!

dcorto commented 10 years ago

En lugar de un direccion = !direccion lo asigno a true o false directamente, en lugar de invertir el valor. En todas el sentido es igual.

Me falta probar más, mañana lo termino, hoy no tengo más tiempo :(