Howdy, Stranger!

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

why can’t my function list1:selectFromTouch grab indices 1 - 9?

edited August 2018 in Questions Posts: 122

Update 2
* Basic highlighting implemented;
* fixme: slight lag when switching which item is selected
* https://pastebin.com/QPsmpAQv
———————————————-

Update 1
* Fixed the selectFromTouch function thanks to dave
* Broke up list1:scroll into seperate funcs
* Created list1:update function
* Minor tweaks on tweens - added twoif self.tween then tween.stop(self.tween) end blocks in if touch.state==ENDED for consistency
* Minor clean up on other functions, renamed some variables
* https://pastebin.com/qTy9VE42

———————————————-

OP
https://pastebin.com/gvfv0ihp

it works on the other indices after those. I’m not sure what’s wrong here. I’m also thinking that the indicies I can grab changes depending on how I scroll, since sometimes I struggle to grab 10.

You know it’s a textwall of doom when it’s a pastebin. sorry..

Comments

  • Posts: 1,359

    @xThomas - hmmm, curious - why are you using Codea to provide an index of Love2D functions? Aren’t you better setting something up on your Mac/pc to do that, or are you running Love2D on iOS?

  • edited August 2018 Posts: 122
    @Bri_G I alt tabbed between sublime and the wiki one too many times, remembered how pretty the Codea reference was, and decided to make one for love.. To answer your question, I haven’t tried using love2d with iOS yet, still getting the hang of it on PC

    As a project it should be pretty easy even for me, I don’t really need to plan it out - easy and fun :smile:

    (Although saying that is one thing, figuring out what went wrong with my selection code is another (took so long trying to figure it out, then my battery died :neutral: )
  • dave1707dave1707 Mod
    edited August 2018 Posts: 7,851

    @xThomas Forget my last comment. I deleted it because I didn’t look close enough to what you were doing. I’ll look at it again later.

  • dave1707dave1707 Mod
    Posts: 7,851

    @xThomas Check the values for your top and bottom variables in the function list1:selectFromTouch. You’re returning from the function in the if statement.

  • dave1707dave1707 Mod
    edited August 2018 Posts: 7,851

    @xThomas Try this function instead of yours. I don’t like the way I calculate index, but it seems to work.

    function list1:selectFromTouch(touch)
        index=((HEIGHT-touch.y+self.y)/(HEIGHT/9)+1)//1-9
        self.selected=items1[index]
        self.selected.state = touch.state
        print("selected index: "..index, self.selected.title)
    end
    

    After I posted the above code, I was able to change your function to work. See the comments I put in. I didn’t look at your code that close to see why I have to subtract 10 in yours and 9 in mine.

    function list1:selectFromTouch(touch)
        local top=self.y
        local bottom=self.y-(#items1*HEIGHT/9)
        self.height=top-bottom
    
        -- subtract 10 and comment out the if statement.
        local listY=touch.y-(top-self.height)-10
        --if listY>top or listY<bottom then return end
    
        local index=math.ceil(listY/(HEIGHT/9))
        index=#items1-index+1
        self.selected=items1[index]
        self.selected.state = touch.state
        print("selected index: "..index, self.selected.title, "at pos:y - "..listY)
    end
    
  • dave1707dave1707 Mod
    Posts: 7,851

    @xThomas I’m not sure how you’re doing your scrolling/choice calculations, but here’s how I do scrolling/choice in the getPosition function.

    displayMode(FULLSCREEN)
    
    function setup()    
        nbr=40
        w=150
        h=HEIGHT//9
        dy=0
        pos=0
        textMode(CORNER)
    end
    
    function draw()
        background(40, 40, 50)
        fill(255)
        text("Tap a box for position",WIDTH/2,HEIGHT-100)
        text("Slide finger up or down for more choices",WIDTH/2,HEIGHT-150)
        for z=1,nbr do       
            fill(59, 110, 122, 255)
            rect(0,HEIGHT-z*h+dy,w,h-5)
            fill(255)
            text(z,60,HEIGHT-z*h+dy+60)
        end
        if pos>0 then
            fill(255,0,0)
            text(pos,WIDTH*.75,HEIGHT/2)
        end
    end
    
    function touched(t)
        if t.state==BEGAN and t.x<200 then
            getPosition(t.y)
        elseif t.state==MOVING then
            dy=dy+t.deltaY
            if dy<0 then
                dy=0
            end
        end
    end
    
    function getPosition(y) 
        pos=(HEIGHT-y+dy)//h+1
        if pos<1 or pos>nbr then
            pos=0
        end
    end
    
  • edited August 2018 Posts: 122

    Lots of Thanks @dave1707

    Now that I have compared my code to yours, my mistake was indeed the if statement.

    ~if listY>top or listY<bottom then return end~

    That was a emergency bug fix because I would have an error if I scrolled and then tapped before it snapped back. The bug fix causes more bugs :lol: In hindsight a simple if not items1[index] then return end works better and is probably more efficient* :triumph:

    ————————

    Edit: I updated my code, you can see it in the OP. it’s basically the same, just a bit cleaner

    About my (original) scrolling code, the way I’ve coded it is a bit mixed

    function list1:scroll()
        self.dt = self.dt + 1
        if self.deltas[11] then
            table.remove(self.deltas, 1)
        end
        if self.deltas[1] and self.dt % 2 == 0 then
            table.remove(self.deltas, 1)
        end
        self.y = self.y + self.vel.y
        self.vel.y = self.vel.y * self.friction
        if not self.maxY or not self.minY then return end
        if self.y > self.maxY + 32 then
            if self.tween then tween.stop(self.tween) end
            self.vel.y = 0
            self.tween = tween(.25,self,{y=self.maxY},tween.easing.quadOut)
        elseif self.y < self.minY - 32 then
            if self.tween then tween.stop(self.tween) end
            self.vel.y = 0
            self.tween = tween(.25,self,{y=self.minY},tween.easing.quadOut)
        end
    end
    

    Scrolling by using velocity and friction is done with these variables

    • dt - timer for the deltas table, increments every tick
    • deltas - table holding the last 10 deltaY’s, removes position 1 every other tick
    • if deltas has more than 10 positions, we remove position 11
    • y, friction, vel represent the list’s position, friction and velocity

    Tweens are technically not for scrolling anymore, but if you scroll past the top or bottom of the list, tweens snap it back to the maxY or minY(and also stop tween, ans set vel.y to 0 because having more than one controller for the scrolling is kind of bad)

    if not minY or not maxY... just checks that those exist. I didn’t create those until the touched function runs because I’m scatterbrained

    now, in touched is where i actually calculate stuff

    every moving touch, deltaY is inserted into the deltas table

    when touches end, velocity is set to the average of the last ten deltas and the deltas table is cleared

Sign In or Register to comment.