RPG作る人のブログ -32ページ目

RPG作る人のブログ

RPGゲームを作りたい人のブログです。

RGSSで選択肢拡張するスクリプト


作品を作っていて5つ以上の選択肢を作りたい場面があったのでどうしたらできるのか調べていたら半日が終わった。
という訳で汗と涙の選択肢拡張スクリプト解説。
以下はイベントスクリプトでの入力を想定しています。
もちろんスクリプトエディタでも可能です。

サンプルコード

$gm = $game_message
$gm.choices.push("1","2","3","4","5","6","7","8")
$gm.choice_cancel_type = 9
$gm.choice_proc = Proc.new {|n| $branch = n }
Fiber.yield while $gm.choice?
case $branch
when 0 then $game_variables[61] = 1
when 1 then $game_variables[61] = 2
when 2 then $game_variables[61] = 3
when 3 then $game_variables[61] = 4
when 4 then $game_variables[61] = 5
when 5 then $game_variables[61] = 6
when 6 then $game_variables[61] = 7
when 7 then $game_variables[61] = 8
when 8 then $game_variables[61] = 9
end

これで後は変数(今回はIDが61の変数)によって条件分岐を作って表示する文章を作ります。



RGSSで選択肢拡張する方法


実行結果は以下の通り。

1から8までの選択肢が表示される。
RGSSで選択肢拡張する方法


「1」を選ぶと変数に対応した文章が表示されます。今回は「label1」

RGSSで選択肢拡張する方法


「6」を選ぶと
RGSSで選択肢拡張する方法


「label6」という文章が表示されます。
RGSSで選択肢拡張する方法


スクリプト解説

1行目 $gm = $game_message


選択肢を表示させるには「$game_message」というメソッドを使います。
イベントスクリプトに入れるには省スペースをしなければならないため、$gmというグローバル変数に$game_messageを代入しています。

2行目 $gm.choices.push("1","2","3","4","5","6","7","8")


これはつまり「$game_message.choices.push」と書かれているわけですが、()内にはそれぞれの選択肢に表示したい文字を「,」で分けて書いています。
この「$game_message.choices.push("1","2","3","4","5","6","7","8")」はこのように書くこともできます。

$game_message.choices.push("1")
$game_message.choices.push("2")
$game_message.choices.push("3")
$game_message.choices.push("4")
$game_message.choices.push("5")
$game_message.choices.push("6")
$game_message.choices.push("7")
$game_message.choices.push("8")

こうして描くとただコードが冗長になったように感じますが、「$game_message.choices」を$gmcというグローバル変数に代入した場合

$gmc = $game_message.choices
$gmc.push("1")
$gmc.push("2")
$gmc.push("3")
$gmc.push("4")
$gmc.push("5")
$gmc.push("6")
$gmc.push("7")
$gmc.push("8")

と縦にすっきりした形で書くことができます。
この縦書き選択肢の使った方が良い場合というは選択肢の中身が長くなる場合でしょう。
例えば

選択肢
勇者よ!魔王を倒せ!と叫ぶ
勇者よ!ほどほどに頑張れ!と声をかける
勇者よ!気楽にな。と肩を叩く
勇者よ!無理はするな!と引き止める
勇者よ!お前じゃ無理だ!と叫ぶ

という選択肢を作りたい場合、横に長くすると

$gmc = $game_message.choices
$gmc.push("選択肢","勇者よ!魔王を倒せ!と叫ぶ","勇者よ!ほどほどに頑張れ!と声をかける","勇者よ!気楽にな。と肩を叩く","勇者よ!無理はするな!と引き止める","勇者よ!お前じゃ無理だ!と叫ぶ")

となり、これをイベントスクリプトに入れるとツクールの方で強制改行され、エラーが出る原因になります。
これを縦に書くと

$gmc = $game_message.choices
$gmc.push("選択肢")
$gmc.push("勇者よ!魔王を倒せ!と叫ぶ")
$gmc.push("勇者よ!ほどほどに頑張れ!と声をかける")
$gmc.push("勇者よ!気楽にな。と肩を叩く")
$gmc.push("勇者よ!無理はするな!と引き止める")
$gmc.push(勇者よ!お前じゃ無理だ!と叫ぶ"")

となり、横幅に何とか間に合い、直観的にも分かりやすいコードの形になります。
それぞれの場面でやり易いやり方を選択してください。

3行目 $gm.choice_cancel_type = 9


これは選択肢が表示された時にキャンセルボタンが押された時の挙動を決めているコードです。
choice_cancel_typeプロパティの値で、以下のように挙動が決まります。
choice_cancel_type = 0 でキャンセルボタン無効に。
choice_cancel_type = 1 でキャンセルボタンが押された時に選択肢1を選択
choice_cancel_type = 2 でキャンセルボタンが押された時に選択肢2を選択
choice_cancel_type = 3 でキャンセルボタンが押された時に選択肢3を選択



といった感じです。
選択肢がない場合にも値は返され、次のコードのnにその値が代入されます。

4行目 $gm.choice_proc = Proc.new {|n| $branch = n }


この行に苦しめられた。
選択肢表示をスクリプトでする上で難しいのがこのコードでしょう。
色々と気になるところはあると思いますが、この行で見てもらいたいのは右辺{}内の「$branch = n」というところ。
nは選択された選択肢の数値を返します。
選択肢1が選択されたら0を、選択肢2を選択されたら1を、選択肢2を選択されたら2を返すという具合。
このnの数値を$branchというグローバル変数に代入しているのです。
あとはこの$branchの数値によってどのような処理をするのかを書くだけ。
「Proc」が何なのかとか「choice_proc」がどういうプロパティなのかということはうまく説明できる自信がないので割愛させていただきます。

5行目 Fiber.yield while $gm.choice?


この行は選択肢を選択されるまで処理を待つための行です。
これがないと最後まで処理が流れてしまい選択肢に応じた処理ができなくなります。
Fiberがなんなのかとかyieldが何なのかとかはツクールのヘルプか他のサイトを参考にしてください。ここでは説明を割愛させていただきます。

6行目以降 case文


こちらで$branchに代入された数値に応じて指定した変数を代入しています。



5つ以上の選択肢を表示するのは$game_message.choices.push()を使えばすぐに表示はできるので簡単なのですが、選択された後の処理をどうするか決めるのが大変という感じですね。
また今回はcase文を使って場合分けして文章表示させるという方法を取りましたがもっとスマートな方法はあるかと思います。
今回はスクリプトエディタ画面でなく、イベント画面で編集したいのでこのような形にしました。
ラベルでジャンプして文章表示なんていう方法もしようと思いましたがスクリプトでラベルジャンプの仕方が分からなかったので諦めました。

選択を増やすだけなので簡単だろうと思いきや結構大変な思いをさせられました。

余談ですが前の記事に「|n|って絶対値みたいで違和感がする」なんて書きましたがブロックパラメータという呼ばれるものなんですね。感覚的には変数の宣言みたいな感じがします。
あぁ、恥ずかしや…

RGSSリファレンスwiki目次へ


◯参考ページ
rgss3 リファレンスwiki $game_message.choices.push()
rgss3 リファレンスwiki $game_message.choice_proc
http://bbs.66rpg.com/plugin.php?id=dsu_xm_codehighlight:main&pid=2050691&action=print&codeid=0




ふりーむ様にてRGSS3のリファレンスが公開されました。
RGSSを使ってみたい、RGSSを勉強したいという方は参考になさってください。
RGSS3リファレンス イベントコマンド版

にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村

Rubyのfor文で降順の繰り返しをする方法


初級の話なのですが、自分がやり方を調べて時間を無駄にしたのでもし同じような方がいればと思い、綴ります。

ツクールのスクリプトを組むときに降順の繰り返しをする必要がでてきたのでfor文で繰り返そうと思ったのですがRubyにはfor文での降順の繰り返しが出来ないので別の方法を考える必要があります。

C#では以下のようになる。


for(int i = 100; i >= 0; i--)
{
  console.WriteLine("無駄");
  console.WriteLine("あと" + i.ToString() + "回無駄って言います。");
}
console.Writeline("無駄ァアアア!");



のですが、その流れでRubyのfor文を以下のように書こうと思うとうまく動きません。


for i in 100..1 do
  puts "無駄"
  puts "あと" + i.to_s + "回無駄って言います。"
end
puts("無駄ァアアア!")


Rubyだと次の方法で降順の繰り返しをする必要があるようです。

Rubyで降順の繰り返し文をする方法その1


100.downto(1){
|i|
puts "無駄"
puts "あと" + i.to_s + "回無駄って言います。"
}
puts "無駄ァアアア!"



Rubyで降順の繰り返し文をする方法その2


((1..100).to_a).reverse
{|i|
puts "無駄"
puts "あと" + i.to_s + "回無駄って言います。"
}
puts "無駄ァアアア!"



