Inscrit le: 28 Aoû 2011, 02:51 Messages: 15 Sexe: Masculin Points d'aide: 0/60
Créations :
Voir ses créations
|
Le script n'est pas de moi, mais apparement d'un certain kellessdee. Il demande a être complété pour être totalement fonctionnel, on ne peut pas mourir et seules les premières vagues d'aliens apparaissent. tout d'abord un lien vers la démo, pour les ressources (à modifier selon votre convenance) http://www.mediafire.com/?07hkgej2a1m33e8et le script : - Code: Tout sélectionner
module Galaga # Sound Effects + Music BGM = 'R-Type Stage1' LASER_SE = 'galaga_laser' PAUSE_SE = '056-Right02' end
#============================================================================ # ** Alias Title Screen New Game to add Galaga high scores #============================================================================ class Scene_Title alias galaga_new_game command_new_game def command_new_game $galaga_high_scores = [] galaga_new_game end end #============================================================================ # ** Alias Save Scene to Save Galaga high scores #============================================================================ class Scene_Save alias galaga_save_game write_save_data def write_save_data(file) galaga_save_game(file) Marshal.dump($galaga_high_scores, file) end end #============================================================================ # ** Alias Load Scene to Load Galaga high scores #============================================================================ class Scene_Load alias galaga_load_game read_save_data def read_save_data(file) galaga_load_game(file) $galaga_high_scores = Marshal.load(file) end end #============================================================================ # ** Galaga_Ship #---------------------------------------------------------------------------- # This class handles a space ship controlled by the player for the Galaga # mini-game #============================================================================ class Galaga_Ship < RPG::Sprite # Constants SPEED = 10 # Number of pixels travelled per frame ANIM_ID = 2 # Animation ID in database for death #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :lives attr_accessor :points attr_accessor :dead attr_accessor :shots_fired attr_accessor :invincible attr_accessor :timer #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(lives, viewport) super(viewport) self.visible = true self.bitmap = RPG::Cache.picture('Ship') self.src_rect = Rect.new(0, 0, 32, 32) self.ox = 16 self.oy = 0 self.x = 320 self.y = 440 @lives = lives @points = 0 @shots_fired = 0 @timer = 0 @invincible = false end # initialize #-------------------------------------------------------------------------- # * Update Frame #-------------------------------------------------------------------------- def update super if @invincible @timer -= 1 if @timer == 0 @invincible = false elsif @timer % 4 >= 1 self.visible = true elsif @timer % 4 < 1 self.visible = false end end # if # if !@invincible && !self.visible self.visible = true end case Input.dir4 when 4 move_left when 6 move_right end # case end # update #-------------------------------------------------------------------------- # * Get Left Corner X #-------------------------------------------------------------------------- def top_left return self.x - 16 end # top_left #-------------------------------------------------------------------------- # * Get Right Corner X #-------------------------------------------------------------------------- def top_right return self.x + 16 end # top right #-------------------------------------------------------------------------- # * Get Y #-------------------------------------------------------------------------- def get_y return self.y end #-------------------------------------------------------------------------- # * Get X #-------------------------------------------------------------------------- def get_x return self.x end #-------------------------------------------------------------------------- # * Move Left #-------------------------------------------------------------------------- def move_left # If ship can move left if top_left - SPEED >= 0 # move distance self.x -= SPEED else # hug wall self.x = 16 end # if end # move_left #-------------------------------------------------------------------------- # * Move Right #-------------------------------------------------------------------------- def move_right # if ship can move right if top_right + SPEED <= 640 # move distance self.x += SPEED else # hug wall self.x = 624 end # if end # move_right #-------------------------------------------------------------------------- # * Death Sequence #-------------------------------------------------------------------------- def death_anim self.animation($data_animations[ANIM_ID], true) @invincible = true @timer = 160 end end # Game_Ship #============================================================================ # ** Galaga_Alien #---------------------------------------------------------------------------- # This class handles all the enemies for the galaga mini-game. It contains # The methods for each enemy's patterns #============================================================================ class Galaga_Alien < RPG::Sprite #-------------------------------------------------------------------------- # * Constants #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :speed attr_reader :points #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(x, y, type, index) super() self.x = 640 self.y = -32 * index if type == 1 self.x = 32 * index self.y = -32 end @start_x = x @start_y = y @move_y = 0 @move_x = 0 @type = type @width = 32 @height = 32 @timer = index * 20 @frame_anim = 0 @frame_count = 0 @damage_count = type / 3 @speed = 30 @start = true self.bitmap = RPG::Cache.picture('Aliens') self.src_rect.set(0, type * 32, 32, 32) end # initialize #-------------------------------------------------------------------------- # * Update Frame #-------------------------------------------------------------------------- def update super if self.effect? return elsif !self.effect? && @damage_count < 0 self.dispose return end @frame_count = (@frame_count + 1) % 7 if @frame_count == 0 @frame_anim = (@frame_anim + 1) % 2 self.src_rect.set(@frame_anim * 32, @type * 32, 32, 32) end case @type when 0 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end when 1 @timer = 0 if @start start_type_a else if rand(100) <= 25 $scene.enemy_fire_laser(self) end @start_x += rand(200) @start_y += rand(200) if @start_x > 640 @start_x = rand(50) end if @start_y > 480 @start_y = rand(50) end @start = true end when 2 when 3 when 4 when 5 when 6 when 7 when 8 when 9 when 10 end end #-------------------------------------------------------------------------- # * Alien A start pattern #-------------------------------------------------------------------------- def start_type_a if @timer == 0 if self.x < @start_x self.x += (@start_x - self.x).abs / @speed elsif self.x > @start_x self.x -= (@start_x - self.x).abs / @speed end if self.y < @start_y self.y += (@start_y - self.y).abs / @speed elsif self.y > @start_y self.y -= (@start_y - self.y).abs / @speed end end test_x = @start_x test_y = @start_y case self.x when test_x - 32..test_x + 32 case self.y when test_y - 32..test_y + 32 @start = false @timer = 120 @move_x = rand(590) + 30 @move_y = 640 end end end #-------------------------------------------------------------------------- # * Alien A move pattern #-------------------------------------------------------------------------- def type_a_pattern if self.x < @move_x self.x += (@move_x - self.x).abs / @speed elsif self.x > @move_x self.x -= (@move_x - self.x).abs / @speed end if self.y < @move_y self.y += (@move_y - self.y).abs / @speed elsif self.y > @move_y self.y -= (@move_x - self.x).abs / @speed end test_x = @move_x test_y = @move_y case self.x when test_x - 32..test_x + 32 case self.y when test_y - 32..test_y + 32 @start = true end end end #-------------------------------------------------------------------------- # * Damage #-------------------------------------------------------------------------- def damage @damage_count -= 1 if @damage_count < 0 unless self.effect? $galaga_ship.points += (@type + 1) * 10 self.animation($data_animations[3], true) end end end end # Game_Galaga_Alien #============================================================================ # ** Galaga_Laser #---------------------------------------------------------------------------- # This class handles the laser objects for the galaga mini-game. #============================================================================ class Galaga_Laser < RPG::Sprite # Constants PLAYER = -1 # Player fired laser ENEMY = 1 # Enemy fired laser COLOR = Color.new(125, 255, 125, 255) # Laser color SPEED = 32 # Laser movement speed #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(viewport, direction, x, y) super(viewport) self.bitmap = Bitmap.new(2, 32) self.bitmap.fill_rect(0, 0, 1, 32, COLOR) self.visible = true @direction = direction if @direction == ENEMY self.oy = 32 end # if self.x = x self.y = y end # initiailize #-------------------------------------------------------------------------- # * Update Frame #-------------------------------------------------------------------------- def update(enemies=nil) # Move laser self.y += SPEED * @direction # if Enemies exist if enemies != nil && @direction < 0 enemies.each {|enemy| # if hit enemy unless enemy.disposed? if (self.x >= enemy.x && self.x <= enemy.x + 32) && (self.y >= enemy.y && self.y <= enemy.y + 32) enemy.damage end end } end # Check if laser hit player if @direction > 0 if (self.x >= $galaga_ship.x && self.x <= $galaga_ship.x + 32) && (self.y >= $galaga_ship.y && self.y <= $galaga_ship.y + 32) unless $galaga_ship.invincible $galaga_ship.death_anim $galaga_ship.lives -= 1 end end end # Check if laser is off screen if self.y < -32 || self.y > 512 self.dispose end end # update end # Galaga_Laser #============================================================================ # ** Galaga_Hud #---------------------------------------------------------------------------- # This class displays galaga game data, lives and points #============================================================================ class Galaga_Hud < RPG::Sprite #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(viewport) super(viewport) self.bitmap = Bitmap.new(640, 480) refresh end # intialize #-------------------------------------------------------------------------- # * Refresh Bitmap #-------------------------------------------------------------------------- def refresh self.bitmap.clear # Draw Words self.bitmap.draw_text(0, 0, 200, 32, 'POINTS:') self.bitmap.draw_text(440, 0, 200, 32, '-LIVES-', 1) # Draw points self.bitmap.draw_text(0, 32, 200, 32, $galaga_ship.points.to_s) # Draw lives if $galaga_ship.lives > 0 bitmap = RPG::Cache.picture('Ship') src_rect = Rect.new(0, 0, 32, 32) (0...$galaga_ship.lives).each {|i| new_rect = Rect.new(i * 20 + 500, 32, 16, 16) self.bitmap.stretch_blt(new_rect, bitmap, src_rect) } end # if end # refresh end # Galaga_Hud #============================================================================ # ** Galaga_Back #---------------------------------------------------------------------------- # This class displays and pans the space background #============================================================================ class Galaga_Back # Constants BACKGROUND = 'Space' PAN_SPEED = 5 #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :viewport1 attr_reader :viewport2 attr_reader :viewport3 #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize # Make viewports @viewport1 = Viewport.new(0, 0, 640, 480) @viewport2 = Viewport.new(0, 0, 640, 480) @viewport3 = Viewport.new(0, 0, 640, 480) @viewport2.z = 200 @viewport3.z = 5000 # Make background @background = Plane.new(@viewport1) @background.bitmap = RPG::Cache.panorama(BACKGROUND, 0) end # Initialize #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose # Dispose Background @background.dispose # Dispose Viewports @viewport1.dispose @viewport2.dispose @viewport3.dispose end # dispose #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update # Pan Background @background.oy -= PAN_SPEED end # update end #============================================================================ # ** Galaga_Menu #---------------------------------------------------------------------------- # This class displays and handles the galaga menu selection #============================================================================ class Galaga_Menu < Sprite #========================================================================== # * Public Instance Variables #========================================================================== attr_reader :index #========================================================================== # * Object Initialization #========================================================================== def initialize(viewport) super(viewport) self.bitmap = Bitmap.new(640, 480) @bit = RPG::Cache.picture('arrow_cursor') @index = 0 refresh end # initialize #========================================================================== # * Refresh Contents #========================================================================== def refresh self.bitmap.clear # Draw Black Rectangle self.bitmap.fill_rect(64, 176, 512, 128, Color.new(0, 0, 0, 255)) # Draw Title self.bitmap.font.size = 45 self.bitmap.draw_text(0, 120, 640, 45, 'GALAGA', 1) self.bitmap.font.size = 24 # Draw Options self.bitmap.draw_text(192, 192, 200, 32, 'Play Game') self.bitmap.draw_text(192, 224, 200, 32, 'High Scores') self.bitmap.draw_text(192, 256, 200, 32, 'Quit') # Draw Arrow self.bitmap.blt(176, @index * 32 + 202, @bit, Rect.new(0, 1, 11, 12)) end # refresh #========================================================================== # * Update #========================================================================== def update # If Up Key is pressed if Input.trigger?(Input::UP) # Play cursor SE $game_system.se_play($data_system.cursor_se) # change index @index = (@index + 2) % 3 # refresh contents refresh end # if # if Down Key is pressed if Input.trigger?(Input::DOWN) # Play cursor SE $game_system.se_play($data_system.cursor_se) # Change index @index = (@index + 1) % 3 # refresh contents refresh end # if end # update end # Galaga_Menu #============================================================================ # ** Galaga_High_Scores #---------------------------------------------------------------------------- # This class handles displaying high scores #============================================================================ class Galaga_High_Scores end #============================================================================ # ** Scene_Galaga #---------------------------------------------------------------------------- # This class handles the galaga mini-game itself and brings together all # the sprites #============================================================================ class Scene_Galaga #-------------------------------------------------------------------------- # * Game Constants #-------------------------------------------------------------------------- MAX_PLAYER_LASERS = 5 #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(lives=3) @lives = lives @pause = false @stage = -1 end # initialize #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main # Save current font default_f = Font.default_name default_s = Font.default_size $game_system.bgm_memorize Audio.bgm_play('Audio/BGM/' + Galaga::BGM) # Change font Font.default_name = 'Press Start K' Font.default_size = 16 # Create game Objects @galaga_back = Galaga_Back.new @menu = Galaga_Menu.new(@galaga_back.viewport3) # Create Laser array @lasers = [] # Create Enemy array @enemies = [] # Execute Transition Graphics.transition # Main Loop loop do # Update Graphics Graphics.update # Update Input Input.update # Update update # If scene has changed if $scene != self break end # if end # loop # Dispose of objects if @lasers != nil @lasers.each {|laser| laser.dispose} end if @enemies != nil @enemies.each {|enemy| enemy.dispose} end $galaga_ship.dispose @galaga_hud.dispose @galaga_back.dispose end # main #-------------------------------------------------------------------------- # * Update Frame #-------------------------------------------------------------------------- def update # Check if menu is active if @menu != nil update_menu return end # if # Check if game is paused if @pause pause return end # Update Objects @lives = $galaga_ship.lives @galaga_back.update $galaga_ship.update @galaga_hud.refresh if @lives <= 0 # game over end if @lasers != nil @lasers.each {|laser| unless laser.disposed? laser.update(@enemies) if laser.disposed? laser = nil @lasers.compact! end end } end if @enemies != nil @enemies.each {|enemy| unless enemy.disposed? if enemy.x / 32 == $galaga_ship.x / 32 && enemy.y / 32 == $galaga_ship.y / 32 unless $galaga_ship.invincible $galaga_ship.death_anim $galaga_ship.lives -= 1 end end enemy.update else @enemies.delete(enemy) end } end if @enemies.size == 0 @stage += 1 add_enemies if @stage > 10 @enemies.each {|enemy| enemy.speed -= 5 if enemy.speed <= 0 enemy.speed = 1 end } end end # If C button is pressed, fire laser if Input.trigger?(Input::C) && !$galaga_ship.effect? player_fire_laser end # if # If B button is pressed, pause game if Input.trigger?(Input::B) @pause = true end # if end # update #-------------------------------------------------------------------------- # * Add Enemies #-------------------------------------------------------------------------- def add_enemies # Add 10 enemies at a time (0..9).each {|i| @enemies.push(Galaga_Alien.new(30 * i, 120, @stage % 10, i)) } end #-------------------------------------------------------------------------- # * Pause Game #-------------------------------------------------------------------------- def pause # Play Pause sound effect Audio.se_play('Audio/SE/' + Galaga::PAUSE_SE) # Draw pause Screen pause = Sprite.new pause.bitmap = Bitmap.new(640, 480) pause.bitmap.fill_rect(160, 120, 320, 240, Color.new(0, 0, 0, 255)) pause.bitmap.draw_text(160, 120, 320, 240, 'PAUSE', 1) # Pause loop loop do # update Graphics Graphics.update # update input Input.update # If B button is pressed if Input.trigger?(Input::B) # Play Pause sound effect Audio.se_play('Audio/SE/' + Galaga::PAUSE_SE) @pause = false pause.dispose break end # if end # loop end #-------------------------------------------------------------------------- # * Update Menu #-------------------------------------------------------------------------- def update_menu # menu loop loop do # Update Graphics Graphics.update # update Input Input.update # Update menu @menu.update # if C button is pressed if Input.trigger?(Input::C) # Play decision SE Audio.se_play('Audio/SE/' + Galaga::PAUSE_SE) case @menu.index when 0 # Play game # SetUp game objects $galaga_ship = Galaga_Ship.new(@lives, @galaga_back.viewport2) @galaga_hud = Galaga_Hud.new(@galaga_back.viewport3) when 1 # High Scores # Draw High Scores when 2 # Quit $scene = Scene_Map.new end # dispose menu @menu.dispose @menu = nil # break loop break end end end # update_menu #-------------------------------------------------------------------------- # * Player Fire Laser #-------------------------------------------------------------------------- def player_fire_laser # Add to shots fired $galaga_ship.shots_fired += 1 Audio.se_play('Audio/SE/' + Galaga::LASER_SE) # Add laser to game @lasers.push(Galaga_Laser.new(@galaga_back.viewport1, -1, $galaga_ship.get_x, $galaga_ship.get_y)) end # player_fire_laser #-------------------------------------------------------------------------- # * Enemy Fire Laser #-------------------------------------------------------------------------- def enemy_fire_laser(enemy) # Add laser to game Audio.se_play('Audio/SE/' + Galaga::LASER_SE) @lasers.push(Galaga_Laser.new(@galaga_back.viewport1, 1, enemy.x, enemy.y)) end # player_fire_laser end
qu'on appelle avec - Code: Tout sélectionner
$scene = Scene_Galaga.new
. En bidouillant, je me suis aperçu que si entre les lignes 247 à 256 on recopiait ce qu'il y avait au dessus les vagues devenaient infinies, reste plus qu'à appuyer sur "esc" pour sortir. Plus concrètement ça donne ça : - Code: Tout sélectionner
when 2 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end when 3 @timer = 0 if @start start_type_a else if rand(100) <= 25 $scene.enemy_fire_laser(self) end @start_x += rand(200) @start_y += rand(200) if @start_x > 640 @start_x = rand(50) end if @start_y > 480 @start_y = rand(50) end @start = true end when 4 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end when 5 @timer = 0 if @start start_type_a else if rand(100) <= 25 $scene.enemy_fire_laser(self) end @start_x += rand(200) @start_y += rand(200) if @start_x > 640 @start_x = rand(50) end if @start_y > 480 @start_y = rand(50) end @start = true end when 6 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end when 7 @timer = 0 if @start start_type_a else if rand(100) <= 25 $scene.enemy_fire_laser(self) end @start_x += rand(200) @start_y += rand(200) if @start_x > 640 @start_x = rand(50) end if @start_y > 480 @start_y = rand(50) end @start = true end when 8 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end when 9 @timer = 0 if @start start_type_a else if rand(100) <= 25 $scene.enemy_fire_laser(self) end @start_x += rand(200) @start_y += rand(200) if @start_x > 640 @start_x = rand(50) end if @start_y > 480 @start_y = rand(50) end @start = true end when 10 @timer -= 1 if @timer > 0 if @start start_type_a elsif !@start && @timer == 0 type_a_pattern end end end
Le problème reste toujours le même quand au fait de ne pas mourir, mais ça rallonge le plaisir de jeu. Alors si quelqu'un qui maitrise bien le Ruby pouvait l'améliorer, je suis sûr que ça intéresserait pas mal de monde, moi en premier, merci !
|
|