読者です 読者をやめる 読者になる 読者になる

bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Netwireでゲームを作成する(13)

16.グラフィックスを含めて完成させる 前回までの記事で、ピンポン玉をラケットで打つ処理の部分までを完成させたが、グラフィックスの部分が完成していなかったため、ゲームそのものを楽しむことはできなかった。今回は、グラフィックスの部分を実装し、…

Netwireでゲームを作成する(12)

15.ラケットでピンポン玉を跳ね返す問題の解 Netwireの紹介で、最初に与えた問題は次のようになっていた。問題:Netwireで次のゲームを実現しなさい。仕様:ピンポン玉が空中に投げ出されたとする。この時、ピンポン玉が落ちないように、水平に移動するラ…

Netwireでゲームを作成する(11)

14.壁面で跳ね返す 前回の記事の四角いボックスは、キーが押された時、x軸に沿って等速度で左あるいは右に移動した。しかし、側面に壁がないため、いくらでも左あるいは右に進むことができた。この単純なゲームを、もう少し現実的なゲームにするため、両…

Netwireでゲームを作成する(10)

13.ボックスを動かす ここでは、四角いボックスを左右に動かす単純なゲームの作成方法について記述する。ゲームは時間とともに進行していく。Netwireでゲームに登場してくるものの振舞いは、Wire型の値で定められている。ゲームが進行する中で、値が変化…

Netwireでゲームを作成する(9)

12.キーボードからのイベント 前回、前々回の記事では時間に関するイベントについて記述したが、ここでは、キーボードを操作したときのイベントについて説明する。キーボードからのイベントの処理の仕方は、どのグラフィックスAPIを用いるかによって異な…

Netwireでゲームを作成する(8)

11.アロー記法 wireは、入力aを受けて、出力bを出すことで、その振る舞いを表しているが、前の記事では、入力aの存在が分かりにくかったので、wireの本質をとらえにくかったかもしれない。そこで、ここでは、前の記事で用いたプログラムを等価なアロー記…

Netwireでゲームを作成する(7)

