Communauté

Interface Graphique...
 
Notifications
Retirer tout

[Résolu] Interface Graphique - Prioritée d'affichage des fenêtres.

8 Posts
2 Utilisateurs
0 Likes
49 Vu
0
Début du sujet

Bonjour , voila plusieurs mois que je galère sur ce problème de priorité d'affichage des fenêtres sur mon interface graphiques. Je voudrais pouvoir afficher en premier plan la fenêtre sur la quelle l'utilisateur a cliqué et passer les autres fenêtres en arrière plan. Je gère cela dans la fonction update de mon objet window en LUA ce qui n'est peut être pas une bonne idée, je n'en sais rien bref voici mon code si quelqu'un aurait une solution a mon problème j'aimerai comprendre comment je pourrais faire en sorte que ca fonctionne.

Le code du fichier window.lua :

local Window = {}

local Panel = require("panel")

function Window:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight, pTitleColor)

    local instance = Panel:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight)

    instance.ID = pID
    instance.nom = pNom
    instance.positionX = pPositionX
    instance.positionY = pPositionY
    instance.width = pWidth
    instance.height = pHeight
    instance.currentWindowSprite = nil
    instance.windowTitle = ""
    instance.windowText = ""
    instance.windowButtons = {}
    instance.windowMove = false
    instance.takePosition = false
    instance.titleColor = pTitleColor

    setmetatable(instance, {__index = Window})
    return instance

end
function Window:update(dt)

   local mousePositionX = love.mouse.getX()
   local mousePositionY = love.mouse.getY()

    if mousePositionX > self.positionX and mousePositionX < self.positionX + self.width and mousePositionY > self.positionY and mousePositionY < self.positionY + self.height then

        if love.mouse.isDown(1) then
         
          selectID = self.ID
       
          old = indexfind(group.elements, selectID)
          new = 1
          print(selectID)
          table.insert(group.elements, new, table.remove(group.elements,old))
         
          print(table.concat(group.elements[1], ','))
         

          self.windowMove = true
         
         
          if self.takePosition == false then
           
            startPositionClicX = love.mouse.getX()
            startPositionClicY = love.mouse.getY()
            startPositionWindowX = self.positionX
            startPositionWindowY = self.positionY
            self.takePosition = true
           
          end
         
          self.positionX = love.mouse.getX() - startPositionClicX + startPositionWindowX
          self.positionY = love.mouse.getY() - startPositionClicY + startPositionWindowY
         
          else
         
          self.takePosition = false
          self.windowMove = false
         
          end
   
        else if self.windowMove == true then
   
          self.positionX = love.mouse.getX() - startPositionClicX + startPositionWindowX
          self.positionY = love.mouse.getY() - startPositionClicY + startPositionWindowY
         
        end
    end

    IDPrecedent = selectID
     
      if love.mouse.isDown(1) == false then
        selectID = nil
      end
end

function Window:setSprite(pSpritePath)

    self.currentWindowSprite = love.graphics.newImage(pSpritePath)
    self.width = self.currentWindowSprite:getWidth()
    self.height = self.currentWindowSprite:getHeight()

end
function Window:setTitle(pTitle)

    self.windowTitle = pTitle

end
function Window:draw()

    if self.currentWindowSprite == nil then

        love.graphics.rectangle("line", self.positionX, self.positionY, self.width, self.height)
 
      else

        love.graphics.draw(self.currentWindowSprite, self.positionX, self.positionY)

        if self.titleColor ~= nil then
            love.graphics.setColor(self.titleColor[1]/255, self.titleColor[2]/255, self.titleColor[3]/255)
          else
            love.graphics.setColor(1,1,1)
          end

        love.graphics.print(self.windowTitle, self.positionX + 10, self.positionY + 5)

      end
      love.graphics.setColor(255,255,255)
end

return Window
8 Réponses
0
Début du sujet

J'ai finalement réussi a faire ce que je voulais coder, merci pour ton aide David ! ^^

0

@vinskate 

Il m'est difficile de comprendre ton code, mais par contre je peux t'expliquer le principe.

1) Il faut que tes fenêtres soient dans une liste

2) La fenêtre en 1er dans la liste est celle la plus en dessous des autres, et donc la dernière est celle qui est le plus au 1er plan

3) Quand l'utilisateur clique :

POUR CHAQUE FENETRE DANS L'ORDRE INVERSE DE LA LISTE

   SI MOUSEX et MOUSEY sont à l'intérieur de la fenêtre ALORS

       NOTER CETTE FENETRE COMME CELLE CLIQUEE

       break -- sors de la boucle sinon un fenêtre en dessous pourrait prendre la main !!

   FIN
