Howdy, Stranger!

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

In this Discussion

Rookie needs help

edited June 2012 in Questions Posts: 8

I'm trying to make a simple game for my kid and learn some programming basics while I'm at it. The game is quite simple. Select a cave to explore by pressing on a cave on the screen. Inside there is either gold a monster or a sword. If there is a monster inside and you have a sword you defeat the monster otherwise game over. If there is gold inside, you collect it.

I fill the caves by doing a for loop on a table (array?) and assigning a random number of 1, 2 or 3 to each slot in the table

I'm running into a problem though. When a cave is clicked a value is set depending on what cave is pressed and then should return what is at cave[value] but is instead returning nil value. This has me totally stumped. Please review the code below and tell me where I've gone wrong so that I'm getting nil back instead of a 1 2 or 3

-- Use this function to perform your initial setup function setup()          value=99 end -- This function gets called once every frame function draw()     -- This sets a dark background color      background(40, 40, 50)          Drawblocks()     -- make stuff     if value==99 then         hidden = {}         for i =1,72 do             hidden[i]=math.random(1,3)-- fill the caves         end     end               value = 0          if CurrentTouch.state == BEGAN then         sprite("Planet Cute:Star",CurrentTouch.x, CurrentTouch.y)         vx=(CurrentTouch.x/8)         vy=(CurrentTouch.y/8)         xint=10         yint=90         count = 0         for i = 1,9 do -- first row, top left             for j = 1,8 do -- cycle across                 count = count + 1                 if vx > (xint-3) and vx < (xint+3) and vy > (yint - 3) and vy < (yint+3) then                     value = count                     print(hidden[value])--why does this return nil?                 end                 xint = xint + 10             end             yint=yint-10 -- move down a row             xint=10 -- reset xint         end     end     if CurrentTouch.state == ENDED then         xint = 10         yint = 90     end           end

Any help is appreciated.


  • edited June 2012 Posts: 563

    Hi @Jdrj - there is no function called Drawblocks() defined. If you comment that out in the code above it seems to work as you describe. If you have this class but haven't included the code in this post then the problem may be in there.

    BTW - I would suggest separating the touch handling and the drawing. That will make your App easier to code and maintain. draw() gets called about 60 times a second while a touch is event based. Use a state machine to keep track of what you want to draw each frame.

  • Posts: 8

    Thanks. Drawblocks is a separate function I wrote to draw some caves on the screen. Like you said, editing it out and things go well. Here is the code for Drawblocks (). I'll keep looking for errors.

    Drawblocks = class()
    function Drawblocks:init(x)
        size = 80
        hidden = {}
        for i = 1,9 do
            for a = 1,8 do
                cave = {sprite("Small World:Monster Den",xpos,ypos)}
                xpos = xpos + size
            xpos= WIDTH/8
            ypos= ypos - size


  • edited July 2012 Posts: 563

    @Jdrj - you need to delete the line: hidden = {} in Drawblocks

    A more object oriented approach would be to create a Cave class which knows what it contains and whether it has been touched.

    @Simeon has written a simple button class which is included in one of the Codea sample projects (Sounds Plus). Your cave is in effect an extended button. You could set up a hit function for your cave similar to the one in the Button class.

    Have a look at the tutorial at

  • Posts: 8

    Now that you point it out it's so insanely obvious. Thanks for the help.

Sign In or Register to comment.