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
ebitenのマルチプレイ対応 | WebSocketの活用
Search
ponyo877
March 29, 2024
Technology
650
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ebitenのマルチプレイ対応 | WebSocketの活用
【ゲーム開発/Go】Ebitengine ぷちConf #2【ゆるいLTと交流会】
https://gocon.connpass.com/event/306765/
ponyo877
March 29, 2024
More Decks by ponyo877
See All by ponyo877
フルスタックGoでスコア改ざんを防いだ話
ponyo877
0
910
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
2.2k
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
420
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
200
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
70
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.3k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
250
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
170
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
800
Other Decks in Technology
See All in Technology
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
930
クラウドセキュリティ入門 ~安全なクラウド利用のための基礎知識~
lhazy
7
4.4k
データ組織の転換期 一足飛びしない段階的戦略
leveragestech
PRO
0
130
人手不足への挑戦:車両保全を支えるIoTとクラウド内製化の道【SORACOM Discovery 2026】
soracom
PRO
0
170
初めてのGitHub Actions / GitHub Actions at First
tooppoo
0
110
テックカンファレンス三大ステークホルダーの文化人類学 ─ 違いを認め合う関係性作り
bash0c7
5
1.4k
基調講演:人とAIをつなぐIoTの今と未来 ー 「フィジカル」と「デジタル」が出会うその先へ【SORACOM Discovery 2026】
soracom
PRO
0
370
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
290
Pavlokで始める電撃駆動開発
sgrsn
0
140
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
0
190
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
710
なぜ、あなたのエージェントは言うことを聞かないのか
segavvy
1
610
Featured
See All Featured
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
190
Marketing to machines
jonoalderson
1
5.6k
Test your architecture with Archunit
thirion
1
2.3k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
41k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
ラッコキーワード サービス紹介資料
rakko
1
4.1M
Bash Introduction
62gerente
615
220k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
A Soul's Torment
seathinner
6
3.1k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.7k
Transcript
ۚ QPOZP FCJUFOͷϚϧνϓϨΠରԠ 8FC4PDLFUͷ׆༻
ϚϧνϓϨΠ w ϚϧνϓϨΠͱਓҎ্ͷϢʔβͰڠ ྗɾରઓ͢Δ༡ͼํ w FCJUFOͷطଘͷήʔϜγϯάϧϓϨΠͷ ͷ͕େ w zෳਓͰͷ௨৴zΛݟͤΔͨΊʹΩϟϥΫ λΛͬͨνϟοτΛ࡞
ϚϧνϓϨΠΛࢧ͑Δٕज़ w 8FC4PDLFU Σϒιέοτ w ΫϥΠΞϯτͱαʔόؒͰํ ʹϦΞϧλΠϜʹσʔλΛΓऔ Γ͢Δٕज़ Ҿ༻IUUQTTIVLBQJODPNJOGPHSBQIJD*5XFCTPDLFU
8FC4PDLFUY(P w ΫϥΠΞϯτͰ͋ΔFCJUFOͷଞʹ8FC4PDLFUαʔό͕ඞཁ w ΫϥΠΞϯτͱαʔό͕ͲͪΒ(PݴޠͰॻ͚ΔͷͰπʔϧϓϥΫςΟε ͕࠶ར༻Ͱ͖ɺΓସ͑ͷετϨε͕গͳ͍ w (PͷHPMMJSBXFCTPDLFU ˑL Ͱ؆୯ʹॻ͚Δ
w XBTNͩͱ্هͷQBDLBHFඇରԠ w σϞOIPPZSJPXFCTPDLFU ˑL Λ༻
σϞ w ൃදऀͱڠྗऀͷਓͰΩϟϥΫλʔͷҠಈϝοηʔδͷૹ৴Λͯ͠ΈΔ w ૢ࡞ͨ࣌͠ͷ$ISPNFσϕϩούʔπʔϧΛݟͯ8FC4PDLFU௨৴ΛΈͤΔ w ࠷ޙʹ63-Λڞ༗ɺདྷΕΔਓདྷͯΒ͏ αʔό͕ύϯΫ͢Δ͔
ॲཧͷྲྀΕ ೖࣨ ΫϥΠΞϯτ" ৽نೖࣨ 8FC4PDLFUαʔό ΫϥΠΞϯτ# ΫϥΠΞϯτ"ΑΓલʹೖࣨࡁΈ ೖࣨ ೖࣨड ৽Ϣʔβ
ࣗ ొ Ϣʔβొ ৽Ϣʔβొ ΫϥΠΞϯτʹೖࣨ ௨ طଘϢʔβ ϝοηʔ δཤྺऔಘ௨ طଘϢʔβ ϝοηʔ δཤྺొ อଘ ྖҬ ʹ͋ Δ ͷΛ ৗʹ ࠶ඳ ը อଘ ྖҬ ʹ͋ Δ ͷΛ ৗʹ ࠶ඳ ը %# %# ϒϥβͷ อଘྖҬ ϒϥβͷ อଘྖҬ Ϣʔβ*% ࠲ඪ Y Z ͖
ॲཧͷྲྀΕ ϝοηʔδૹ৴ ΫϥΠΞϯτ" ೖࣨࡁΈ 8FC4PDLFUαʔό ΫϥΠΞϯτ# ೖࣨࡁΈ ϝοηʔδΛૹ৴ ϝοηʔδड ϝοηʔδొ
ϝοηʔδ௨ ϝοηʔδ ࣗͷ ొ ϝοηʔδొ Ϣʔβ*% ϝοηʔδ %# ϒϥβͷ อଘྖҬ ϒϥβͷ อଘྖҬ อଘ ྖҬ ʹ͋ Δ ͷΛ ৗʹ ࠶ඳ ը อଘ ྖҬ ʹ͋ Δ ͷΛ ৗʹ ࠶ඳ ը ϝοηʔδͷ9࠲ඪൃݴΩϟϥΫλͷ9࠲ඪͱಉ͡ ϝοηʔδͷ:࠲ඪൃݴ࣌ࠁݱࡏ࣌ࠁΛͱʹܭࢉ ු͔ͼ্͕Δ෩
·ͱΊ w 8FC4PDLFUΛ͏͜ͱͰFCJUFOͰϚϧνϓϨΠήʔϜΛ࣮Ͱ͖Δ w ϚϧνϓϨΠήʔϜͱͦͷαʔόͷํΛ(PݴޠͰ؆୯ʹ࣮Ͱ͖Δ
c࣮ྫ FCJUFOΫϥΠΞϯτ w ը໘ͷૢ࡞͝ͱʹԿΛૹΔ͔ܾΊͯૹΔɺجຊతʹ(BNF6QEBUFͰ࣮ func (g *Game) Update() error {
// ΩϟϥΫλʔͷҠಈ if dir != entity.DirUnknown { x, y := g.characters[g.id].Point() g.wss.Send(entity.NewMessage("move", entity.NewMoveBody(g.id, x, y, dir))) } // ϝοηʔδͷૹ৴ if ebiten.IsKeyPressed(ebiten.KeyEnter) { text := g.textField.Text() g.textField.Clear() g.wss.Send(entity.NewMessage("say", entity.NewSayBody(g.id, text))) } return nil }
c࣮ྫ 8FC4PDLFUαʔό func readMessage(session *session, service socket.UseCase) { ɹ for
{ var mp presenter.MessagePresenter if err := session.Read(&mp); err != nil { return } switch mp.MessageType { // ΩϟϥΫλʔͷҠಈ ΩϟϥΫλʔͷ࠲ඪΛӬଓԽ case "move": u := entity.NewUser(mp.Body.ID, mp.Body.X, mp.Body.Y, entity.Dir(mp.Body. if err := service.UpdateUser(u); err != nil { return } body := entity.NewEnterBody(users) mp := presenter.NewMessagePresenter(entity.NewMessage("enter", body)) if err := session.Write(&mp); err != nil { return } continue } // ϝοηʔδͷૹ৴ ϝοηʔδͷ༰ΛӬଓԽ case "say": if err := service.AddMessage(mp.Unmarshal()); err != nil { return } // ΩϟϥΫλʔͷҠಈ or ϝοηʔδͷૹ৴ΛଞͷϢʔβʹൖ if err := service.Publish(mp.Unmarshal()); err != nil { return } } } w 8FCTPDLFUͷϦΫΤετ ͷ۠ΛಡΈऔΓɺ۠ ಛ༗ͷૢ࡞Λ࣮ࢪ w ͦͷޙɺଞϢʔβૢ࡞ ༰Λૹ৴