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
540
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
filesystem風チャットchatsh開発で学んだGoの便利package紹介
ponyo877
1
230
Go言語の2Dゲームエンジン Ebitengineの紹介
ponyo877
2
120
OGPer あなたのサイトに簡単にOGPを付けよう
ponyo877
0
30
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
1k
Goのwasmで笑い男に挑戦してみた
ponyo877
1
180
GoのWasmでのWebRTC P2Pの検証+α
ponyo877
0
94
Ebitengineの1vs1ゲーム WebRTCの活用
ponyo877
0
610
GoのWasmでWebRTC P2Pで通信する
ponyo877
0
500
Other Decks in Technology
See All in Technology
Delegating the chores of authenticating users to Keycloak
ahus1
0
180
SRE不在の開発チームが障害対応と 向き合った100日間 / 100 days dealing with issues without SREs
shin1988
1
1.4k
[ JAWS-UG千葉支部 x 彩の国埼玉支部 ]ムダ遣い卒業!FinOpsで始めるAWSコスト最適化の第一歩
sh_fk2
2
150
Reach American Airlines®️ Instantly: 19 Calling Methods for Fast Support in the USA
flyamerican
1
180
[SRE NEXT] ARR150億円_エンジニア140名_27チーム_17プロダクトから始めるSLO.pdf
satos
4
2k
第64回コンピュータビジョン勉強会「The PanAf-FGBG Dataset: Understanding the Impact of Backgrounds in Wildlife Behaviour Recognition」
x_ttyszk
0
170
Four Keysから始める信頼性の改善 - SRE NEXT 2025
ozakikota
0
190
全部AI、全員Cursor、ドキュメント駆動開発 〜DevinやGeminiも添えて〜
rinchsan
2
1.9k
ソフトウェアテストのAI活用_ver1.25
fumisuke
1
550
〜『世界中の家族のこころのインフラ』を目指して”次の10年”へ〜 SREが導いたグローバルサービスの信頼性向上戦略とその舞台裏 / Towards the Next Decade: Enhancing Global Service Reliability
kohbis
2
1k
インフラ寄りSREの生存戦略
sansantech
PRO
8
3.4k
ロールが細分化された組織でSREは何をするか?
tgidgd
1
200
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
524
40k
Embracing the Ebb and Flow
colly
86
4.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
Bash Introduction
62gerente
613
210k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
830
Building Applications with DynamoDB
mza
95
6.5k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.1k
Building an army of robots
kneath
306
45k
A designer walks into a library…
pauljervisheath
207
24k
What’s in a name? Adding method to the madness
productmarketing
PRO
23
3.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
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 ͦͷޙɺଞϢʔβૢ࡞ ༰Λૹ৴