超初心者が0からRPGを作る

ゲームプロデューサー志望が日々の悪戦苦闘を綴る。

静寂の中の奮迅【第12歩】

流石に連休ボケか、HeptagonDだ。

いやぁ参った。自分がブログを書いている身であることをすっかり忘れていた…

毎日更新できれば習慣になるだろうか?書く時間と内容が足りるか怪しいが。

 

ともかく、今回は前回に引き続き2DCGについての研鑽の様子を綴っていくぞ。

久々に初期の作品を見てみると、確実に成長していることを実感できるものだ。

 

 

【半年を駆け抜ける】

私事にはなるが、現在あまり時間が無いので手短にいこう。

 

本腰を入れて絵を練習し始めたのは昨年の夏半ば

ペンタブにはまだまだ慣れていないが、とりあえず一通り絵を描く流れを覚えた頃の作品がこちら。

f:id:Heptagon:20190515014018p:plain

鎌使いの青年

まだまだ服の質感や線のカクつきが気になるところだ。

キャラデザインとしても、現代ファンタジーなのか西洋ファンタジーなのかパッとしない感じで、情報量が少ないな。

 

 

 

ほぼ同時期に描いた作品。草創期では最自信作だったのがこちら。

f:id:Heptagon:20190515014400p:plain

よくある少女×博士な作品

後ろの機械たちに助けられて、キャラ付けがしっかりできたのが良かったのだろう。

しかし、まだまだ直線が上手く描けず歪んだ所も多く見受けらる。

 

 

 

夏も暮れ、ファンタジーRPGではパーティにほぼ必須の筋肉キャラを描いてみたのがこちらの作品だ。

f:id:Heptagon:20190515015139p:plain

筋肉の描画に挑戦した作品

まだまだ筋肉の付き方や陰影の付け方への理解が至っていないことを痛感したものだ。

とは言っても、今でもこれらは不動の壁ではあるのだが…

 

 

 

同じく晩夏、背景の方にも挑戦してみたのがこちらの作品。

f:id:Heptagon:20190515021118p:plain

召喚士の少女と…何?

少々要素が多くゴチャゴチャしているが、案外荒野とマッチしたのではないだろうか。

何にせよ。魔物のデザインは幾分やりすぎた気はするが…

 

 

 

秋に入り、デフォルメにも手を出してみたのがこちらの作品。

f:id:Heptagon:20190515021529p:plain

急に作風チェンジ

デフォルメとはただ簡略化するだけではなく、特徴をより強調すること。

それを何より強く感じる作品だった。

 

 

 

続いて中秋の頃、チェス駒のルークをモデルに描かれた二人。

f:id:Heptagon:20190515022117p:plain

モンスターの缶ではありません、盾です

がこうも難しい物とは。

普段は気にも留めていなかったが、装備毎にグラフィックを変更することはそう容易ではない…そう悟らされた作品。

 

 

 

凩の吹く頃、知人から依頼を受けての一枚。

ゲーム「アズールレーン」の「サンディエゴ」なるキャラクターらしい。

模写ではなくポーズなどはオリジナルのため、二次創作という扱いになるのだろうか?

f:id:Heptagon:20190515022639p:plain

依頼だけに力も入る

間違いなく今までで最も時間をかけた作品だろう。

プロのデザインを真似ることは、思っていた以上に経験になった。

顔しか描けない者のかかる罠はこれだろうな。

 

 

 

 

そして年末。満を期して登場のアルフレッド君。

裏で細かい設定なども考慮した上でデザインを手がけた。

f:id:Heptagon:20190515023155p:plain

もはや看板のアルフ君

なんだかんだでまだまだ気になる部分もあるのだが…

最初の作品と比べればデザイン面でも画力でも、天と地の差があるといえよう。

 

 

 

 

そして練習が落ち着いてきた頃。

実質現状ラストの作品がこちら。

f:id:Heptagon:20190515023750p:plain

一応節分に合わせて描いていたりする

雰囲気作りがかなり上手くいって、調子に乗ってサインなど入れている。

ある意味集大成作品とも言えよう。

 

 

 

 

【経験・熟考・選択】

ということで、どうだったろうか。

真夏から真冬まで…練習期間はおよそ半年といったところだな。

半年とはいっても絵一筋だったわけでもなく、他の趣味や責務を果たすためにも時間を費やしていたのだ。

そのため、やる気さえあればものの数か月あればこれくらいは描けるようになるはずだ。

 

…しかし、終盤になるほど伸び悩む結果となった。

いわゆるスランプにはまってしまったのだろうな。

その後も身内から依頼を受けたのだが、未だに描けていないのが現状だ。

 

苦難、逆境でも挫けることなく進めてこそ、天職…進むべき道であると考える自分としては、絵で食べていくことはかなわないものと認識せざるを得なかった。

