Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Need help: Using tables to shoot arrow

Hi,
I'm a beginner with Lua and Codea. I have a basic understanding of tables. In this project, I need to have an arrow (shown as a sprite) shoot across the screen at my touch. My current problem is that the arrow resets at the assigned (x,y) position every time I touch the screen, instead of spawning a new arrow. How can I fix this? Alternative ways to do this? (And I'm aware that my code is very flawed other than this error, though not by anything big enough to prevent it from running.)

function setup() 
    B={}  --table to hold balloons
    S={}
    dude=readImage("SpaceCute:Rocketship")
    backgrnd=readImage("Documents:Galaxy yes")
    star=readImage("Planet Cute:Star")
    gameover=readImage("Documents:Game over")
    dudeX=100 dudeY=HEIGHT/2 dudeSize=100 dudeSpeed=2
    score=0
    balloonFrequency=5 --number of balloons released per second
    LaunchBalloon()  --set off the first balloon
    LaunchStar()
    timer=0 --initialise timer
end
function LaunchBalloon()
    b={} --a table to hold details of our new balloon
    b.x=WIDTH
    b.y=math.random(0,HEIGHT)
    b.w = math.random(30,80)  --width
    --make height dependent on width, to keep the proportions reasonable
    b.h = 50 --height
    b.s = math.random(5,15) --speed in pixels/second
    b.c=color(0, 0, 0, 255)
    table.insert(B,b) --add to our table of balloons
end
function LaunchStar()
    s={}
    s.x=dudeX+dudeSize/2
    s.y=dudeY
    s.s=30
    s.sp=7.5
    table.insert(S,s)
end
function draw()
    sprite(backgrnd,WIDTH/2,HEIGHT/2)
    sprite(dude,dudeX,dudeY,dudeSize)
        dudeY=dudeY-dudeSpeed 
        dudeSpeed=dudeSpeed+.25
    sprite(star,s.x,s.y,s.s)  
    timer=timer+DeltaTime
    if timer>1/balloonFrequency then 
        LaunchBalloon()  
        timer=0 --reset timer
    end
    for i,b in pairs(B) do 
        b.x=b.x-b.s --adjust y position using speed
        if b.x-b.h/2>HEIGHT then table.remove(B,i) end --delete balloon if it goes off screen
        fill(b.c) --set colour for this balloon
        ellipse(b.x,b.y,b.w,b.h)
        --check for collision with star
        if s.x+s.s/2>b.x-b.w/2 --if front of star hits front of balloon and
        and s.y+s.s/2>b.y-b.h/2 --if top of star hits bottom of balloon and 
        and s.y-s.s/2<b.y+b.h/2 --if bottom of star hits top of balloon then
        then score=score+1 print("Hit!",score) 
            table.remove(B,i) --delete this balloon
            b.x=-1  --reset balloon   
        end
        if dudeX+dudeSize/2>b.x-b.w/2 --if front of star hits front of balloon and
        and dudeY+dudeSize/2>b.y-b.h/2 --if top of star hits bottom of balloon and 
        and dudeY-dudeSize/2<b.y+b.h/2 then --(I know I need to finish this conditional)     
        end
    end 
    for i,s in pairs(S) do
        s.x=s.x+s.sp 
        if s.x-s.s/2>WIDTH then --if star leaves screen, remove from table 
            table.remove(S,i)
        end
    end
end
function touched(touch)
   if touch.state==BEGAN then
        dudeSpeed=dudeSpeed-8
        LaunchStar()
    end
end

Comments

  • dave1707dave1707 Mod
    Posts: 10,053

    @kjsheavahs See my example in the discussion Arrow to shoot multiple arrows. You can remove the table code to just shoot 1 arrow.

  • dave1707dave1707 Mod
    edited January 2016 Posts: 10,053

    @kjsheavahs I made 2 corrections in your draw function. See the comments added code to go thru star table where I made additions. You were just missing 2 for loops for the star table.

    function draw()
        background(255)
        --sprite(backgrnd,WIDTH/2,HEIGHT/2)
        sprite(dude,dudeX,dudeY,dudeSize)
            dudeY=dudeY-dudeSpeed 
            dudeSpeed=dudeSpeed+.25
    
        -- added code to go thru star table
        for a,s in pairs(S) do
            sprite(star,s.x,s.y,s.s)
        end 
    
        timer=timer+DeltaTime
        if timer>1/balloonFrequency then 
            LaunchBalloon()  
            timer=0 --reset timer
        end
        for i,b in pairs(B) do 
            b.x=b.x-b.s --adjust y position using speed
            if b.x-b.h/2>HEIGHT then table.remove(B,i) end --delete balloon if it goes off screen
            fill(b.c) --set colour for this balloon
            ellipse(b.x,b.y,b.w,b.h)
    
            --check for collision with star
    
            -- added code to go thru star table
            for a,s in pairs(S) do
                if s.x+s.s/2>b.x-b.w/2 --if front of star hits front of balloon and
                and s.y+s.s/2>b.y-b.h/2 --if top of star hits bottom of balloon and 
                and s.y-s.s/2<b.y+b.h/2 --if bottom of star hits top of balloon then
                then score=score+1 print("Hit!",score) 
                    table.remove(B,i) --delete this balloon
                    b.x=-1  --reset balloon   
                end
            end
    
            if dudeX+dudeSize/2>b.x-b.w/2 --if front of star hits front of balloon and
            and dudeY+dudeSize/2>b.y-b.h/2 --if top of star hits bottom of balloon and 
            and dudeY-dudeSize/2<b.y+b.h/2 then --(I know I need to finish this conditional)     
            end
        end 
        for i,s in pairs(S) do
            s.x=s.x+s.sp 
            if s.x-s.s/2>WIDTH then --if star leaves screen, remove from table 
                table.remove(S,i)
            end
        end
    end
    
  • @dave1707 Oh, thanks so much -- it's actually pretty clear to me now!

Sign In or Register to comment.