先日は、
■ プログラミングとツール(1) 【 ECUCATION 】
にてブロック型言語について紹介しましたが、先日も書いたように現在は結構グラフィカルなプログラミング言語があり、対象年齢を下げて、プログラミングにおける基本的な考え方が出来るような仕様のものが増えています。その為、20世紀のようにいきなりコーディングしか選択肢がないという時代とは変わっているので、考えた物を形にする為の手段も増えています。
こうしたプログラミングですが、問題を解きながら挙動を考えながらコードを作れるCode.orgのようなサービスもありますし、Scratchのようにアプリケーションを作れる物もありますが、MakeCodeのようにハードウェアのエミュレーションを実装した物もあります。
先日は、その中で、 【 Arcade 】 について紹介しましたが、これは、ワンボードマイコンのような製品でゲームを動かす五感ハードで動かすような仕様になっています。
のような感じで、
のようにオンラインのエミュレーター上で挙動を確認できるようになっていますが、スプライトの制作もできるようになっています。
このように、ゲーム機もハードウェアの制御なので、接点からの信号で表示をコントロールしている訳ですが、構造をハードウェア寄りのものにしたのがMicro;bitなどになります。
現在は、プログラミングを行えるものも増えていますが、家庭用ゲーム機のソフトでもそう言ったツールが出ているので、今回は、そう言ったソフトと仕様について書こうかなと思います。
ゲ ーム機とコンセプト
ゲーム機と言うのは 【 単なるハードウェアのカテゴリー 】 なので、実際には、 【 ソフトウェアの実行環境 】 でしかありません。その為、 【 Arcade 】 のようにどう言った物を作るのかで実行できる物も変わってきます。
その為、ゲームもソフトウェアの一種であり、インタラクティブのコンテンツの中の一つでしかないので、
【 ソフトがどう言った仕様の物なのか? 】
で出来る事も変わってきます。この辺りは、汎用性のある物をプログラムで処理を実行するハードウェアなので当然ですが、プログラミングを行う際にも 【 元々ないもない状態から構造物を作る 】 ので、実行する物を作る事になります。その時の対象がコンピューターになりますが、ゲーム機の場合、 【 ゲームのジャンルに特化したソフトウェアがより効率的に動き、その分野に特化した機能を実装したハードウェア 】 なので、 【 ゲーム機 】 になります。
その為、ゲームのAPIを動かした時によりハイパフォーマンスにするためには、その分野で動作するハードウェアが必要になります。例えば、ワークステーションやCADの用途だと倍精度が必要になるので、FP32ではなく、FP64の性能が重要になります。そうなると、FP64に特化した演算性能を追いかける事になりますから、そう言居た処理に向いているハードを作る必要があります。これに対し、ゲーミングのようにCADよりもかなり精度が低い物を扱う場合だとFP32で済むわけです。
では、UUIDの発行と同じレベルで桁数が必要な用途だと用意する物はFP128以上になりますから、専用のハードを使って研究用にしっかりと散らばる疑似乱数を使ってサンプリングを行う場合だと、それに見合ったハードウェアが必要になります。
このように、 【 演算を行う場合において特化型の製品を作る場合には、専用の設計の物を使う事になる 】 訳ですが、開発されているハーキテクチャからパーツの構成を考える場合、製品の選択はある程度絞られてきます。その為、市販のゲーム機だと 【 量産 】 の必要がありますから、量産可能で流通量の多い物を選ぶことになります。そうなると、 【 ハードウェアの使途にあった物で目的のパフォーマンスに達している物 】 と言う条件抽出を行う事になりますから、ゲーム機の場合だと、何を使うのかもある程度決まってくるわけです。
そうではなく、オートクチュールと言う条件だと、既存のアーキテクチャに依存する必要がありませんから、FPGAで単一のモジュールを作って、クラスター化した時に高速になるような物を試験的に作り、回路を詰めて行って、それを実際にクラスター化して長期運用してみて最適な状態になった物を使った方が、速度は出ると思います。この場合、サイズやコストの制約がない条件になりますから、 【 ユーザーが購入したいと思うような市場価格と言う根付の必要がない 】 ので、上限を追いかけるとすれば、余計否処理を実装しない専用機材の構造を作った方がボトルネックも減るので高速になります。つまり、この時の処理やデータの移送やストックをどう言った形で行えば高速になるのか?を考える必要があるので、 【 演算を行うハードウェアと言うt構造物の設計 】 まで行う事になるので、市販されているパーツをレイアウトして設計を詰めていくのよりも膨大な時間を要する事になります。
ゲームも産業なので、学校の提出物ではありませんから、個人が購入できるような物でなければならないので、少なくとも性能を高くしたとしても 【 フラグシップのゲーミングPCのような高額だと売れない 】 ので、高級品であっても価格の上限と言うのがあります。
その為、高速にする方法は世の中には山のように存在するのですが、製品には 【 コンセプト 】 があるので、それに見合った作りにしようと思うと使用するハードェアも決まってきます。
この仕様の条件が存在するので、任天堂のハードウェアとSIEやマイクロソフトのハードウェアでは構造が異なる訳です。任天堂はWii-Uをもう少し扱いやすくした製品ですから、タブレットのような仕様になっていますから、性能は抑えめなので、残念ながら現在のゲーミングPCで動いているAAAタイトルを動かせるだけのリソースを持っていませんから、参入予定のメーカーからリリース予定のタイトルが出なくなったという経緯もあります。
では、Xbox Series XやPlayStation 5は、どう言った構造なのか?と言うと、これはBGAのマザーボードにパーツが実装されているので、ストレージ以外の換装が出来ません。
つまり、大半のものがオンダイになっています。この構造は白物家電とか黒物家電(オーディオビジュアル)などの構造と同じですが、構造がスマホとは違います。
その為、方向性が据え置きでハイパフォーマンスな物を作るのと、スマホなどと同じ形態性を求めた場合だと、コンセプトが違うので製品の構造が違ってきます。この辺りの内容は、極端な言い方をすると、ワンボードマイコンの用途とシングルボードコンピューターの用途の違いとも言えますが、コンセプトによって求める物が違ってくるので、設計その物が異なる訳です。
ハードウェアによって処理の違いが生まれる事例は極端に異なる作りの物を見ると解りやすいのですが、同じような処理能力でも
のようにLCDを使った物と
のようなマトリックスディスプレイを使った物だと出来る事が違うので目的が異なる訳です。この辺りは、解像度と出来る事の違いだったり、カラーとモノクロの差異などとも同じことが言えますが、同じ処理をする場合でも結構な違いが出ます。
ゲ ーム機とソフトウェア
ゲーム機のソフトウェアですが、NINTENDO DS辺りからEDUCATIONの分野が増えていましたが、この時期以降にはかなり作りのいいソフトウェアが多くリリースされています。
その為、 【 ゲームとはソフトウェアのジャンルでしかない 】 ので、映像と言うカテゴリーだとなんでも同じという訳ではないのと同じで、この呼び名は 【 ソフトウェアのカテゴリー 】 でしかありませんから、教育ソフトをインタラクティブに作るというのもごく当たり前に行えるものになります。
では、インタラクティブな物を作るソフトウェアはいつごろから出ているのか?と言うと、20世紀には既に存在しており、ファミコンが出た時代はバブルだったこともあり、調べてみると、見た事もない周辺機器が存在しています。その中には、 【 フレームシーケンシャル方式の3D眼鏡 】 と言う 【 時代を数十年先取りしたような物 】 まで存在していたのですが、ファミコンの時代には 【 3Dゲームを作る 】 のようなコンセプトもあったようです。
1987年の年末にスクウェアはファイナルファンタジーと言うRPG史に名を刻む名作を生みだし、現在も多くの人がプレイしたことがあるシリーズタイトルの最初の製品をリリースしましたが、その年の3月にディスクシステムで 【 飛び出せ大作戦 】 と言うアナグリフ方式で立体に見えるゲームを作っていましたが、3Dと言うアプローチはこのじだいにもあったようです。1970年代と1980年代にはハードの限界を超えたような未来の物を作ろうとしている人が多かったようで、タイトルを見ると、現在のハードで数十年後のスタンダードを作ろうとしている人が多かったことが分かります。スクウェアだとクリスタルドラゴンとかがそんな感じがしますが、 【 グラフィックの上限を目指す 】 という点では、そうしたアプローチがありました。そうしたムービーの作り込みとゲームのアプローチの両方で凄い事をしていたのが、テクモの忍者龍剣伝シリーズでしたが、この時代にはゲームの間にムービーのような物を挟んだ展開にする作り方が確立されていました。これも1998年の話ですから、そう言った流れが後のハードでスタンダードになるのもごく当たり前の話とも言えます。
謎の周辺機器には 【 お絵描きタブレット 】 と言うペンタブレットや
【 MIDIキーボード 】 などもあり、既にゲーム機をコンピューターとして使うようなアプローチの物が揃っていたのですが、任天堂自体も自社製ハードで 【 プログラミング 】 と 【 ロボット制御 】 を行うコンセプトの物を出していましたから、名前の通りに家庭用ゲーム機と言うよりも 【 家庭用のコンピューター 】 を売ろうとしていたような展開が図られていました。その時代だと、X1のPCGが水平解像度を2倍にした時の品質が高過ぎたので、別次元な物が出来るようになっていた(ブラウン管は滲むので、8色を半分のドットにすると中間色に見えるので、色数を増やす事が出来ていました。)のですが、グラフィカルにしても、VRAMにドットを乗せて動かしているのではなく、アスキーアートのパターンを入れ替えて表示している(と言ってもマシン語で画像を処理したほうが高速なので、あくまでもBASICをフツーに使う場合に当時だと相当グラフィカル難が作れるのとその時の処理のお話になります。)ので、BASICなのに意外と動いてくれるというしようになっていたので、ゲーム画面を綺麗に作れるBASICのプログラム(HuBASIC)になっていましたから、画質や機能だと違っていましたが、色々いじれる面白さは存在していたようです。
その為、 【 作れる 】 という部分だと、ファミリーベーシック辺りが該当するので、そうした 【 何かを作る 】 という体験については1984年辺りにはゲーム機で行えるようになっていました。
ただし、これだとファミリーベーシックの仕様に引っ張られてしまうので、意図したゲームが作れないのですが、1990年代になると、作れるソフトが出てきます。ゲーム機ではありませんが、MSXというハードはゲームの名作の宝庫で、コナミだとネメシスなどもありますが、やはり、MSX2のゲームの金字塔と言うと誰もが知ってるステルスアクションの代表作の 【 メタルギア 】 があります。
そして、このハードで登場したコントラクションツールに株式会社アスキーからリリースされた 【 RPGコンストラクションツール Dante 】 になります。MSX2で登場したタイトルになりますが、PC98の前にMSX2で登場していますが、1995年にスーパーファミコンにも移植され、その後、エンターブレインに移行してからツクールシリーズになりました。
1991年代にシューティングゲームを作れるコントラクションツールの 【 絵描衛門 】 がファミコンでリリースされますが、この時代以降にゲーム機でゲーム作りを体験できるソフトが増えていきます。
ツクールシリーズは種類だけ見るとかなりの数になっていますが、セガサターンやPlayStationでは、
■ 3Dシューティングツクール
■ 3D格闘ツクール
■ 音楽ツクール
などが出ていましたが、PS2の時代には、BASICを使ってポリゴンを動かせる 【 BASIC STUDIO パワフルゲーム工房 】 と言う物が登場します。これが登場したのが2001年になりますが、ゲーム機でもプログラミングを行って何かが作れる物が登場します。そして、2011年になると、3DSでプチコンが登場し、ゲーム機でプログラミングをするようなゲームが登場しますが、単なる近トラクションツールではなく、プログラミングツールがリリースされるようになります。
基本的に、
■ BASIC STUDIO パワフルゲーム工房
■ プチコン
もBASICインタプリタを使っているので、素材制作を行ってBASICでそれを制御するというコンセプトのツールになっています。少し複雑な事の出来るScratchのようなイメージですが、ハードウェアの実装機能を有効的に使えるという点で面白い部分が多いのですが、ゲーム機で何かを作るという選択は21世紀になるとより複雑な事が出来るようになります。
近 年のソフトウェア
近年のソフトウェアだと、以前、
の中で紹介した
■ Dreams Universe
https://www.playstation.com/ja-jp/games/dreams/
や
■ ナビつき! つくってわかる はじめてゲームプログラミング
https://www.nintendo.co.jp/switch/awuxa/
がありますが、この二者ではアプローチが異なりますが、形としてはノード型のコーディングの仕様になっています。
■ ノードによる処理
ビジュアルスクリプト言語だとブロック型ですが、Dreams Universeは、関連付けで処理を構築していく流れになっていますが何に対して何をするのか?と言う 【 処理の流れ 】 の作り方をします。その為、接続が凄い事になるので、簡略化する方法もあります。
ナビつき! つくってわかる はじめてゲームプログラミングについては、 【 ノードン 】 なので、ノードそのものですが、これを使ったプログラミングはコーディングと言うよりも、ゲームエンジンやグラフィックツールなどで使用されているノードによる処理に対応できると言う利点があります。
ゲームエンジンでのコーディングですが、どのゲームエンジンでもテキストで打ち込んで行う事になっていますが、UnrealEngineもそう言った機能があります。
■ UnrealEngine
https://www.unrealengine.com/ja/
このソフトでは、通常のディングだけでなくブループリントが使用できるので 【 ノード 】 でゲームの制御が出来るようになっています。
■ ブループリントの基本 【 UnrealEngine 】
https://www.unrealengine.com/ja/blog/blueprint-basics
PC環境でのノードの利用例と言うと、シェーダーの設定がそう言った仕様になっていますが、Poserなどはかなり昔からノードでの設定になっていかしたからどう言う仕様のツールになっています。その為、ノード自体は昔から存在しますが、コンポジットツールにもノード型とレイヤー型があり、After Effectsのようなレイヤー型のUIの物と、ノードを薙ぐUIの物が存在していいます。
動画制作だとDavinch Resolveがノード型のツールになっていて、ノードを使った調整が出来るようになっています。
■ DavinchResolve
DaVinci Resolve 17 | Blackmagic Design
3DCGツールだと現在のBlender 2.93.5もノードを使う部分が増えており、
■ コンポジション
■ シェーダー
■ ジオメトリーノード
でノードを使用します。
■ Blender
■ ノードの使い方
基本的にノードンが解ればノードも解るのですが、ノードは目的の決まったパーツで、対応した物を接続する事で処理を設定する事ができます。
ノードの基本形は、 【 始点 】~【 終点 】 が直結した状態になっています。つまり、
【 対象 】 が 【 表示されている 】
のような状態になります。ノードについては、
【 主語 】 + 【 述語 】 と言う構文に対して
【 修飾語 】 を追加して、結果を確定する
ような感じの作業になりますから、
【 この形状は 】 + 【 ( ) 】 + 【 である。 】
と言う構文があった時、( )内の内容で状態は変わりますが、ノードのイメージはこれです。プロパティの数値で指定する方法もありますが、ノードの場合だと、この始点と終点の間の 【 変数化した物 】 に状態を代入して 【 結果を定数化する作業 】 をすることになりますが、この時の 【 状態の要素を指定する為の道具 】 がノードになります。
Blenderでは、ノードを使いますが、2.92からジオメトリ―ノードが追加されたので形状を扱えるようになりました。これについては、
の中で触れていますが、
の状態の中に状態を加えて
のように繋いで情報を追加する事ができますが、ノードの組み方で
の用に変えたり、
のように状態を変える事もできます。質感については、マテリアルを変えるだけでも
の様な質感の設定ができますし、
■ 質感をコントロールする : テクスチャ(1) 【 Blender 2.93 】
野中で行ったように
のようになりますが、テクスチャで質感を変える事もできます。この時にもノードを使いますが、
■ 質感をコントロールする : テクスチャ(2) 【 Blender 2.93 】
の中で触れているように素材の質感もノードで指定できます。この中で
のようなRGBミックスのノードを使っていますが、これが2つの素の間に階層を作ってレイヤーの効果を与える物になります。このノードでは、
■ 階層の指定
■ 不透明度(上位レイヤーの合成の度合い)
■ レイヤー効果(重ねた時の効果)
■ マスク
を一つのノードだけで行えます。画像処理でレイヤーを使った場合だと、マスク用のレイヤーを作って処理をしますが、素材が2つの場合だと同じ状態になります。これが多重化する場合には、この素材が上位に来るのか、解に来るのかを決めて処理をすることになりますが、ノードの場合も同様の繋ぎ方をします。これがノードでの制御になります。
質感については、
■ 質感をコントロールする : テクスチャ(3) 【 Blender 2.93 】
でも扱っていますが、
のようにする事で異なるマスクをかけています。画像のコンポジションについては、
で行っていますが、素材を加工・合成すると
な感じになりますし、
のような素材も加工をすると、
のような感じにもできますが、これもレイヤーでの合成が前提になっています。つまり、階層を調整しているのでこう言うのが出来ているのですが、何をどう言った形で重ねていくかでこうした事もできます。
ただし、前面に来た物をそのまま使うのか、透過するのかで処理が違ってきますから、透過する場合には、RGBAで作れる場合には問題がありませんが、そうでない実写素材だと動的なマスク処理が必要になります。動画の場合、動いているので、フレーム単位で違う画像になっているので、マスクもフレームごとに違ってきます。こうしたマスクを作って透過部分を作る事で、背景と素材を合成する事ができます。この作業をロトスコープと言いますが、現在では映像の解析を行ってロトスコープを行う機能を実装したツールもありますが、手動で行う場合だと、ツールを選ばずに行えるようになっています。
Blenderでは、レンダリング結果もノードでコントロールできるようになっており、
■ Blenderとコンポジション 【 Blender 2.92 】
の中で触れていますが、異なるシーンを個合成できるので、
のような感じで合成をすることができます。また、実写素材同士でもコンポジションが出来るので、
のように合成した物の素材の状態を調整して
のような感じにすることもできます。また、
のようにして
の素材を
のように合成することもできます。ノードとは関係ないのですが、3Dビューポートでカメラで見てている物も合成できるので、
のようにロトスコープで透過した映像素材を配置してシーン愛でオブジェクトを動かした場合、
のように映像内のアクターの前後を周回するような物体を配置することもできます。ノードを使わない条件でのコンポジションだと、
の中で触れていますが、
のようなレンダリング結果を別のシーンで用意しておいて、それを動画編集用のシーンに読み込んで合成する事で、
のように使用することもできます。
これが、ノードになりますが、基本的に、 【 処理の塊 】 がノードで、それに対して、
■ 何を入力して
■ どう言った設定にして
■ 何に対して出力するのか?
を指定するようになっています。そして、ノードの出力結果をそのまま入力として使う事もできますが、 【 合成 】 もできるので、構造物の状態の合成や色彩や質感の合成も行えるようになっています。
とりあえず、テクスチャの組み合わせをノードでコントロールできるのでプリンシプルBSDFだけを使った場合でも
のようなノードを組むと、
や
のような感じの質感の設定ができますから、何に対して、何をするのか?を明確にできると細かな設定を行えるようになります。
Unreal Engineのブループリントやナビつき! つくってわかる はじめてゲームプログラミングのノードンの場合、これを動的な処理で使用する作りになっていますが、登録なしで、無償で使えるゲームエンジンにもノードでの処理の実装が出来る物があります。それが、
■ Godot
ノードについては、日本語のドキュメントが
■ ノードと用語 【 Godot 】
https://docs.godotengine.org/ja/stable/getting_started/
scripting/visual_script/nodes_purposes.html
に用意されていますが、基本的に、コードの記述で行う内容をノードの接続で実装する形になっています。ちなみに、このソフトは、製作したゲームは商用利用が可能ですが、実行時にオンラインにしておく必要があります。登録などは存在しませんが、インターネット接続環境が必要にんります。
ノードとは少し仕様が異なりますが、無償で登録なしの上にオフラインで使用できるゲームエンジンにUPBGEがあります。
■ UPBGE
これについれは、
で触れていますが、
のような感じで、
■ 入力 : センサー
■ 判定 : コントローラー
■ 処理 : アクチュエーター
で指定する仕組みになっており、この処理の構造がどう言ったつながりで動くのかを考えて行く仕組みになっています。
■ ロジックで動かしたもの
のようなことができます。あと、数値はプロパティで扱うようになっているのですが、テキストオブジェクトのゲームテキストプロパティで数値の変化を表示できる仕様になっています。この数値の扱いについては、
■ UPBGEと変数(その2) 【 UPBGE 0.3Alpha 】
■ UPBGEとロジックエディタ(UPBGE 0.2.5 & 0.3 Alpha)
の中で触れていますが、コードを書かない場合には色々と制約が発生するようです。ロジックとは別にノードでコントロールする方法もあるようですが、これは機能が良く解っていないのですが、そう言った制御方法もあるようです。
このように、現在は、コードを書かずに挙動の設定が可能な手段もありますが、ノードについては、コンテンツを制作するツールで主に使われている印象があります。
コ ードの記述について
ゲーム機でゲームを作れるソフトについては、
■ BASIC STUDIO パワフルゲーム工房
https://www.artdink.co.jp/japanese/title/bs/
■ プチコン4 Smile BASIC
https://www.petc4.smilebasic.com/
もありますが、このツールでは、BASICインタプリタを使った処理になってます、DSのプチコンだと通常のBASICの作りだったので、使用できるのがサブルーチンしかなかったのですが、プチコン4ではユーザー定義関数の概念が含まれています。
サブルーチンと関数ですが、
■ サブルーチン
呼ぶ側(メインルーチン)と呼ばれる側(サブルーチン)の
【 関係性が強い 】 時に使う。
呼ぶ側で使っている変数(サブルーチン内の変数)を使う
事が前提
基本的に他のプログラムでの使いまわしが出来ない。
【 ソースコードを繰り返して使う 】目的で使用
■ ユーザー定義関数
呼ぶ側(メインルーチン)と呼ばれる側(サブルーチン)の
完成性が全くない。
呼ぶ側で使っている変数(ユーザー定義関数内の変数)を
使う事も可能だが、使わないことが理想
呼ぶ側(メインルーチン)に依存しなければ、使いまわす事
が出来る
【 考え方を繰り返して使う 】目的で使用
と言う違いがあります。
関数の場合、 【 関数名() 】 のように引数がない宣言もできますが、プチコン4でもそれが可能で、PythonのようにDEFで宣言します。
DEF 関数名
記述
END
が引数なしの場合で、実行時には、関数名で実行できます。この辺りは、PythonやJavaScriptと考え方は同じです。
■ 戻り値が1つの場合
戻り値が一つの場合、
DEF 関数名()
記述
RETUERN
END
のようになり、実行時には、
関数名()
関数名 OUT ~
で実行できます。システムで定義されている関数だとRAND()の記述と同じで引数を渡すような記述になります。
■ 戻り値が2つ以上の場合
戻り値が2つの場合、
DEF 関数名 OUT 引数
記述
END
のようになり、実行時には、
関数名 ~OUT ~
で実行できます。
■ 戻り値が不定数の場合
戻り値が負定数の場合、
DEF 関数名 *[OUT* ]
記述
END
のようになり、実行時には、
関数名 ~OUT ~
で実行できます。
■ 実際のコ―ド
基本的に、def 関数名()と同じような記述ですから、引数なしだと、
ACLS
DEF A1
PRINT "A"
END
A1
のような記述にすると、A1と言う関数を作って、A1を呼び出している事になりますから、Aが表示されます。では、戻り値が1つの場合だと、
ACLS
DEF A1(C)
PRINT "A"
RETURN C+1
END
B=A1(1)
PRINT B
のような記述になります。こうすると、関数は読み込まれますが不確定な数値になりますから、
B=A1(1)
の関数の変数の宣言が処理としては先に行われます。すると、
A1(C)の引数のCに1が入った状態になるので、RETRNの戻り値の計算が行われることになります。その為
A
2
と言う結果が返ってきます。
では、値が2つある場合だと、この場合、計算式を作れますから、
ACLS
DEF A1(C,D)
PRINT "A"
RETURN C+D
END
B=A1(3,9)
PRINT B
のようにすると、関数の型と同じ状態で引数が代入されるので、最初に変数Bに引数入りの関数を代入しているので、Bの値が関数の結果になり、関数に引数が代入されて関数が実行されるので、
A
12
が表示されます。これとは別に DEF~OUTの記述も行えるのですが、その場合、
ACLS
DEF A1 C,D OUT E
PRINT "A"
E=C+D
END
A1 3,9 OUT B
PRINT B
のようになります。この形にすると引数を増やせるので、
ACLS
DEF A1 C,D OUT E,F,G,H
PRINT "四則演算"
E=C+D
F=C-D
G=C*D
H=C/D
END
A1 3,9 OUT B,I.J,K
PRINT "足し算の答え : " ;B
PRINT "引き算の答え : " ;I
PRINT "掛け算の答え : " ;J
PRINT "割り算の答え : " :K
とすると、引数を使った四則演算の答えが出ます。文字列の場合だと、 【 変数名$ 】 にすればいいので、
ACLS
DEF A1 C,D,L$ OUT E,F,G,H
PRINT L$
E=C+D
F=C-D
G=C*D
H=C/D
END
A1 3,9,"四則演算のプログラム" OUT B,I.J,K
PRINT "足し算の答え : " ;B
PRINT "引き算の答え : " ;I
PRINT "掛け算の答え : " ;J
PRINT "割り算の答え : " :K
のようにすると文字列が表示されるようになります。
この構造を見ると、
■ ユーザー関数の宣言
DEF 関数名 引数1,引数2, ... OUT 変数名1,変数名2,...
処理
END
■ ユーザー関数の実行
関数名 引数1,引数2, ... OUT 変数名1,変数名2,...
処理
のようにすると、複数の引数に対応できるので、拡張の予定がある物だと、この記述にしておけば、引数や変数の数を増やす事が出来るので、便利な気がします。ただし、それがない条件だと、簡素な記述にしたほうがソースコードが見やすくなるので、目的で使い分ける事になります。また、引数は関数外のプログラムで宣言してそれを関数に使用するので、INPUT文とかで引数を入れるようにすると、数値を自由に入れ替える事が出来ます。
サブルーチンは、処理の塊を入れるので、キャラの入力と挙動の処理とかを入れて動かす時に使用しますが、関数は違う場所からお呼び出せるという利点があります。
Pythonなどの言語だと、クラスや関数やコードのどの場所からでも呼び出せるので、サブルーチンのようにON GOSUBの呼び出しとRETRNでの戻る先の場所の指定の縛りがないのが関数の利点になります。