Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Berans' Interactive Drumkit script v1.11

Beran's Interactive Drumkit script
Version: v1.11
Type: Interactive music player


Introduction

Another unique script by me, inspired, and with graphics, by Sniper308. It's a little Drumkit which lets you pump out some beats ingame.

Features

  • Easy to set up
  • Can customize drum-sounds however you like
  • Graphics included
  • Fully lagfree

Screenshots

http://img396.imageshack.us/img396/7174 ... hotbb5.png[/img]

Demo

Berans' Interactive Drumkit demo v1.00

Script


Code:
#==============================================================================
#==============================================================================
#Berans' "Interactive drumkit" script v1.11
#Last edited: 24 August 2008
#
#------------------------------------------------------------------------------
#What's new in v1.11
# - Script now features support for "input codes"
# - Added instructions to customize controls
#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
#
#This script creates an "interactive drumkit" allowing you to play some nice
#beats within your game. It's easy to adapt to your own liking to create
#many different sounds
#
#Credits: Berans    - Making the script
#         Sniper308 - Providing the graphics and idea for the script
#
#------------------------------------------------------------------------------
#Features
#------------------------------------------------------------------------------
# -Easy set-up
# -Can change drum sounds to anything you like
# -comes with nice graphics
# -Fully lagfree
# -NEW: You can now use the drums to input codes
#------------------------------------------------------------------------------
#Compatibility
#------------------------------------------------------------------------------
#This script does not rewrite any standard methods and does not use any global
#variables. Should be compatible with anything, including the SDK
#
#==============================================================================
#Instructions
#==============================================================================
#
#------------------------------------------------------------------------------
#Setup
#------------------------------------------------------------------------------
# -Download the demo if the script was obtained separately
# -Copy the Audio files in Audio/SE to your own project, and make sure the names
#  stay the same. You can provide your own Audio files, but they must be called
#  "Tom-1","Tom-2","Tom-3","Hi-Hat" and "Bassdrum" respectively
# -Copy the picture files in Graphics/Pictures to your own project, making sure
#  the names stay the same. You can easily change the color of the "lighting"
#  effect by changing the color of the objects in "DrumsLights"
# -Import the picture files into your game, making white transparant in both 
#  files, clearing the semi-transparant color for "Rock Band Drums" and making 
#  the color of the main objects in "DrumsLights" semi-transparant
#
#------------------------------------------------------------------------------
#Optional
#------------------------------------------------------------------------------
#To change the drum's controls find the lines in the script below with the 
#comment "Control" above them and change what's after "Input::"
#The lines correspond to the drums from left to right, followed by the bass drum
#With the standard engine's input module, possibilities to follow Input:: are:
#A,B,C,X,Y,Z,L,R,CTRL,ALT,SHIFT,F5,F6,F7,F8,DOWN,LEFT,UP and RIGHT
#Check the helpfile for what each of these corresponds to on your keyboard.
#This will also help the script functioning with a custom Input module as you 
#can customize the controls to take the module into account.
#
#------------------------------------------------------------------------------
#Using the script
#------------------------------------------------------------------------------
# - To call the script, use the "script" command within any event.
#   In the script write "$scene = Scene_Drums.new", without the quotes
# - You can change the script call as follows to create a "Ryhtm code" that
#   turns on a game switch when entered correctly
#   $scene = Scene_Drums.new(switch,code,mode)
# - To use this feature, replace switch with a switch number in the game that
#   you want to affect
#   Replace code with an "input code" in the following format:
#   '14232B23B1' (include the single quotes)
#   Where 1-4 correspond to each of the drums from left to right, and B
#   corresponds to the pedal
#   Finally, you can replace mode by either 0, 1 or 2 to have a different style
#   of inputting the code
#   mode 0 means that, if you get the code wrong, nothing happens
#   mode 1 means that, if you get the code wrong, a sound plays notifying you
#   of the wrong input, and the input starts over
#   mode 2 means that, if you get the code wrong, a sound plays and the scene
#   is quit to map
#   leaving mode out automatically uses mode 0
#==============================================================================
#==============================================================================

  
#==============================================================================
#**Scene_Drums
#------------------------------------------------------------------------------
#This class handles processing for the drums screen
#==============================================================================
class Scene_Drums
  #----------------------------------------------------------------------------
  #*Object initialization
  #----------------------------------------------------------------------------
  def initialize(switch = nil,string = nil,mode = 0)
    @switch = switch
    @string = ''
    unless string == nil
      @required = string.gsub("\n"){nil}
    end
    @mode = mode
  end
  
  #----------------------------------------------------------------------------
  #*Main processing
  #----------------------------------------------------------------------------
  def main
    #Memorize Map/Menu BGM
    $game_system.bgm_memorize
    #Fade out BGM
    $game_system.bgm_fade(2)
    #Memorize Map/Menu BGS
    $game_system.bgs_memorize
    #Fade out BGS
    $game_system.bgs_fade(2)
    #This keeps track of the animation frames for the drum's lighting effects
    @animation = []
    #create a value for @animation for each drum
    for i in 0...5
      @animation.push(-1)
    end
    #Create spritesets
    @spriteset = Spriteset_Map.new
    @drums = Spriteset_Drums.new
    #Create windows
    @help_window = Window_Drumshelp.new
    @drumdummy = Drum_Dummy.new
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @help_window.dispose
    @spriteset.dispose
    @drums.dispose
    @drumdummy.dispose
    #Restore Map/Menu BGM
    $game_system.bgm_restore
    #Restore Map/Menu BGS
    $game_system.bgs_restore
  end
  
  #----------------------------------------------------------------------------
  #*Frame update
  #----------------------------------------------------------------------------
  def update
    if Input.trigger?(Input::B)
      $scene = Scene_Map.new
    end
    if Input.trigger?(Input::F5)
      Audio.se_play("Audio/SE/Tom-1",100,100)
      @string += '1'
      @animation[0] = 0
      @drumdummy.refresh(0)
    end
    if Input.trigger?(Input::F6)
      Audio.se_play("Audio/SE/Tom-2",100,100)
      @string += '2'
      @animation[1] = 0
      @drumdummy.refresh(1)
    end
    if Input.trigger?(Input::F7)
      Audio.se_play("Audio/SE/Tom-3",100,100)
      @string += '3'
      @animation[2] = 0
      @drumdummy.refresh(2)
    end
    if Input.trigger?(Input::F8)
      Audio.se_play("Audio/SE/Hi-Hat",100,100)
      @string += '4'
      @animation[3] = 0
      @drumdummy.refresh(3)
    end
    if Input.trigger?(Input::C)
      Audio.se_play("Audio/SE/Bassdrum",100,100)
      @string += 'B'
      @animation[4] = 0
      @drumdummy.refresh(4)
    end
    #update lighting effects
    animation
    #Check for code input
    if @required != nil
      #If mode is free input
      if @mode == 0
        #If correct code was input
        if @string == @required
          Audio.se_play('Audio/SE/055-Right01',100,100)
          $game_switches[@switch] = true
          $scene = Scene_Map.new
        end
      #If mode is specific input length
      elsif @mode == 1
        #When string length is correct
        if @string.length == @required.length
          if @string == @required
            Audio.se_play('Audio/SE/055-Right01',100,100)
            $game_switches[@switch] = true
            $scene = Scene_Map.new
          else
            Audio.se_play('Audio/SE/057-Wrong01',100,100)
            $game_switches[@switch] = false
            @string = ''
          end
        end
      #If mode is quit after input length
      elsif @mode == 2
        #When string length is correct
        if @string.length == @required.length
          if @string == @required
            Audio.se_play('Audio/SE/055-Right01',100,100)
            $game_switches[@switch] = true
            $scene = Scene_Map.new
          else
            Audio.se_play('Audio/SE/057-Wrong01',100,100)
            $game_switches[@switch] = false
            $scene = Scene_Map.new
          end
        end
      end
    end
  end
  
  #----------------------------------------------------------------------------
  #*animation
  #----------------------------------------------------------------------------
  #Takes care of animating the drum's lighting effects
  #----------------------------------------------------------------------------
  def animation
    for i in 0...@animation.size
      if @animation[i] == 0
        #Create lighting effect for the drum
        @drumdummy.refresh(i)
      end
      unless @animation[i] == -1
        #Progress a frame
        @animation[i] += 1
        if @animation[i] == 10
          #Remove lighting effect
          @drumdummy.clear(i)
          @animation[i] = -1
        end
      end
    end
  end
