Advertisement
Guest User

Untitled

a guest
Jul 29th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 10.11 KB | None | 0 0
  1. # coding: utf-8
  2. # Project1, pour commencer avec Gosu.
  3. # Une suggestion ? Une question ? Un conseil ?
  4. # --> <contact@maeln.com>
  5. # --> Ou sur forum.relite.org
  6.  
  7. require 'rubygems'
  8. require 'gosu'
  9.  
  10. class Stars < Gosu::Image
  11.     attr_writer :layer
  12.     attr_reader :y_stars
  13.    
  14.     def initialize(parent, start)
  15.         #-- Class :
  16.         @parent = parent
  17.        
  18.         #-- Images
  19.         @layer = rand(3) + 1 # L'étoiles peut apparaître sur l'un des 3
  20.                              # Calque au hasard.
  21.         @sprite = super(parent, "sprites/stars#{@layer}.png", false)
  22.        
  23.         #-- Variables :
  24.         @x_stars = rand * @parent.width
  25.         # Si la partie vient de commencer, pour remplir l'écran d'étoiles
  26.         # aléatoirement dans l'espace.
  27.         if start then
  28.             @y_stars = rand * @parent.height
  29.         else
  30.             @y_stars = -50
  31.         end
  32.         @z_stars = 0
  33.     end
  34.    
  35.     def update
  36.         # En fonction du calque, l'étoiles ira plus ou moins vite pour
  37.         # donner une sensation de "profondeur".
  38.         if @layer == 1 then
  39.             @y_stars += 5
  40.             @z_stars = 3
  41.         elsif @layer == 2 then
  42.             @y_stars += 2
  43.             @z_stars = 2
  44.         elsif @layer == 3 then
  45.             @y_stars += 1
  46.             @z_stars = 1
  47.         end
  48.     end
  49.    
  50.     def draw
  51.         super(@x_stars, @y_stars, @z_stars)
  52.     end
  53. end
  54.  
  55. class Stars_layer
  56.     def initialize(parent)
  57.         #-- Class :
  58.         @parent = parent
  59.        
  60.         #-- Variables :
  61.         @stars = Array.new
  62.         @start = true
  63.     end
  64.    
  65.     def spawn # Pour faire apparaître une étoiles.
  66.         @stars << Stars.new(@parent, @start)
  67.     end
  68.    
  69.     def update
  70.         i = 0
  71.         if @start then # Quand la partie commence on "spawn" aléatoirement
  72.                        # 100 étoiles (WIP).
  73.             100.times do spawn end
  74.             @start = false
  75.         end
  76.         spawn if rand(3) == rand(3) # On fait apparaître des étoiles si
  77.                                     # les 2 chiffres aléatoires sont égaux (WIP).
  78.                                     # Cette méthode est AMHA très moche.
  79.                                     # Si vous avez une suggestion, merci
  80.                                     # de me contacter.
  81.         @stars.each do |n|
  82.             n.update
  83.             if n.y_stars >= (@parent.height) then # On supprime l'étoile si elle sort
  84.                                                   # de la fenêtre.
  85.                 @stars.delete_at(i)
  86.             end
  87.             i += 1
  88.         end
  89.     end
  90.    
  91.     def draw
  92.         @stars.each do |n| n.draw end
  93.     end
  94. end    
  95.        
  96. class Enemy < Gosu::Image
  97.     attr_reader :x_enemy, :y_enemy, :life, :sprite
  98.     def initialize(parent)
  99.         #-- Class :
  100.         @window = parent
  101.        
  102.         #-- Images :
  103.         @sprite = super(parent, "sprites/enemy.png", false)
  104.        
  105.         #-- Variables :
  106.         @x_enemy = rand * (@window.width - @sprite.width)
  107.         @y_enemy = -140
  108.         @life = 10
  109.     end
  110.    
  111.     def update
  112.         @y_enemy += 3
  113.         if @life <= 0 then # Si l'ennemi n'a plus de vie, on renvoi un message
  114.                            # Pour que Spaceship le détruit.
  115.             return 3
  116.         end
  117.     end
  118.    
  119.     def damage
  120.         @life -= 1
  121.     end
  122.    
  123.     def contact?(x, y)
  124.         a = (x[0] >= (@x_enemy) && x[0] <= (@x_enemy+@sprite.width)) && (y[0] <= (@y_enemy+@sprite.height) && y[0] >= @y_enemy)
  125.         b = (x[1] >= (@x_enemy) && x[1] <= (@x_enemy+@sprite.width)) && (y[1] <= (@y_enemy+@sprite.height) && y[1] >= @y_enemy)
  126.         c = (x[1] >= (@x_enemy) && x[1] <= (@x_enemy+@sprite.width)) && (y[0] <= (@y_enemy+@sprite.height) && y[0] >= @y_enemy)
  127.         d = (x[0] >= (@x_enemy) && x[0] <= (@x_enemy+@sprite.width)) && (y[1] <= (@y_enemy+@sprite.height) && y[1] >= @y_enemy)
  128.         return a || b || c || d
  129.     end
  130.    
  131.     def draw
  132.         super(@x_enemy, @y_enemy, 6)
  133.     end
  134. end
  135.  
  136. class Bullet < Gosu::Image
  137.     attr_reader :x_bullet, :y_bullet, :dist
  138.     attr_writer :id # Pour que l'objet Bullet "connaisse" sa place dans l'Array.
  139.     def initialize(parent)
  140.         #-- Class :
  141.         @enemy = parent.enemy
  142.         @spaceship = parent
  143.        
  144.         #-- Images :
  145.         @bullet = super(parent.window, "sprites/blast.png", false)
  146.        
  147.         #-- Variables :
  148.         @y_bullet = @spaceship.y_player
  149.         @x_bullet = @spaceship.x_player + @spaceship.width / 3
  150.         @yreal = [@y_bullet, (@y_bullet+@bullet.height)]
  151.         @xreal = [@x_bullet, (@x_bullet+@bullet.width)]
  152.     end
  153.    
  154.     def update
  155.         @yreal = [@y_bullet, (@y_bullet+@bullet.height)]
  156.         @xreal = [@x_bullet, (@x_bullet+@bullet.width)]
  157.         unless @enemy[0].nil? then
  158.             @enemy.each do |n| # La balle calcule sa distance avec chaque ennemi.
  159.                 if n.contact?(@xreal, @yreal) then
  160.                     op = @enemy.index(n)
  161.                     @spaceship.touch(op, @id)
  162.                 end
  163.             end
  164.         end
  165.         if @y_bullet >= 0 then
  166.             @y_bullet -= 10
  167.         else
  168.             @spaceship.bullet_oos(@id) # Si un objet Bullet sort de l'écran
  169.                                        # bullet_oos(id_bullet) le détruit.
  170.         end
  171.     end
  172.    
  173.     def draw
  174.         super(@x_bullet, @y_bullet, 4)
  175.     end
  176. end
  177.  
  178. class Spaceship < Gosu::Image
  179.     attr_reader :x_player, :y_player, :window, :enemy, :life, :nb_bullet, :score
  180.     def initialize(window)
  181.         #-- Class :
  182.         @enemy = Array.new
  183.        
  184.         #-- Images :
  185.         @spaceship = super(window, "sprites/spaceship.png", false)
  186.        
  187.         #-- Variables :
  188.         @x_player = @y_player = 0.0
  189.         @yreal = [@y_player, (@y_player+@spaceship.height)]
  190.         @xreal = [@x_player, (@x_player+@spaceship.width)]
  191.         @bullet = Array.new
  192.         @nb_bullet = 0
  193.         @window = window
  194.         @life = 5
  195.         @time = Gosu::milliseconds/100
  196.         @score = 0
  197.     end
  198.    
  199.     def warp(x, y) # Pour télé-porter le joueur n'importe ou.
  200.         @x_player = x
  201.         @y_player = y
  202.     end
  203.    
  204.     #-- Les fonctions qui suivent permette de mettre en mouvement le joueur.
  205.     def move_up
  206.         unless @y_player <= 0
  207.             @y_player -= 4
  208.         end
  209.     end
  210.    
  211.     def move_down
  212.         unless @y_player >= (@window.height-@spaceship.height)
  213.             @y_player += 4
  214.         end
  215.     end
  216.    
  217.     def move_left
  218.         unless @x_player <= 0
  219.             @x_player -= 4
  220.         end
  221.     end
  222.    
  223.     def move_right
  224.         unless @x_player >= (@window.width-@spaceship.width)
  225.             @x_player += 4
  226.         end
  227.     end
  228.     #--
  229.    
  230.     def update
  231.         @yreal = [@y_player, (@y_player+@spaceship.height)]
  232.         @xreal = [@x_player, (@x_player+@spaceship.width)]
  233.         @nb_bullet = @bullet.size
  234.         if @life <= 0 then # Si le joueur n'a plus de vie, c'est le Game Over.
  235.             @window.game_over
  236.         else
  237.        
  238.         # Move & Shoot.
  239.         # <!> Note : Impossible d'aller dans 2 direction en même temps
  240.         # ( ex : haut-gauche ) tout en tirant sauf dans le cas de haut-droite.
  241.         # Si vous voyez d'ou vient le bug, merci de me contacter.
  242.         shoot if @window.button_down?(Gosu::Button::KbSpace)
  243.         move_up if @window.button_down?(Gosu::Button::KbUp)
  244.         move_right if @window.button_down?(Gosu::Button::KbRight)
  245.         move_down if @window.button_down?(Gosu::Button::KbDown)
  246.         move_left if @window.button_down?(Gosu::Button::KbLeft)
  247.        
  248.         for i in (0 ... @bullet.size) # Pour "mettre à jour" toute les balles.
  249.             if @bullet[i] then
  250.                 @bullet[i].id = i
  251.                 shoot = @bullet[i].update
  252.             end
  253.         end
  254.        
  255.         @enemy.each do |n| # De même avec les ennemis.
  256.             unless n.nil?
  257.                 # Si le joueur touche l'ennemi, on détruit l'ennemi et
  258.                 # On fait perdre une vie au joueur.
  259.                 if n.contact?(@xreal, @yreal) then
  260.                     @life -= 1
  261.                     @enemy.delete_at(@enemy.index(n))
  262.                     puts "[Player L] #{@life}"
  263.                 # Si l'ennemi n'a plus de vie on le détruit et on incrémente
  264.                 # le score de 10.
  265.                 elsif n.update == 3 then
  266.                     puts "[Dest.]"
  267.                     @enemy.delete_at(@enemy.index(n))
  268.                     @score += 10
  269.                     puts "[Done]"
  270.                 # Si l'ennemi sort de la fenêtre, on le détruit et on fait
  271.                 # perdre une vie au joueur.
  272.                 elsif n.y_enemy >= (@window.height) then
  273.                     puts "[En-OOS]"
  274.                     @life -= 1
  275.                     @enemy.delete_at(@enemy.index(n))
  276.                 end
  277.             end
  278.         end
  279.         end
  280.     end
  281.    
  282.     def shoot
  283.         if @time < (Gosu::milliseconds/100) # Cette condition permet de limiter
  284.                                             # le nombre de tir/seconde.
  285.                 @bullet << Bullet.new(self)
  286.                 @time = Gosu::milliseconds/100
  287.         end
  288.     end
  289.    
  290.     def touch(nb_enemy, id_bullet) # Lorsqu'une balle touche un ennemi
  291.                                    # on supprime la balle et on indique
  292.                                    # à l'objet Enemy qu'il à été touché.
  293.         @enemy[nb_enemy].damage
  294.         @bullet.delete_at(id_bullet)
  295.     end
  296.    
  297.     def bullet_oos(id_bullet) # Quand un objet Bullet sort de l'écran on la supprime.
  298.         @bullet.delete_at(id_bullet)
  299.     end
  300.    
  301.     def spawn_enemy
  302.         @enemy << Enemy.new(@window)
  303.     end
  304.    
  305.     def draw
  306.         super(@x_player, @y_player, 5)
  307.         # On dessine tout les objets Bullet et Enemy.
  308.         @bullet.each do |n| n.draw end
  309.         @enemy.each do |n| n.draw end
  310.     end
  311. end
  312.  
  313. class Director
  314.     def initialize(parent)
  315.         #-- Class :
  316.         @parent = parent
  317.        
  318.         #-- Variables :
  319.         @time = Gosu::milliseconds
  320.         @vitesse = 5000
  321.     end
  322.    
  323.     def update
  324.         if @parent.life > 0 then
  325.             if (@time+@vitesse) < (Gosu::milliseconds) then
  326.                 puts "[Spawn] [vit:#{@vitesse}]"
  327.                 @parent.spawn_enemy
  328.                 @time = Gosu::milliseconds
  329.                 if @vitesse > 900 then
  330.                     @vitesse -= 100
  331.                 end
  332.             end
  333.         end
  334.     end
  335. end
  336.  
  337. class Game < Gosu::Window
  338.     def initialize
  339.         @x_window = 600
  340.         @y_window = 800
  341.         super(@x_window, @y_window, false)
  342.         self.caption = "Space Des."
  343.        
  344.         #-- Images :
  345.         #nil
  346.        
  347.         #-- Variables :
  348.         #@music = Gosu::Song.new(self, "song/1.wav")
  349.         @player = Spaceship.new(self)
  350.         @director = Director.new(@player)
  351.         @stars = Stars_layer.new(self)
  352.         @font = Gosu::Font.new(self, "ubuntu-font-family/Ubuntu-B.ttf", 54)
  353.         @hud = Gosu::Font.new(self, "ubuntu-font-family/Ubuntu-R.ttf", 16)
  354.         @game_over = false
  355.         @time = Gosu::milliseconds/50
  356.         @time2 = Gosu::milliseconds/20
  357.         @score = 0
  358.         @score_total = 0
  359.        
  360.         #-- Init :
  361.         @player.warp(@x_window / 2.0, @y_window / 2.0)
  362.         #@music.play(true)
  363.     end
  364.    
  365.     def button_down(id) # On quitte le jeux si le joueur appui sur ESC.
  366.         #@music.stop if id == Gosu::Button::KbEscape
  367.         self.close if id == Gosu::Button::KbEscape
  368.     end
  369.    
  370.     def update
  371.         @player.update
  372.         @stars.update
  373.         @director.update
  374.         if @time < Gosu::milliseconds/50 then # Pour que le score s'incrémente
  375.                                               # progressivement ( plus joli ).
  376.             unless @score == @player.score
  377.                 @score += 1
  378.             end
  379.             @time = Gosu::milliseconds/50
  380.         end
  381.         if @time2 < Gosu::milliseconds/20 && @game_over then
  382.             unless @score_total == @score
  383.                 @score_total += 1
  384.             end
  385.             @time2 = Gosu::milliseconds/20
  386.         end
  387.     end
  388.    
  389.     def game_over
  390.         @game_over = true
  391.     end
  392.    
  393.     def draw
  394.         @player.draw
  395.         @stars.draw
  396.         @hud.draw("Life : #{@player.life}", 5, 5, 15)
  397.         if @game_over then
  398.             @font.draw("Game Over", @x_window / 2.0, @y_window / 2.0, 15)
  399.             @hud.draw("Score total : #{@score_total}",  @x_window / 1.9, @y_window / 1.7, 15)
  400.         end
  401.         @hud.draw("Player : (#{@player.x_player};#{@player.y_player}) | bullet : #{@player.nb_bullet}", 5, 30, 15)
  402.         @hud.draw("Score : #{@score}", 5, 55, 15)
  403.     end
  404. end
  405.  
  406. game = Game.new
  407. game.show
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement