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
0
600
ebitenのマルチプレイ対応 | WebSocketの活用
【ゲーム開発/Go】Ebitengine ぷちConf #2【ゆるいLTと交流会】
https://gocon.connpass.com/event/306765/
ponyo877
March 29, 2024
Tweet
Share
More Decks by ponyo877
See All by ponyo877
全てGoで作るP2P対戦ゲーム入門
ponyo877
3
1.9k
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
340
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
160
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
62
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1.1k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
220
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
130
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
720
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
550
Other Decks in Technology
See All in Technology
制約が導く迷わない設計 〜 信頼性と運用性を両立するマイナンバー管理システムの実践 〜
bwkw
3
1k
Tebiki Engineering Team Deck
tebiki
0
24k
茨城の思い出を振り返る ~CDKのセキュリティを添えて~ / 20260201 Mitsutoshi Matsuo
shift_evolve
PRO
1
390
生成AIを活用した音声文字起こしシステムの2つの構築パターンについて
miu_crescent
PRO
3
220
Red Hat OpenStack Services on OpenShift
tamemiya
0
130
~Everything as Codeを諦めない~ 後からCDK
mu7889yoon
3
480
pool.ntp.orgに ⾃宅サーバーで 参加してみたら...
tanyorg
0
550
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
540
私たち準委任PdEは2つのプロダクトに挑戦する ~ソフトウェア、開発支援という”二重”のプロダクトエンジニアリングの実践~ / 20260212 Naoki Takahashi
shift_evolve
PRO
2
190
量子クラウドサービスの裏側 〜Deep Dive into OQTOPUS〜
oqtopus
0
140
usermode linux without MMU - fosdem2026 kernel devroom
thehajime
0
240
Codex 5.3 と Opus 4.6 にコーポレートサイトを作らせてみた / Codex 5.3 vs Opus 4.6
ama_ch
0
200
Featured
See All Featured
The Language of Interfaces
destraynor
162
26k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6.2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
58
50k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
150
Music & Morning Musume
bryan
47
7.1k
Statistics for Hackers
jakevdp
799
230k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Skip the Path - Find Your Career Trail
mkilby
0
59
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
200
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
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 ͦͷޙɺଞϢʔβૢ࡞ ༰Λૹ৴