# Algorithm [LUA]Getting the mouse position on a table

## Recommended Posts

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!

##### Share on other sites

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.

##### Share on other sites

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!

Edited by orange451

##### Share on other sites
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?

Edited by NewtonEinherjar

##### Share on other sites

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.

##### Share on other sites
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.

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

##### Share on other sites

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.

##### Share on other sites
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

##### Share on other sites

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.)

Edited by Zakwayda

##### Share on other sites

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

## Create an account or sign in to comment

You need to be a member in order to leave a comment

## Create an account

Sign up for a new account in our community. It's easy!

Register a new account

1. 1
2. 2
3. 3
Rutin
19
4. 4
khawk
14
5. 5
frob
12

• 9
• 11
• 11
• 23
• 12
• ### Forum Statistics

• Total Topics
633657
• Total Posts
3013197
×