美食と猫と自作ゲーム

今のところ、自作ゲーム記事ばっかり。

自作ゲーム57 背景の簡易アニメーション

これも非常にシンプルなやり方である。プログラム自体は非効率で容量をくっているのではと思うが、基本的な考え方のみ伝わればと思う。

 

波の処理

波は初期から何度か変更した。

 

※初期のカクカク海辺

 

簡易アニメーションや主人公、その他のキャラクターの動きは、カウンターが一定値を上回ると動作プログラムに飛ぶようになっている。主人公以外動くものがないシーンでは、その他キャラクターを動かす処理時間分、なにもしない処理を入れて、スピードバランスを調整している。

※このプログラムから各処理に飛ぶ。

簡易アニメーションの処理プログラムに飛ぶと、以下のようなプログラムで動かす。

基本は4サイクルで、波は2番目と4番目のサイクルを使う。単純にマップパーツ(8×8)の一部を書き換える。絵の一部を変える場合もあれば、色だけ変える場合もある。波の場合、波の白を青(海の色)に変えたり戻したりする事で表現している。

 

※炎の表現の場合、上二段のデータを書き換える。

 

なぜ最大4サイクルか?

元々は川の流れを表現するために作ったプログラムである。

川のマップパーツは、青に二つの白い点があるだけのシンプルなものだが、同じものを4つ作っており、川の流れ方向に順番に並べている。同じマップパーツだが、一つを除いては白い点を青に塗りつぶしている。

460行でHBという変更の値に応じて処理する行に飛び、白い点のあるパーツを青に、次のパーツの点を白にする。すると次のようになる。

一番下の画像は一番上の画像と同じである。動画で見ると、連続して水が流れているように見える。

海岸のシーンではさざ波の、滝のシーンではザーという音を流している。BGMは止めており、隣のマップに移動すると鳴り出す。

 

次回は以下のネタあたりを

BGMの鳴らし方、セーブ・ロードの仕方、爆発の表現 等

コアントローというリキュール

クレープシュゼットっぽく作ったコナモン(粉もん)スイーツ

※美味しそうに見えないのをごまかすため、わざとピンボケさせているわざと。

※焦げが好きなので多分 わざと 焦がしている。

コアントロー

前の記事で書いたクレープシュゼットに使われている事も多いリキュール。

クレープシュゼットを自分で作ろうとしたものの、薄いクレープがうまく焼けず。ソースは十分美味しいので、もういいやとクレープを別のものにした。

以下、適当レシピ

①ホットケーキかフレンチトーストを作る。

②フライパンにバター適当を熱して溶かし、同じ量くらいのオレンジジュースを入れる。お好みでマーマレードとレモン汁数滴。余熱を通して混ぜ。火を止め。

③②と同じ位のコアントローまたはグランマルニエ(ようはオレンジ系リキュール)を入れる。

④チャッカマンを点火して③に近づける(少し燃えあがるので注意)

⑤アルコール分がとぶと火は弱まってきえていく。

⑥皿に適当にもった①に⑤をぶっかける。

 

以上で味だけは美味しい出来損ないのスイーツができる。

 

さて、それだけの為に買ったコアントローだが、先日たまたま行ったバーで使い道を得た。

 

ヴァン・ショーという飲み物がある。いわゆるホットワインというもの。

甘めのワイン(甘くなければ砂糖かハチミツを入れればいいじゃない)に数分の一ほどコアントローをまぜ、シナモン等(うちにはシナモン以外にオールスパイスがあった)を入れて、レンジて1分半ほどチンするだけで、それっぽいものができる。

 

グルメなんてもんは、楽しんでなんぼです。あまり細かい事は求めず自分が美味しく、楽しめればOK。(でも不味いのは嫌)

 

※うっさいなあ・・・

自作ゲーム56 ドラクエ式会話システム+アレンジ

エンディング作成も後少しであるが、まだ、BGMがない。また、エンディングは作中唯一、3音を使った演奏を考えているので、確実に容量をくう。ディスクの残り容量が少なく、不要なプログラムや設定を削りつつ、エンディングを作っている。

 

※最強のザコ敵ゴールドナイツは、主人公に近づくと剣を抜く設定だったが、容量削減の為、剣は常に出したままになった。しかし、正面の攻撃に対し、盾を構えた時と同じ防御力をもつ。側面からの攻撃も効きにくい。連続攻撃でシールドブレイクするか、うまく背後をとらないと大きなダメージを与えられない強敵。

※シールドブレイクの設定について