ツクールのヘルプはloop do文が好きなのでそれを使うと以下の方法

Rubyで降順の繰り返し文をする方法その3


i = 100
loop do
  puts "無駄"
  puts "あと" + i.to_s + "回無駄って言います。"
  i = i -1
  
  if i == 0 then
    break
  end
end
puts "無駄ァアア!"



と色々出てきたのですがイマイチ自分の好きな方法じゃなかった。
上二つの方法は|i|が絶対値に見えてしまって違和感を感じてしまうから。これは完全に好き嫌い。
loop do文に関しては行も長くなっちゃうし。
for文に慣れている自分にとって可読性を良くしたいのでfor文で済むところはfor文にしたい。
で、ふと閃いたのが以下の方法

Rubyのfor文で降順の繰り返しをする方法


for i in 1..100 do
  i = 101 - i
  puts "無駄"
  puts "あと" + i.to_s + "回無駄って言います。"
end
puts("無駄ァアアア!")


そう、「あれ、変数にマイナスつければ良くね?そんで上手く引けば良くね?」というだけのことでした。
for文内で複雑な操作をしようとするとこの方法は使えないかもしれませんが簡単な操作だったらこれで間に合うかと思います。

こんな単純なことに態々1時間かけてしまったので恥を落とすつもりで記事にします。


◯参考ページ
rubyで降順forループを実現する


にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村

RPGツクールVX Aceで画像を表示する方法


以前書いた記事でリファレンス的なものをこのブログで書こうかなんて話をしていたので実行。

初回はRPGツクールVX Ace(つまりRGSS3)で画像を表示する方法について。

screen.pictures[①画像番号].show(②画像名, ③原点, ④x座標, ⑤y座標, ⑥拡大率横%, ⑦拡大率縦%, ⑧不透明度, ⑨合成方法)

上記番号とイベント設定ページの対応は以下の通り。




使用例:
screen.pictures[1].show("battleback", 0, 10, 20, 100, 100, 255, 0)


それぞれの入力項目番号について

①画像番号
1~100の数値を入力。番号が大きい順に上に表示される。

②画像名
ゲームフォルダのGraphics/Picturesフォルダの中に入っている画像の名前のみ記述。
.pngとか.jpgとかはいらない。

③原点
画像の原点をどこにするか。0で左上が原点。1で中心が原点。

④x座標
画像を表示する位置のx座標を入力。マイナスも可

⑤y座標
画像を表示する位置のy座標を入力。マイナスも可

⑥拡大率横%
画像の横の拡大率を入力。100で画像そのままの横の大きさ。0~2000まで入力可能。

⑦拡大率縦%
画像の縦の拡大率を入力。100で画像そのままの縦の大きさ。0~2000まで入力可能。

⑧不透明度
0~255までの数値を入力。数値が大きいほどはっきりと映る。数値が小さいほど透ける。
0で全く見えなくなる。

⑨合成方法
画像をどうやって合成するか。0で通常。1で加算、2で減算。


テクニック的な説明。


このメソッドは横に長い。
だからイベントコマンドのスクリプトで入力すると変なところで改行されてしまう。
↓こんな感じ
screen.pictures[1].show("battleback", 0, 10, 20,
100, 100, 255, 0)

するとこれが意図的に改行されたものなのか、1行だったものをツクール側で強制的に改行された(ようにみえる)のか、分からなくなる。
そのため「スクリプト 'Game_Interpreter'の1409 行目で ArgumentError が発生しました。 wrong number arguments(7 of 8)」などといった()内の変数が足りないという旨を伝えるエラーが表示されてしまうことがある。(つまり例外がスローされる。)

これを防ぐためにはscreen.picture[]をグローバル変数にしてしまえば良い。
グローバル変数とは簡単に言えばどこでも使える$のついた変数のこと。
よくわからない方は以下をコピペ。

$sc = screen.pictures[1]
$sc.show("battleback", 0, 10, 20, 100, 100, 255, 0)

こうすればなんとかイベントコマンドのスクリプトでも入りそうになってくる。
後は画像名を短くすること。
「battleback.png」なら「bb.png」にしてしまうとかして2,3文字に収める。
すると

$sc = screen.pictures[1]
$sc.show("bb", 0, 10, 20, 100, 100, 255, 0)