10.Netwireの概要 振舞いは次のように定義した。 newtype Behavior t a b = Behavior { stepBehavior :: t -> a -> Maybe (b,Behavior t a b) } netwireではデータ型Wireによって振舞いを次のように定めている(5.0以前のNetwireでは、これまでの説明と同…

Netwireでゲームを作成する(6)

9.抑制(Inhibition) Netwireを特徴づけている機能の一つは、inhibitionである。この単語のhibitの部分は、ラテン語のhabitで「つかんだり持ち続けたりすること」を表している。接頭語のinは「中に」を表す。例えば、心理学では「ある心理的機能が他の心理…

Netwireでゲームを作成する(5)

8.各圏へのインスタンス化 前回の記事で、振舞いを次のように定義した。 newtype Behavior t a b = Behavior { stepBehavior :: t -> a -> (b,Behavior t a b) } この段階では、型として定義しただけなので、いろいろな性質を持たせるために、必要な型クラ…

Netwireでゲームを作成する(4)

6.関数型リアクティブ・プログラミング 関数型リアクティブ・プログラミングを特徴づけるのが、スイッチである。これに関してはYampaの記事でいくつか取り上げた。ここでは、最も簡単なスイッチを用いて、Netwireではどのように実現するのかを説明する。ス…

Netwireでゲームを作成する(3)

5.スイッチ イベントの発生により、振舞いは変化する。例えば、ボールを床に落下させると、床にぶつかって、ボールは跳ね返ってくる。このような状況を記述するために、関数型リアクティブ・プログラミングではスイッチを用いる。スイッチの型シグネチャは…

Netwireでゲームを作成する(2)

4.イベント イベントも振舞いと同じように型で表す。即ち、tという時間にeというイベントが発生したとき、 newtype Event t a = Event { getEvent :: (t,a) } というデータ型で表す。これは、振舞いを定義したBehaviorの型と比較するとよく似ていることが…

Netwireでゲームを作成する(1)

1.問題 最初からいきなり問題である。問題:Netwireで次のゲームを実現しなさい。仕様:ピンポン玉が空中に投げ出されたとする。この時、ピンポン玉が落ちないように、水平に移動するラケットで反射させなさい。また、左右には壁があるものとし、ピンポン…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―オブジェクトの運命

1.概略 これまで説明してきたシューティングゲームでは、鳥のオブジェクトが一つ、石のオブジェクトが二つ存在した。この記事では、これらのオブジェクトがどのような運命をたどるかを説明する。オブジェクトの振舞いは信号関数によって制御される。例えば…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―発射台を移動する(2)

3.発射台の位置の移動をスムーズに 前回の記事で発射台の位置を移動できるようになった。しかし、残念なことに、その動きはスムーズではなかった。ここでは、発射台をスムーズに移動できるようにする。即ち、dのキーを押し続けている間は右に移動し、aのキ…

Haskell-Platform 2014, Eclipse-Luna, EclipseFPで快適な開発環境を構築する

1.概略 どの言語でも同じことがいえるが、開発環境を整えて作業をしたほうがずっと効率的である。幸いなことに、Haskellの開発環境に対しても、オンラインでの文法チェックや見やすくするためのコードの修正示唆などの機能がEclipceで提供されている。今回…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―発射台を移動する(1)

1.概略 キーボードの利用の仕方を覚えたので、石の発射位置を右矢印キーと左矢印キーで変えられるようにする。ゲームのデモを見たほうが早いので、ゲームを行っているときのビデオを下に挙げておく(発射位置の設定が悪く、今回は鳥にうまく当たっていない…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―発射と停止を加える(2)

6.デモ 今回のプログラムの実行状況をビデをで説明する。 余り、代わり映えしないのだが、PgUpキーを押すと鳥が動き出すと同時に石が発射され、PgDnキーを押すと鳥と石が消える。 7.オブジェクトのプログラム それでは、鳥と石のオブジェクトのプログラ…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―発射と停止を加える(1)

1.概略 これまで述べてきたゲームは、本当に基本的な部分を製作しただけで、勝手に鳥が飛んで、勝手に石が飛んで行って、鳥を撃ち落としていた。今回、紹介する記事は、この部分は変わらないのだが、キーボードから石の発射や石と鳥の停止を指示できるよう…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―付録

1.データ型 シューティングゲームの主要な部分の説明は終わったので、ここでは、このゲームのために定義したデータ型やタイプを説明する。プログラムは次のようになっている。 module Types where import FRP.Yampa type Pos = (Double, Double) type Vel …

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―メインプログラム

1.概略 ゲームを構成するプログラムの説明がほぼ終了したので、それらをまとめてゲームのプログラムとして機能させるメインプログラムを見ていく。Yampaではreactimateという関数を用意している。これを働かせるためには、初期化ルーチン、入力ルーチン、…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―グラフィックス

1.概略 ゲームの出力を行うのはグラフィックスである。広く利用されているのはOpenGLである。その簡易版はGLUTである。また、最近ではSDL(Simple DirectMedia Layer)も広く利用されている。このシューティングゲームではGLUTを用いる。ゲームの進行状況を…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―登場者の信号関数

1.概略 ゲームプログラムの登場人物、このシューティングゲームでは石二つと鳥一羽、の振舞いを定義しなければならない。どの石も同じ振舞いをすることにすると、ここでは、石と鳥の二種類の振舞いを定める必要がある。Yampaでは登場者の振舞いは信号関数…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―プロセス(2)

5.用語の説明 説明に入る前にまず言葉の定義をしておく。ゲームの中で登場する人や物を登場者と呼ぶ。その振舞いは信号関数により定義されている。ゲームはある時間間隔で進行する。一つの時間間隔をサイクルと呼ぶ。登場者はあるサイクルを始める前にある…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―プロセス(1)

1.プロセスの概略 Yampaを用いてのゲームは、reactimateを用いるが、reactimateは前にも記述した通り、init,input,output,processで構成されている。今回の記事では、この中のprocessについて説明する。ここで説明するゲームは極めて簡単なゲームで、石を…

YampaとOpenGL(GLUT)で簡単なシューティングゲームを作成する―概略

1.Yampaでのゲーム作成 Yampaでのゲームの作成の概略はMeisinger作成の下図のとおりである。 この図をフローチャートで示したのがMeisinger作成の下図である。 ゲームのプログラムは、Yampaが用意しているreactimateという関数を利用する。これは4つの部分…

Yampaでゲームを定式化する―Haskanoidの信号関数

1.Haskanoidでの信号関数 パックマンでは信号関数はオブジェクトと入力の対を得てオブジェクトの新しい状態を得ていた。Haskanoidでも原理は同様である。信号関数はオブジェクトごとに用意され、信号関数への入力は、キーボード、マウス、Wiiリモートプラ…

Yampaでゲームを定式化する―Haskanoidのオブジェクト

1.動作画面 Haskanoidの操作画面は次のようになっている。 この画面が出てくるまで、インストール時に様々な障害に出会うことと思うが、最も生じやすいエラーは、画像や音声のデータがないと言われることだと思う。Haskanoidはこれらのデータをdata(小文字…

Yampaでゲームを定式化する―Haskanoid紹介

1.Yampaの生い立ち Yampaは前にも説明した通り、関数型リアクティブ・プログラミング(Functional Reactive Programming)の概念に基づいて離散的なシステムと連続的なシステムの両方を扱えるハイブリッドなプログラミングで、ドメイン特化言語である。Yampa…

Yampaでゲームを定式化する―概略

1.懐かしいパックマン Yampaを用いてのゲームの作成方法は、Gerold Meisinger (University of Applied Sciences Upper Austria) の学位論文「Game-Engine-Architektur mit funktional-reaktiver Programmierung in Haskell/Yampa」やそれに関連する学会論…

ゲームの中で信号関数を自在に扱う:スイッチ

1.スイッチ スイッチはある一つの信号関数を他の信号関数で置き換えるものである。スイッチが生じるのは、スイッチング・イベントの発生元で、最初のイベントが発生したときである。スイッチの型シグネチャは次のようになっている。 switch :: SF a (b, Ev…

ゲームの中で信号関数を自在に扱う:アロー記法

1.アロー記法 ここで用いているアロー記法は、John Hughesが定義したものを応用している。もとの理論は次のようになっている。 John Hughesのアロー記法: 1)型のような関数に対する抽象データ型インタフェースである。2)プロセスのような計算を表現す…

ゲームの中で信号関数を自在に扱う:信号関数の定義

1.基本的な信号関数 恒等関数:ある信号aをそれ自身(信号)aへ写像する信号関数である。 identity :: SF a a 定数:ある信号bを入力し、それを出力とする信号関数を出力する。 constant :: b -> SF a b iPre:ある信号aを入力し、それを入出力とする信号関…

ゲームの中で信号関数を自在に扱う:Yampaの原理を理解する

1.信号関数の原理 前回の記事「シューティングゲーム手習い:複数投石(一石二鳥ならぬ二石一鳥)」で、投石された石と飛んでいる鳥の軌跡を描くプログラムを作成した。続きの記事として、石と鳥がぶつかった瞬間を描きたいのだが、これには、石と鳥が衝突…

シューティングゲーム手習い:複数投石(一石二鳥ならぬ二石一鳥)

1.複数の石を同時に投げる 今回はこの動画のように複数の石、といっても二つだが、を投げる場合を考える。 プログラムの修正はそれほど難しくはない。鳥と石の軌跡を計算しているupdateに新たな石を加える(三行目が新たに加わった石で、鳥には当たらず鳥…

シューティングゲーム手習い:鳥も参加

1.石と鳥の軌跡 今回はこの動画のように機能するプログラムを作成する。 今、角度\(\theta =tan^{-1} \frac{v_{y_0}}{v_{x_0}}\)、速度\(\sqrt{v_{x_0}^2 + v_{y_0}^2}\)で石を投げた(\(x\)方向、\(y\)方向の速度成分がそれぞれ\((v_{x_0}\),\(v_{y_0})\)…

シューティングゲーム手習い:投石プログラムを整理する

1.投石ゲーム 原始的だが、投石で鳥を落下させるゲームの設計を目指して、基本的な部分を作成する。まずは、前回の記事で作成したプログラムを整理する。 一つは、位置、速度、加速度はそれぞれ\(x\)方向と\(y\)方向を別々に記述していたが、プログラムを…

物理的なモデルに基づいてゲームを開発する:ボールを投げる

1.落下するボールのプログラムを応用する 今回のプログラムを実行すると次のようになります。 落下するボールのプログラムができれば、シューティングゲームなど幅広い分野に応用することができる。ここでは、ボールを投げたときの軌跡を求める。今、ボー…

物理的なモデルに基づいてゲームを開発する:落下するボールをバウンドさせる

1.FRPを本格的に 今回のプログラムを実行すると次のように動きます。 今まで書いたプログラムでは、落下する物体は地面をも突き破ってどんどんと地下のほうに落ちていく。これでは非現実的なので地表面で跳ね返るようにする。即ち、\(y=0\)の時、\(v_t\)は…

物理的なモデルに基づいてゲームを開発する:将来の発展のために

1.mainの部分を本格的に reactimateは簡便で便利な関数だが、落下するボールをマウスで操作したいなどインタラクティブな操作を加えるときは、不向きである。そこで、ここでは将来の拡張に備えて、reactInitとreactを用いて、mainの部分を書き換える。コー…

物理的なモデルに基づいてゲームを開発する:OpenGLで描画

1.落下する物体を描画する 前回の記事で、FRPを用いて落下するボールの刻々と変化する高さと時間を数字で出力した。ここでは、直感的に分かりやすくするために、GLUT(The OpenGL Utility Kit)を用いて、描画する。コードは同じようにJekorが動画で説明した…

物理的なモデルに基づいてゲームを開発する:FRP事始め

1.ゲームとエンジンの紹介 日本では、フリー・モナドやオペレーショナル・モナドがゲームのエンジンに向いているとひところ話題になっていた。一方、海外では関数型リアクティブ・プログラミング(Functional Reactive Programming:以下ではFRPと省略する)…