連続で攻撃を受けた場合に、盾の防御力から補正値が引かれていく。(補正値は連続攻撃から一回でも逃れるとリセットされる。)補正値の増加数は敵(または主人公)の攻撃力によって決まる。攻撃側の攻撃力が補正値を引いた盾の防御力を上回った時、盾の防御をつきやぶって攻撃をくらう。

 

 

今回は会話のシステムについて

基本はドラクエと同じ。会話が続くと矢印がでて、ボタンを押すまで表示をとめる。

 

オリジナル要素とよべるほどではないが、以下の工夫を加えている。

・句読点、スペースで少し時間をおき、実際の会話の間に近づけている。(早口だが)

・キャラクターごとに声のトーンが違う。

・可能なものは漢字表示(わざとひらがなにする時もあり)

 

会話のテキストは、そのまんまデータとして格納してある。容量はくうが、改良はしやすい。

最大3段分のデータがA$、B$、C$に格納されている。その他にN$があり、ここに、名前つきのキャラクターの名前が入る。

 

処理プログラム

最初にあるHFはカウント変数。1以上にするとカウントが始まり、一定数になると、メッセージ表示欄が空白になる。(会話を表示したまま、別マップに移動しても消さず、時間が経つと消える。)

LEN(?$)で文字列の長さを数え、文字列から一文字づつ抜いて、文字数分繰り返し表示する。それを最大3回繰り返す。文字列は、横27文字ぎりぎりまで入力する事もあるが、ぐきりのいい場所での改行したり、上下にある漢字表記が重なるのをなるべくさけて、読みやすくする事を優先している。また、190行の句読点や空白で音を消し、表示に少し時間をかける事による、「ため」を演出するのにも利用する。

※イメージ

「そ、それは、、、、」

そのままだと

  (音)ピピピピピピピピヒ(棒読み)

本作の会話システム

  (音)ピッ   ピピビ  (長めの消音)

 

多分今時のゲームはこういうのも当たり前なのだろうが、村の人の会話一つにも、読みやすさや自然さを考えて作っている。

 

なお、時に会話が面倒くさい場合もある。同じ村で同じ人が話す内容はせいぜい1~3種程度なので聞いた話をまた長々会話されるとわずらわしいが、190行で、会話中にスペースキーを押すと、表示時間をスキップし、会話が流れるように表示される。

 

会話する為の仕組みも単純で、人のいる方向にキーを押すと、一部の人を除いてこちらに振り向き、会話が始まるようにしている。

 

1290行が振り向き処理。

主人公の向き(変数F)は、上が1、右が3、下が5、左が7なので、相手の向き変数は主人公の向きに4を足し、合計が8以上の場合に8を引いてやると、ちょうど向かい合わせとなる。

 

疲れてきたので本日は以上。

 

 

自作ゲーム55 画面スクロール

本作は一つのエリアあたり最大16マップで構成され、画面の端に行くとスクロールして隣のマップが表示される。マップデータは16文字×13行分で、一マップあたり16文字を1ラインとした13個のデータをそのままマップ用変数M$(x)に格納してある。圧縮というテクニックを用いてないので容量はくうが、変更・改良がしやすくなっている。(オールベーシックにこだわる理由がここにある。)

スクロールは理屈的にはシンプルで、特に縦スクロールは、表示すべき13ラインのうち移動先のマップラインを一ラインづつ、増やしながら移動元のマップラインを減らし(合計は必ず13ライン)表示するという仕組みである。

縦スクロールなのでY軸のみ変動する。3800行が上向き、3810行が下向きのスクロール。Y軸増減前にGOSUB590とあるが、これは主人公の表示ルーチンに飛んでおり、スクロールにあわせて主人公をマップ上から下または下から上に移動させている。

 

 

横スクロールの場合は移動先のマップを一文字分づつ抜き出したデータと、一文字分づつ減らした移動元マップのデータを足したライン(必ず16文字)を作り、表示する。元のマップデータの右端や左端から指定分を抜き出す命令(right$、left$)を用いている。

これと同じ要領でMID$を使って、抜き出す位置を指定すると、洞窟のように主人公の周りのみを表示する事ができる。

※火矢の通過している周囲もマップ表示し、フラッシュのような、使い道にする予定だが、今の所メモリ不足で手付かず。

※一度635行で空白(黒)で埋め尽くした後に636行か637行でマップ表示している。636行はアイテム  キャンドルをもっていない場合。主人公のいる位置しかマップが表示されない。

※三番目のダンジョンにいるケイブバードは、向こうからは攻撃してこないが、攻撃をくらうと反撃してきてキャンドルを食べてしまい、突然暗闇の中に残されるという恐怖を味わえる。炎に包まれたような変異種もおり、その羽はイベントアイテムと、なっている。

 

今回は以上。

 

自作ゲーム54 生命力バーの表示方法

MSXBASICでゲームを作る際、何かの役にたつかもしれないので、各処理のプログラムをメモしておく。

 

Vitality(生命力)の表示

戦闘しながら、リアルタイムに高速表示できるのばturboRの恩恵だろう。生命力1につき1ドット(マップパーツやキャラクターが8ドット)なので、作中では120を最大としている。もっと増やしたい場合は、横に表示しているマナの数字を移動するか、1ドットあたり2以上に増やせばよい。

 

プログラム

P(20)が最大生命力、Hが生命力、その他O、N1、Nという変数を用いている。

60行で最大生命力を8で割った回数分、まず赤色で表示する。(VPOKE6630+J,3の3は赤い横8ドットの表示)

70行では、生命力が8を超えている時のみ、8で割り、値をOに得る。割りきった余りをN1に得る。生命力が8以下の場合は、その値をN1に得る。それから、Oの回数分の青い表示を、先ほど表示した赤の上に表示していく。すると、最大生命力と今の生命力の差が開くほど、赤の表示割合が増える事になる。なお、生命力が1以下の場合870行に飛ぶが、これはゲームオーバー処理のため。

80行  IF N1 THEN~は、IF N1<>0  THEN~と同じ。つまり、生命力が綺麗に8の倍数かそうでないかを判定する。N1が0以外の時は1~7の数字を得ているが、それは、スプライト機能を使って表示している。

 

スプライト1~8の中身。8要らんかった。

スプライトは赤い表示の上に重ねて表示出きるので、スプライトの枠が狭くなる分、下の赤い表示(ダメージ分)を表示できる。

90行は変数Nの変動を管理。Nは主人公の動きに影響する変数で、通常2である。処理としてはP(24)が0以外の時、生命力が最大生命力の8分の1以下の場合、Nを1にする。つまり、動きが鈍くなる。P(24)は青の結晶で、状態異常を全て無効化するため、もっていれば動きも遅くならないという事。

 

60行と70行を分けている理由

プログラムは行ごとに255文字近く書き込め、まとめた方が記憶容量も節約できる。では、回復処理の場合を考えてみる。

回復時は赤色の表示が増える事はない。回復処理のプログラムから赤色表示の60行を無視して青色表示の70行に飛ぶ事で、処理スピードをあげている。

 

今回のネタはこれまでとする。

 

次はメッセージ表示かスクロールあたりを

 

 

グルメ旅 博多(クレープシュゼットにはまる)

小倉→博多へ

ホテルのチェックインまで1時間ちょっとあるので、駅周辺を散策。

寿司屋が目当てだったが、人が多い。並んでまつのは嫌いなので、他の店をみてまわる。

目についたのがクレープシュゼットだった。クレープをオレンジジュース、バター、リキュールをフランベしたソースにからめて食べるスイーツである。(写真は撮っていない。下の画像はアンリ・シャルパンティエのクレープシュゼット。ここは、ワゴンで席まで持ってきて調理してくれるとの事。リキュールが美しく燃えあがるのを視覚で楽しめるサービス。)

 

https://www.henri-charpentier.com/products/dessert/535/

 

甘いものも好き。プリンとかアップルパイ、オレンジタルトは特に。

 

オレンジタルト

https://dancyu.jp/recipe/2019_00002293.html

 

ワゴンパフォーマンスはないが、ワイン、スフレオムライスとセットで食べたクレープシュゼットは激ウマだった。(帰り道途中の三ノ宮で、もう1回食べた)

 

その後、同じビルの中華料理屋に目がとまる。

四川飯店

先日亡くなられた陳健一氏の店である。麻婆豆腐の作り方をYoutubeで無料公開してくれている。調味料を買い揃えて、何度も作った。その麻婆豆腐(本物)が味わえる。

食後だが迷わず食べた。四川の麻婆豆腐だが食べられる辛さであり、香りと旨味がしっかりある。一番感動したのは、動画を見て作ったものと香りや味が近かった事だ。(自分で作ったものは辛すぎないよう、豆板醤を少し減らし白味噌と豆乳を加えている。)

この駅ビル、美味しいものがいっぱいある。博多の味を求めてきたが今回は違う味を楽しんだ。もともとは、(あれば)ウチワエビを食べにきたのだが。

 

ウチワエビ

 

博多だと、もつ鍋や水炊き、ラーメンなどが有名。ゴマサバなんかも必ずたべる。

 

ゴマサバ

https://dancyu.jp/read/2020_00002840.html

 

鯖は痛み安いが、この辺りの鯖は新鮮なので生で食べられるのである。

 

近辺で行った事のある所

 

キャナルシティ

実サイズのガンダム

 

その日の夜はお目当ての店が満席だった+あまり食欲がなかったので(←あたり前)、飛び込みではいった居酒屋でゴマサバを食べた。次の日に豚骨ラーメンを食べ、帰路についた。(三ノ宮寄った)

 

博多は25年ほど前に1年間住んでいた。また遠からず旅行に行くだろう。

三ノ宮は神戸市に半年ほどすんでいたのでその頃から。ここもグルメ天国で多国籍料理もスイーツもなんでもあり、ちょっと歩けば元町に南京町中華街もある。少しづつ開拓しているので、グルメレポートが書けなくもない。

 

自作ゲーム53 BASICを使ったプログラムは簡単1

自作ゲームはエンディング途中まで作成中で、使える画像もあまりないので、タイトル詐欺になっているゲームプログラムの中身について触れていこうと思ふ。高度なプログラム技術のある方から見れば拙い内容だが、その拙いレベルでもこの程度のゲームはできるという事を伝えるのが目的。

ゲームはBLUE MSXというMSXパソコンのエミュレータを使用して作成している。

 

ここから無料でダウンロードできる。

https://bluemsx.msxblue.com/jdownload.html

※ダウンロード後にMSX2turboRで起動するよう設定変更。

 

プログラムは100%BASICという言語で作成している。下のように、行番号の後に言語をならべる。

例:

10  DEFINTA-Z:DIMM$(280):I=0

10行の次は20行といった感じでプログラムを追加していく。プログラムが組上がったら、RUNという命令を実行する事で、行番号の若い順に命令が処理されていく。

最初の行は初期化処理を行っている。

上の例だと、DEFINTというのは整数扱い宣言をする命令。その後にあるAからZではじまる変数を整数のみ扱うという事。これをしないと小数点以下の計算までしようとするため、処理が遅い。その後にある : はセミコロンといい、次の命令との区切り。区切る事で1行あたり確か255文字位の命令が入力できる。

変数とは?

名の通り、変化する数字や文字列。数字の変数は、いわゆる体力や移動スピードなどのパラメーター管理に使う。たとえば主人公の体力は変数Hを使っている。$がつくのが文字列変数。上の例でいうとM$で、ここにマップデータや音楽データを格納する。DIMM$(280)という命令は、M$()という文字列変数を0~最大280まで利用するという事。()数字付の変数は沢山のデータを同じ目的で使うのに便利で、たとえばマップデータは一画面あたり16×13個のマップパーツで構成されており、一行16文字のデータを13個縦に並べて表示する。一つのプログラムに16枚程度のマップを入れているので、数字なし変数にしようとすると208(13×16)個もの文字列変数を用意し、かつ208個分の表示命令が必要になる。記憶容量は限られているので、とんでもない無駄使いである。数字付変数の場合、1~13に初めのマップ、14~26に次のマップといった感じでデータを格納する。今マップ何番にいるかをしめす変数にMを使っているので、表示命令は以下一行ですむ。

例:

240 FORI=1TO13:LOCATE1,I:PRINTM$((M-1)×13+I):NEXT

 

FORI=1TO13とNEXTは対になっていて、Iの数字が1からスタートして加算され、13に達するまで、はさんだ命令を繰り返す。先ほど10行のプログラムにI=0とあったが、変数IやJはこの繰り返し命令でよく使うので、プログラムの先頭付近で、ダミー数字をいれて使うという事を宣言しておくと、処理が少し速くなるらしい。

LOCATEは表示する位置をX軸,Y軸で指定する。下の画像を見るとイメージがつかみやすいかもしれない。

※主人公(白)はX(横)軸8,Y(縦)軸13の位置にいる。

 

PRINTは後に続く文字列や数字や変数を表示する命令。応用すると下のようにスクロール表示なんかもできる。

 

 

まだ1行分しか解説していないのに、解説するってなかなか大変だ。しかもよんでても分かりにくい上に面白くない。

次回からは命令の説明は簡略化し、どういった処理で動かしているかをメモも兼ねて以下のように処理別に公開していく事にする。

・主人公の生命力を示すLIFEバーの表示方法

・先ほどのスクロール処理はどうやっているか

・BGM(音楽)はどうやって鳴らしているか

・敵の動く処理、動き方のパターン

・飛び道具の処理

・飛び道具にあたった時の処理

など

 

各命令については説明サイトの方がわかりやすいと思ふ。

http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=1%2E1+MSX+BASIC+ver2%2E0%A4%CE%CC%BF%CE%E1