flashjaysan

Exemple de collision de deux rectangles.

Feb 6th, 2019
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.40 KB | None | 0 0
  1. --Déclare à l'avance la largeur et la hauteur d'écran.
  2. --Seront initialisées dans la fonction love.load.
  3. local SCREEN_WIDTH, SCREEN_HEIGHT
  4. --Cette valeur est un nombre que l'on peut modifier pour ajuster la
  5. --taille des rectangles. Elle divise juste la largeur et la hauteur
  6. --d'écran pour avoir des valeurs multiples de ces dimensions d'écran.
  7. --Par exemple, avec une valeur de 10, les rectangles mesureront 1/10ème
  8. --de l'écran de jeu. Les rectangles auront une dimension de
  9. --SCREEN_WIDTH / FACTOR et SCREEN_HEIGHT / FACTOR.
  10. local FACTOR = 10
  11. --Déclare les variables qui représenteront la position du pointeur de
  12. --la souris à l'écran.Seront mis à jour à chaque affichage dans la
  13. --fonction love.update.
  14. local mouse_position_x, mouse_position_y
  15.  
  16.  
  17. function love.load()
  18.   --Les variables déclarées au début du fichiers sont initialisées ici.
  19.   SCREEN_WIDTH, SCREEN_HEIGHT = love.graphics.getDimensions()
  20. end
  21.  
  22.  
  23. function love.update(dt)
  24.   --On met à jour la position du curseur de la souris à l'écran à
  25.   --chaque affichage.
  26.   mouse_position_x, mouse_position_y = love.mouse.getPosition()
  27. end
  28.  
  29.  
  30. function love.draw()
  31.   --On règle la couleur active sur BLANC
  32.   --soit ROUGE = 1, VERT = 1, BLEU = 1, ALPHA = 1.
  33.   love.graphics.setColor(1, 1, 1, 1)
  34.   --On dessine un rectangle BLANC au centre de l'écran. D'abord on se
  35.   --positionne au centre avec SCREEN_WIDTH / 2 et SCREEN_HEIGHT / 2
  36.   --mais on enlève une moitié (/ 2) de la dimension du rectangle,
  37.   --soit (SCREEN_WIDTH / FACTOR) / 2 et (SCREEN_HEIGHT / FACTOR) / 2
  38.   love.graphics.rectangle(
  39.     "fill",
  40.     SCREEN_WIDTH / 2 - (SCREEN_WIDTH / FACTOR) / 2,
  41.     SCREEN_HEIGHT / 2 - (SCREEN_HEIGHT / FACTOR) / 2,
  42.     SCREEN_WIDTH / FACTOR,
  43.     SCREEN_HEIGHT / FACTOR
  44.     )
  45.   --On regarde si les deux rectangles entrent en collision en appelant
  46.   --la fonction collision. On passe à cette fonction les limites du
  47.   --rectangle de la souris (mouse_position_x, mouse_position_y) et
  48.   --celles du rectangle centrale (SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2)
  49.   --et en ajoutant ou retirant la moitié des dimensions du rectangle
  50.   --((SCREEN_WIDTH/ FACTOR) / 2, (SCREEN_HEIGHT / FACTOR) / 2).
  51.   if collision(
  52.     mouse_position_x - (SCREEN_WIDTH / FACTOR) / 2,
  53.     mouse_position_x + (SCREEN_WIDTH / FACTOR) / 2,
  54.     mouse_position_y - (SCREEN_HEIGHT / FACTOR) / 2,
  55.     mouse_position_y + (SCREEN_HEIGHT / FACTOR) / 2,
  56.     SCREEN_WIDTH / 2 - (SCREEN_WIDTH / FACTOR) / 2,
  57.     SCREEN_WIDTH / 2 + (SCREEN_WIDTH / FACTOR) / 2,
  58.     SCREEN_HEIGHT / 2 - (SCREEN_HEIGHT / FACTOR) / 2,
  59.     SCREEN_HEIGHT / 2 + (SCREEN_HEIGHT / FACTOR) / 2
  60.     ) then
  61.     --S'il y a collision entre les deux rectangles, on règle la couleur
  62.     --active sur ROUGE soit ROUGE = 1, VERT = 0, BLEU = 0, ALPHA = 1.
  63.     love.graphics.setColor(1, 0, 0, 1)
  64.   else
  65.     --S'il n'y a pas de collision entre les deux rectangles, on règle
  66.     --la couleur active sur BLEU
  67.     --soit ROUGE = 0, VERT = 0, BLEU = 1, ALPHA = 1.
  68.     love.graphics.setColor(0, 0, 1, 1)
  69.   end
  70.   --On dessine le rectangle à la position de la souris
  71.   --(mouse_position_x, mouse_position_y) avec la couleur active.
  72.   --On décale l'affichage du rectangle de la moitié de ses dimensions
  73.   --(pour que le pointeur de la souris soit au centre du rectangle et
  74.   --pas dans son coin supérieur gauche).
  75.   love.graphics.rectangle(
  76.     "fill",
  77.     mouse_position_x - (SCREEN_WIDTH / FACTOR) / 2,
  78.     mouse_position_y - (SCREEN_HEIGHT / FACTOR) / 2,
  79.     SCREEN_WIDTH / FACTOR,
  80.     SCREEN_HEIGHT / FACTOR
  81.     )
  82. end
  83.  
  84.  
  85. --Cette fonction prend les limites gauches, droites, supérieures et
  86. --inférieures de deux rectangles et retourne une valeur booléenne.
  87. --S'il y a collision entre les deux rectangles, elle renvoie la valeur
  88. --true. Dans le cas contraire, elle renvoie la valeur false.
  89. function collision(left1, right1, top1, bottom1, left2, right2, top2, bottom2)
  90.   --Cette ligne vérifie que toutes les conditions sont bien remplies
  91.   --pour qu'il y ait collision entre deux rectangles parallèles aux
  92.   --axes du jeu. C'est la technique AABB (Axis Aligned Bounding Box).
  93.   --Pour la comprendre faites une recherche sur Internet ou
  94.   --demandez-moi.
  95.   return (left1 < right2 and right1 > left2 and top1 < bottom2 and bottom1 > top2)
  96. end
  97.  
  98.  
  99. --cette fonction permet de quitter le programme avec la touche ECHAP.
  100. function love.keypressed(key)
  101.   if key == "escape" then
  102.     love.event.quit()
  103.   end
  104. end
Advertisement
Add Comment
Please, Sign In to add comment