Jump to content
  • Advertisement
NewtonEinherjar

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 this post


Link to post
Share on other sites
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.

Share this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
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.

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

Share this post


Link to post
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 this post


Link to post
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 this post


Link to post
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 this post


Link to post
Share on other sites

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

Sign in

Already have an account? Sign in here.

Sign In Now

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!