Jump to content

[TOPIC: topicViewTemplate]
[GLOBAL: userSmallPhoto]
Photo

Problema al restar puntos con un contador
Started by quinohp Oct 16 2016 12:43 AM

6 replies to this topic

Best Answer jondugames , 07 November 2016 - 04:24 AM

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

[TOPIC CONTROLS]
This topic has been archived. This means that you cannot reply to this topic.
[/TOPIC CONTROLS]
[modOptionsDropdown]
[/modOptionsDropdown]
[reputationFilter]
[TOPIC: post.html]
#1

quinohp

[GLOBAL: userInfoPane.html]
quinohp
  • Enthusiast

  • 37 posts
  • Corona SDK

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" )


[TOPIC: post.html]
#2

koormo

[GLOBAL: userInfoPane.html]
koormo
  • Observer

  • 19 posts
  • Corona SDK

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.



[TOPIC: post.html]
#3

quinohp

[GLOBAL: userInfoPane.html]
quinohp
  • Enthusiast

  • 37 posts
  • Corona SDK

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


[TOPIC: post.html]
#4

quinohp

[GLOBAL: userInfoPane.html]
quinohp
  • Enthusiast

  • 37 posts
  • Corona SDK

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:



[TOPIC: post.html]
#5

jondugames

[GLOBAL: userInfoPane.html]
jondugames
  • Observer

  • 22 posts
  • Corona SDK

  Best Answer

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


[TOPIC: post.html]
#6

remiduchalard

[GLOBAL: userInfoPane.html]
remiduchalard
  • Contributor

  • 306 posts
  • Corona SDK

Es la primera vez que voy una topic en portugués! ;)



[TOPIC: post.html]
#7

quinohp

[GLOBAL: userInfoPane.html]
quinohp
  • Enthusiast

  • 37 posts
  • Corona SDK

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. :)




[topic_controls]
[/topic_controls]