<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/tune_projects/">
    <title>tune_projects @ ウィキ</title>
    <link>http://w.atwiki.jp/tune_projects/</link>
    <atom:link href="https://w.atwiki.jp/tune_projects/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>tune_projects @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2012-09-15T20:41:15+09:00</dc:date>
    <utime>1347709275</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/24.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/23.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/22.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/tune_projects/pages/18.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/19.html">
    <title>SDL画像描画関連</title>
    <link>https://w.atwiki.jp/tune_projects/pages/19.html</link>
    <description>
      とりあえず画像表示できた。
これをベースに色々実験してみる予定。

  module Main where
  import Data.Word
  import qualified Graphics.UI.SDL as SDL
  import qualified Graphics.UI.SDL.Image as SDLi
  
  gameinit :: IO ()
  gameinit = do
   SDL.init [SDL.InitEverything]
   SDL.setVideoMode 640 480 32 []
    return ()
  
  dispImage :: IO ()
  dispImage = do
    --準備
    screen &lt;- SDL.getVideoSurface
    img &lt;- SDLi.load &quot;ue.png&quot;
    --表示
    SDL.blitSurface img (Just $ SDL.Rect 0 0 100 100) screen Nothing
    SDL.flip screen
    SDL.freeSurface img --画像を解放
  
    --画面が閉じられるまで待機
    e &lt;- SDL.waitEvent
    if e == SDL.Quit then return () else dispImage
  
  main :: IO ()
  main = gameinit &gt;&gt; dispImage &gt;&gt; SDL.quit

----

拡大／回転

  module Main where
  import Data.Word
  import qualified Graphics.UI.SDL as SDL
  import qualified Graphics.UI.SDL.Image as SDLi
  import qualified Graphics.UI.SDL.Rotozoomer as SDLr
  
  gameinit :: IO ()
  gameinit = do
    SDL.init [SDL.InitEverything]
    SDL.setVideoMode 640 480 32 []
    return ()
  
  dispImage :: IO ()
  dispImage = do
    --準備
    screen &lt;- SDL.getVideoSurface
    imgG &lt;- SDLi.load &quot;OnpuG.png&quot;
    imgBG &lt;- SDLr.rotozoom imgG 180 3 False
  
    --表示
    SDL.blitSurface 
      imgBG (Just $ SDL.Rect 0 0 300 300) 
      screen (Just $ SDL.Rect 170 90 300 300) 
    SDL.flip screen
  
    --画像を解放
    SDL.freeSurface imgG
    SDL.freeSurface imgBG
    
    --画面が閉じられるまで待機
    e &lt;- SDL.waitEvent
    if e == SDL.Quit then return () else dispImage
  
  main :: IO ()
  main = gameinit &gt;&gt; dispImage &gt;&gt; SDL.quit    </description>
    <dc:date>2012-09-15T20:41:15+09:00</dc:date>
    <utime>1347709275</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/24.html">
    <title>Scenario実装参考資料</title>
    <link>https://w.atwiki.jp/tune_projects/pages/24.html</link>
    <description>
      ふみさん（@fumieval)さんより情報頂きますた。
monad-coroutineというものがあるらしい。

Suspension Functorとかゆー構造を定義すればどってんこってん。（まだちゃんと読んでない）
https://github.com/fumieval/MonadicShooter/blob/master/Data/Danmaku.hs
http://ideone.com/XOl3e    </description>
    <dc:date>2012-08-26T15:04:54+09:00</dc:date>
    <utime>1345961094</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/tune_projects/pages/2.html</link>
    <description>
      -[[トップページ]]
-[[技術情報]]
--[[メインループ記述]]
--[[SDL画像描画関連]]
--[[Scenario実装参考資料]]
***Project Bucephalas
Haskell向けRPGFramework開発プロジェクト

【超簡易要件定義】
-[[GAME基板開発]]
-[[HaskellでRPG作る]]
--[[マップ移動システム作る]]
--[[イベント処理システム作る]]

【超絶簡易基本設計】
-[[GAME基板：機能概要]]

【その他】
-[[課題管理]]

----

&amp;link_editmenu(text=ここを編集)    </description>
    <dc:date>2012-08-26T15:02:00+09:00</dc:date>
    <utime>1345960920</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/23.html">
    <title>GAME基板：機能概要</title>
    <link>https://w.atwiki.jp/tune_projects/pages/23.html</link>
    <description>
      *GAME基板システム
システム名：Bucephalas Base

このシステムは、Haskellでゲームを開発するための基板になるシステムである。
SDL/OpenGLを基板とし、より簡単に以下の処理を記述する機能を提供する。

-メインループの記述
-文字列／画像の描画
-サウンド／BGM再生
-Layerの管理（後述）
-Scenarioの記述（後述）

**Layer
本システムにおける「Layer」とは、実際にゲーム固有の動作が記述された関数を持つ型である。
「マップ移動処理」「メニュー選択処理」「戦闘処理」等といった単位で、ある程度汎用的なシステムとして開発される。
そして、具体的な「物語」や「演出」等を後述のScenarioとして各プログラマにより記述する事で、大きなプログラムを効率よく記述していく事ができる。

**Scenario
本システムにおける「Scenario」とは、マップ移動時における「物語」、メニュー画面における「各機能」等を作成するための型である。
ScenarioはMonadクラスのインスタンスとして作成し、状態へのアクセスや、画像／文字列の入出力データの受け渡しといった、Layerと本システム間の連携処理を担う。    </description>
    <dc:date>2012-08-25T17:16:14+09:00</dc:date>
    <utime>1345882574</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/22.html">
    <title>課題管理</title>
    <link>https://w.atwiki.jp/tune_projects/pages/22.html</link>
    <description>
      【GAME基板】
-LayerとScenario
--ScenarioはLayerに対してどのような処理を行えるのか
--複数のLayerに跨った処理をScenarioが行う事はできるか
--LayerがScenarioをキックする仕組みはどうするか
--具体的にどのようにして実装するか
-副作用に関する課題
--複数人数で開発する際、副作用のスコープはどのように分割すべきか
--Scenarioを構成する際に、一般プログラマは何処まで自由に副作用を扱えるようにするか
--それらの条件を満たす処理をどのように実装するか    </description>
    <dc:date>2012-08-25T16:06:15+09:00</dc:date>
    <utime>1345878375</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/21.html">
    <title>GAME基板開発</title>
    <link>https://w.atwiki.jp/tune_projects/pages/21.html</link>
    <description>
      ジャンル固有のシステムを構築する前に、リアルタイム性のあるあらゆるゲームで基板となるシステムを構築する必要がある。
このシステムは、ざっくりと以下の機能を持つ。

-Escキー押下、あるいは画面が閉じられるまで無限ループ
--一定の間隔でゲームに関する主処理を呼出し、それに対して画面の描画処理やサウンドの再生処理を実施する
-キー押下状態を監視し、主処理に渡す
--主処理は「マップ移動システム」「イベント処理システム」「メニュー操作処理」等
--これらの処理は多重起動する事ができ、必要に応じ前画面と並行に実行できるものとする
---例えば、「マップ」と「イベント」は常に同時に実行されていなくてはならない
---それに対し、アイテム／ステータス等のメニュー画面操作中は、フロントの機能を停止させておかなくてはいけない    </description>
    <dc:date>2012-08-19T23:48:24+09:00</dc:date>
    <utime>1345387704</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/20.html">
    <title>メインループ記述</title>
    <link>https://w.atwiki.jp/tune_projects/pages/20.html</link>
    <description>
      SDLの場合GetTicks関数を使って1000分の1秒単位でシステム時間を取得する事ができる。
これを使ってメインループを制御する。
ちなみに、delay関数は1000分の１秒間隔で待機する関数。
多分使わない・・・と思ったら使うかもしれない。
  module Main where
  import Graphics.UI.SDL.Time
  import Control.Monad
  
  main :: IO ()
  main = do
    replicateM_ 10 $ do
      getTicks &gt;&gt;= print
      delay 600 

----

8/18更新：
上のサンプルだとSDLをquitしてないのでgetTicksの値がアプリケーションを終えても増え続ける。
実際には、ゲーム終了時にquitする事で、リセットされるらしい。

メインループ内では、一定間隔で処理を実行しつつ、ユーザーからの入力を受けなくてはいけない。
入力を受けるためには、pollEvents関数を使うと良い。戻り値であるEvent型については http://hackage.haskell.org/packages/archive/SDL/0.6.3/doc/html/Graphics-UI-SDL-Events.html を参照。

一定間隔でgetTicksの値を出力しつつ、イベントを受け取ったらその内容も出力するサンプルを以下に示す。
これをベースに、簡単にメインループを記述できるような仕組みを作る事でおよそ問題無さそう。