また、絵に纏わる仕事はセンスと才能が何より重要で、門が非常に狭いものであることもある。

 

感情的にも打算的にも、2DCGは自分の道ではないと判断したのだ。

 

これが自分の過去の半年だ。

結果的に別の方向へ進むことにはなったが、決して無駄ではなかったと思う。

また一つの趣味としてであれば、今後も楽しむことができるだろう。

 

…そう、絵を描くことは楽しいのだ。

 

読者の中に、少しでも興味がある者がいるならば。

マウスでもいい。鉛筆でもいい。スマホでもいい。ペンタブに挑戦してみてもいい。

何かを創造する楽しみを思い出してみてはどうかな?

 

 

さて、次回からはサウンドクリエイターの仕事…特に、作曲の経験について述べるつもりだ。

ところで、はてなブログで音声ファイルは埋め込めるのだろうか…?

 

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…画像が多すぎて、内容は薄いのにブログ画面が長いw

 

【次回はこちら】

Comming soon!

【前回はこちら】

印象を司る者へと【第11歩】 - 超初心者が0からRPGを作る

印象を司る者へと【第11歩】

平成も終わってしまったな…これで一時代前の人間となる、HeptagonDだ。

今まで世話になった、平成。そしてこれから駆けることになる令和の世、頼んだぞ。

 

さて、前回までプログラミング体験をしてみた訳だが、難しいことこそ多かったものの意外や意外、この手の頭を使う仕事は性に合っているようだ。

思い返せば自分は考えることが好きなのかもしれないな。

 

案外あっさり適した分野が見つかってしまったな。

何?比較対象が無い以上本当に自分に合っているのかが判断できないのではないか?

実は、既に2Dグラフィック…つまり、「」には手をつけているのだ。

 

近年ではゲームで使用される絵はほとんどがデジタル作品で、アナログ作品であっても最終的にはデジタル加工がなされるという。

つまり、ゲームに携わるために絵を描くのであればデジタルが適している、と考えた。

そこでデジタル絵を描くにあたり少々設備を整えたので、まずはそちらを確認する。

 

 

【職が変われば装備も変わる】

用意したものは以下の3つ。

 

ペンタブレット(板タブ)

ペンタブレット(液タブ)

・グラフィックボード

 

購入した板タブは、ペンタブ業界では最大手といっても過言ではないWACOM社製のもので、およそ¥6,000といったところ。

ペンタブレット(板タブ)は紙とペンに代わるもので、板状の端末上で付属のペンを動かすことで疑似的に線などを描くことができるツールだ。

PCのモニターを見ながら手元を動かすため、慣れるには少々時間がかかる。

…らしいが、自分は思いのほか板タブへの慣れは比較的早かったようだ。

とは言っても、絵の総合的な上手さにどこまで貢献したか、と言われると微妙だ。

 

その暫く後に購入したのが液タブだ。

こちらはモニターと板タブが合わさったようなもので、例えとして正しいかわからないが、iPadを操作するような感覚で絵を描くことができる。

直接モニターに向かって描くので、板タブよりも直感的に描きやすい利点がある。

また、非使用時にも通常のモニターとして使用することもできる。

 

その代わりと言っては何だが、高価だ。

今回購入した物はGAOMON社製の中古品だったのだが、それでも¥26,000程。

WACOM社の新品を買おうと思えば、¥100,000近くかかってしまう。

また、液晶画面に描くためペンが滑りやすい

さらに、モニターに直接手を乗せるため、利き手の下が見えなくなることになる。

 

以上のことから、一概にどちらがいいかは言えない。

自分としても、どちらも一長一短であるためどちらが好きとは言いづらい。

 

さて、グラフィックボードについてだが…本来は買う予定は無かったのだ。

グラフィックボードについて説明すると長くなるので省くが、ここでは「画質を向上させるための部品」だと思ってくれていい。*1

より性能の良いグラフィックボードを搭載すれば、より綺麗に表示されるのだ。

 

絵を描くにしても美術の授業で描かされるくらいで、普段は絵を描いていない自分にはまだそこまで高性能なグラフィックボードは必要ないと思っていたのだが、ここで問題が発生する。

大枚はたいて購入した液タブはHDMI入力しか受け付けない物だった。

それに対して、自分のPCにはHDMI出力の端子がなかったのだ!

他の端子からHDMIへ返還するケーブルが無いわけではないが、それらは確実に働いてくれるわけではない。

そもそも、ほかの端子は既にディスプレイ達によって占領されていたため、新たにHDMI出力端子を持つグラフィックボードを購入するハメになった。

ちなみに性能は1050Ti…らしいが、イマイチわからないな…

値段もそこそこで、およそ¥19,000はかかった。夢のために散財…悔いはなし。

 

そんなこんなで、ようやく環境が整ったわけだが…まだ足りない物がある。

 

 

【もちろん武器も変わる】

それは、ペイントソフトだ。

ペイントとは言っても、決してWindowsの「ペイント」ではない。

Winの「ペイント」には、デジタルイラストにおいて最重要要素である「レイヤー」の機能が無いのだ…。

 

今回購入したのはペイントソフトの定番、セルシス社の「CLIP STUDIO(PRO)」

高価なハード達とは違い、たったの¥5,000で済んだ。

…感覚がマヒしているのかもしれない。

 

さて、これでやっと準備万端。

早速描いてみると…

f:id:Heptagon:20190430230307p:plain

…というのは冗談だが、とても人様に見せられるような絵ではなかった

そもそも今現在そのデータを削除してしまっていたため載せられない、といのが正しい。

ともかく、これでも並以上には描けるつもりでいたのだが、初めてのデジタル絵を前に惨敗したのだ。

しかしここで屈するわけにはいかない、と努力を続けるわけだが…それはまた次回に回すとしよう。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

しょうこお姉さん、今どうしてるのかな…

 

【次回はこちら】

静寂の中の奮迅【第12歩】 - 超初心者が0からRPGを作る

【前回はこちら】

「逃げる」ということ【第拾歩】 - 超初心者が0からRPGを作る

*1:正確には画像・映像情報をディスプレイに表示するための部品

「逃げる」ということ【第拾歩】

最近謝ってばかりのような気がする、HeptagonDだ。

 

さて、どこから話したものだろうか。

結論から言ってしまうとすると、現在…いや、この数週間に及んで考案・制作していたゲームを完成させることはできない

 

不甲斐ない話であろう?

自分で「必ずやり遂げる」と宣言したことだというのに、それを後から「やっぱりできない」と曲げているのである。

正直、今現在も自己嫌悪に陥りつつあるのだ。

 

 

【やる気という名の悪魔】

それでは、なぜこの結論に至ったか。

簡潔にいえばモチベーションの低下が原因だ。

 

以前記したと記憶しているが、専門学校の教員の方に「うちに入学するなら、今独学で頑張っても意味はないよ」という内容のことを言われたのが第一。

実際に自分が作ったゲームを読者たる貴方等に遊んでもらえるか、ということを考えた結果、そこに需要が見いだせなかったというのが第二。

さらに、義務感に押しつぶされてしまったのが第三。

そして、ここで停滞している時間を更に有効に使うことができるのではないか、と思い始めたことが第四の理由だ。

 

うむ、自分で読んでいてもただの言い訳にしか見えないな。

しかしこのどれもが事実であり、確実に自分のモチベーションを奪っていったのだ。

 

 

【「逃げる」ということ】

ここで開き直ってみよう。

例えばとあるRPGで、とても倒せないような強敵に出会ったとしよう。

立ち向かうのもいいが、負けてゲームオーバーになってしまっては元も子もない。

では、主人公達はどうするだろうか?

 

 

 

そう、「逃げる」のだ。

 

 

それはきっと、恥ずかしいことではない。

そして、もっと鍛錬に励み、力をつけてから再戦すれば良いのだ。

 もちろん逃げてばかりでは強くなれないが、ときには逃げることも大事なのだ。

 

 

…という話は、誰かの受け売りだ。

残念ながら、この格言を与えてくれたのは誰だったか思い出せない。

しかしながら、この言葉は自分の中に深く響いたことは確かだ。

そして、今のこの状況こそ、この言葉に当てはまるとき…!

 

…という風に自身の行動を合理化してみたわけだが、果たして許してもらえる行為なのだろうか。

まだまだコメントのつくようなブログでもないため、その真偽はわからない。

…が、そうであると信じてこのような結果に至ったわけだ。

 

 

【雨、逃げ出した後】

さて、逃げることを良しとして、逃げた先が重要だ。

これからの行動であるが…しばらく曲作りについて学んでいこうと思う。

これでも作曲はほんの僅かにではあるが、経験があるのだ。

 

しかして、このブログではグラフィック…つまり、について先に触れていく。

というのも、現段階で曲を作り上げるには相当の時間を有するためである。

とは言っても、イラスト編はそこまで続かない。その理由については後々わかるであろう。

 

ともかく、次回から数歩に渡ってについて歩んでいくことになる。

 

最後にはなるが、約束を破ってしまったことを深くお詫びする

ここで歩みを止めるわけにはいかないのだ。

どうか、これからの旅路も見守っていてほしい。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…まさか本当にフラグ回収するなんて…orz

 

【次回はこちら】

印象を司る者へと【第11歩】 - 超初心者が0からRPGを作る

【前回はこちら】

冥き異界より目覚めよクラス【第玖歩】 - 超初心者が0からRPGを作る

その言葉は弁明か鍵か【第九歩七割五分】

もはや開き直りつつある、HeptagonDだ。

 

…賢明な読者は察したと思うが、まだ完成していないのだ。

ただ、今回は弁明をいくつかさせていただきたい。

一応今回は役立つ可能性のある情報仕入れてきたので、言い訳など聞きたくないという者も後半は読んでいただきたい。

 

 

【弁解に意味はあるか】

今週は本当に忙しかったのだ…。

というのも、休日は遠方の某専門学校のオープンキャンパスに行ってきており、平日もまた行事が多かった。

おまけに自分はこれでも生徒会役員を担っているのだが、行事で使用する動画を作る宿題を引き受けてしまい…慣れぬ動画編集に手を取られていた。

…という、時間的な問題が第一。

 

さらに、行ってきた専門学校の教員に「当校に入学するのであれば、今のうちに勉強するよりはネタを練っておいた方がよっぽどいい」と助言されたことによって、プログラミングのモチベーションが下がっていたことも理由として挙げられる。

 

とは言いつつも、やはりここで宣言してしまった以上はやり通すのが筋だ。

とりあえず作品は完成させるので、安心(?)してほしい。

 

 

【現状、報告】

一応、今回構想は練ってきた。

とは言っても、第陸歩で作った戦闘シミュレーションを改良した物だ。

選べる職業を5職から8職に、そしてエディットモード…職を「作る」ことができるようにする予定だ。

できれば作った職を保存できれば面白かったのだが…またそれは別の機会にしよう。

 

ともかく、このエディットモードが恐らく今作の肝となる。

そのためにはコード記入の腕はもちろんのこと、ゲームバランスを整える力が相当要求されるであろう…覚悟はせねばな。

 

 

【道具の充実は自信の充実】

お待たせした、今回持ち込んできた情報というのはコレだ。

今まではjavaファイルを作る際にテキストエディタとして、Windows付属の「メモ帳」を使用してきた。

しかし、長いコードとなるとメモ帳では見難い。波括弧{}がズレてしまっていれば、大惨事であった。

 

そこでだ。TeraPadというテキストエディタを使用する。

TeraPadにはJavaコード専用の編集モードが存在し、classやif、intといったキーワード、""で囲われた文字列などをしてくれる。

また、検索機能より特定のワードを検索したり、それらを別のワードに置き換えたりもできる。

 

そして、何よりも役立つのは対応する括弧を検索してくれる機能だ。

これがあることで、括弧がズレてコードがグチャグチャになってしまった際、括弧を一つずつ数える手間が省けるのだ。

 

もちろんその他にも便利な機能が揃っている。

TeraPadのダウンロードは以下のリンクから行ってくれ。

TeraPad 公式ダウンロードサイト

 

 

【現実との邂逅】

さて、あとはオープンキャンパスで学んだことについて綴っていこう。

まず冒頭の辺りでも書いたが、後々本格的に勉強をするつもりであるならば独学で中途半端に学んでいく必要はほぼないようだ。

というのも、この道の専門学校では完全な初心者でもプログラミングをマスターできるようにカリキュラムが組まれているらしい。

どこまで数値を信じてよいかはわからないが、ゲーム会社への就職率もそこそこであることがその事実を物語っていると考えてよいだろうか。

 

また、入学希望者に熱意がある者は案外少ないのかもしれない。

今回のオープンキャンパスでは送迎バスが出ていたのだが、そのバスの中では殆どの者がスマホゲームを遊んでいた。

たとえ学校についての説明中であろうと、だ。

また、数人と話してみたのだが、「ゲームが好き」という想いにズレがあるように感じた。

少なくとも自分の「好き」とは違い、とでもいうべきか…他にやることもなく、ただただ憑りつかれたかのようであった。

どこでもゲームを夢として掲げるとあまり良い顔をされないが、それはゲーム業界が悪いのではなく、それをとりあえずの逃げ道とする者のせいなのではないか、と考えるようになった。

 

少なくとも自分はそういった輩とは違う…そうでありたい。

 

 

さて、少し熱くなって話しすぎてしまったな。

とにかく、現在ようやく落ち着いてコードを書ける状況になった。

流石にもう一週間延長などということにはならないだろう、ハッハッハ

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…フラグ(ボソッ

圧倒的謝罪文公開刑実行【第玖歩半】

何も言うまい、HeptagonDだ。

今回は言わなければならないことがある。

 

申し訳ない!今回は内容が0なのだ。

 

制作が間に合わないことがその理由だ。

このブログを投稿する際には既に遅刻となっていると思うが、未だに半分と完成していない。

というのも、ゲームデザインが非常に難航しているのだ。

コード自体は少しの時間さえあれば組める自信があるのだが、どうもゲームの設計が捗らない。

妥協すれば完成させられなくもなかったのだろうが、性格上それはできなかった。

 

また、言い訳がましいかもしれないが、最近新学期が始まったこともあり多忙であることも少なからず影響している。

十分な時間とアイデアさえあれば…っと、ないものねだりはこのくらいにしておこう。

 

ということで、今回は一切解説するものがない。

これもゲーム作りの一環と、長い目で見ていただけると嬉しい。

が、今後もこういったこともあるだろうな…そういう際のブログ内容も考えておくとしよう。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…本当にごめんなさいっ!

 

 

冥き異界より目覚めよクラス【第玖歩】

週一更新、滑り込みでセーフ。HeptagonDだ。

家のネット環境が悪化しており、投稿が滞ってしまった…。

 

さて、今回でみっちりとした勉強はラスト。

その大トリを務めるのは「クラス」だ。

クラスと聞くと、真っ先に頭に浮かぶのは学校だが…おおよそ学校のクラスと同様の認識で構わない。

まずは、クラスの基本について学んでおくとする。

 

 

【王を従える者】

前回メソッドを使い、プログラムを部品化したことは覚えているだろうか。

クラスメソッドと同じく、部品化を手助けしてくれる。

多くの命令を一つにまとめたものがメソッドであったのに対し、クラスメソッドを一つにまとめたものなのだ。

今すぐには必要性は感じないかもしれないが、実際世に出回っているゲームなどのプログラムは膨大なメソッドを要する。

そうなると、やはりメソッドだけでは制作側も手に負えなくなってしまうわけだ。

いずれRPGを作ろうというのであれば、当然必要となってくるだろうな。

 

 

【甦る金字塔】

今回用意したコードは2つだ。というのも、2つのクラスを用いたプログラムだからである。

クラスが2つあるため、コンパイルもそれぞれに必要となることに気を付けよう。

前回同様コードの中をあちらこちらへ飛ぶが、適宜解説を加えるので安心してほしい。

 

まずは1つ目。mainメソッドのみからなるClassクラスだ。

 

public class Class
{
public static void main(String args)
{
String name = "";
while(name == ""){name = ClassSub.nameSelect();}
int answer = ClassSub.novel1(name);
if(answer == 1){ClassSub.novel2(name);}
if(answer == 2){ClassSub.novel3(name);}
}
}

 

そして2つ目はClassSubクラス。こちらは複数のメソッドで成り立っている。

 

public class ClassSub
{
public static String nameSelect()
{
System.out.println("主人公の名前を入力してください。");
String name = new java.util.Scanner(System.in).nextLine();
System.out.println(name + "でよろしいですか?");
System.out.println("1:はい 2:いいえ");
int answer = 0;
while(answer == 0){answer = option();}
if(answer == 2){name = "";}
System.out.println();
return(name);
}

public static int novel1(String name)
{
display(name + "……");
display(name + "!");
display(name + "ったら!");
display("いつまで寝てるの?");
display("いいかげん起きなさい!");
System.out.println("1:起きる 2:起きない");
int answer = 0;
while(answer == 0){answer = option();}
System.out.println();
return(answer);
}

public static void novel2(String name)
{
display("やっと起きたのね。");
display("そうそう、あの、幼馴染の発明好きな子……");
display("アラ、ど忘れしちゃったわ。なんていったっけ、あの子?");
}

public static void novel3(String name)
{
display("ああ、ルーンの鐘があんなに気持ちよさそうに歌ってる。");
display("どうせ昨夜、興奮して寝付けなかったんでしょ?");
display("ま、建国100年のお祭りだから無理ないけど……");
display("あんまり調子に乗ってハシャぎすぎるんじゃないわよ!");
display("さ、いいかげん起きなさい!");
}

public static void display(String content)
{
System.out.println(content);
String response = new java.util.Scanner(System.in).nextLine();
System.out.println();
}

public static int option()
{
int answer = new java.util.Scanner(System.in).nextInt();
if(answer != 1 && answer != 2)
{
System.out.println("※1か2を入力してください※");
answer = 0;
}
return(answer);
}
}

 

どこかで見たようなセリフがチラホラ見えた気がするが…

ともかく、詳しくコードを見ていこう。まずはClassクラスの頭からだ。

 

public class Class

 

こちらのクラス名は「Class」とした。

 

public static void main(String args)

 

メインメソッドの宣言だ。

メインメソッド一つのプログラムに一つ限りの物なので、ClassSubクラスにはメインメソッドが存在しないことに注意だ。

 

String name = "";
while(name == ""){name = ClassSub.nameSelect();}

 

文字列nameを初期化し、その値が空になっている間はClassSubクラスnameSelectメソッドを呼び出している。

実は同じクラスのメソッドを呼び出す際にはクラス名.の部分を省略できていたのだが、別クラスのメソッドを呼び出す際にはそのメソッドがどのクラスに所在しているかを正確に表してやる必要がある。

別クラスを呼び出すときには、以下のようにコードを書く。

 

クラス名.メソッド名(引数);

 

さて、それでは呼び出されたClassSubクラスnameSelectメソッドへ移ろう。

名前の通り、主人公の名前を決まるためのメソッドだ。

 

public static String nameSelect()

 

メソッドの定義だ。Classクラスmainメソッドへの戻り値にString型を指定している。

 

System.out.println("主人公の名前を入力してください。");

今後println文やprint文では必要のない限り、解説は省くことにする。

 

String name = new java.util.Scanner(System.in).nextLine();

1行分の入力を受け取り、変数nameへ格納している。

 

System.out.println(name + "でよろしいですか?");
System.out.println("1:はい 2:いいえ");

 

int answer = 0;
while(answer == 0){answer = option();}

整数の変数answerを初期化。

そして、answerの値が0である間、optionメソッドからの戻り値をanswerに代入することを繰り返している。

 

それでは、こちらもoptionメソッドへ移動しよう。

 

public static int option()

optionメソッド。戻り値はもちろんint型だ。

 

int answer = new java.util.Scanner(System.in).nextInt();

入力された整数をanswerに代入。

メソッドを移動したため、この変数answerは先程までの変数answerとは別物である。

 

if(answer != 1 && answer != 2)]

