Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ゲーム画面をブラウザから見られるサイトを作った話
Search
soukouki
March 01, 2026
Technology
0
41
ゲーム画面をブラウザから見られるサイトを作った話
CircLeT 2026(2026-03-01)にて発表したスライドです。
soukouki
March 01, 2026
Tweet
Share
More Decks by soukouki
See All by soukouki
Simutrans CityView (日本語版)
soukouki
0
97
Simutrans CityView (English)
soukouki
0
42
10分で学ぶ すてきなモナド
soukouki
1
170
Misskey自鯖を建ててみた
soukouki
1
91
1年前の日記を要約するツールをローカルLLM&自作MCPサーバーで作った話
soukouki
0
460
自作Cコンパイラ 8時間の奮闘
soukouki
0
1.8k
定理証明支援系Coq(セキュリティキャンプLT会)
soukouki
1
260
Coqで選択公理を形式化してみた
soukouki
0
500
「プログラミング」と「数学」の関係 〜カリー・ハワード同系対応と定理証明支援系Coq〜
soukouki
1
350
Other Decks in Technology
See All in Technology
【社内勉強会】新年度からコーディングエージェントを使いこなす - 構造と制約で引き出すClaude Codeの実践知
nwiizo
1
440
スケールアップ企業でQA組織が機能し続けるための組織設計と仕組み〜ボトムアップとトップダウンを両輪としたアプローチ〜
tarappo
1
230
20260311 技術SWG活動報告(デジタルアイデンティティ人材育成推進WG Ph2 活動報告会)
oidfj
0
370
ソフトバンク流!プラットフォームエンジニアリング実現へのアプローチ
sbtechnight
1
220
LINEヤフーにおけるAIOpsの現在地
lycorptech_jp
PRO
3
650
Laravelで学ぶOAuthとOpenID Connectの基礎と実装
kyoshidaxx
1
780
夢の無限スパゲッティ製造機 #phperkaigi
o0h
PRO
0
260
Tebiki Engineering Team Deck
tebiki
0
27k
プラットフォームエンジニアリングはAI時代の開発者をどう救うのか
jacopen
8
4k
猫でもわかるKiro CLI(AI 駆動開発への道編)
kentapapa
0
270
2026-03-11 JAWS-UG 茨城 #12 改めてALBを便利に使う
masasuzu
2
410
実践 Datadog MCP Server
nulabinc
PRO
2
250
Featured
See All Featured
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
310
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
560
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.4k
Speed Design
sergeychernyshev
33
1.6k
The SEO Collaboration Effect
kristinabergwall1
0
400
Building Applications with DynamoDB
mza
96
7k
Scaling GitHub
holman
464
140k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
110
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
180
Optimising Largest Contentful Paint
csswizardry
37
3.6k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
990
BBQ
matthewcrist
89
10k
Transcript
ゲーム画面をブラウザから見られるサイトを作 った話 CircLeT 2026 2026-03-01 1
自己紹介 sou7といいます。 そーなな、そーせぶん、そ ーくんなど好きに呼んでく ださい。 会津大学の修士1年生 趣味 : なろう小説を読み漁る こと、鉄道(ライト勢)
おすすめの小説を紹介し合 いましょう! 嫌いなもの : 花粉症(つらい) 2
連絡先 ActivityPub/Misskey: @
[email protected]
→ Twitter: @sou7_ _ _ GitHub: @soukouki
3
交通系シミュレーションゲーム Simutrans Simutransとは、鉄道・自動車・船・飛行機などの交通手段を使って、乗客や 貨物を運んで利益を得る交通系シミュレーションゲームです。 4
このゲームのすごいところ OSSで開発されていて、複数のフォークがある 日本人向けのプレイに特化したフォークなども存在する! 2Dゲームで軽いので、マップサイズをめちゃくちゃ大きくできる A列車で行こう9では、マップは10km四方まで Simutransでは1マス125mと換算すると625km(5000x5000)でも動作可能 飛行機と寝台特急の競争がプレイングとして可能 編成数の上限は65535編成 A列車で行こう9の編成数の上限は列車300編成に自動車300台 有志が作成したグラフィックが大量にあり、日本の現役の鉄道車両はほぼ
すべてカバー済み マルチプレイ可能 5
このゲームをもっと広めたい! こんな素晴らしいゲームであるSimutransをもっと広めたい! マルチプレイで作った素敵なマップを自慢したい! しかしながら、マルチプレイの様子を見学するには以下の手順が必要で、ハー ドルが高いのが現状でした。 1. マルチプレイのDiscordの招待リンクを探す 2. 知らない人しか居ないDiscordサーバーに入る 3.
本体とグラフィックをダウンロードする 4. マルチプレイ用のサーバーに接続する 6
この状況をなん とかしたい 他の魅力的なゲームが溢れている 昨今、Simutransの良さを広めて いきたい!!! ということで、Simutransのゲー ム画面をブラウザから見られるサ イトを作ってみました。 https://cityview.sou7.io/ 7
CityViewの仕組み SimutransをDockerコン テナで起動し、スクリー ンショットを撮影 スクショ位置はかなり誤 差があるので、位置合わ せをする 地図描画ライブラリ向け に、正方形のタイルに切 り出す※
※実際にはタイルをまとめてより低ズームレベルの画像を生成したり、画像の圧縮を行ったりしています。 8
全体の構成 今回はDocker Composeのレプリカ機能を使ったマイクロサービスアーキテク チャもどきで作成しました。 理由は以下のとおりです。 スクショ撮影の部分でゲームを複数起動するのは処理的に難しい 1コンテナ1Simutransという形にして、レプリカ機能を使うことで考えるこ とがグッと減る Rubyが好きなので複雑そうなところはRubyで書きたい 画像処理はライブラリがないと面倒なのでPythonで書きたい
9
Dockerコンテナ上でゲームを起動する? SimutransはDockerコンテナ上でも動作します SimutransはLinuxに対応していて、アンチチートなどの仕組みはありません コンテナ上に仮想ディスプレイを置き、仮想的なキー入力を伝えてあげる ことで、Simutransをプログラムから操作できます。 あとはHTTP APIを提供しスクショを撮影するサーバーを置けば、いい感じに Simutransのスクリーンショットを撮れるコンテナの完成です。 10
まとめ 1. Simutransという素敵なゲームが あるのでみんな遊びましょう! 最初はちょっととっつきづら い面もあるので、興味がある 人は連絡をください! 2. ゲーム画面をブラウザから見られ るツールを作りました。
3. DockerとDocker Composeを活用 し、ややこしい部分を回避しまし た。 デモサイト : https://cityview.sou7.io/ 11
おまけ 時間があったら話します。 1. 使ったけれど説明しきれなかったもの 2. コードの規模 12
使ったけれど説明しきれなかったもの MapLibre GL JS・地図タイル 画面移動やズームを自由自在に行うために、地図描画ライブラリである MapLibre GL JSを使いました。 MapLibre GL
JSは地図タイル形式のデータを要求するため、CityViewの大部 分のコードはこの地図タイルのデータを作成することに費やしています。 Prefect 地図タイルの作成を並列でうまいこと処理するためにはタスクオーケストレ ーターを使うのが良いだろうと考え、Prefectを使いました。ただ、やってみ た結果としてはPrefectほどの多機能さはあまり必要なかったような気もして います。 13
LLMの活用について CityViewの開発には、コーディングエージェントは使わず、Chat形式でひた すらプログラムを書かせていました。 Claude Sonnetはもちろん活用でき、Kimi K2の性能はその少し下だが十分使 える、そんな印象を受けました。 マイクロサービスアーキテクチャもどきを採用したことで、各サービスごと に仕様が閉じているため開発効率が向上しました。 14
コードの規模 大体6000行くらいでした。 言語 行数 Python 2635行 Ruby 1949行 HTML・JS 1416行
Rubyが好きなので、Rubyでも書けそ うな部分はRubyで書きました。 区分 行数 prefect関連 1573行 service-capture 968行 その他のサービス 1062行 バックエンド 981行 フロントエンド 1416行 15