Guest User

Untitled

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