選択肢は1か2なので、それ以外の答えが返ってきた際には…

 

System.out.println("※1か2を入力してください※");
answer = 0;

answerを無効(0)にして、プレイヤーに文句をつける必要がある。

 

return(answer);

そして、answerの値を戻り値としてnameSelectメソッドへと返している。

 

それでは、戻ってnameSelectメソッドは9行目。

 

if(answer == 2){name = "";}

答えが「いいえ」の場合、nameの値を空にしておく。

こうすることでmainメソッドでの反復条件にひっかかり、もう一度nameSelectメソッドが呼び出される形になる。

 

System.out.println();
return(name);

そしてnameの値をmainメソッドへ返す。

 

さて、さらに戻ってClassクラスmainメソッド

 

int answer = ClassSub.novel1(name);

3つ目のanswerを宣言。さらにClassSubクラスnovel1メソッドnameの値を送り、返ってきた値を代入している。

 

再びClassSubクラスnovel1メソッド

 

public static int novel1(String name)

送られてきたString型の値を、こちら側で作った変数nameに代入した。

さらに、戻り値はint型を宣言している。

 

display(name + "……");
display(name + "!");
display(name + "ったら!");
display("いつまで寝てるの?");
display("いいかげん起きなさい!");

全てdisplayメソッドを呼び出す命令だ。

我ながら、ここはメソッドの力をフルに活用できた。

 

それでは自慢のdisplayメソッドへ。

 

public static void display(String content)

戻り値はなく(void)、送られてきた文字列をcontentとして受け取っている。

 

System.out.println(content);

受け取った値を表示。

 

String response = new java.util.Scanner(System.in).nextLine();

この入力には意味はないが、これを挟むことによって自動で文字が流れて行ってしまうのを防いでいる。

今回は省いているが、「Enterを押してください」などの表記があっても良いかもしれないな。

 

System.out.println();

何も出力せずに改行。

 

これでメソッドは終了だ。短い命令だが、何度も必要になってくるためこのメソッドを作ることでかなりコードを短くできたはずだ。

さて、それでは呼び出し元のnovel1メソッドへ帰ろう。

 

System.out.println("1:起きる 2:起きない");
int answer = 0;
while(answer == 0){answer = option();}

選択肢を表示し、ここでoptionメソッドを再利用。

メソッド化させることで、このように楽ができるな。

 

System.out.println();
return(answer);

改行して、answerの値を呼び出し元のmainメソッドへ返す。

 

それではmainメソッドへ。

 

if(answer == 1){ClassSub.novel2(name);}
if(answer == 2){ClassSub.novel3(name);}

answerが1ならnovel2メソッドを、2ならnovel3メソッドを呼び出す。

novel2、novel3メソッドは先程のdisplayメソッドを使って文を表示させるだけなので省く。

 

さて、以上となる。ついて来れただろうか。

ここまでできれば、かなりの物が作れるようになっているはずだ。

もちろんCUIであるというのはかなり痛いのだが、それでも遊び手が楽しめる物はいくらでも作ることができるはず。