とまで短くなる。
ここまで短ければ十分にスクリプトの横幅に間に合う。
また、グローバル変数にしておけばスクリプトの欄を別にしても有効になる。
つまりどうゆうことかというと↓のようにしても文章が表示された後上手く画像が表示される。



このグローバル変数という考え方はイベントコマンドのスクリプトで書くときに知ってると非常に良い。なぜならスクリプト欄を跨いで変数を使えるから。

と、少し脱線気味になってしまったが、以上がRPGツクールVX Aceで画像を表示する方法。



◯参考ページ
rgss3 リファレンスwiki様 screen.pictures[].show()



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
依頼作品の方はマップ作りが大体終わり、ストーリー、アクション作成に入っています。

マップを作っていて気付いたのですがフォグ(天候や光などの画面効果)って大事ですね。

ウディタだとデフォルトでついているようなのですが、RPGツクールは正式に「フォグ」という概念は無いようなので「ピクチャの表示」で何とかしないといけません。

そのフォグがある場合と無い場合でどのように違うのか、見てみてください。

今回は森マップにおいての影フォグ日光フォグです。

例その1

<無い場合>
RPGツクールのフォグ 例


<あった場合>
RPGツクールのフォグ 例



例その2

<無い場合>
RPGツクールのフォグ 例


<あった場合>
RPGツクールのフォグ 例



例その3
<無い場合>
RPGツクールのフォグ 例


<あった場合>
RPGツクールのフォグ 例


その差は歴然!

フォグをつけるだけで洗練された(ように見える)RPGツクールのゲームに見えてくるから不思議。

木の陰から煌めく木漏れ日を表現すると途端に幻想的な世界になってきますね~。

ちなみにピクチャの合成方法は通常よりも加算または減算の方がなんとなく味が出る気がします。


さぁこれからはストーリーをどんどん考えていかねばいけませんね。

自分はストーリーを考えるのが苦手だけど好きです。

頑張って考えよー!




にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
依頼作品を作る休憩がてら製作していたコマンド入力式アクションゲームの試作品が出来たのでご紹介します。

今回も動画をご覧ください。



ふぅ~作るの大変だった。

箱庭勇者ではひたすら敵にぶつかり、ゲージが溜まったら必殺技発動という流れでプレイが単調になってしまったのでこのようなコマンド入力があると良いなーと思い作りました。

この試作品ではRGSSをバリバリ使ってみたので理解が深まりましたね~。

そもそもRGSSにはしっかりとした逆引き辞典的なサイトがあまりないのでモジュールやプロパティを調べるのに一苦労します。

画像を表示するのにデフォルトのイベントではなくRGSSで表示するには何を使えば良いのか調べるので、まず苦戦。

ヘルプを見て載っていたbitmapやspriteを使ってみるも表現したいことができない、ピクチャの表示はどうやってするんじゃー!?と思って調べて出てきたのを使ってみたらRGSS3ではなくRGSS2のものでRPGツクールVX Aceではうまく動かず。

結局wikiサイトにちょこっと載っていた
screen.pictures[番号].show(素材名, 原点, x座標, y座標, 拡大率横%, 拡大率縦%, 不透明度, 合成方法)
でなんとか表現に成功して気付いたら夜も更けていた・・・

なんてことが3回も4回もありましたよ・・・泣

今度このブログでRGSSで逆引き辞典的なものを作ってやろうかと思ったくらいでした。

この矢印と時間ゲージの同時表示、入力処理にも大変苦労させられました。

プレイしてみると単純ですがその裏ではプログラマーさんの汗と血と涙の結晶があるんですね~・・・

Rubyを日々使っている方ならRGSSはすぐに分かるのかな。

業務ソフトとかで使うモジュールとかとはまた違う感じがするから慣れるまで時間がかかる感じがするけど・・・

とにかくやって慣れるしかないですね。

このコマンド入力アクションについては当サークルの次回作品に使いたいと考えております。

乞うご期待。



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村

RPGツクールで和風の町を作りました。


前回紹介した和風の町が大体できましたので動画でご紹介します。



*動画の内容は制作途中のものです。

まだまだ手馴れていないもので、作るのに時間がかかりました。

出来栄えは悪くはないと思います。

こだわった箇所は日の陰りですね。

羊雲に日光が遮られて全体が暗くなる様子を再現してみました。

この表現を作るためにRGSSと大体一日くらいかけて格闘したんだぜ・・・

また水に映える雲がきれいですね。

これには白洋菓子店様の透過するマップチップを使わせていただきました。

