Ajuster le nombre de tile du background à l'écran
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
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 :
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 ...
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%
Merci pour ton aide.
Gilles
-
lua + microsoft studio code + debugging
Il y a 7 mois
-
LUA / LOVE2D - Comment réaliser un menu classique ?
Il y a 7 mois
-
Position d'un rectangle dit "pad" (atelier casse-briques)
Il y a 2 ans
-
Creer , ecrire et lire un fichier pour la sauvegarde des scores[lua/love2d]
Il y a 2 ans
- 6 Forums
- 262 Sujets
- 906 Posts
- 1 En ligne
- 45.6 {numéro}K Membres