Problema al restar puntos con un contador

Hola de nuevo,

He creado este script para restar puntos a un juego, y funciona, pero no como yo quiero, me explico:

“initialtime” me muestra 500 en el display, a este 500 le quiero restar el tiempo transcurrido del contador “clockText” cada vez que “ball” toca “platform”. Lo que intento conseguir es que si la pelota toca la plataforma y ha transcurrido 1 segundo, a 500 le descontaría 1 segundo y quedaría 499, pero como el contador sigue en marcha, si han transcurrido 3 segundos, no quiero que le reste 3 segundos a 500, quiero que se lo reste a 499 - 3 = 496, y así sucesivamente:

 —SI---------|-----------NO

                   |

500 -1-------|---------500 -1        

                   |

499 -3-------|---------499 -3

                   |

496 -5-------|---------497 -5

                   |

 491----------|---------495

Concluyendo, la pelota seguiría botando y cada vez que bote, que reste al resultado de  initialtime y no a 500.

Espero haberme explicado bien, por si alguien me puede ayudar.

Saludos :)  

Os dejo el código para que lo probéis en el simulador:

local physics = require "physics" physics.start() local score = 500 -------------------------------------------Initial Time-------------------------------------------------------- local initialtime = display.newText(score, 100, 200, "Helvetica", 40) -------------------------------------------Accountant-------------------------------------------------------- local clockText = display.newText("000", 100, 300, "Helvetica", 40) local secondsLeft = 0 -- secons local function updateTime() secondsLeft = secondsLeft + 1 seconds = secondsLeft % 60 timeDisplay = string.format("%03d", seconds ) clockText.text = timeDisplay end countDownTimer = timer.performWithDelay( 1000, updateTime, secondsLeft ) -------------------------------------------Collision--------------------------------------------------------- local platform = display.newRect( 0, 0, 280, 30 ) platform.surfaceType = "superbounce" platform.x, platform.y = display.contentCenterX, display.contentCenterY+200 physics.addBody( platform, "static", { bounce=0.0, friction=0.3 } ) local ball = display.newCircle( 0, 0, 15 ) ball.x, ball.y = display.contentCenterX+100, display.contentCenterY-40 physics.addBody( ball, "dynamic", { bounce=0.0, radius=20 } ) local function onCollision( self, event ) local collideObject = event.other if ( collideObject.surfaceType == "superbounce" ) then event.contact.bounce = 1 print(score - clockText.text) initialtime.text = score - clockText.text end end ball.collision = onCollision ball:addEventListener( "collision" )

Lo que está claro en ese código sin probarlo es que en ningún sitio actualizas “score”, por lo que siempre estás restando sobre 500
 
Donde pone

initialtime.text = score - clockText.text

debes poner

score = score - clockText.text initialtime.text = score

o

initialtime.text = initialtime.text - clockText.text

Te dejo que tu mismo arregles formatos entre textos y numeros.

Gracias por responder koormo,

De últimas, probando y probando lo tenía así…

initialtime.text = initialtime.text - clockText.text

Y al igual que de esta manera…

score = score - clockText.text initialtime.text = score

…me resta el doble de lo que marque clockText.text. Para arreglar esto, lo he intentado dividiendo clockText.text entre 2…

initialtime.text = initialtime.text - clockText.text /2 

…,más o menos, lo hace bien, pero hay veces que me sale con decimales, ( 468.5 ). Si lo imprimo…

print(initialtime.text - clockText.text / 2)

…en el Output del simulador de corona sdk, me aparecería así:

499.5

499

497.5

496

493.5

491

487.5

484

479.5

475

Porfi, ¿hay alguien que tenga una solución mejor que la mía u otro foro que me puedan aconsejar?, estoy atascado y no puedo continuar.

Saludos :unsure:

Hola intenta esto que creo que funciona. solamente cambiar para que solo detecte el evento de inicio de la colisión y emplea el score reduciendo.

