SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|12|
2025|01|02|03|04|05|06|

2025-06-20(Fri) PCD(パブリック・サーキット・データ)フォーマットを策定

  開発中のゲーム「TopDrivin'」は、さかのぼれば「見せてもらおうかッ! WebAssemblyの性能とやらをッ!」から始まったプロジェクトだ。最近では「F1観戦に先立ってサーキットを体験したい」が目的になっているが。

  その点において「TopDrivin'」の圧倒的な利点は「ほぼコースデータを作る必要がない」という点である。空撮画像の上を走らせる、という都合からくる制限は少なくないものの、究極的には「スターティンググリッドの緯度経度情報」だけでレースゲームができてしまうのだ。ゲームシステムのプログラミングは好きだが、レベルデザインにまるで興味のない自分には、うってつけのプロジェクトである。

  そしてその開発中にもF1のカレンダは進んでいく。来週末はオーストリアGPだ。サーキットはレッドブル・リンク、と……コースデータもだいぶ増えてきたなぁ……このままmainに追記し続けるのもなぁ……Courseクラスに出すべきだよな……いや、そもそもデータは外から与えられるようにすべきでは……んをッ!? ならばJSON形式にして、ウェブ上に置く形にするのがよいのでは!?

{
    "name": "レッドブル・リンク",
    "grid": {
        "lat":  47.220048,  "lng":  14.765464,  "dir": 245
    }
}

  こうだ。これをウェブサーバに置いて、こんな感じにURIで指定してやると、ゲームが始まるようにする。

http://localhost/~user/topdrivin/?stage=http://localhost/~user/topdrivin/stages/red_bull_ring.json

  画像の説明

  コースの定義ファイルは、Courseクラスの初期化時に読み込まれる。面倒くさいことに読み込みは非同期処理なので、mainではCourse.data_complete()がtrueになるのを待ってからメインループを開始するようにしてある。

class Course extends BgRotnscl(Obj)
 
    query = new URLSearchParams(window.location.search)
    (it = query.get('stage')) and fetch(it)
        .then (response) =>
            response.json()
        .then (data) =>
            @data = data
        .catch (err) =>
            console.error('json parse error.', err)
 
    @data_complete: ->
        @data
      :
      :

  これの長所は、誰でもサーキットのコースデータを勝手に作って遊べるし、それを公開することもできる、というところだ。まさにオープンフォーマット、オープンデータである。昔、電脳倶楽部で提唱されたPDD(パブリック・ドメイン・データ)にちなんで、PCD(パブリック・サーキット・データ)と名付けよう。

  PCDフォーマットには、セクタ情報も含めることができる。向かって左から右にコースを横断する線分を定義することで、各セクタタイムを計測することができるわけだ。こんな感じに定義する。

{
    "name": "レッドブル・リンク",
    "grid": {
        "lat":  47.220048,  "lng":  14.765464,  "dir": 245
    },
    "sectors": [
        {   "l": [ 47.219976,  14.765222],  "r": [ 47.220080,  14.765181],  "name": "=Finish"       },
        {   "l": [ 47.225082,  14.755456],  "r": [ 47.225163,  14.755574],  "name": "-Sector 1"     },
        {   "l": [ 47.222460,  14.759733],  "r": [ 47.222409,  14.759600],  "name": "-Sector 2"     },
        {   "l": [ 47.222973,  14.769995],  "r": [ 47.222919,  14.769862],  "name": " dummy 25"     }
    ]
}

  しかし「『スターティンググリッドの緯度経度情報』だけでレースゲームができてしまう」という利点も維持されるべきだろう。なので、スターティンググリッドを中心とする18mの円から「出る」タイミングでタイムを計測するという機能も付ける。それにより「スターティンググリッドの緯度経度情報」の定義のみでも、ラップタイムは計測して競うことができるという寸法である。

  なんだかどんどん楽しくなってくるなぁ。