Ir para conteúdo
  • 0

Percorrer um array dentro de um array. Systema de som.


Developer Berg

Pergunta

olá gente, boa noite, queria a ajuda de algum Scripter pra me dá uma ajudinha ligeira. n sou muito conceituado com lua, e sim com java e c++. mas vamos lá.

estou com um sistema de som que reproduz som em uma posição especifica do mapa, porem ele funciona com apenas 1 posição. só que quando ponho uma nova posição ou seja um array novo de posições diferentes dentro do array de "Sons" ele repete somente 1 segundo do arquivo mp3. creio eu que seja algum bug em algum if de comparação dentro do for que percorre o array. se alguém me ajudar fico agradecido.

 

Array sounds, e dentro do array, um array de posições e a string da música.

SOUNDS = {--area sounds
	{fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
}

quando eu ponho somente um array de posições ele funciona. agr se eu fizer assim

SOUNDS = {--area sounds
	{fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	{fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}

ele faz o bug que eu falei a cima.

 

vou deixar a parte do código

 

require('irrklua')
require('ex')

SOUNDS_CONFIG = {
	folder = 'mods/Advanced Sound/Sounds/',
	loop=false,
	start_paused=false,
	checkInterval = 500,
}



local UPDATESOUND_OPCODE = 85
local PAUSESOUND_OPCODE = 81

SOUNDS = {--area sounds
	{fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	{fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}
local toggleSoundEvent
local e
local audio = nil
local window = nil
local volume = 100
local str
function init()
	connect(g_game, { onGameEnd = terminate })
	window = modules.client_options.audioPanel
	str = string.explode(window:getChildById('musicSoundVolumeLabel'):getText(), ":")
	volume = tonumber(str[2])
	ProtocolGame.registerExtendedOpcode(UPDATESOUND_OPCODE, getSound)
	ProtocolGame.registerExtendedOpcode(PAUSESOUND_OPCODE, pauseSound)
	e = cycleEvent(iniciar, SOUNDS_CONFIG.checkInterval)
end
function iniciar()
	if (g_game.isOnline()) then
		removeEvent(e)
		toggleSoundEvent = addEvent(startAsound, SOUNDS_CONFIG.checkInterval)
	end
end

local m 
function startAsound()
	local player = g_game.getLocalPlayer()
	if not player then return end
	
	local pos = player:getPosition()
	for i = 1, #SOUNDS do
		if(isInPos(pos, SOUNDS[i].fromPos, SOUNDS[i].toPos)) then
			if audio == nil then
				m = irrklua.playMusic(SOUNDS_CONFIG.folder..SOUNDS[i].sound, true, SOUNDS_CONFIG.start_paused)
				str = string.explode(window:getChildById('musicSoundVolumeLabel'):getText(), ":")
				volume = tonumber(str[2])
				irrklua.setVolume(m, volume/100)
				audio = true
			end
		else
			audio = nil
			irrklua.setPaused(m, true)
			removeEvent(toggleSoundEvent)
		end
	end
	toggleSoundEvent = scheduleEvent(startAsound, SOUNDS_CONFIG.checkInterval)
end

function pauseSound(protocol, opcode, buffer)
	if opcode == 81 then
		irrklua.pauseAll()
	end
end

function terminate()
	disconnect(g_game, { onGameEnd = terminate })
	e = cycleEvent(iniciar, SOUNDS_CONFIG.checkInterval)
	audio = nil
	irrklua.pauseAll()
end

function isInPos(pos, fromPos, toPos)
	return
		pos.x>=fromPos.x and
		pos.y>=fromPos.y and
		pos.z>=fromPos.z and
		pos.x<=toPos.x and
		pos.y<=toPos.y and
		pos.z<=toPos.z
end

 

Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

Posso estar enganado mas não esta faltando o índice ai não? Tipo:

SOUNDS = {--area sounds
	[1] = {fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	[2] = {fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}

Testa e me fala xD

Link para o comentário
Compartilhar em outros sites

  • 0
18 minutos atrás, SirDubstep disse:

Posso estar enganado mas não esta faltando o índice ai não? Tipo:


SOUNDS = {--area sounds
	[1] = {fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	[2] = {fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}

Testa e me fala xD

fiz com os índices [1] e [2] como vc falou e continuei com o mesmo problema, porem eu modifiquei para [0] e [1] pq 0 é onde inicia o tamanho do array, e funcionou, mas agr ele só está executando o índice [1] e ignorando o indice [0]

 

SOUNDS = {--area sounds
	[0] = {fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	[1] = {fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}
está execultando o vetor [1], porem não execulta o vetor [0]

 

Link para o comentário
Compartilhar em outros sites

  • 0
Agora, Developer Berg disse:

fiz com os índices [1] e [2] como vc falou e continuei com o mesmo problema, porem eu modifiquei para [0] e [1] pq 0 é onde inicia o tamanho do array, e funcionou, mas agr ele só está executando o índice [1] e ignorando o indice [0]

 


SOUNDS = {--area sounds
	[0] = {fromPos = {x = 989, y = 884, z = 7}, toPos = {x = 1072, y = 946, z = 7}, sound = "Musica1.mp3"},
	[1] = {fromPos = {x = 940, y = 919, z = 7}, toPos = {x = 968, y = 949, z = 7}, sound = "Musica2.mp3"},
}
está execultando o vetor [1], porem não execulta o vetor [0]

 

Perdão pelo erro hahaha

Troca essa linha:

for i = 1, #SOUNDS do

Por:

for i = 0, #SOUNDS do

Assim ele vai começar do índice 0 ao invés do 1 =D

Link para o comentário
Compartilhar em outros sites

  • 0
7 minutos atrás, SirDubstep disse:

Perdão pelo erro hahaha

Troca essa linha:


for i = 1, #SOUNDS do

Por:


for i = 0, #SOUNDS do

Assim ele vai começar do índice 0 ao invés do 1 =D

kk, modifiquei mas agr ficou do jeito que tava, continua executando somente somente 1 segundo do arquivo mp3. no caso os 2 arrays dentro do array funcionou, mas é como se o som ficasse parando e repetindo

Link para o comentário
Compartilhar em outros sites

  • 0
7 minutos atrás, Developer Berg disse:

kk, modifiquei mas agr ficou do jeito que tava, continua executando somente somente 1 segundo do arquivo mp3. no caso os 2 arrays dentro do array funcionou, mas é como se o som ficasse parando e repetindo

Que estranho hahaha

Bem, tenho um client perdido aqui no PC com sistema de som com um código bem parecido, tenta dar uma comparada ou adaptar (nesse código não tive esse problema de tocar 1 segundo e parar)

Spoiler

SOUNDS_CONFIG = {
	soundChannel = SoundChannels.Music,
	checkInterval = 500,
	folder = 'music/',
	noSound = 'No sound file for this area.',
}

SOUNDS = {
	{fromPos = {x=1008, y=888, z=7}, toPos = {x=1054, y=940, z=7}, priority = 2, sound="cidade 1.ogg"},
	{fromPos = {x=1116, y=818, z=7}, toPos = {x=1101, y=807, z=7}, sound="cidade 1.ogg"},	
}

-- Sound
local rcSoundChannel
local showPosEvent
local playingSound

-- Design
soundWindow = nil
soundButton = nil

function toggle()
  if soundButton:isOn() then
    soundWindow:close()
    soundButton:setOn(false)
  else
    soundWindow:open()
    soundButton:setOn(true)
  end
end

function onMiniWindowClose()
  soundButton:setOn(false)
end

function init()
	for i = 1, #SOUNDS do
		SOUNDS[i].sound = SOUNDS_CONFIG.folder .. SOUNDS[i].sound
	end
	
	connect(g_game, { onGameStart = onGameStart,
                    onGameEnd = onGameEnd })
	
	rcSoundChannel = g_sounds.getChannel(SOUNDS_CONFIG.soundChannel)
	
	soundWindow = g_ui.loadUI('rcsound', modules.game_interface.getRightPanel())
	soundWindow:disableResize()
	soundWindow:setup()
	
	if(g_game.isOnline()) then
		onGameStart()
	end
end

function terminate()
	disconnect(g_game, { onGameStart = onGameStart,
                       onGameEnd = onGameEnd })
	onGameEnd()
	soundWindow:destroy()
	soundButton:destroy()
end

function onGameStart()
	stopSound()
	toggleSoundEvent = addEvent(toggleSound, SOUNDS_CONFIG.checkInterval)
end

function onGameEnd()
	stopSound()
	removeEvent(toggleSoundEvent)
end

function isInPos(pos, fromPos, toPos)
	return
		pos.x>=fromPos.x and
		pos.y>=fromPos.y and
		pos.z>=fromPos.z and
		pos.x<=toPos.x and
		pos.y<=toPos.y and
		pos.z<=toPos.z
end

function toggleSound()
	local player = g_game.getLocalPlayer()
	if not player then return end
	
	local pos = player:getPosition()
	local toPlay = nil

	for i = 1, #SOUNDS do
		if(isInPos(pos, SOUNDS[i].fromPos, SOUNDS[i].toPos)) then
			if(toPlay) then
				toPlay.priority = toPlay.priority or 0
				if((toPlay.sound~=SOUNDS[i].sound) and (SOUNDS[i].priority>toPlay.priority)) then
					toPlay = SOUNDS[i]
				end
			else
				toPlay = SOUNDS[i]
			end
		end
	end

	playingSound = playingSound or {sound='', priority=0}
	
	if(toPlay~=nil and playingSound.sound~=toPlay.sound) then
		g_logger.info("RC Sounds: New sound area detected:")
		g_logger.info("  Position: {x=" .. pos.x .. ", y=" .. pos.y .. ", z=" .. pos.z .. "}")
		g_logger.info("  Music: " .. toPlay.sound)
		stopSound()
		playSound(toPlay.sound)
		playingSound = toPlay
	elseif(toPlay==nil) and (playingSound.sound~='') then
		g_logger.info("RC Sounds: New sound area detected:")
		g_logger.info("  Left music area.")
		stopSound()
	end

	toggleSoundEvent = scheduleEvent(toggleSound, SOUNDS_CONFIG.checkInterval)
end

function playSound(sound)
	rcSoundChannel:enqueue(sound, 0)
	setLabel(clearName(sound))
end

function clearName(soundName)
	local explode = string.explode(soundName, "/")
	soundName = explode[#explode]
	explode = string.explode(soundName, ".ogg")
	soundName = ''
	for i = 1, #explode-1 do
		soundName = soundName .. explode[i]
	end
	return soundName
end

function stopSound()
	setLabel(SOUNDS_CONFIG.noSound)
	rcSoundChannel:stop()
	playingSound = nil
end

function setLabel(str)
	soundWindow:recursiveGetChildById('currentSound'):getChildById('value'):setText(str)
end

 

 

Editado por SirDubstep
Link para o comentário
Compartilhar em outros sites

  • 0
1 minuto atrás, SirDubstep disse:

Que estranho hahaha

Bem, tenho um client perdido aqui no PC com sistema de som com um código bem parecido, tentar dar uma comparada ou adaptar (nesse código não tive esse problema de tocar 1 segundo e parar)

  Mostrar conteúdo oculto


SOUNDS_CONFIG = {
	soundChannel = SoundChannels.Music,
	checkInterval = 500,
	folder = 'music/',
	noSound = 'No sound file for this area.',
}

SOUNDS = {
	{fromPos = {x=1008, y=888, z=7}, toPos = {x=1054, y=940, z=7}, priority = 2, sound="cidade 1.ogg"},
	{fromPos = {x=1116, y=818, z=7}, toPos = {x=1101, y=807, z=7}, sound="cidade 1.ogg"},	
}

-- Sound
local rcSoundChannel
local showPosEvent
local playingSound

-- Design
soundWindow = nil
soundButton = nil

function toggle()
  if soundButton:isOn() then
    soundWindow:close()
    soundButton:setOn(false)
  else
    soundWindow:open()
    soundButton:setOn(true)
  end
end

function onMiniWindowClose()
  soundButton:setOn(false)
end

function init()
	for i = 1, #SOUNDS do
		SOUNDS[i].sound = SOUNDS_CONFIG.folder .. SOUNDS[i].sound
	end
	
	connect(g_game, { onGameStart = onGameStart,
                    onGameEnd = onGameEnd })
	
	rcSoundChannel = g_sounds.getChannel(SOUNDS_CONFIG.soundChannel)
	
	soundWindow = g_ui.loadUI('rcsound', modules.game_interface.getRightPanel())
	soundWindow:disableResize()
	soundWindow:setup()
	
	if(g_game.isOnline()) then
		onGameStart()
	end
end

function terminate()
	disconnect(g_game, { onGameStart = onGameStart,
                       onGameEnd = onGameEnd })
	onGameEnd()
	soundWindow:destroy()
	soundButton:destroy()
end

function onGameStart()
	stopSound()
	toggleSoundEvent = addEvent(toggleSound, SOUNDS_CONFIG.checkInterval)
end

function onGameEnd()
	stopSound()
	removeEvent(toggleSoundEvent)
end

function isInPos(pos, fromPos, toPos)
	return
		pos.x>=fromPos.x and
		pos.y>=fromPos.y and
		pos.z>=fromPos.z and
		pos.x<=toPos.x and
		pos.y<=toPos.y and
		pos.z<=toPos.z
end

function toggleSound()
	local player = g_game.getLocalPlayer()
	if not player then return end
	
	local pos = player:getPosition()
	local toPlay = nil

	for i = 1, #SOUNDS do
		if(isInPos(pos, SOUNDS[i].fromPos, SOUNDS[i].toPos)) then
			if(toPlay) then
				toPlay.priority = toPlay.priority or 0
				if((toPlay.sound~=SOUNDS[i].sound) and (SOUNDS[i].priority>toPlay.priority)) then
					toPlay = SOUNDS[i]
				end
			else
				toPlay = SOUNDS[i]
			end
		end
	end

	playingSound = playingSound or {sound='', priority=0}
	
	if(toPlay~=nil and playingSound.sound~=toPlay.sound) then
		g_logger.info("RC Sounds: New sound area detected:")
		g_logger.info("  Position: {x=" .. pos.x .. ", y=" .. pos.y .. ", z=" .. pos.z .. "}")
		g_logger.info("  Music: " .. toPlay.sound)
		stopSound()
		playSound(toPlay.sound)
		playingSound = toPlay
	elseif(toPlay==nil) and (playingSound.sound~='') then
		g_logger.info("RC Sounds: New sound area detected:")
		g_logger.info("  Left music area.")
		stopSound()
	end

	toggleSoundEvent = scheduleEvent(toggleSound, SOUNDS_CONFIG.checkInterval)
end

function playSound(sound)
	rcSoundChannel:enqueue(sound, 0)
	setLabel(clearName(sound))
end

function clearName(soundName)
	local explode = string.explode(soundName, "/")
	soundName = explode[#explode]
	explode = string.explode(soundName, ".ogg")
	soundName = ''
	for i = 1, #explode-1 do
		soundName = soundName .. explode[i]
	end
	return soundName
end

function stopSound()
	setLabel(SOUNDS_CONFIG.noSound)
	rcSoundChannel:stop()
	playingSound = nil
end

function setLabel(str)
	soundWindow:recursiveGetChildById('currentSound'):getChildById('value'):setText(str)
end

 

 

blz, vou dá uma olhada aqui. vlw man :) acho que é algo dentro do laço for, alguma condição dentro do laço impedindo a execução.

Link para o comentário
Compartilhar em outros sites

  • 0
2 minutos atrás, Developer Berg disse:

blz, vou dá uma olhada aqui. vlw man :) acho que é algo dentro do laço for, alguma condição dentro do laço impedindo a execução.

Sim é o que parece, nesse que mandei o for apenas define qual música tocar, mas a execução ocorre fora do for, então deve ser isso hahaha

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo?

 

TwyIHBJ.png


Complemento:

Spoiler

 

Os array que são chamados de tabelas em lua não necessita de colocar índice dessa forma falado pelo amigo acima,

muitos quando colocam ou não sabem que não é necessário e pensam que sem isso o código não vai funcionar ou

colocam para ter uma noção do tamanho da tabela ou para outros afins, também em lua as tabelas não começam do zero

e sim do índice 1, diferente de outras linguagens que começam do zero.

 

 

Link para o comentário
Compartilhar em outros sites

  • 0
1 hora atrás, BlazerX disse:

Deu certo?

 

TwyIHBJ.png


Complemento:

  Mostrar conteúdo oculto

 

Os array que são chamados de tabelas em lua não necessita de colocar índice dessa forma falado pelo amigo acima,

muitos quando colocam ou não sabem que não é necessário e pensam que sem isso o código não vai funcionar ou

colocam para ter uma noção do tamanho da tabela ou para outros afins, também em lua as tabelas não começam do zero

e sim do índice 1, diferente de outras linguagens que começam do zero.

 

 

não, estou analisando a script que o  SirDubstep. mas se tiver alguma ideia ou quiser tentar ajudar, agradeço muito.

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...