FIN

SI UNE FENETRE A ETE CLIQUEE ALORS

    Passer cette fenêtre au 1er plan en la déplaçant dans la liste en dernière position

FIN

 

 

0
Début du sujet

Bonjour David, j'espère que ca va ! J'ai tenter d'amélioré mon code en essayant d'appliquer l'exemple que tu m'as donné, j'ai l'impréssion que ma fonction pour changé la la position de mon objet window dans ma liste ne fonctionne pas correctement puisque c'est encore un peu aléatoire mais sinon la structure du code respecte ton exemple je te montre le code que j'ai : 

 

la fonction de déplacement dans la liste me parait douteuse.

"

old = indexfind(group.elements, self.selectID)
          new = 1
          print(selectID)
         
          table.insert(group.elements, new, table.remove(group.elements, old)) "
 
et la fonction indexfind et celle ci : 
 
function indexfind(pTable, pMot)
 
  for i = 1, #pTable do
    if pTable[i] == pMot then
      return i
    end
  end
 
end

 

local Window = {}

local Panel = require("panel")

function Window:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight, pTitleColor)

    local instance = Panel:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight)

    instance.ID = pID
    instance.nom = pNom
    instance.positionX = pPositionX
    instance.positionY = pPositionY
    instance.width = pWidth
    instance.height = pHeight
    instance.currentWindowSprite = nil
    instance.windowTitle = ""
    instance.windowText = ""
    instance.windowButtons = {}
    instance.windowMove = false
    instance.takePosition = false
    instance.titleColor = pTitleColor
   

    setmetatable(instance, {__index = Window})
    return instance

end
function Window:update(dt)

   local mousePositionX = love.mouse.getX()
   local mousePositionY = love.mouse.getY()

    for i = #group.elements, 0, -1 do

    if mousePositionX > self.positionX and mousePositionX < self.positionX + self.width and mousePositionY > self.positionY and mousePositionY < self.positionY + self.height and selectID == nil then

        if love.mouse.isDown(1) then
         
       
          selectID = self.ID
         
          break

        end

      else if love.mouse.isDown(1) == false then
        selectID = nil
      end
      end

        if selectID ~= nil then

          old = indexfind(group.elements, self.selectID)
          new = 1
          print(selectID)
         
          table.insert(group.elements, new, table.remove(group.elements, old))
         
          --print(table.concat(group.elements[1], ","))
         
          windowMove = true
         
          if self.takePosition == false then
           
            startPositionClicX = love.mouse.getX()
            startPositionClicY = love.mouse.getY()
            startPositionWindowX = self.positionX
            startPositionWindowY = self.positionY
            self.takePosition = true
           
          end

          if selectID == self.ID then
         
          self.positionX = love.mouse.getX() - startPositionClicX + startPositionWindowX
          self.positionY = love.mouse.getY() - startPositionClicY + startPositionWindowY
     
          end
      if love.mouse.isDown(1) == false then
        self.takePosition = false
        self.windowMove = false
        IDPrecedent = selectID
      end
     
    end
  end
end

function Window:setSprite(pSpritePath)

    self.currentWindowSprite = love.graphics.newImage(pSpritePath)
    self.width = self.currentWindowSprite:getWidth()
    self.height = self.currentWindowSprite:getHeight()

end
function Window:setTitle(pTitle)

    self.windowTitle = pTitle

end
function Window:draw()

    if self.currentWindowSprite == nil then

        love.graphics.rectangle("line", self.positionX, self.positionY, self.width, self.height)
 
      else

        love.graphics.draw(self.currentWindowSprite, self.positionX, self.positionY)

        if self.titleColor ~= nil then
            love.graphics.setColor(self.titleColor[1]/255, self.titleColor[2]/255, self.titleColor[3]/255)
          else
            love.graphics.setColor(1,1,1)
          end

        love.graphics.print(self.windowTitle, self.positionX + 10, self.positionY + 5)

      end
      love.graphics.setColor(255,255,255)
end

return Window
0
Début du sujet

Est ce que je dois utilisé la fonction love.mouse.isDown(1) ou juste checker la colision ?

0
Début du sujet

J'ai compris que dans ma fonction update je dois d'abord géré l'évènement du clique de l'utilisateur donc la fonction love.mouse.isDown(1) en premier, puis intégré une boucle qui lis la liste qui contient mes fenêtres a dans le sens inverse et regarder la colision dans la box de la fenêtre enregistrer l'ID de la fenêtre puis sortir de la boucle avec un break pour qu'aucune des fenêtre en arrière plan ne prenne la main, puis placer la fenetre correspondant a l'ID en dernière position, mais j'ai l'impréssion que la fonction pour réaliser ce changement de position et foireuse pourrait tu m'envoyé un lien vers une fonction qui marche bien ??