end


#==============================================================================
#**Window_Drumshelp
#------------------------------------------------------------------------------
#Help window displaying the different input possibilities
#==============================================================================

class Window_Drumshelp < Window_Base
  
  #----------------------------------------------------------------------------
  #*Object initialization
  #----------------------------------------------------------------------------
  def initialize
    super(0,0,640,64)
    self.contents = Bitmap.new(width - 32, height - 32)
    text = ["F5: Drum 1", "F6: Drum 2", "F7: Drum 3", "F8: Hi-Hat", "Enter: Bass"]
    w = self.contents.width/text.size
    for i in 0...text.size
      self.contents.draw_text(i * w,0,w,32,text[i],1)
    end
  end
end


#==============================================================================
#**Spriteset_Drums
#------------------------------------------------------------------------------
#This class takes care of drawing the drum's graphics onscreen
#==============================================================================

class Spriteset_Drums
  
  #----------------------------------------------------------------------------
  #*Object initialization
  #----------------------------------------------------------------------------
  def initialize
    @viewport = Viewport.new(35,95,640,480)
    @viewport.z = 5000
    @sprite = Sprite.new(@viewport)
    @drums = RPG::Cache.picture('Rock Band Drums.png')
    @sprite.bitmap = @drums
  end
  
  #----------------------------------------------------------------------------
  #*Dispose
  #----------------------------------------------------------------------------
  def dispose
    @viewport.dispose
    @sprite.dispose
  end
end


#==============================================================================
#**Drum_Dummy
#------------------------------------------------------------------------------
#This class draws the drum's lighting effects
#==============================================================================

class Drum_Dummy
  
  #----------------------------------------------------------------------------
  #*Object initialization
  #----------------------------------------------------------------------------
  def initialize
    @sprite = []
    @lights = RPG::Cache.picture('DrumsLights')
    #Create a rect for the drums and pedal
    @rect = Rect.new(1,1,130,130)
    @rect2 = Rect.new(1,134,130,130)
    #create a new bitmap for each drum's lighting effect
    for i in 0...5
      @sprite[i] = Sprite.new
      @sprite[i].bitmap = Bitmap.new(640,480)
      @sprite[i].z = 9999
      @sprite[i].visible = false
    end
  end
  
  #----------------------------------------------------------------------------
  #*Refresh
  #----------------------------------------------------------------------------
  def refresh(drum)
    #Clear lighting effect to avoid overlap
    @sprite[drum].bitmap.clear
    case drum
    #Get coordinates based on drum
    when 0
      x = 43
      y = 198
    when 1
      x = 170
      y = 99
    when 2
      x = 335
      y = 99
    when 3
      x = 462
      y = 198
    when 4
      x = 255
      y = 371
    end
    #Create correct effect in the given bitmap
    if drum == 4 ? @sprite[drum].bitmap.blt(x,y,@lights,@rect2) : 
                   @sprite[drum].bitmap.blt(x,y,@lights,@rect)
    end
    #Make lighting effect visible             
    @sprite[drum].visible = true
  end
  
  #----------------------------------------------------------------------------
  #*Dispose
  #----------------------------------------------------------------------------
  def dispose
    for i in 0...@sprite.size
      @sprite[i].dispose
    end
  end
  
  #----------------------------------------------------------------------------
  #*clear
  #----------------------------------------------------------------------------
  #Removes the specified drum's lighting effect when called
  #----------------------------------------------------------------------------
  def clear(drum)
    @sprite[drum].bitmap.clear
  end
end
Paste this script above main and under the other standard scripts.

Instructions

Instructions in script.
NOTE: Audiofiles and images can be obtained in the demo, this script won't function properly without them

Compatibility
This script does not rewrite any standard methods and does not make use of its own global variables. It should be compatible with anything out there, including the SDK

Credits and Thanks

  • Berans - Making the script
  • Sniper308 - Inspiring the script and providing the graphics

Author's Notes

Please credit me and sniper308 if you use this in your game. Other than that, have fun with it!
I'm always open for feedback.
Also, there are two ways to access the scene in the demo, both of which are hidden ;)
you'll be able to see them easily in the editor though :p
 
yeah...my next big challenge will probably be something more difficult and useful like a custom battle system....I'll have to think up somthing good though, since I don't want to stop making unique stuff :P
 
I actually thought about doing a guitar-hero like mini-game....but I think that, with RMXP's rather untrustworthy framerate, that might be near impossible XD
 
Yeah, I can see RMXP horking up and crashing at something like Guitar Hero.  Well, maybe not for all songs, but most would probably kill it.

Although a DDR mini-game has been attempted (and sadly not made public D: ).  So who knows, it might work.
 
I've actually got an evented "press the correct key within a very small timeframe" mini-game. The system's hell to work with though, and works through the battle system. I just use it for a bit of comic relief in my game
 
Actually, there was a DDRlike system in an RM2K3 game called Naufrager: Crimson (or was it Elegy?)
It worked pretty well, too.
No idea how it worked, though.
 
I'm thinking of making a Kamen Rider Hibiki fangame with that script on (though I have not watched it), but may not be done due to complex battle systems and nearly far-fetched to put this baby alongside with it.

Nice one though!
 
Beran: Oh no your making me want to make a game involving music! Great job on the script, is it alright if I modify the graphics to make it look like a guitar?
 
You can go right ahead. Feel free to modify this however you like, provided you still credit me if you're actually building on my script ;)
 
Well, then go right ahead. I don't mind people building on my script. I try to make them as customizable as possible just for that reason.
 
Rofl...wait till I release the piano script *muhahaha* I'm like halfway done. I just need to get all the sounds recorded (I'm recording my own computer playing piano from a midi device so I can easily control the length and volume of each sound to be the same :P)
and get the graphics positioned well, which is kinda tricky. Also a bit ticked off because the Input module I'm using for custom keys doesn't seem to like forward slash, which is the last key I actually need :P
 
Very nice! I actually made one just like this but for guitar, but I couldn't find very good sounding notes so there's a bit of background noise and stuff in each note. xD
And actually, Jump! and Jump! Platinum were great DDR clones in RM2K/3. J!P was the better one, and it even had double note detection(but it didn't always work :x). Just saying that if that was done with events, a scripted version should definitely run....Pretty well, at least.
 
Possibly. But animating anything large can cause problems....
anyway, I'm updating this script with brand-new imput code functionality. So that a game-creator can specify a sequence of keys that need pressing within the scene to turn on a switch
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top