简体   繁体   中英

function 'for - do - end" / moving object ( Corona Sdk )

I'm beginner for coding, I've questions : First I'd like know why that code is not moving :

local speed = 5
function cube ()
  for i = 1,20,2 do
    local rect = display.newRect(50,50,50,50)
    rect.x = screenleft-300 + (50*i)
    rect.y = _y
    rect.x = rect.x - speed
      if (rect.x < -450 )then
         rect.x = 1200
      end
  end
end

timer.performWithDelay(1, cube, -1)

Secondly : What's the difference between

Runtime:addEventListener( "enterFrame", cube )
and
timer.performWithDelay(1, cube, -1)

Because I get the same result with both of them

And to be done, Why when I use the function "for" to duplicate something like the square i've done upside, this one put the image behind eachother and not like the square beside eachother ( the image i'm trying to duplicate has more than 4 side )

Thanks for all your reply !


thks a lot dude , I know what you mean by here but my question is little bit weird maybe lol and maybe we can't do it I try to explain again :

for i=1,10,1 do
    local Circle = display.newCircle(50, 20, 20)
    Circle.x = _x + (50*i)
    Circle.y = _y 
    end

So here I've a Circle line like that 00000 (imagine 0 are circle ^^) and I want to make that line moving from the left to the right screen, but when i try to make it move with :

Circle.x = Circle.x - speed

Corona don't recognize the " circle.x " so I can't, maybe because is insert into the"FOR" SO my question is : "How to move this Circle line if that's possible with the "FOR" ?

I hope I've Been clearer Anyway, Thanks for all

I'll answer your second question first:

Runtime:addEventListener( "enterFrame", cube )

The function addEventListener adds a listener to the object's list of listeners. When the named event occurs (in this case "enterFrame"), the listener will be invoked and be supplied with a table representing the event. In your code, the listener will call cube() on every frame (normaly, games run at 60 frames per second).

timer.performWithDelay(delay, listener [, iterations])

performWithDelay does what it says it does: Call a specified function after a delay. The timer function returns an object that can be used with other timer.* functions. In your code timer.performWithDelay(1, cube, -1) the function is calling cube() every 1ms and it is going to do so forever. This is not a good thing to do. There's nothing catching the return of the timer function and it is going to be running forever.

Now, to answer your main question. I believe what you are trying to do is create a square an move it in the screen. If that's correct, here's how you should do it:

local square = display.newRect(100,100,50,50)
local speed = 2

-- called every frame
local function moveSquare()
    square.x = square.x + speed
end

Runtime:addEventListener("enterFrame", moveSquare)

The reason your code doesn't do what you want it to do is because you misunderstood a some basic CoronaSDK things.

Hope this little code helps you to understand more about how CoronaSDK works. Don't forget to check the documentation of Corona in http://docs.coronalabs.com/

You're creating an object locally in a loop and trying to move it outside of the loop. This doesn't work due to the way lua uses local variables. See http://www.lua.org/pil/4.2.html for more info about this.

Also, you'll need to place the objects into a single display group in order to move them easily. If you're using Box2D physics at all, I recommend reading up on it more at http://docs.coronalabs.com/api/library/physics/index.html .

Your code:

for i=1,10,1 do
    local Circle = display.newCircle(50, 20, 20)
    Circle.x = _x + (50*i)
    Circle.y = _y 
end

Should Be Changed to:

local Circle = display.newGroup(); --Forward declaration of Variable. Place this before any calls for it.
local speed = 2;

for i=1,10,1 do
    local object = display.newCircle(50,20,20);
    object.x = _x + (50*i);
    object.y = _y;
    Circle:insert(object); --Insert this local object into the display group
end

function moveCircle()
     Circle.x = Circle.x + speed;
end

Runtime:addEventListener( "enterFrame", moveCircle);

This will move the Circle line every frame, on the X-axis, by the speed variable's value.

If you're trying to move it with a for-loop, then we'd need to see more of you code in context.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM