2013-12-22

RGSS-たらたら文字

Comment ShareLink
«RGSS一覧

ゲーム中のメッセージを一文字ずつ表示させるようにします。
今回のスクリプトはちょーっとばかり頑張って Window_Message全体 を改造してみたので、下のリンク先(テキストファイル)にまとめました。


【スクリプト】

【主な機能】
 ・疑似ポーズサイン
 ・フェードイン&フェードアウト
 ・一文字ずつメッセージ表示(速度設定可)
 ・顔グラフィック表示
 ・名前表示
 ・ページ送り、たらたら効果音付き
 ・たらたら、一気表示の手動切り替え機能
 ・メッセージウェイト
 ・ボタン入力待ち
 ・押しっぱなしスキップ
 ・メッセージ自動送り
 ・メッセージ続行機能
 ・ルビ(読み仮名)機能
 ・文字サイズ変更機能
 ・インデント機能
 ・メッセージ速度変更機能


リンク先の文章(スクリプト)をスクリプトエディタにコピー&ペーストしてお使いください。
※このスクリプトを使用した作品を公開する場合はクレジット等に「SilverHearts」の表記、可能であればこちらの制作ブログへのリンクをお願いします。

各機能の使い方をよく読んでからご使用下さい。

導入の仕方:Windows_Messageの代わりにたらたら文字RGSSを挿入


■戦闘中メッセージ表示で動作がカクカクする時は■
[Scene_Battle 1>フレーム更新]のアフターバトルフェーズでなければリフレッシュする条件に青文字を追加(メッセージウィンドウ表示中でなければステータスウィンドウをリフレッシュするように変更)

# アフターバトルフェーズでなければ
if @phase != 5 and $game_temp.message_window_showing != true
 # ステータスウィンドウをリフレッシュ
 @status_window.refresh
end


変更点
2022/11/26
 ・たらたら表示の速度変更が可能になりました
 ・文字描画の横幅指定を文字幅依存に修正
2020/07/04
 ・\K(入力待ち)でエラーが発生する問題を修正
 ・表示を文字の大きさ依存に変更
 ・ルビ、ポーズサイン表示位置を改良
2019/12/03
 ・メッセージ続行を使用した時にフェードしてしまう問題を修正
 ・顔グラフィックのフェードインが正常に行われていなかった問題を修正
2019/11/11
 ・ウェイトスキップの動作を修正(自動送り→強制ウェイト依存に変更)
 ・自動送り時にフェードアウトが反映されていなかった問題を修正
 ・表示開始時のフェードイン機能追加(たらたら対応)
 ・インデント機能追加
 ・メッセージ速度変更機能追加
 ・フェイス画像(Bitmap)の横幅に顔表示時の字下げ対応
 ・たらたら、一気表示の切り替えに対応
2016/05/08
 ・たらたら音を半角/全角スペースの場合無音になるよう改良
 ・前回更新時、たらたら音のつけ忘れ修正
2016/04/12
 ・一文字ずつ表示と一気表示の描画処理を統合しスクリプトを軽量化
2015/05/23
 ・擬似ポーズサインがウィンドウ位置変更に対応しなかった問題を解決
2015/03/04
 ・擬似ポーズサイン実装
 ・基本フォントサイズをデフォルト依存に変更
2015/03/03
 ・名前表示の幅改善
2014/12/17
 ・選択肢のカーソル幅を固定ではなく文字数依存に変更
 ・ルビに伴うカーソル位置とウィンドウ位置を微調整
2014/11/29
 ・ルビ機能追加
 ・文字サイズ変更機能追加

category:
2013-11-05

カラスのくちばし~RGSS小技集

Comment ShareLink
«RGSS一覧

RGSSの基本から役に立つかわからないものまで、
色々いじって活用できそうなものを集めてみました(・ω・)
多くはRPGツクールXPのヘルプに書かれているものを烏守が勝手に解釈して書いたものなので、ヘルプを見る事を強くオススメします。
間違ってることが書いてあるかもしれないので強く!おすすめします。
一部はヘルプに載っていないRubyスクリプト参考。


~ 基本 ~~ 小技メモ ~
クラス
メソッド
グローバル変数
インスタンス変数
ローカル変数
整数に変換
浮動小数点に変換
文字列に変数
配列
ハッシュ
条件分岐
ループ
returnでメソッド終了?
同じマップのイベント実行
セルフスイッチ遠隔操作
同マップ場所移動でイベント位置初期化
指定位置に移動
表示ピクチャの一部変更
テキストに出力
フォルダ作成
EC「スクリプト」の不具合修正

category:
2013-11-01

RGSS-ステート自然解除タイミング修正(アクティブ)

Comment ShareLink
«RGSS一覧

デフォルトだと、戦闘中の
ステート解除タイミングが行動開始時になっている
んですよね…
このままだと行動選択時に、
「解除ターンなのに解除されてない」
「まだこのステートついてるから回復しないと」
とプレイヤーに思わせて混乱を招くかと思うので
ステート解除のタイミングを修正します。




【今回の変更点】
・Scene_Battle 4



■Scene_Battle 4

134行目~あたりの
# ステート自然解除
@active_battler.remove_states_auto
# ステータスウィンドウをリフレッシュ
@status_window.refresh

を消去し
以下の2箇所に追加。

「フレーム更新 (メインフェーズ ステップ 2 : アクション開始)」
def update_phase4_step2
# 制約が [行動できない] の場合
if @active_battler.restriction == 4
 @active_battler.remove_states_auto
 @status_window.refresh

def update_phase4_step6
# アクション強制対象のバトラーをクリア
$game_temp.forcing_battler = nil
@active_battler.remove_states_auto
@status_window.refresh



各アクターのターンが過ぎたら自動回復するようになっています。
例えば、1ターンだけのステートなら
ステートがついた→次のターンの行動後に解除
となります。

category:
2013-08-22

RGSS-パラメーター上昇アイテム使用制限

Comment ShareLink

«RGSS一覧


う~ん…タイトルがいつも微妙でごめん。


今回は
アクターのパラメータが最大の時
パラメータ上昇アイテムを使用不可にする
ように改造します。


なんとこれで…


「能力値MAXなのに間違えて使っちまった!!!うおおおぉ~~~ん!!!」


という勿体無く嘆かわしい出来事も防げるんです!


アイテム使用時のターゲットステータスに腕力だとか、魔力だとかの詳細はデフォルトのままだと見えないし、その状態で能力アップを間違えて使っちゃうのはプレイヤーにとって不親切かな~とか思ってやってみました。


ステータスについては、まあ…
レイアウトや表示を変えれば解決するんですが。
プレイヤーさんが
「このパラメータは最大値だな」と思ってても
間違えてポチっと使っちゃう事も
あるかもしれないじゃないですか(・ω・)


…え?烏守じゃないから間違えないって?
あややややや(((゚Д゚;)))

まあとりあえず、やってみましょー!




【今回の変更点】
・Game_Battler 3



■Game_Battler 3

デフォルトではHP、SP回復アイテムの場合だと
対象アクターが全回復している状態なら
ブザーが鳴ってアイテムが使用できないようになっていますよね。

今回はそこを応用してみました。
とりあえず、HP回復アイテム処理のスクリプトについて解説!


last_hp = self.hp
last_sp = self.sp
self.hp += recover_hp
self.sp += recover_sp
effective |= self.hp != last_hp
effective |= self.sp != last_sp


recover_hp がアイテムに設定されている「HP回復量」で
self.hp が対象アクターの現在のHPを表しています。
アイテムの回復量で現在HP、SPが変化したかどうかで
effective が切り替わるようになってます。
この effective という変数は、
アイテムを使用したかどうかを判断させるための
スイッチのような存在になってます。
これが true であれば、消費アイテムは消費されます。


では、パラメータの方も
最大の場合にはアイテムを消費しないように変更してみましょう。

変更場所は以下のwhen…の下です。
(デフォルトのままなら271行目あたり)
# パラメータ上昇値が有効の場合
if item.parameter_type > 0 and item.parameter_points != 0
 # パラメータで分岐
 case item.parameter_type
  when 1 # MaxHP
     :
     :

パラメータごとに
「@maxhp_plus += item.parameter_points」
のようになっていますが、
最大値はGame_Battler 1 と Game_Actorで設定してある
MaxHP の取得等で制限される事になるので
中身を思いっ切り

maxhp = self.maxhp
self.maxhp += item.parameter_points
effective |= self.maxhp != maxhp

に変更!

self.maxhpが最大HP、self.maxspが最大SP
self.strが腕力…というように
selfで対象アクターのパラメータを示します。

パラメータ分岐の中身を変更し終えたら
最後尾についている
# 有効フラグをセット
effective = true

を消去しておきましょう。



これでプレイヤーさんが
アクターのパラメータが最大値の時に間違ってアイテムを使ってしまって
「あ~~勿体無い事した~~orz」
なんて目には合わなくなったハズ。


完成したら必ず面倒だと言わずにテストしておくように(・ω・)



★このスクリプトを使った関連作品

category:
2013-08-10

RGSS-制御文字で絵文字を表示

Comment ShareLink

«RGSS一覧


台詞に「♥(ハートマーク)」を入れたり絵文字でキャラクターの感情を表現したいけど
文字だと環境依存で?になって表示できないし…
と、


諦めたらそこで試合終了だよ(・ω・)


それなら自分で作っちゃえばいいのさ~♪


「でも絵文字の絵を作ってもメッセージに表示するやり方を知らない」
って方に、
今回は制御文字で絵文字を表示させるやり方を伝授します!




【今回の変更点】
・Window_Message

【用意するもの】
・絵文字画像

SilverHearts絵文字サンプルダウンロード

*絵文字サンプルの著作権はSilverHeartsにあります。公開作品に使用する場合はクレジット表記をお願いします。



【スクリーンショット】

こんな感じになります。
絵文字の種類を増やせば、メッセージをより豊かに彩る事ができます。
ビジュアル重視の作品にはもってこい?




■Window_Message

文字描画でいつもお世話になってる「def refresh」に注目。
text.gsub!だとかがつらつら並んでいる場所、
while ((c = text.slice!…の上あたりに
まずはひとつ、スクリプトを追加します。

text.gsub!(/\\[Ee]\[([0-9]+)\]/) { "\006[#{$1}]" }

ここでは、文章の表示に書き込んだ「\E」を「\006」に変換させます。


で、次は。
wheile…の下に

  if c == "\006"
 text.sub!(/\[([0-9]+)\]/, "")
 emoji = $1.to_i
 case emoji
 when 0
  bitmap = RPG::Cache.picture("ハート")
 when 1
  bitmap = RPG::Cache.picture("キラキラ")
    :
    : 使う絵文字の分だけ上と同じように追加
    :
 end
 self.contents.blt(4 + x, 32 * y + 2, bitmap, Rect.new(0, 0, bitmap.width, bitmap.height))
 x += bitmap.width
 next
end

というように追加します。
これで文章の表示で「\E[0]」と書き込むと
Picturesフォルダに入っているハートが、
「\E[1]」と書き込むとキラキラの絵文字が表示されます。
ね、簡単でしょ?



初期からある制御文字の応用なので、
執筆者の書き方がヒジョ~に分かりにくくても(笑)
どうすればいいかすぐ分かるかと思います。

スクリーンショットで使った絵文字4点は
上の「SilverHearts絵文字サンプル」のリンク先からセットでダウンロードできますので、指定フォルダに入れてテストしてみてください。

category:
2013-07-10

002-制作中のキャラクターなど

Comment ShareLink
«001-制作中の作品!003-デバッグ中!»

やっとストーリーの方、終盤にとりかかっています!


…が、しかし。

戦闘に関するところがカラッキシなんですね(・ω・`)
スキル・スキルアニメーション・武器・防具・効果音など。

ストーリーはなんとかもうエンディングまでいけそうです
まあ、よくあるパターンというか。
そんなカンジのストーリーになっちゃうんですが。
エンディングの最後の方だけは


「え!こんな終わり方なの?!」


っていうオチにしたいと思ってるんですけど。
難しいですねorz


もういっそエターなってもいいから、オリジナルにこだわってみようとも思ってます(ダメじゃんそれじゃ;)
また発表できずに歳月だけ過ぎていくかも…
節電もしなきゃ、ですし。。。





ちょっとココで登場キャラクターを載せちゃいます。
まだまだ制作途中なんで、変更する事もあると思いますが。
こんな感じですよ、と(苦笑)


ゲーム中のキャラクターは
下のgifアニメのように、単純に2枚アニメーションで動きます。


カジノを作ろうと思ってバニーちゃんを用意しました。
ディーラーもいますが、とりあえずバニーちゃんを貼り付け♪
金髪の方はダンジョンでギャンブルを挑んでくる姐さんな設定です。


メンバーの好きなアーティストの方をモデルにしたキャラクター
「謎の旅人/大賢者/もやしの人」です。
主人公のサポート的な立場にいる偉大な人たちになります(*´∀`*)
誰をモデルにしたかはご想像におまかせします。





作る事に意義がある!


しかし、完成させる事にもまた意義がある!!


そういうわけで、
パソコンと電気とネットとお金とこの命ある限り
頑張って今後もメンバーと制作に取り組みます!!!




どんなにありふれた作品でも

どんなにヘボといわれても

完成させるという事は素晴らしい事なので

頑張りましょう!


…と、自分に言い聞かせる(。A。)



もちろん、パクリはダメですけどね(‘ー‘)

category:
2013-06-10

001-制作中の作品

Comment ShareLink

Silver Heartsで現在制作中のゲームをちょこっと公開。
昨年の夏頃からRPGツクールXPで制作中。
えぇっと…
ここで公開している画像は制作中のもので
内容を変更する事があります。






主人公は魔王を倒すために異世界から呼び出された
という、かな~りベタな展開から始まります。

「レトロゲーム調(ファミコンとか、ゲームボーイみたいな)にしたいな」
という案から、
ゲーム中では漢字は一切使っていません。

グラフィックも通常サイズの4~5倍に伸ばして
ドット風味を出してみました。








ゲーム中の移動は主に選択肢。

街にある掲示板では、様々な情報が見れたり
クエストが受けられるようにする予定。
…まだ掲示板のクエストは実装してないです。

現在はとにかくひたすら
物語の流れを最初から最後まで作って
公開できるまでにもっていこうと頑張ろうという事で!
(`・ω・´)キュ






ダンジョンはこんな感じです。
「~m」はダンジョンの位置を表しています。
入ったところからの距離ではないです。

今の段階では入った場所関係なしに
「すすむ」で距離を増やして
「もどる」で距離を減らす
というものになっているんですが、
ややこしいから、入った場所からの
「すすむ・もどる」がいいんでしょうか(・ω・`)
あぁ混乱。。。

…と、いったように悩むところもまだまだ多いですね。

ダンジョンを歩き回っている内に
モンスターや旅人、商人、宝や罠に
出会っちゃいます。
ダンジョンごとに起こるイベントや確率を設定していますが
特定のイベント以外は全て運が重要、と。








戦闘画面です。
「~があらわれた!」や「~たちがあらわれた!」
と表示されます。
時々、運による先制攻撃や、不意打ちもあります。
ダンジョンのイベント同様にステータスは関係ないので
これもまた運なんですね(=∀=*)

ほとんど運ゲー。
って事になるんでしょうか。
う~ん…






マヨッマヨ平原の向こう側にある
兵士キャンプへ着くと、物語は進みます。
とは言っても。


現在の制作進行度は
まだ、完成には到底かかりそうですが
あと少しで物語はエンディングの方まで作れそうなので
ちょこちょこっと書きました。

制作メンバー間の都合で制作ペースが落ち込む事も度々ありますが
この作品は意地でも完成させたい!!
ので、
時間はかかっても、完成まで持っていこうと思っております。
作品の公開は未定です。

category:
2013-04-05

RGSS-ステート画像表示

Comment ShareLink
«RGSS一覧

デフォルトのままだとステートの表示は
[沈黙/睡眠/麻痺] といった風に文字で
表示部分width(横幅)に収まるだけしか表示できず
多くのステートをかけると
「どのステートにかかってたっけ?」
って思っちゃう事も…ない?(´・ω・`)

それならいっそ、画像表示にしたらどうなんだ!
という事で今回の「ステート画像表示」を思いつきました。
…他に解決法はいくらでもあるんですけどね~。

画像はステートと同じ名前のファイルをIconsフォルダに用意して下さい。
16~32ピクセルくらいのサイズで用意する事をオススメします。




【今回の変更点】
・Window_Base
・Window_Help

【スクリーンショット】

左がステート画像表示の例。右はスクリプトの応用で文字ステートを複数二段で表示したもの。


■Window_Base

def make_battler_state_text
中身をまるっきり下記のように変えます。
「st番号」は、表示させたい分だけそれぞれの部分に
追加しておきましょう。
※レーティングが0のものは表示されないようにしてます。

array = 0
st1 = st2 = st3 = "" ←空にしておく
for i in battler.states
 if $data_states[i].rating >= 1
  case array
  when 0
   st1 = $data_states[i].name
   array = 1
  when 1
   st2 = $data_states[i].name
   array = 2
  when 2
   st3 = $data_states[i].name
   array = 3
     :
     :
(表示させるステートの分だけ上when…と同じように追加)
  end
 end
end
return st1, st2, st3…

ここで初歩的・豆知識!
スクリプトでよく見る「return 変数、または数値」ですが
あれはdef~というメソッドに変数を戻り値として入れている
らしいです(・ω・*)
上のように st1, st2...と続けて入れると、配列として入ります。

次の変更点で「ああそゆこと!」ってわかるかも。
勉強も大切です。頑張りましょう。

def draw_actor_state
 st = make_battler_state_text(actor, width)
 rect = Rect.new(0, 0, 640, 480)
 if st[0] != ""
  bitmap = RPG::Cache.icon(st[0])
  self.contents.blt(x, y, bitmap, rect)
 end
 if st[1] != ""
  bitmap = RPG::Cache.icon(st[1])
  self.contents.blt(x + 18, y, bitmap, rect)
 end
 if st[2] != ""
  bitmap = RPG::Cache.icon(st[2])
  self.contents.blt(x + 36, y, bitmap, rect)
 end
  :
  :
(表示させるステートの分だけ追加)

st[番号]が空でない場合
ステータスと同じ名前の画像をIconフォルダから参照します。
縦(y)値をずらせば、二段重ねでも表示できますよo(・ω・o´)


■Window_Help

ヘルプにも画像で付加されているステートを表示します。
エネミーの方は名前と一緒(しかも文字表示)になっているので
ちょっと変更します。

「テキストの設定」の
@actor = nil の下あたりにでも
@enemy = nil
を追加。

次に、デフォルトのset_enemy中身を消して
下記を記述しておきます。

if enemy != @enemy
 self.contents.clear
 draw_actor_name(enemy, 280 - enemy.name.size, 0)
 draw_actor_state(enemy, 450, 8)
 @enemy = enemy
end

「280 - enemy.name.size」では
エネミーの名前のサイズ分だけ横280pxの位置から引いて
中央寄せに見せています。
アクター設定の方も調整しておきましょう。




画像にするのにメソッド名に"text"なんておかしいって思った方は独自で変更するとして。
デフォから改造して使いやすい・確認しやすいように書いたつもりです。


self.contents.blt
self.contents.draw_text(x, y, width, height, st[番号]) に変更してそれぞれの値を調整すればスクリーンショットのように二段表示にする事もできるので、作品の雰囲気に合った表示方法を見つけてみてください。



★このスクリプトを使った関連作品

category:
2013-03-04

RGSS-制御文字で文字サイズ変更

Comment ShareLink
«RGSS一覧

メッセージの一部の文字を大きくしたり小さくしたりできたら
表現の幅がきっと広がるハズ!

メッセージで文字の色を変える、
アクターの名前を入力する、変数の値を表示する、
…などの制御文字はXPツクラーの方なら
既に知っているかと思います。

今回のRGSSは、
文字サイズの変更を制御文字で可能にします。




【今回の変更点】
・Window_Message

【スクリーンショット】



■Windows_Message

「リフレッシュ」
def refreshの下に
  self.contents.font.size = 22追加

リフレッシュでサイズを初期値に戻しておかないと、
次に文章を表示した時、初期サイズに戻りません。
デフォルト文字サイズが22なので22にしてあります。

「制御文字処理」
    :
# "\\C" を "\001" に、"\\G" を "\002" に変換
text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
text.gsub!(/\\[Gg]/) { "\002" }
text.gsub!(/\\[Mm]/) { "\003" }←普通サイズ
text.gsub!(/\\[Ss]/) { "\004" }←小サイズ
text.gsub!(/\\[Ll]/) { "\005" }←大サイズ

\Mで初期サイズ、\Sで小さいサイズ、\Lで大きいサイズに
制御文字を使って変更できるようにします。

# c に 1 文字を取得 (文字が取得できなくなるまでループ)
while ((c = text.slice!(/./m)) != nil)
…の以下、文字の描画以上に下記を挿入。

# \M の場合
if c == "\003"
 self.contents.font.size = 22(初期サイズに)
 next
end
# \S の場合
if c == "\004"
 self.contents.font.size = 16(好きなサイズに)
 next
end
# \L の場合
if c == "\005"
 self.contents.font.size = 26(好きなサイズに)
 next
end

これで\M\S\Lの制御文字で文字を各サイズに
変更する事が可能になります。
文字の大きさはそれぞれ好きな大きさに設定して下さい。




同じようなやり方で一部書体を変えたり、画像を表示させたりもできるかと思います。
制御文字もアイデア次第ですね。

category:
2013-02-13

RGSS-ステート自然解除タイミング修正(ターン)

Comment ShareLink
«RGSS一覧

デフォルトだと、戦闘中の
ステート解除タイミングが行動開始時になっている
んですよね…
このままだと行動選択時に、
「解除ターンなのに解除されてない」
「まだこのステートついてるから回復しないと」
とプレイヤーに思わせて混乱を招くかと思うので
ステート解除のタイミングを修正します。

前回はバトラーの行動直後に解除タイミング
でしたが、今回はコマンド入力前のターン開始時に
解除させるやり方を書いておきます。





【今回の変更点】
・Scene_Battle 1
・Scene_Battle 2
・Scene_Battle 4




■Scene_Battle 1

def main 内、プレバトルフェーズ開始よりも上の方に
@remove_states = false(変数の名前はダブらなければ自由)
を追加。

■Scene_Battle 2

def start_phase2 の下に下記追加。
if @remove_states == false
 for actor in $game_party.actors
  actor.remove_states_auto
 end
 for enemy in $game_troop.enemies
  enemy.remove_states_auto
 end
 @status_window.refresh
 @remove_states = true
end

これが一度実行されると「@remove_states」がtrueになるので
アクターコマンドフェーズからキャンセルして
再度繰り返される事はありません。
ですが次のターンのために
一度「@remove_states」を false に戻す必要があるので
次の段階へ。

■Scene_Battle 4

「フレーム更新」
def update_phase4_step1(メインフェーズ ステップ1)
# 未行動バトラーが存在しない場合 (全員行動した)
if @action_battlers.size == 0
 @remove_states = false ←追加
 # パーティコマンドフェーズ開始
  start_phase2
 return
end

これでターン毎に解除タイミングを設ける事ができた…ハズ。

あとは前回と同じくScene_Battle 4の
134行目~あたりの
# ステート自然解除
@active_battler.remove_states_auto
# ステータスウィンドウをリフレッシュ
@status_window.refresh

を消去するだけ。




バトラーごとにバラバラに自然解除させるか
ターンごとに一気に全員のステートを自然解除させるか…
少し違うだけで、
ゲームのバトルスタイルがガラっと変わる事もあります。
ちょっとの違いで大きな変化です(・ω・´)
制作、頑張りましょう!



★このスクリプトを使った関連作品

category: