Crear objeto y arrastrarlo automaticamente

Buenas a todos,

estoy creando un juego dondee tengo un menú inferior para crear distintos objetos.

El funcionamiento es el siguiente:

  • Click sobre un boton de la parte inferior.

  • Se crea un objeto.

  • Puedo arrastrar el objeto haciendole click y “drageando”

Bien, hay alguna forma de cuando se ha creado el objeto dispatchar el evento “touch” para que empiece a “dragearse”?

Muchas gracias.

Hola @sephirot36,

Does this help? It’s a basic touch-drag function:

[lua]

local function dragObject( event )
   local target = event.target
   local phase = event.phase

   if ( event.phase == “began” ) then
      local parent = target.parent
      display.getCurrentStage():setFocus( target )
      target.isFocus = true
      target.x0 = event.x - target.x
      target.y0 = event.y - target.y
      target.xStart = target.x
      target.yStart = target.y
      target:toFront()
   elseif ( target.isFocus ) then
      if ( phase == “moved” ) then
         target.x = event.x - target.x0
         target.y = event.y - target.y0
      elseif ( phase == “ended” or phase == “cancelled” ) then
         display.getCurrentStage():setFocus( nil )
         target.isFocus = false
      end
   end
   return true
end

[/lua]

Brent

Hola @Brent,

quizas no me he explicado bien.

Yo tengo un boton que crea un objeto, este objeto puede “dragearse” pero para ello hace falta que le haga touch, lo que necesito es que al crearse (cuando hago press en el boton) sin levantar el dedo ya esté el objeto “drag” y el objeto siga mi posicion del touch, sin tener que volver a hacer touch sobre el objeto.

P.D: Esa funcionalidad dragObject ya la tengo implementada y funciona correctamente, basicamente lo que quiero es :

obj= display.newImage(“levels/”…name…".png")

obj:setReferencePoint( display.CenterReferencePoint )
menuGroup:insert( obj )

obj:addEventListener(“touch”,onTouch)
obj:dispatchEvent({name=“touch”,phase=‘began’, target=obj })

Muchas gracias

Solucionado!

Al crear el objeto añado al Stage un listener de touch que dispatcha el evento touch del objeto.

Al sacar el dedo tras crear el objeto ya se elimina el vento del Stage y se peude interactuar con el touch del objeto normalmente.

[lua]

obj= display.newImage(“levels/”…name…".png")
obj:setReferencePoint( display.CenterReferencePoint )
obj.x = positionX
obj.y = positionY
menuGroup:insert( obj )

f(x) touch to drag obj{}

obj:addEventListener(“touch”,onTouch)

objetoCreadoActual=obj --global variable

local stage=display.getCurrentStage()
local function onTouch(event)
local t=obj
local phase =event.phase
if(objetoCreadoActual~=nil)then
if “began” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘began’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
elseif “moved” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘moved’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
elseif “ended” == phase or “cancelled” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘ended’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
objetoCreadoActual=nil
stage:removeEventListener(“touch”, onTouch)
end
end

return true
end
stage:addEventListener(“touch”, onTouch)[/lua]

Hola @sephirot36,

Does this help? It’s a basic touch-drag function:

[lua]

local function dragObject( event )
   local target = event.target
   local phase = event.phase

   if ( event.phase == “began” ) then
      local parent = target.parent
      display.getCurrentStage():setFocus( target )
      target.isFocus = true
      target.x0 = event.x - target.x
      target.y0 = event.y - target.y
      target.xStart = target.x
      target.yStart = target.y
      target:toFront()
   elseif ( target.isFocus ) then
      if ( phase == “moved” ) then
         target.x = event.x - target.x0
         target.y = event.y - target.y0
      elseif ( phase == “ended” or phase == “cancelled” ) then
         display.getCurrentStage():setFocus( nil )
         target.isFocus = false
      end
   end
   return true
end

[/lua]

Brent

Hola @Brent,

quizas no me he explicado bien.

Yo tengo un boton que crea un objeto, este objeto puede “dragearse” pero para ello hace falta que le haga touch, lo que necesito es que al crearse (cuando hago press en el boton) sin levantar el dedo ya esté el objeto “drag” y el objeto siga mi posicion del touch, sin tener que volver a hacer touch sobre el objeto.

P.D: Esa funcionalidad dragObject ya la tengo implementada y funciona correctamente, basicamente lo que quiero es :

obj= display.newImage(“levels/”…name…".png")

obj:setReferencePoint( display.CenterReferencePoint )
menuGroup:insert( obj )

obj:addEventListener(“touch”,onTouch)
obj:dispatchEvent({name=“touch”,phase=‘began’, target=obj })

Muchas gracias

Solucionado!

Al crear el objeto añado al Stage un listener de touch que dispatcha el evento touch del objeto.

Al sacar el dedo tras crear el objeto ya se elimina el vento del Stage y se peude interactuar con el touch del objeto normalmente.

[lua]

obj= display.newImage(“levels/”…name…".png")
obj:setReferencePoint( display.CenterReferencePoint )
obj.x = positionX
obj.y = positionY
menuGroup:insert( obj )

f(x) touch to drag obj{}

obj:addEventListener(“touch”,onTouch)

objetoCreadoActual=obj --global variable

local stage=display.getCurrentStage()
local function onTouch(event)
local t=obj
local phase =event.phase
if(objetoCreadoActual~=nil)then
if “began” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘began’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
elseif “moved” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘moved’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
elseif “ended” == phase or “cancelled” == phase then
objetoCreadoActual:dispatchEvent({name=“touch”,phase=‘ended’,
target=objetoCreadoActual ,x=objetoCreadoActual.x ,
y=objetoCreadoActual.y })
objetoCreadoActual=nil
stage:removeEventListener(“touch”, onTouch)
end
end

return true
end
stage:addEventListener(“touch”, onTouch)[/lua]