0
Début du sujet

J'essaye de trouver une solution pour l'instant je galère...

Mon code: 

 

local Window = {}

local Panel = require("panel")
Mouse = require("mouse")

function Window:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight, pTitleColor)

    local instance = Panel:new(pID, pNom, pPositionX, pPositionY, pWidth, pHeight)

    instance.ID = pID
    instance.nom = pNom
    instance.positionX = pPositionX
    instance.positionY = pPositionY
    instance.width = pWidth
    instance.height = pHeight
    instance.currentWindowSprite = nil
    instance.windowTitle = ""
    instance.windowText = ""
    instance.windowButtons = {}
    instance.windowMove = false
    instance.takePosition = false
    instance.titleColor = pTitleColor
    instance.startPositionWindowX = nil
    instance.startPositionWindowY = nil
   

    setmetatable(instance, {__index = Window})
    return instance

end
function Window:update(dt)

   local mousePositionX = love.mouse.getX()
   local mousePositionY = love.mouse.getY()

   if love.mouse.isDown(1) then    
     
    for i = #group.elements, 0, -1 do
     
      if mousePositionX > self.positionX and mousePositionX < self.positionX + self.width and mousePositionY > self.positionY and mousePositionY < self.positionY + self.height and selectID == nil then

        selectID = self.ID  
         
        break

      end

    end

    if selectID ~= nil then

      old = indexfind(group.elements, selectID)
      new = 1
      print(selectID)
       
      --table.insert(group.elements, new, table.remove(group.elements, old))
     
     table.move(group.elements, 1, #group.elements, 1, group.switchElements)
     table.insert(group.saveElement, group.elements[selectID])
     table.remove(group.switchElements, selectID)
     table.insert(group.switchElements, group.saveElement[1])

     for i = #group.elements, 0, - 1 do

        table.remove(group.elements, i)

     end

     table.move(group.switchElements, 1, #group.switchElements, 1, group.elements)
     
   
     

     for i = #group.switchElements, 0, -1 do

        --table.remove(group.switchElements, i)

     end
     
        print(table.concat(group.elements[1], ","))
       
    end
     
    self.windowMove = true
       
    if self.takePosition == false then
           
      startPositionClicX = love.mouse.getX()
      startPositionClicY = love.mouse.getY()
      self.startPositionWindowX = self.positionX
      self.startPositionWindowY = self.positionY
      self.takePosition = true
           
    end
           
    else
           
      self.takePosition = false
      self.windowMove = false
    end

    if selectID == self.ID and self.windowMove == true then
         
      self.positionX = love.mouse.getX() - startPositionClicX + self.startPositionWindowX
      self.positionY = love.mouse.getY() - startPositionClicY + self.startPositionWindowY
     
    else if love.mouse.isDown(1) == (false) then
       
      selectID = nil

    end        
     
  end

end
function Window:setSprite(pSpritePath)

    self.currentWindowSprite = love.graphics.newImage(pSpritePath)
    self.width = self.currentWindowSprite:getWidth()
    self.height = self.currentWindowSprite:getHeight()

end
function Window:setTitle(pTitle)

    self.windowTitle = pTitle

end
function Window:draw()

    if self.currentWindowSprite == nil then

        love.graphics.rectangle("line", self.positionX, self.positionY, self.width, self.height)
 
      else

        love.graphics.draw(self.currentWindowSprite, self.positionX, self.positionY)

        if self.titleColor ~= nil then

            love.graphics.setColor(self.titleColor[1]/255, self.titleColor[2]/255, self.titleColor[3]/255)

          else

            love.graphics.setColor(1,1,1)

          end

        love.graphics.print(self.windowTitle, self.positionX + 10, self.positionY + 5)

      end

      love.graphics.setColor(255,255,255)

end

return Window
0

C'est illisible 🙁

Il y a un mode "code" dans le forum, c'est l'icone "<>". 

0

Pour déplacer un élément dans une table, je pense que table.move c'est pas bon. Ca sert pour déplacer d'une table à une autre non ?

Moi je ferais :

local element = t[position]
table.insert(t,element)
table.remove(t,position)
Répondre
Share:

Dialoguez avec les autres membres de la gamecodeur school.

Accédez maintenant à notre serveur Discord privé : Entraide, Game Jams, Partage de projets, etc.

Vous devez être membre de la Gamecodeur School Premium pour être autorisé à accéder au serveur.