Zeriab 9 Report post Posted January 16, 2007 Snake Look-alike on Load Script Version: 1.0 Introduction The SLOLS has been made by Zeriab. Thanks goes to RMXP for making this possible Credits should be given. The purpose of SLOLS is to provide the player an opportunity to interact with something during loading sequences. I think the loading time will not seem as long as normally if the player as something to do while the program is loading. They don't experience the time it takes to load as bad even though the script reduced the loading speed. In the game itself the principle is to collect dots by moving a bigger dot into them. There is no time limit. There is no way to die or get stuck or etc. Steering is done by the arrow keys. When the loading is finished a sound will be played and visual aids will be used to let the player know that the loading is finished. The player can then continue by pressing a trigger key (fx. ENTER) There is no need to press enter. The player can play the game as long as he or she wants unless the script loaded does something that changes this. Screenshots Demo The demo has been combined with my Letter Ninigame to show a example of use. If the Letter Minigame is used credits mentionen in the Letter Minigame should be given. You download my demo from one of the following links. http://rapidshare.de/files/34811243/SLOLS.rar.html http://www.uploadtemple.com/view.php/1159485902.rar http://www.bigupload.com/d=0361F1BA http://www28.websamba.com/Vobbys/SLOLS.rar http://www28.websamba.com/Vobbys/SLOLS.zip Script #============================================================================== # ** Snake Look-alike on Loading Script #------------------------------------------------------------------------------ # Zeriab # v 1.0 # 28-09-2006 #============================================================================== class Scene_SLOLS # The variable the number of dots collected will be stored Cheese_Variable = 25 # The size of the margin in pixels Margin = 10 # The thickness of the border in pixels Border_Thickness = 3 #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(scene=Scene_Map.new) @next_scene = scene end #-------------------------------------------------------------------------- # * Main Processing #-------------------------------------------------------------------------- def main # Creates Bar Window (Loading bar) @bar_window = Window_SLOLS_Bar.new # Creates Info Window @info_window = Window_SLOLS_Info.new(Margin, Border_Thickness, Cheese_Variable) # Creates Game Window @game_window = Window_SLOLS_Game.new(Margin, Border_Thickness, Cheese_Variable) # Execute transition Graphics.transition # Scene Objects @scene_objects = [@bar_window, @info_window, @game_window] # Main loop loop do # Sleeps a short while to let the other thread work. sleep(0.01) # Update game screen Graphics.update # Update input information Input.update ## Frame update update # Abort loop if screen is changed break if $scene != self end # Prepare for transition Graphics.freeze # Dispose Scene Objects @scene_objects.each { |x| x.dispose } end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Updates Scene Objects @scene_objects.each { |x| x.update } # If B or C Button Is Pressed if Input.trigger?(Input::B) || Input.trigger?(Input::C) # If the loading thread is finished (not alive) if !$loader.is_a?(Thread) || !$loader.alive? # Play Decision SE $game_system.se_play($data_system.decision_se) # Switch to map screen $scene = @next_scene return else # Play Buzzer SE $game_system.se_play($data_system.buzzer_se) return end end end end #============================================================================== # ** Window_SLOLS_Bar #============================================================================== class Window_SLOLS_Bar #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize @contents = Sprite.new(Viewport.new(0, 416, 640, 64)) @contents.bitmap = Bitmap.new(640, 64) @left_block = Sprite.new(Viewport.new(540-48, 424, 48, 48)) @left_block.bitmap = Bitmap.new(64, 64) @right_block = Sprite.new(Viewport.new(100, 424, 48, 48)) @right_block.bitmap = Bitmap.new(640, 64) @blocks = [@left_block, @right_block] @bar = Sprite.new(Viewport.new(270, 446, 100, 4)) @bar.bitmap = Bitmap.new(200, 4) @bar_f = Sprite.new(Viewport.new(270, 446, 100, 4)) @bar_f.bitmap = Bitmap.new(100, 4) @bar_fx = 0 # The sprites used @sprites = [@contents,@bar,@bar_f] refresh end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh @contents.bitmap.clear bar_color = Color.new(225,225,225,255) fin_color = Color.new(255,255,0,0) @bar.bitmap.fill_rect(0,0,25,4,bar_color) @bar.bitmap.fill_rect(50,0,25,4,bar_color) @bar.bitmap.fill_rect(100,0,25,4,bar_color) @bar.bitmap.fill_rect(150,0,25,4,bar_color) @bar_f.bitmap.fill_rect(0,0,100,4,fin_color) @blocks.each {|x| x.bitmap.fill_rect(0,0,64,64,fin_color)} end #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update @bar.ox -= 1 @bar.ox = @bar.ox % 100 @bar.update if @bar_fx == 0 && (!$loader.is_a?(Thread) || !$loader.alive?) @bar_fx = 1 @count = 3 $game_system.se_play($data_system.load_se) end if @bar_fx > 0 && @bar_fx < 255 @bar_fx += @count @bar_f.bitmap.fill_rect(0,0,100,4,Color.new(255,255,0,@bar_fx)) @blocks.each {|x| x.bitmap.fill_rect(0,0,48,48,Color.new(255,255,0,@bar_fx))} case @bar_fx when 10..20 @count = 50 when 180..230 @count = 5 end end end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose @sprites.each { |x| x.bitmap.dispose} @sprites.each { |x| x.dispose} end end #============================================================================== # ** Window_SLOLS_Game #============================================================================== class Window_SLOLS_Game #Player Settings Size = 5 Default_Speed = 3 Trail_Length = 19 #Cheese Settings Cheese_Size = 3 Cheese_Colors = [Color.new(10,200,20,255)] Max_Cheese_Amount = 200 #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(margin, border_thickness, cheese_variable) # The margin and border thickness @margin = margin @border_thickness = border_thickness @cheese_variable = cheese_variable # Width of the playing field @width = 480-(@margin*2) - (@border_thickness*2) # Height of the playing field @height = 416-(@margin*2) - (@border_thickness*2) # Player info @player_x = 200 @player_y = 208 @player_trail = [] @player_dir = 6 #2 - up, 4 - left, 6 - right, 8 - down @speed = Default_Speed # The cheese array @cheese = [] @cheese.push(make_cheese) # The amount of cheese caught during this season. @cheese_amount = 0 # Create the Sprite for viewing the border @border = Sprite.new(Viewport.new(@margin, @margin, 480-@margin, 416-@margin)) @border.bitmap = Bitmap.new(480-(@margin*2),416-(@margin*2)) # Creates the main Sprite @contents = Sprite.new(Viewport.new(@margin + @border_thickness, @margin + @border_thickness, @width, @height)) @contents.bitmap = Bitmap.new(@width,@height) # Refreshes refresh # Updates update end #-------------------------------------------------------------------------- # * Make Cheese # --------------------- # Generates a pointer to a place where a cheese will be at least 3 pixels # away from the player #-------------------------------------------------------------------------- def make_cheese result = [] # Total size. (Sum of player size and cheese size) size = Size + Cheese_Size loop do # Generating the x and y coordinates x = rand(@width - (size + 5)*2) y = rand(@height - (size + 5)*2) # Adjusts the x and y coordinates so the cheese will not be # placed in the player if x > @width / 2 - (size + 5) x += 2*(Size + 5) end if y > @height / 2 - (size + 5) y += 2*(Size + 5) end # Makes sure that no cheese exists in that exact same place # Does not consider the size of the cheese. if !@cheese.include?([x,y]) result = [x,y] break end end return result end #-------------------------------------------------------------------------- # * Check Player # -------------------- # Checks if the player have caught a cheese. (Is touching one) # Returns the indices of the cheese in an array #-------------------------------------------------------------------------- def check_player result = [] # Checks every cheese for i in 0...@cheese.size # Distance in the x-plane d = (@cheese[i][0] - @player_x).abs # Distance in the y-plane d_y = (@cheese[i][1] - @player_y).abs # Makes 'd' contain the largest distance if d < d_y d = d_y end # If the largest distance is less than the size of the player and the # cheese the player must be touching the cheese. if d < (Size + Cheese_Size - 1) result.push(i) end end return result end #-------------------------------------------------------------------------- # * Draw Cheese # i : The index on the cheese # color : The color wanted for the cheese # -------------------- # Draws the designated cheese with the given color #-------------------------------------------------------------------------- def draw_cheese(i, color) cheese = @cheese[i] size = Cheese_Size # Draws the cheese @contents.bitmap.fill_rect(cheese[0]-(size-1),cheese[1]-(size-1), (size*2)-1, (size*2)-1, color) end #-------------------------------------------------------------------------- # * Delete Cheese # i : The index on the cheese # -------------------- # Deletes the cheese by first drawing it black and then removing the cheese # from @cheese. #-------------------------------------------------------------------------- def delete_cheese(i) draw_cheese(i, Color.new(0,0,0,0)) @cheese.delete_at(i) end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh @border.bitmap.clear # Draws a white block @border.bitmap.fill_rect(0,0,480-@margin, 416-@margin,Color.new(225, 225, 225, 255)) # Draws a smaller black block to give the border @border.bitmap.fill_rect(@border_thickness, @border_thickness, @width, @height, Color.new(0, 0, 0, 0)) end #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update @contents.update # Checks if the player gets any cheese array = check_player if array.size > 0 # Removes all the cheese for i in array # Cheese counters $game_variables[@cheese_variable] += 1 @cheese_amount += 1 # Deletes the old cheese delete_cheese(i) # Creates a new one @cheese.push(make_cheese) # Might create another one if @cheese.size < Max_Cheese_Amount # Creates an extra cheese if enough cheese have been caught if @cheese_amount > @cheese.size * @cheese.size + 1 # Creates a new one @cheese.push(make_cheese) end end end end # Draws the cheese for i in 0...@cheese.size draw_cheese(i, Color.new(10,200,20,255)) end # Makes sure the trail isn't too short while @player_trail.size < Trail_Length # Adds the player positions into the trail @player_trail.push([@player_x,@player_y]) end coords = @player_trail.shift # Draws the trail @contents.bitmap.fill_rect(coords[0]-(Size-1),coords[1]-(Size-1), (Size*2)-1, (Size*2)-1, Color.new(0,0,0,255)) #Calculates the steps per shade step = 200 / (Trail_Length) for i in 0...Trail_Length-1 # Calculations coords = @player_trail[i] s = step*(Trail_Length-i) # Draws the trail @contents.bitmap.fill_rect(coords[0]-(Size-1),coords[1]-(Size-1), (Size*2)-1, (Size*2)-1, Color.new(200-s,200-s,100-(s/2),255)) end # Draws the player @contents.bitmap.fill_rect(@player_x-(Size-1),@player_y-(Size-1), (Size*2)-1, (Size*2)-1, Color.new(200,200,100,255)) # If UP Is Pressed if Input.trigger?(Input::UP) @player_dir = 8 unless @player_dir == 2 end # If DOWN Is Pressed if Input.trigger?(Input::DOWN) @player_dir = 2 unless @player_dir == 8 end # If LEFT Is Pressed if Input.trigger?(Input::LEFT) @player_dir = 4 unless @player_dir == 6 end # If RIGHT Is Pressed if Input.trigger?(Input::RIGHT) @player_dir = 6 unless @player_dir == 4 end # Moves the player accordingly to the directions case @player_dir when 8 # Down @player_y -= @speed when 2 # Up @player_y += @speed when 4 # Left @player_x -= @speed when 6 # Right @player_x += @speed end # Warping the player @player_x = (@player_x) % @width @player_y = (@player_y) % @height end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose @contents.bitmap.dispose @contents.dispose end end #============================================================================== # ** Window_SLOLS_Info #============================================================================== class Window_SLOLS_Info # Instructions Instructs = [ 'Navigate using the','arrow keys.', 'Collect green dots.', 'This is done by','going into them.', 'A sound will play','when the loading','is finished', '','Enter to continue' ] #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(margin, border_thickness, cheese_variable) # The name of the arrow images @arrow_file_names = ["Down_Arrow.png", "Left_Arrow.png", "Right_Arrows.png", "Up_Arrow.png"] # The arrow images @arrow_images = [] for i in 0..3 # Makes sure that the program keeps running if one or more of the files # given don't exists. (read: wrong filename or missing file) begin # Reads the bitmap bitmap = Bitmap.new('Graphics\\Pictures\\'+@arrow_file_names[i]) rescue Exception => ex # Creates a blank 32x32 bitmap if the reading fails bitmap = Bitmap.new(32,32) # Prints the exception if in Debug mode. if $DEBUG p ex end end # Pushes the resulting bitmap into the array @arrow_images.push(bitmap) end # The margin and border thickness @margin = margin @border_thickness = border_thickness @cheese_variable = cheese_variable # Height with border excluding margin @height = 416-@margin # The instructions Sprite @instru = Sprite.new(Viewport.new(480 + @border_thickness, 48 + @border_thickness, 159 - @margin - @border_thickness*2, 282 - @margin*4 + 4)) @instru.bitmap = Bitmap.new(159 - @margin - @border_thickness*2, 282 - @margin*4 + 4) @instru.bitmap.font.color = Color.new(225, 225, 225, 255) @instru.bitmap.font.size = 20 # The main Sprite @contents = Sprite.new(Viewport.new(480, 0, 160, @height)) @contents.bitmap = Bitmap.new(160, @height) @contents.bitmap.font.color = Color.new(225, 225, 225, 255) @contents.bitmap.font.size = 22 refresh end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh # Simplifying the variables used border = @border_thickness spacing = @margin + border # Removes any old contents, garbage and so on. @contents.bitmap.clear # Draws the white block used for the border of the score @contents.bitmap.fill_rect(0,@margin,159-@margin,22+border*2, Color.new(225, 225, 225, 255)) # Draws the white block used for the border of the instructions @contents.bitmap.fill_rect(0,48,159-@margin,282+border*2-@margin*4+4, Color.new(225, 225, 225, 255)) # Draws a black block on the white block creating the border. @contents.bitmap.fill_rect(border, 48+border,159-spacing-border, 282-@margin*4+4, Color.new(0, 0, 0, 0)) # Draws the left arrow @contents.bitmap.blt(0,373-@margin,@arrow_images[1],Rect.new(0,0,43,43)) # Draws the down arrow @contents.bitmap.blt(43+@margin,373-@margin,@arrow_images[0], Rect.new(0,0,43,43)) # Draws the right arrow @contents.bitmap.blt(43*2+@margin*2,373-@margin,@arrow_images[2], Rect.new(0,0,43,43)) # Draws the up arrow @contents.bitmap.blt(43+@margin,330-@margin*2,@arrow_images[3], Rect.new(0,0,43,43)) # Draws the text 'Instructions:' @contents.bitmap.draw_text(border, 48, 150-border*2, 22, 'Instructions',1) # Draws the intructions for i in 0...Instructs.size # Gets the string str = Instructs[i] # Draws the string @instru.bitmap.draw_text(2, 22*(i+1), 150-border*2, 20, str,1) end end #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update # Simplifying the variables used border = @border_thickness spacing = @margin + border # Updates the sprite @contents.update # Removes old contents @contents.bitmap.fill_rect(border, spacing, 159-spacing-border, 22, Color.new(0, 0, 0, 0)) # Draws the amount of dots collected @contents.bitmap.draw_text(border, spacing, 153-spacing, 22, $game_variables[@cheese_variable].to_s, 2) # Draws the text 'Dots:' @contents.bitmap.draw_text(border+2, spacing, 157-spacing, 22, 'Dots:') end #-------------------------------------------------------------------------- # * Dispose #-------------------------------------------------------------------------- def dispose @contents.bitmap.dispose @contents.dispose end end I have collected them all in 1 file which can be downloaded here: http://www28.websamba.com/Vobbys/SLOLS.txt Instructions You must have these pictures in your graphics\pictures folder or the arrow keys shown on the picture will be missing: The Script: This script used the global variable $loader. It can run without $loader being initialized in which case the script considers the loading as done. To use $loader you must set it to a Thread. The syntax is: Thread.new( [arg]* ) {| args | block } -> aThread (Reference) An example: $loader = Thread.new { MyClass.new } To get the SLOLS scene use this syntax: $scene = Scene_SLOLS.new(scene=Scene_Map.new) scene will be used to set the scene that comes after Scene_SLOLS. The scene to be used after finished loading and player pressing trigger. An example; syntax for standard scene: (Scene_Map) $scene = Scene_SLOLS.new # or $scene = Scene_SLOLS.new(Scene_Map.new) The script will store the amount of dots in the variable number specified by Cheese_Variable in Scene_SLOLS. (Near top) There also are the Margin (in pixels) and the Border_Thickness (in pixels). Changing these may break the design. The info bar with the instructions is a bit fragile. FAQ None yet Compatibility Should be independent which increases compatibility. Credits and Thanks I would like to thank everyone using their time to try and use SLOLS. I would like to thank everyone reading this topic. Thanks. Author's Notes I don't recommend letting the script being 'loaded' change the $scene as makes the SLOLS stop rather suddenly from my point of view (Players position). And finally: ENJOY! - Zeriab Share this post Link to post Share on other sites
EmilyAnnCoons 7 Report post Posted January 17, 2007 Interesting. I've been looking for something that can be done toeither show how long the game has before it's done loading (when you start up the game, just before it goes to the Title Screen...like a load bar or something). I don't think this is what I'm looking for, but still cool. Share this post Link to post Share on other sites
Zeriab 9 Report post Posted January 18, 2007 You are free to modify it to your needs. You have my permission :rolleyes: Share this post Link to post Share on other sites
EmilyAnnCoons 7 Report post Posted January 18, 2007 -nods- cool...but really all I'd need is a load bar...I don't suppose you can make one? Share this post Link to post Share on other sites
Zeriab 9 Report post Posted January 19, 2007 What are you going to use a loading bar for? The problem with creating a modular loading bar is that I can't possible know how much stuff the script have to do and how long it will take. This means that you will have to feed the loading bar with information if I create one. Share this post Link to post Share on other sites
Dark Dragon 0 Report post Posted January 19, 2007 Hehe, I don't remember seeing an RMXP project that was loading to start a scene... Expect in the very beginning before the game starts. Share this post Link to post Share on other sites
EmilyAnnCoons 7 Report post Posted January 19, 2007 Ahh, ok, well, the loading bar would be so people don't stare at blank when they load the game...it'll actually say how long until the game is loaded, then, finally, will load up...right now I'm having problems with it taking about 20-30 seconds to go from blank screen to loaded up, so it looks like its crashed... Share this post Link to post Share on other sites
Zeriab 9 Report post Posted January 19, 2007 My script solves the 'Script Hanging' issue. You must in some way let the current script report their status to the report button. Do you know what takes a lot of time to load? Share this post Link to post Share on other sites