次回は今までの集大成として第陸歩で作ったゲームを改良し、プログラミング編に一旦幕を下ろすとする。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…もうすぐプログラム編もおしまいか…ちょっと寂しいな…

 

【次回はこちら】

「逃げる」ということ【第拾歩】 - 超初心者が0からRPGを作る

【前回はこちら】

主に仕える誠は固く【第捌歩】 - 超初心者が0からRPGを作る

主に仕える誠は固く【第捌歩】

紅茶の飲みすぎで机がカップだらけ、HeptagonDだ。

コーヒーも嫌いなわけではないが、紅茶の方が好きだな。

 

さて、今回学ぶのは「メソッド」。

今までで、一つのプログラムに同じようなコードを何度も書く必要があって面倒な思いをしたことはないだろうか。

あるいは、自分で書いたコードが長くなりすぎて理解が追いつかないということはなかっただろうか?

メソッドについて知れば、これらの問題を解決することができる。

コードの紹介…の前に、まずはメソッドの造りを知っておこう。

 

 

【主君と臣、そこに謀はなし】

このブログでは、今までのプログラムは全て「mainメソッド」という物にコードを書きこんできた。

mainメソッドは例えるなら主君だ。とある絶対王政の国の王を想像してみてくれ。

王は政治を取りはからうが、そのすべてを王自身が行うわけではない。

外交は外交の、財務は財務の、軍事は軍事の大臣なり将軍なりが取りまとめているな。

プログラムではmainメソッド以外のメソッドたちが家臣にあたることになる。

そして、メソッド毎に決められた仕事をこなしているのだ。

 

さて、それでは王の仕事は何だろうか。

それは臣たちに指示を出すことだ。

また、臣たちの提案や仕事を評価することも大切だ。

同様にmainメソッドでは、他のメソッドに指示を出し、他のメソッドから送られてきた情報を得るという流れが一般的なようだ。

細かい仕事は他のメソッドに任せて大局を動かすのがmainメソッドなのだな。

 

 

【偵察、魔王城】

さて、それでは今回のコードを見ていこう。

今回は王が魔王城付近の偵察を指示することを想定した内容となる。

軍隊に詳しい者には叱られるような内容もあるかもしれないが、あくまでサンプルであるため長い目で見てほしい。

 

public class Method
{
public static void main(String args)
{
System.out.println("王:魔王軍の動きが激しくなってきておるのう…");
System.out.println("王:A少将よ、魔王城北部の偵察をさせてまいれ。");
System.out.println();

majorGeneral("魔王城北部");

System.out.println("王:そうであったか…ご苦労。");
}

public static void majorGeneral(String place)
{
System.out.println("A少将:はっ、承知致しました。");
int nameInt = new java.util.Random().nextInt(2);
String detailPlace = "";
String situation = "";
switch(nameInt)
{
case 0:
System.out.println("A少将:B少尉!偵察小隊を動かせ!");
detailPlace = "森林";
System.out.println(place + "の" + detailPlace +"付近の偵察を任せた。");
situation = secondLieutenant("森林地帯");
break;
case 1:
System.out.println("A少将:C曹長!偵察分隊を動かせ!");
detailPlace = "渓谷";
System.out.println("A少将:" + place + "の" + detailPlace +"付近の偵察を任せた。");
situation = sergeantMajor("渓谷地帯");
break;
}
System.out.println();
System.out.println("A少将:偵察完了しました。");
System.out.println("A少将:" + situation + "とのことです。");
System.out.println();
}

public static String secondLieutenant(String place)
{
System.out.println();
System.out.println("B少尉:了解!ただちに向かいます!");
System.out.println();
System.out.println("B少尉:ただいま戻りました!");
System.out.println("B少尉:報告します。" + place + "にて巨大な魔法陣を確認。魔界と繋がっているものと見られます。");
return("森林にて魔界との門を確認");
}

public static String sergeantMajor(String place)
{
System.out.println();
System.out.println("C曹長:了解!ただちに向かいます!");
System.out.println();
System.out.println("C曹長:ただいま戻りました!");
System.out.println("C曹長:" + place + "、特に異常ありませんでした。");
return("渓谷地帯、特に異常なし");
}
}

 

それでは、早速詳細を見ていこう。

 

public class Method

今回のクラス名はそのまま「Method」とした。

Method.java」としてコンパイルしよう。

 

public static void main(String args)

これがmainメソッドの定義だ。

メソッドの定義の文は以下の通り。

 

public static 戻り値の型 メソッドの名前 (引数) {メソッドの仕事内容}

 

ここでの「戻り値」と「引数」に関してはこの後説明する。

その他は、今の段階では暗記してしまった方がよさそうだ。

mainメソッドに関してはあまり弄ることもないようなので、丸暗記でも問題ないだろう。

 