水の表現がいかに綺麗にできるかがマップが美しくなる条件だなぁと感じますね。

また、今回の主人公は忍者ということで屋根に上れたりできるようにしました。

樹を伝って上に上り、屋根に駆け上る様は忍者そのもの。

屋根の間をジャンプして飛び越える様も忍者そのもの。

これ見ているとあまり感じないかもしれませんが、実際に操作するとパルクールみたいで気持ちいいですよ。

結局はジャンプのイベントなのですが屋根や垣根のグラフィックをつけるだけでこの臨場感。

面白いですよね~。

なかなか忍者忍者出来ているかと思います。(自画自賛)

今回はこのジャンプアクションをふんだんに取り入れていけたらと思っています。

そう、忍者だからね。

この感じで世界観を作っていければと思います。



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
現在ジークンソフト様にゲーム制作の依頼を受け、ゲームを製作しております。

ジークンソフト様HP
http://www16.ocn.ne.jp/~sst/

ゲームの内容としては女忍者と悪魔との物語になります。

ゲームの全体のイメージが固まった訳ではないのですが、マップを作り始めました。

画像は制作途中のものです。

花見ができる会場です。


一応設定は江戸時代位を想定していますがマップチップ的に昭和とごっちゃになっています。

江戸時代にも花見は庶民の楽しみだったのでしょう。

こちらは武器屋さんです。



ここで武器を買ったり、素材から合成して強い武器を作ったりします。

音にカーンコーンといった鉄を打つ音を入れると臨場感が出て良いかもしれません。

団子屋さん


ここで団子やお茶を買って体力回復。

ギルド的な建物の門構え。


ここでクエストを受けるような格好にしようと思っています。

基本的にゲームのシステムは旅をする形式ではなく、一か所の町に住んで依頼をこなしていくという形にしようかと今のところ考えております。

実際にどうなるかはまだわかりません。

普通の依頼の中に混じって謎の依頼が主人公のもとに。

徐々にその謎と依頼者の目的が明らかになっていく・・・

というようなストーリーにしようかと思っております。

戦闘システムは箱庭勇者と似たものにする予定です。


とあるゲームを見てRPGツクールでも幻想的な世界や美しい世界を作れることを知ったので、まずはマップチップや画面効果を駆使して美しいゲームの世界を表現できるように頑張ります。



マップチップ素材は主にドット絵世界様のものを使わせていただいております。

素晴らしい和風マップチップありがとうございます。

ドット絵世界様
http://yms.main.jp/



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
良いRPGとは世界観、ストーリー、音楽、絵、もしくはグラフィックがそれぞれ調和しているゲームのことを言うんだと思う。
自分は作曲や絵を描く才能はないのでストーリーの組み立てとRPGゲームを作る腕を上げて、将来イラストを外部委託して描いてもらい、良いゲームを作りたい。
夢は自分の作ったゲームにフルオケのBGMを入れること。
作業に戻ろう。



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
他のサークルさんの作品を見ると自分の作品がどんどんチンケなものに見えてきますね。
割とスクリプト頑張ったりしているつもりでもまだまだだったり・・・
もっと作りこんで魅力のある作品を作らねば・・・
とにかく作りこみとか、やりこみ要素とか、グラフィックとか世界観とか・・・色々な要素が足りないんだなーと思います。
それに、販売サイト様を見ると作りこめば作りこむほど売れている。
市場は応えてくれるというのが分かります。
勉強せねば・・・



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村
箱庭勇者が本日発売になりました。

売り上げを見て思ったことは

「需要の反対にいってもうた!?」

多分RPGなどのPCゲームで多くの方が求めているものは「やりこみ度」や「どれだけ楽しく、長くプレイ出来るか」や「どれだけ歯ごたえあるか」ということなんだろうと思います。

良く売れているゲームのレビューなどを見ても「やりこみできる」ということが良く書かれていますからね。

今回作ったゲームはサクサクとほぼ一本道でクリア出来るので、そんな需要と反対側に行ってしまっていたものだったのかもしれません。

反省。

ということで次回はやりこみできるゲームを作ろうと思います。

今日考えて思いついたのはサバイバル型のRPGです。

回復剤や武器なんかを素材を揃えて、合成して作ると。

良くありそうなRPGですが、システムで楽しくできればと思います。

と思ったけどもっと時間かけて長編RPGでもいいんじゃないか!?

どうしよう・・・!?



にほんブログ村 ゲームブログ RPG・ロールプレイングゲームへ
にほんブログ村