スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

web拍手 by FC2   

[RGSS]時間の概念

使い方は → こちら

[RGSS]時間の概念
ゲーム内に昼夜の概念や現実時間との同じ時間を追加することができます。

スクリーンショット サムネイルクリックで拡大画像が見られます。
rgss_time.jpg

プログラムは続きにあります。

=begin
===============================================================================
    ☆★☆★☆★☆★ 時間の概念 ★☆★☆★☆★☆
=============================================================================== 

 製作・開発:STERS

  Page::http://stersblog.blog15.fc2.com/
  
導入方法------------------------------------------------------------------

    このスクリプトを Scene_Debug より下 Main より上に
   新しく作ったセクションにコピペして入れてください。

--------------------------------------------------------------------------

これを導入することで

ゲーム内に
昼夜の概念や現実時間との同じ時間を追加すること

ができるようになります。

使い方--------------------------------------------------------------------
1.まずはこのスクリプトを導入してください。

2.次に自分のゲームに合うように設定項目を変えてください

3.時間を取り出したければ
    $game_system.game_time.time(index)
    index の値
    0:年
    1:月
    2:日
    3:時間
    4:分
    5:秒
    6:曜日
    と記述すると取り出せます
    
4.完全時刻は
    $game_system.game_time.fulltime(type)
    typeの値
    0:区切りが年や月など
    1:区切りがスラッシュ(/)とコロン(:)
    と記述すると取得できす。
    具体的には
      (type=0)
     2006年 1月 1日 \n 0時 0分 0秒
    
      (type=1)
     2006/1/1 \n 0:0:0
   となります。
=end

#--------------------------------------------------------------------------
# ○ 各種設定項目
#--------------------------------------------------------------------------
class Game_Time
  # 現実時間とまったく同じにするかどうか?
  REAL_TIME = true 
  
  # 何時までが朝で、何時までが昼、何時までが夕方、何時までが夜か?
  # ( 24時間で )
  # ( 4つ無いとエラー )
  TIME_WHAT = [9, 15, 18, 3]
  
  # 昼夜を作成するか?
  # ( 一番上が false の時のみ )
  DEY_NIGHT = true
  
  # イベント中は時間を止めるか?
  # ( 一番上が false の時のみ )
  EVENT_STOP = true
  
  # 初期時刻
  # ( 一番上が false の時のみ )
  # 左から順に 年・月・日・時・分・秒
  # ( 6つ無いとエラー )
  START_TIME = [2006, 1, 1, 0, 0, 0]
  
  # 現実時間が何秒たつとゲーム内時刻が1秒か?
  # ( 一番上が false の時のみ )
  # ( 内部でここの数値を100分の1に調整します )
  # 左から順に 朝・昼・夕方・夜
  # ( 4つ無いとエラー )
  CHANGE_TIME = [20, 20, 20, 20]
  
  # 時間帯の色調
  # 上から順に 朝・昼・夕方・夜
  # ( ここを nil または 空の配列 にすると色調変更を行いません )
  # ( 1つでも要素がある場合4つ無いとエラー )
  CHANGE_TONE = [
    Tone.new(-48, -48, -16),
    Tone.new(0, 0, 0),
    Tone.new(-32, -64, -64),
    Tone.new(-96, -96, -64)
  ]
  
  # 上のやつの切り替え時間
  # 単位は フレームです
  CHANGE_FRAME = 40
end
class Window_PlayTime
  # メニュー画面でプレイ時間の変わりに
  # ゲーム時間を表示するか?
  MENU_GAME_TIME = true
end
class Scene_Map
  # マップ上で時刻を表示するか?
  MAP_GAME_TIME = true
end

#==============================================================================
# ■ Game_Time
#------------------------------------------------------------------------------
# ゲーム内時間の調整や、現実時間と同じ時間に調整する
# といった処理を行うクラスです。
#==============================================================================
class Game_Time

  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    # 現実時間か?
    if REAL_TIME == true
      # 現実時間を作成
      @time = []
      time = Time.now
      @time[0] = time.year
      @time[1] = time.mon
      @time[2] = time.mday
      @time[3] = time.hour
      @time[4] = time.min
      @time[5] = time.sec
      @wday = time.wday
      if @time[3] <= TIME_WHAT[3]
        @time_now = 3
      elsif @time[3] <= TIME_WHAT[0]
        @time_now = 0
      elsif @time[3] <= TIME_WHAT[1]
        @time_now = 1
      elsif @time[3] <= TIME_WHAT[2]
        @time_now = 2
      else
        @time_now = 3
      end
    else
      # それ以外なら
      # 初期設定をそのまま呼び出す
      @time = START_TIME
      @wday = 0
      @time_now = 0
    end
    # 計測用のカウントを初期化
    @count = 0
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # 計測用のカウントを増やす
    @count += 1
    # フラグをクリア
    @time_flag = false
    # 実行中なら戻る
    return if EVENT_STOP == true and $game_system.map_interpreter.running?
    # 現実時間と同じか?
    if REAL_TIME == true
      # 同じなら再作成して更新する
      time = Time.now
      @time[0] = time.year
      @time[1] = time.mon
      @time[2] = time.mday
      time2 = time.hour
      # 時間が動けばフラグをたてる
      if @time[3] <= time2
        @time_flag = true
        @time[3] = time2
      end
      @time[4] = time.min
      @time[5] = time.sec
      @wday = time.wday
      if @time[3] <= TIME_WHAT[3]
        @time_now = 3
      elsif @time[3] <= TIME_WHAT[0]
        @time_now = 0
      elsif @time[3] <= TIME_WHAT[1]
        @time_now = 1
      elsif @time[3] <= TIME_WHAT[2]
        @time_now = 2
      else
        @time_now = 3
      end
    else
      # それ以外なら
      # 必要時間が過ぎているか?
      if @count % Graphics.frame_rate >= CHANGE_TIME[@time_now] / 100
        # 過ぎていたら時刻の調整
        @time[5] += 1
        if @time[5] >= 60
          @time[4] += 1
          @time[5] = 0
          if @time[4] >= 60
            # 時間が動けばフラグをたてる
            @time_flag = true
            @time[3] += 1
            @time[4] = 0
            if @time[3] >= 24
              @wday = yobi_math  # 曜日を算出
              @time[2] += 1
              @time[3] = 0
              if @time[2] >= 30
                @time[1] += 1
                @time[2] = 0
                if @time[1] >= 12
                  @time[0] += 1
                  @time[1] = 0
                end
              end
            end
          end
        end
      end
    end
    # フラグが立っているかそれとも条件を満たしていなければ
    if @time_flag = true
      unless CHANGE_TONE == nil or CHANGE_TONE.size == 0
        # 色調変更の開始
        $game_screen.start_tone_change(CHANGE_TONE[@time_now],CHANGE_FRAME)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 曜日の算出
  #--------------------------------------------------------------------------
  def yobi_math
    # "日" を複製
    time = @time[2]
    # ループ
    loop do
      # "日" が7以下になるまで
      # "日" を減らす
      if time <= 7
        break
      end
      time -= 7
    end
    # 出てきた値を返す
    return time
  end
  #--------------------------------------------------------------------------
  # ● 必要な時刻を返す
  #--------------------------------------------------------------------------
  def time(index=0)
    case index
    when 0
      mozi = @time[0]
    when 1
      mozi = @time[1]
    when 2
      mozi = @time[2]
    when 3
      mozi = @time[3]
    when 4
      mozi = @time[4]
    when 5
      mozi = @time[5]
    when 6
      mozi = return_yobi
    end
    # 時刻を返す
    return mozi
  end
  #--------------------------------------------------------------------------
  # ● 算出した曜日を文字列として返す
  #--------------------------------------------------------------------------
  def return_yobi
    # 変数の値に応じて曜日を算出
    case @wday
    when 0
      mozi = "日"
    when 1
      mozi = "月"
    when 2
      mozi = "火"
    when 3
      mozi = "水"
    when 4
      mozi = "木"
    when 5
      mozi = "金"
    when 6
      mozi = "土"
    end
    # 曜日を返す
    return mozi
  end
  #--------------------------------------------------------------------------
  # ● 完全時刻を返す
  #--------------------------------------------------------------------------
  def fulltime(type=0)
    year = @time[0]
    mon = @time[1]
    mday = @time[2]
    wday = return_yobi
    hour = @time[3]
    min = @time[4]
    sec = @time[5]
    case type
    when 0
      mozi = sprintf("%2d年 %2d月 %2d日 %s曜日\n", year, mon, mday, wday)
      mozi += sprintf("%2d時 %2d分 %2d秒", hour, min, sec)
    when 1
      mozi = sprintf("%2d/%2d/%2d %s\n", year, mon, mday, wday)
      mozi += sprintf("%2d:%2d:%2d", hour, min, sec)
    else
      mozi = ""
    end
    # 時刻を返す
    return mozi
  end