もうちょっと内容まとめたらブログに書く。
  module Main where
  import Data.Word
  import Graphics.UI.SDL.Events
  import Graphics.UI.SDL as SDL
  
  --initしてsetVideoModeすればとりあえず画面が表示される
  --setVideoModeの戻り値はSurfaceとかいう構造体で
  --画面の情報なんかを保持しているらしい
  gameinit :: IO () 
  gameinit = do
       SDL.init [SDL.InitEverything]
       SDL.setVideoMode 640 480 32 [] &gt;&gt;= print
  
  --メインループ処理
  mainLoop :: Word32 -&gt; IO ()
  mainLoop ago = do
    delay 1 --1000分の1ミリ秒待機、これ入れないとCPU使用率が大変な事になる
    ev &lt;- pollEvent --待機せずイベントを取得、waitEventとかだと処理が継続できない
    printEvent ev
    --画面が閉じられたらメインループ終了、それ以外の場合は再帰呼び出し
    if ev == Quit then return () else printTicks &gt;&gt;= mainLoop
     where
      --イベントを出力
      printEvent :: Event -&gt; IO ()
      printEvent NoEvent = return ()
      printEvent ev = print ev 
  
      --適当な間隔でgetTicksを出力
      printTicks :: IO Word32
      printTicks = do
        t &lt;- getTicks
        if ago + 100 &lt; t then print t &gt;&gt; return t else return ago
  
  -------------------------------------------------
  
  main :: IO ()
  main = gameinit &gt;&gt; getTicks &gt;&gt;= mainLoop &gt;&gt; SDL.quit

----
同日更新：

さらに詳しくブログに書いた。
http://d.hatena.ne.jp/its_out_of_tune/20120818/1345307698    </description>
    <dc:date>2012-08-19T01:56:53+09:00</dc:date>
    <utime>1345309013</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/16.html">
    <title>マップ移動システム作る</title>
    <link>https://w.atwiki.jp/tune_projects/pages/16.html</link>
    <description>
      **基本的なこと
-キャラクタエディタ必要
-マップエディタ必要
--背景／地面の層／キャラクタ層／上層／エフェクトの３層＋２枚で構成すればそれっぽくなる？
--マップチップで組み立てるのではなく、自由移動
---旧ドラクエみたいなのではなく、クロトリみたいなイメージで
---当たり判定プログラム書かねば
---オブジェクトをしっかり敷き詰められるようにエディタには工夫が必要そう
-シチュエーションや操作キャラクターによってズーム機能があると良いかと
-操作感重視、多少不自然でもダンジョン内を走りまわってて気持ち良いゲームを目指す
**イベントとの連携とか
-カメラ位置を切り替えられるようにする
--どのオブジェクトを捉えるか、そこからどのくらいずらすか・・・
---これを使って画面を揺らして地震みたいな演出はできないだろうか
-色々踏まえてイベント処理システムと並行して作ったほうがヨサゲ    </description>
    <dc:date>2012-08-16T23:20:12+09:00</dc:date>
    <utime>1345126812</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/15.html">
    <title>HaskellでRPG作る</title>
    <link>https://w.atwiki.jp/tune_projects/pages/15.html</link>
    <description>
      想定してるのは壮大なストーリーのRPG(2D)だけど、いきなり大きなものを作ろうとすると間違いなくずっこけるので、パーツを揃えながらちょっとづつ形にしていく感じで。

**最低限作る必要があるもの
ここで作ったものはFramework化して、後々も使えるようにする。
-マップ移動システム
--マップ内歩きまわるだけでドーパミン放出しまくる操作感(期待値)
--別途キャラクタ／マップエディタが必要
-イベント処理システム
--キャラクターの会話とか選択肢とか
--アクションRPGに発展させられるように柔軟性持たせた作りに
--データのセーブとか簡単にできるようにしたい
---JSON形式で保存すればいくね？
-メニューシステム
--多分ゲーム毎にカスタムできるくらいの自由度は必要
--でも基本的な選択肢なんかはチャチャっと組めるようなFrameworkにする
とりあえずここまで１年半くらいで仕上げて、２年後くらいには戦闘無しの探索RPGリリースしたい
簡単なものとは言え、それなりに本格的に・・・
**ゲーム毎に作る必要のありそうなもの
-戦闘システム
--マップシステムと連携して、キャラのレベルやステータスを共有できるようにしたいね
--    </description>
    <dc:date>2012-08-16T00:48:27+09:00</dc:date>
    <utime>1345045707</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/tune_projects/pages/18.html">
    <title>技術情報</title>
    <link>https://w.atwiki.jp/tune_projects/pages/18.html</link>
    <description>
      ある程度内容が纏まったらブログに更新したりとか
http://d.hatena.ne.jp/its_out_of_tune/

ここにはもっと細かなチップスとか、纏まり切ってないような事を思いついた事片っ端から書いてく    </description>
    <dc:date>2012-08-16T00:46:00+09:00</dc:date>
    <utime>1345045560</utime>
  </item>
  </rdf:RDF>