System.out.println(…);

もう言うまでもないな。

 

majorGeneral("魔王城北部");

ここで、後々定義している「majorGeneralメソッド」を呼び出している。

以前プログラムの文は上から下へ読まれると話したが、メソッドの定義においては順番は関係ない。

まず初めにmainメソッドが実行されていき、呼び出されたメソッド上だろうと下だろうと順番を無視してジャンプする、という解釈でいいだろう。

さて、メソッドを呼び出すには次のように記そう。

 

呼び出すメソッド名 (引数);

 

【君が賜うは引数】

引数(ひきすう)というのは、以前も話したが命令を実行する際に必要なデータだ。

ここではメソッドを呼び出す際に受け渡す情報のこと。

前に変数は、宣言したブロック内({と}の間)でしか使えないことを説明したな?

呼び出されたメソッドはもちろんブロック外だ。

そのため、呼び出し元のメソッドから呼び出し先のメソッドへ変数の値などを送るためにはこのような形をとる必要があるのだ。

引数は(A,B,C…)とすることで複数送ることも可能だ。

さて、それではmajorGeneralメソッドが呼び出されたのでそちらへ移ろう。

 

 

public static void majorGeneral(String place)

majorGeneralメソッドの定義だ。

()内で引数を受け取るString型変数placeを用意していることがわかるだろうか。

 

System.out.println(…);

 

int nameInt = new java.util.Random().nextInt(2);

0か1の乱数を発生。

 

String detailPlace = "";
String situation = "";

次のswitch文で使用する変数を前もって初期化している。

 

switch(nameInt)

先程の乱数によって0か1に分岐。

 

case 0:
System.out.println("A少将:B少尉!偵察小隊を動かせ!");
detailPlace = "森林";
System.out.println(place + "の" + detailPlace +"付近の偵察を任せた。");

乱数が0だった場合の処理だ。今回は1だった場合の処理の解説は省く。


situation = secondLieutenant("森林地帯");

少しわかりづらいが、赤文字の部分に注目してほしい。

そう、ここでsecondLieutenantメソッドを呼び出しているのだ。

mainメソッド(王)がmajorGeneralメソッド(少将)に命令を出すように、majorGeneralメソッドsecondLieutenantメソッドに命令を下すことができる。

つまり、mainメソッド以外のメソッドでも他のメソッドを呼び出すことが可能なのだ。

また、

 

変数 = メソッド名(引数);

 

とすることで、呼び出したメソッドから返ってきた情報(戻り値)を変数に格納することができるのだ。

それでは、呼び出されたsecondLieutenantメソッドへ移ろう。

 

 

public static String secondLieutenant(String place)

またしてもString placeを使用しているが、前メソッドで使用していたplaceはブロック外。

ということで、先程のplaceとここのplaceは別の変数ということになる。

また、今回は普段「void」となっているところが「String」となっているな?

ここで返す戻り値の型を宣言している。もちろん戻り値はこの型に合っていなければならないぞ。

また、戻り値が無い場合はvoidとなっているようだな。

 

System.out.println(…); ×5

 

return("森林にて魔界との門を確認");

ここで出てきたのが「戻り値」。

何度も言うが、呼び出し元のメソッドへ返すのことだ。

今回はString型のため、文字列をmajorGeneralメソッドへ返すことになる。

 

また、return();が登場することでメソッドの実行は完了となり、呼び出し元へ返ることになるぞ。

それでは、呼び出し元のmajorGeneralメソッドへ戻ろう。

 

break;

switch文から抜け出した。

二度目にはなるが、今回はcase 1:は省略する。

 

System.out.println(…); ×4

 

さて、ここでmajorGeneralメソッドが終了した。

returnを使わずとも、メソッドが終了すると呼び出し元へ返るぞ。

 

System.out.println("王:そうであったか…ご苦労。");

まさにここまでご苦労だった。今回のソースコードは以上となる。

 

 

さて、どうだっただろうか。メソッドについてわかってきただろうか。

 少しばかり難しい内容もあったが、実際に使っていけば覚えられるはず。

まずは新しく学んだことを活かして、一つプログラムを組んでみてはどうだろうか。

 

次回はさらにメソッドの上、クラスについて学んでいく。

ここまでできれば、複雑なプログラムも時間をかければ作ることができるはずだ。

クラスについて学んだ後はもう一度自由にプログラムを組み、プログラム編に一旦区切りをつけようと思うぞ。

 

ここまでのお目通し、ご苦労だった。

また会えることを楽しみに待っているぞ。

 

…やっぱり紅茶美味しい…ズズズッ

 

【次回はこちら】

Comming soon!

【前回はこちら】

全ての要素、集う刻【第漆歩】 - 超初心者が0からRPGを作る