Communauté

Ajuster le nombre d...
 
Notifications
Retirer tout

Ajuster le nombre de tile du background à l'écran

2 Posts
2 Utilisateurs
0 Likes
240 Vu
0
Début du sujet

Bonjour

j'essaie de créer un background a partir d'un tile 100x100. 

j'arrive à créer la grille et à faire apparaitre l'image mais pour les colonnes dont la largeur est inférieure à la taille de ma tile, l'image ne se dessine pas.  Je me retrouve donc avec une ligne et une colonne noir au bord à droite de l'écran...

je pense que je suis pas loin de la solution (dessiner un partie de la tile si la taille de la colonne/line est inférieure à la taille de la tile)

j'avais essayé : 

local ligne, colonne
  for ligne = 1, #grid do
    for colonne = 1, #grid[ligne] do
      if colonne*tile.l <= love.graphics.getWidth() and ligne*tile.h <= love.graphics.getHeight() then
        love.graphics.draw(grid[ligne][colonne], (colonne-1) * tile.l, (ligne-1) * tile.h  ) 

      elseif colonne*tile.l >= love.graphics.getWidth() and ligne*tile.h>= love.graphics.getHeight() then
    -- je calcule la largeur de la colonne qui est visible       
          local partCol = love.graphics.getWidth() - colonne *tile.l

      -- je calcul la hauteur de la ligne qui est visible
          local partLine = love.graphics.getWidth() - ligne* tile.h

         -- j'essaie d'afficher les parties calculées des tiles
          love.graphics.draw(grid[ligne][colonne], partTileC, partTileL ) 
      end
      end
    end

 

Je pense que je ne suis pas loin de trouver mais je bloque. Si quelqu'un peut aider / à une solution plus simple (je n'ai pas encore commencé la formation, j'essaie de mettre en pratique les notions de bases que j'ai lu d'avance)

 

merci 

Gilles 🙂

Voici mon code en entier: 

io.stdout:setvbuf('no')
love.graphics.setDefaultFilter("nearest")
if arg[#arg] == "-debug" then require("mobdebug").start() end

-- je créer mes variables pour les tiles
local tile={}
tile.l = 0
tile.h = 0
tile.x = 0
tile.y = 0

-- je créer une liste pour acceuillir les lignes / colonne
local grid ={}

function love.load()
  
  -- je modifie la taille de l'écran
  love.window.setMode(1024,500) 
  
  -- j'importe l'image à dupliquer
  img = love.graphics.newImage("images/ocean.jpeg")
  
  -- j'obtiens les dimensions de l'image
  tile.l = img:getWidth()
  tile.h = img:getHeight()
  
  -- je calcule le nombre de ligne par rapport à la taille de l'écran / taille de l'image pour qu'elle s'adapte à toutes les résolution
 numCol = love.graphics.getWidth()/ tile.l
  numLine = love.graphics.getHeight()/ tile.h

 -- je créer ma grille
  local  ligne, colonne
  -- pour les lignes de 1 à numline je créer une table
  for ligne = 1, numLine do
    grid[ligne] = {}
    -- pour les colonnes de 1 à numCol je créer les colonnes
    for colonne = 1, numCol do
    -- pour chaque ligne/colonne ma table contient mon image
      grid[ligne][colonne] = img
    end
  end
end

function love.update()
end

function love.draw()
  -- je dessine ma ma grille avec les images a l'intérieur en mutipliant chaque colonne par les coordonnées de chaque img - 1 car sinon le calcul commence à la ligne/colonne 1. 
  
  local ligne, colonne
  for ligne = 1, #grid do
    for colonne = 1, #grid[ligne] do
      if colonne*tile.l <= love.graphics.getWidth() and ligne*tile.h <= love.graphics.getHeight() then
        love.graphics.draw(grid[ligne][colonne], (colonne-1) * tile.l, (ligne-1) * tile.h  ) 
      end
    end  
  end

end

2 Réponses
0

@gilkun 

Je comprends que tu cherches à ne pas afficher les colonnes qui ne sont pas visibles à l'écran.

Et pour l'instant tu ne le fais que pour la droite. Il faudra le faire pour la gauche, le haut et le bas aussi.

Pour résoudre ton problème je te conseille de te faire un dessin sur papier :

image

Exprime le problème en français :

- Une tuile est visible à droite si sa position x est visible.

- Une tuile est visible à gauche si sa position x + sa largeur est visible.

- etc

Ensuite découpe ça en code.

Ca passe donc par calculer la position x et la stocker dans une variable :

local x = (colonne-1) * tile.l

A partir de là tu peux dire :

if x <= love.graphics.getWidth() or x + tile.l >=0 ...
0
Début du sujet

Salut @david 

merci pour l'aide. Je suis finalement arrivé à le faire. 

Le souci vient d'ici 

numCol = math.ceil(love.graphics.getWidth()/ tile.l)
  numLine = math.ceil(love.graphics.getHeight()/ tile.h)

il semble qu'automatiquement si le nombre de colonne / ligne ne soit pas arrondie a un entier, la grille formée par mon code ne dessine pas la dernière colonne / ligne.

En prenant la valeur arrondie à l'entier supérieur j'obtient ma colonne/ ligne manquante. 

Et ensuite en utilisant l'aide que tu m'as donnée j'obtiens bien un fond "uni" avec la tile quelque soit la taille de mon écran : 

local ligne, colonne
    for ligne = 1, #grid do
      for colonne = 1, #grid[ligne] do
        local  x = (colonne - 1) * tile.l
        local y = (ligne - 1) * tile.h
        if x <= love.graphics.getWidth() or x + tile.l >= 0 then
          love.graphics.draw(grid[ligne][colonne], x, y) 
        end
     end

 

Sans la modification de la taille des colonnes et lignes, j'avais toujours une bande noire en bas et à droite.

j'ai testé avec différentes résolutions (même absudes) et mon écran est toujours remplie à 100%

Capture d’écran 2023 03 31 à 10.41.41
Capture d’écran 2023 03 31 à 10.42.07
Capture d’écran 2023 03 31 à 10.45.38

 

 

Merci pour ton aide.

Gilles

Ce message a été modifié Il y a 11 mois 2 fois parGilKun
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.