[LUA]Getting the mouse position on a table

Started by
9 comments, last by NewtonEinherjar 5 years, 4 months ago

I'm writing a little game for visual deficient people, but I'm having a hard time getting the mouse position. Let me explain :

I need to know where in the table the mouse cursor is, without having a click, and then I want to play a sound. That sound would be different for every position. Any thoughts? Thanks, in advance!

e.g., when the mouse is on the 1st box would be played the audio "a1", when it's on the 2nd box, "a2", and so on.

I tried with:


mouse_x, mouse_y = get_Position()

if mouse_x and mouse_y == map[x][y] then
if map[x][y] == 0.1 then
Audio:play()

But it makes a loop and the sound keeps playing forever!

Advertisement

Since Lua neither has mouse nor audio capabilities you are using a library. Which is it?

 

You need to be able to either ask the playing audio if it's still playing and avoid calling play again, or add a countdown variable so you only call play once it's zero.

Fruny: Ftagn! Ia! Ia! std::time_put_byname! Mglui naflftagn std::codecvt eY'ha-nthlei!,char,mbstate_t>

I'm going to assume your get_Position() function is working correctly...

 

Maybe compare it like this:


if ( map[mouse_x][mouse_y] == 0.1 ) then
	Audio:Play()
end

I assume this is what you're trying to do... More information would be nice!

4 hours ago, orange451 said:

Eu estou indo supor que sua função get_Position () está funcionando corretamente ...

 

Talvez compare isso assim:




 

Eu suponho que isso é o que você está tentando fazer ... Mais informações seria bom!

I'm getting a ERROR when I try this 


Error

main.lua:333: attempt to index a nil value


Traceback

main.lua:333: in function 'update'
[C]: in function 'xpcall'

 

The code: 


mouse_x, mouse_y = love.mouse.getPosition()
  
  for y=1, #map do
    for x=1, #map[y] do     
       if (map[mouse_x][mouse_y] == 0.1) then
           audio_a1:play()

       end

  end

end

And the map:


function love.load()  

  -- MAPA DO ÁUDIO
   map =  { 
        { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
        { 1, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 0.10, 0.11, 0.12, 0.13, 0.14, 0.15, 1},
        { 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1},
        { 1, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 2.10, 2.11, 2.12, 2.13, 2.14, 2.15, 1},
        { 1, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, 3.11, 3.12, 3.13, 3.14, 3.15, 1},
        { 1, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 4.10, 4.11, 4.12, 4.13, 4.14, 4.15, 1},
    { 1, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 5.10, 5.11, 5.12, 5.13, 5.14, 5.15, 1},
        { 1, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 6.10, 6.11, 6.12, 6.13, 6.14, 6.15, 1},
        { 1, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 7.10, 7.11, 7.12, 7.13, 7.14, 7.15, 1},
    { 1, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 8.10, 8.11, 8.12, 8.13, 8.14, 8.15, 1},
    { 1, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 9.10, 9.11, 9.12, 9.13, 9.14, 9.15, 1},
    { 1, 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.10, 10.11, 10.12, 10.13, 10.14, 10.15, 1},
        { 1, 11.1, 11.2, 11.3, 11.4, 11.5, 11.6, 11.7, 11.8, 11.9, 11.10, 11.11, 11.12, 11.13, 11.14, 11.15, 1},
    { 1, 12.1, 12.2, 12.3, 12.4, 12.5, 12.6, 12.7, 12.8, 12.9, 12.10, 12.11, 12.12, 12.13, 12.14, 12.15, 1},
    { 1, 13.1, 13.2, 13.3, 13.4, 13.5, 13.6, 13.7, 13.8, 13.9, 13.10, 13.11, 13.12, 13.13, 13.14, 13.15, 1},
    { 1, 14.1, 14.2, 14.3, 14.4, 14.5, 14.6, 14.7, 14.8, 14.9, 14.10, 14.11, 14.12, 14.13, 14.14, 14.15, 1},
    { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 
    }


function love.update()


  mouse_x, mouse_y = love.mouse.getPosition()
  
  for y=1, #map do
    for x=1, #map[y] do     
       if (map[mouse_x][mouse_y] == 0.1) then
          audio_a6:play()
       end
  end

end

btw, how do I get the coordinates of the map, please?

There may be multiple issues here, but I'll just mention a couple things for now.

First, perhaps you could tell us specifically which statement is generating the error.

Second, you seem to be iterating over the coordinates of the map (x and y), but not doing anything with those coordinates, which raises the question of what the nested loop is for.

26 minutes ago, Zakwayda said:

Pode haver vários problemas aqui, mas vou mencionar algumas coisas por enquanto.

Primeiro, talvez você possa nos dizer especificamente qual declaração está gerando o erro.

Segundo, você parece estar interagindo com as coordenadas do mapa (x e y), mas não fazendo nada com essas coordenadas, o que levanta a questão de qual é o loop aninhado.

About the error:


function love.update()

mouse_x, mouse_y = love.mouse.getPosition()
  
  for y=1, #map do
    for x=1, #map[y] do     
        if (map[mouse_x][mouse_y] == 0.1) then  -- this is the error line
             audio_a6:play()
      end
    end
  end
end

Can you explain me better about loop nested and how am I interacting with the coordinates? Please

Unless 'map' is nil, the error is likely because 'mouse_x' is an invalid index.

The loop I'm talking about is this:


for y=1, #map do
  for x=1, #map[y] do
    ...
  end
end

You may already know this, but this is a 'nested' loop because it's one loop inside another loop. This particular loop loops over every coordinate (x, y) in 'map'.

The reason I mention it is that the loop doesn't accomplish anything. 'x' and 'y' are never used outside the loop statements themselves. All you're doing is executing this bit of code:


if (map[mouse_x][mouse_y] == 0.1) then
  audio_a6:play()
end

Repeatedly for no apparent reason.

I suspect this is just due to a conceptual error. One thing that might help is to ask yourself why you think the loops are necessary.

6 hours ago, Zakwayda said:

A menos que 'map' seja nil, o erro provavelmente é porque 'mouse_x' é um índice inválido.

O loop que estou falando é o seguinte:




    ...

Você pode já saber disso, mas este é um loop 'aninhado' porque é um loop dentro de outro loop. Esse loop em particular faz um loop sobre cada coordenada (x, y) em 'map'.

A razão pela qual menciono é que o loop não realiza nada. 'x' e 'y' nunca são usados fora das próprias instruções de loop. Tudo o que você está fazendo é executar esse código:



Repetidamente sem motivo aparente.

Eu suspeito que isso seja apenas devido a um erro conceitual. Uma coisa que pode ajudar é se perguntar por que você acha que os loops são necessários.

Right.

Now I need yhe audio to play when I press the left button, but it does not work. Can you help me?

This is the code:

 


function CheckClick(mouse_x, mouse_y, button)
      if button == '1' then
        if (map[x][y] == 0.1) then
           audio_a1:play()
        end
      end
    end


  

 

In the last code excerpt you posted, 'mouse_x' and 'mouse_y' aren't used, and it's not clear what 'x' and 'y' are, so I'd look at that first. (If 'x' and 'y' exist in some enclosing scope, perhaps you could clarify that.)

Well, thanks everyone who helped me! I did fix it! I appreciate all the help, guys!

This topic is closed to new replies.

Advertisement