end
#==============================================================================
# ■ Game_System
#------------------------------------------------------------------------------
#  システム周りのデータを扱うクラスです。BGM などの管理も行います。このクラス
# のインスタンスは $game_system で参照されます。
#==============================================================================
class Game_System
  attr_accessor :game_time          # ゲーム内時刻
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_STERS_time initialize unless $@
  def initialize
    # オブジェクトを作成
    @game_time = Game_Time.new
    # 呼び戻す
    initialize_STERS_time
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_STERS_time update unless $@
  def update
    # クラスの更新
    @game_time.update
    # 呼び戻す
    update_STERS_time
  end
end

#==============================================================================
# ■ Window_PlayTime
#------------------------------------------------------------------------------
#  メニュー画面でプレイ時間を表示するウィンドウです。
#==============================================================================

class Window_PlayTime < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(flag=false)
    super(0, 0, 160, 96)
    self.contents = Bitmap.new(width - 32, height - 32)
    @flag = flag
    # オリジナル時間を使用か?
    if MENU_GAME_TIME == true or @flag == true
      # 時間の作成
      @time = Game_Time.new
      # リフレッシュ
      refresh_sters_org
    else
      refresh
    end
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ-オリジナル
  #--------------------------------------------------------------------------
  def refresh_sters_org
    @time = Game_Time.new if @flag == true
    self.contents.clear
    self.contents.font.color = normal_color
    # 時間の取得
    year = @time.time(0)
    mon = @time.time(1)
    mday = @time.time(2)
    wday = @time.time(6)
    hour = @time.time(3)
    min = @time.time(4)
    sec = @time.time(5)
    # 描画
    text = sprintf("%02d/%02d/%02d", year, mon, mday)
    self.contents.draw_text(4, 0, 120, 32, text)
    text = sprintf("%02d:%02d:%02d", hour, min, sec)
    self.contents.draw_text(4, 32, 120, 32, text)
    self.contents.font.color = system_color
    self.contents.draw_text(4, 32, 120, 32, wday, 2)
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    # オリジナル時間を使用か?
    if MENU_GAME_TIME == true or @flag == true
      # 時間を更新
      @time.update
      # リフレッシュ
      refresh_sters_org
    else
      # それ以外なら通常
      if Graphics.frame_count / Graphics.frame_rate != @total_sec
        refresh
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 開放
  #--------------------------------------------------------------------------
  def dispose
    # オリジナル時間を使用か?
    if MENU_GAME_TIME == true
      # 時間をシステムに同期させる
      $game_system.game_time = @time
    end
    super
  end
end

#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  マップ画面の処理を行うクラスです。
#==============================================================================

class Scene_Map
  #--------------------------------------------------------------------------
  # ● メイン処理
  #--------------------------------------------------------------------------
  alias org_main main unless $@
  def main
    if MAP_GAME_TIME == true
      @time_win = Window_PlayTime.new(true)
    end
    org_main
    @time_win.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias org_update update unless $@
  def update
    @time_win.update
    org_update
  end
end

web拍手 by FC2   

コメントの投稿


非公開コメント

コメント

STERS's Development Room

STERSの開発室っぽい何か。


プロフィール

Name:STERS
Unity3D/C#/PHP/js/C++/VB
などを勉強中です

[STERS's Room]
[ファイル置き場]

カテゴリー
最近の記事
最近のコメント
カレンダー
04 ≪│2017/05│≫ 06
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
RSSリンクの表示
ブログ内Google検索
Google
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。