Saludos

local function onCollision( self, event )

   local collideObject = event.other

   if (event.phase == “began”) then

     if ( collideObject.surfaceType == “superbounce” ) then

        event.contact.bounce = 1

      --print(“Hola”  , score - clockText.text, score, clockText.text)

         score = score - clockText.text

         initialtime.text = score

         --initialtime.text = score - clockText.text

     end

   end

end

Es la primera vez que voy una topic en portugués! :wink:

Al fin, Gracias jondugames por la solución, la tuya es más sencilla y sin complicaciones, yo ya había optado por jason, insertando la puntuación en puntoData[1] y recuperándola después:

------------------------------SALVAR PUNTOS EN puntos.json-- local puntoData = {} puntoData[1] = initialtime.text - clockText.text loadsave.saveTable(puntoData,"puntos.json", system.DocumentsDirectory) ------------RESCATAR PUNTOS DE puntos.json Y MOSTRARLOS EN initialtime.text------ puntoData = loadsave.loadTable("puntos.json", system.DocumentsDirectory) local function puntuacion(event) initialtime.text = puntoData[1] end tiempoPuntos = timer.performWithDelay( 100, puntuacion )

Saludos y gracias por interesaros. :slight_smile:

Lo que está claro en ese código sin probarlo es que en ningún sitio actualizas “score”, por lo que siempre estás restando sobre 500
 
Donde pone

initialtime.text = score - clockText.text

debes poner

score = score - clockText.text initialtime.text = score

o

initialtime.text = initialtime.text - clockText.text

Te dejo que tu mismo arregles formatos entre textos y numeros.

Gracias por responder koormo,

De últimas, probando y probando lo tenía así…

initialtime.text = initialtime.text - clockText.text

Y al igual que de esta manera…

score = score - clockText.text initialtime.text = score

…me resta el doble de lo que marque clockText.text. Para arreglar esto, lo he intentado dividiendo clockText.text entre 2…

initialtime.text = initialtime.text - clockText.text /2 

…,más o menos, lo hace bien, pero hay veces que me sale con decimales, ( 468.5 ). Si lo imprimo…

print(initialtime.text - clockText.text / 2)

…en el Output del simulador de corona sdk, me aparecería así:

499.5

499

497.5

496

493.5

491

487.5

484

479.5

475

Porfi, ¿hay alguien que tenga una solución mejor que la mía u otro foro que me puedan aconsejar?, estoy atascado y no puedo continuar.

Saludos :unsure:

Hola intenta esto que creo que funciona. solamente cambiar para que solo detecte el evento de inicio de la colisión y emplea el score reduciendo.

Saludos

local function onCollision( self, event )

   local collideObject = event.other

   if (event.phase == “began”) then

     if ( collideObject.surfaceType == “superbounce” ) then

        event.contact.bounce = 1

      --print(“Hola”  , score - clockText.text, score, clockText.text)

         score = score - clockText.text

         initialtime.text = score

         --initialtime.text = score - clockText.text

     end

   end

end

Es la primera vez que voy una topic en portugués! :wink:

Al fin, Gracias jondugames por la solución, la tuya es más sencilla y sin complicaciones, yo ya había optado por jason, insertando la puntuación en puntoData[1] y recuperándola después:

------------------------------SALVAR PUNTOS EN puntos.json-- local puntoData = {} puntoData[1] = initialtime.text - clockText.text loadsave.saveTable(puntoData,"puntos.json", system.DocumentsDirectory) ------------RESCATAR PUNTOS DE puntos.json Y MOSTRARLOS EN initialtime.text------ puntoData = loadsave.loadTable("puntos.json", system.DocumentsDirectory) local function puntuacion(event) initialtime.text = puntoData[1] end tiempoPuntos = timer.performWithDelay( 100, puntuacion )

Saludos y gracias por interesaros. :slight_smile: