1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4817],{1640:(e,s,n)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/newsletter/005",function(){return n(135)}])},135:(e,s,n)=>{"use strict";n.r(s),n.d(s,{default:()=>x,useTOC:()=>d});var t=n(5893),r=n(7812),i=n(1304),l=n(8925),o=n(8445),a=n(7654),h=n(6454),c=n(7024);function d(e){return[{value:"\uD83D\uDD25 Headlines",id:"-headlines",depth:2},{value:"â¬ï¸ Updates",id:"ï¸-updates",depth:2},{value:"âï¸ Content",id:"ï¸-content",depth:2},{value:"⨠Games & Demos",id:"-games--demos",depth:2},{value:"\uD83D\uDCAC From our Discord",id:"-from-our-discord",depth:2}]}let x=(0,r.c)(function(e){let{toc:s=d(e)}=e,n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",li:"li",p:"p",strong:"strong",ul:"ul",...(0,l.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{children:"Newsletter â Issue 005"}),"\n",(0,t.jsx)(c.V,{value:"2023-01-17"}),"\n",(0,t.jsx)(h.Gw,{}),"\n",(0,t.jsx)(h.TK,{}),"\n",(0,t.jsx)(n.h2,{id:s[0].id,children:s[0].value}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(a.vT,{})," ",(0,t.jsx)(n.strong,{children:"Duelyst"}),", a turn-based strategy game that ",(0,t.jsx)(n.a,{href:"https://steamcommunity.com/games/291410/announcements/detail/1688222120329073284",children:"shut down in early\n2020"}),", just got\n",(0,t.jsx)(n.a,{href:"https://www.youtube.com/watch?v=h3Cuz6d_7x0",children:(0,t.jsx)(n.strong,{children:"open-sourced"})}),". You can still play on their\n",(0,t.jsx)(n.a,{href:"https://staging.duelyst.org/",children:"staging deployment"}),". It was coded with\n",(0,t.jsx)(n.a,{href:"https://github.com/cocos2d/cocos2d-js",children:"Cocos2d-JS"}),", a library merged into\n",(0,t.jsx)(n.a,{href:"https://github.com/cocos2d/cocos2d-x",children:"Cocos2d-x"}),", which is now legacy, and got merged into the\n",(0,t.jsx)(n.a,{href:"https://github.com/cocos/cocos-engine",children:"cocos-engine"}),", which you can use via ",(0,t.jsx)(n.a,{href:"https://www.cocos.com/en/creator",children:(0,t.jsx)(n.strong,{children:"Cocos\nCreator"})})," (",(0,t.jsx)(n.em,{children:"are you following?"})," \uD83D\uDE05). Cocos Creator is a\nUnity-like cross-platform editor which ",(0,t.jsx)(n.a,{href:"https://docs.cocos.com/creator/manual/en/scripting/language-support.html",children:"supports TypeScript and\nJavaScript"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(a.Mj,{})," ",(0,t.jsx)(n.a,{href:"https://usegpu.live/",children:(0,t.jsx)(n.strong,{children:"Use.GPU"})})," (",(0,t.jsx)(n.a,{href:"https://gitlab.com/unconed/use.gpu",children:"GitLab\nrepo"}),") is a ",(0,t.jsx)(n.em,{children:"set of declarative, reactive WebGPU legos"})," by\n",(0,t.jsx)(n.a,{href:"https://acko.net/",children:"Steven Wittens"}),". Itâs a standalone\n",(0,t.jsx)(n.a,{href:"https://usegpu.live/docs/guides-live-vs-react",children:"React-like"})," library that uses ",(0,t.jsx)(n.strong,{children:"JSX"}),". ",(0,t.jsx)(n.a,{href:"https://acko.net/blog/use-gpu-goes-trad/",children:(0,t.jsx)(n.strong,{children:"Version\n0.8"})})," (",(0,t.jsx)(n.a,{href:"https://news.ycombinator.com/item?id=34384719",children:"Hacker News\nthread"}),") brings conveniences like scenes and nodes\nwith matrices, mesh instancing, shadow maps, visibility culling, and a new rendering pipeline.\n",(0,t.jsx)(n.a,{href:"https://acko.net/blog/the-case-for-use-gpu/",children:"Learn more"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(a.mA,{})," ",(0,t.jsx)(n.a,{href:"https://x.com/NYTimesRD",children:"NYTimes"})," released ",(0,t.jsx)(n.strong,{children:"Vite and Rollup plugins"})," to ",(0,t.jsx)(n.a,{href:"https://rd.nytimes.com/projects/optimizing-3d-gltf-assets-for-interactive-journalism",children:(0,t.jsx)(n.strong,{children:"optimize\n3D glTF\nassets"})}),". By\n",(0,t.jsx)(n.a,{href:"https://x.com/donrmccurdy",children:"Don McCurdy"})," and ",(0,t.jsx)(n.a,{href:"https://x.com/juniorxsound",children:"Or Fleisher"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(a.Xn,{})," The results of the ",(0,t.jsx)(n.a,{href:"https://2022.stateofjs.com/en-US/",children:(0,t.jsx)(n.strong,{children:"State of JS 2022"})})," are\navailable. For a TLDR, check out the ",(0,t.jsx)(n.a,{href:"https://2022.stateofjs.com/en-US/libraries/#tier_list",children:"tier\nlist"})," (",(0,t.jsx)(n.a,{href:"https://www.youtube.com/watch?v=vdiYtiKD8eI",children:"Fireship\nvideo"}),"). A safe bet is still\n",(0,t.jsx)(n.a,{href:"https://reactjs.org/",children:"React"})," + ",(0,t.jsx)(n.a,{href:"https://vitejs.dev/",children:"Vite"})," or ",(0,t.jsx)(n.a,{href:"https://nextjs.org/",children:"Next.js"}),", but I\ncan see ",(0,t.jsx)(n.a,{href:"https://svelte.dev/",children:"Svelte"})," gaining more traction thanks to\n",(0,t.jsx)(n.a,{href:"https://kit.svelte.dev/",children:"SvelteKit"})," this year."]}),"\n",(0,t.jsx)(n.h2,{id:s[1].id,children:s[1].value}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.oO,{})," ",(0,t.jsx)(n.a,{href:"https://github.com/pmndrs/drei/releases",children:(0,t.jsx)(n.strong,{children:"Drei v9.52 and v9.53"})})," â Adds\n",(0,t.jsx)(n.a,{href:"https://x.com/0xca0a/status/1613587031392751616",children:(0,t.jsx)(n.strong,{children:"<Caustics>"})})," and support for\n",(0,t.jsx)(n.code,{children:"THREE.LineSegments2"})," in ",(0,t.jsx)(n.a,{href:"https://github.com/pmndrs/drei#line",children:(0,t.jsx)(n.strong,{children:"<Line>"})}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.lS,{})," ",(0,t.jsx)(n.a,{href:"https://github.com/playcanvas/engine/releases",children:(0,t.jsx)(n.strong,{children:"PlayCanvas v1.60.0"})})," â Adds\nstandard material invert for gloss channels and improved WebGPU support, including directional\nlight shadow maps. GLB imports in the Editor are coming soon."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.rM,{})," ",(0,t.jsx)(n.a,{href:"https://github.com/photonstorm/phaser/releases",children:(0,t.jsx)(n.strong,{children:"Phaser 3.60 Beta 18"})})," â Updated\nParticle System."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.Ru,{})," ",(0,t.jsx)(n.a,{href:"https://github.com/BabylonJS/Babylon.js/releases",children:(0,t.jsx)(n.strong,{children:"Babylon.js v5.42.0"})})]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.Up,{})," ",(0,t.jsx)(n.a,{href:"https://github.com/pixijs/pixijs/releases",children:(0,t.jsx)(n.strong,{children:"PixiJS v7.1.0"})})]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:s[2].id,children:s[2].value}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\uD83C\uDFAC ",(0,t.jsx)(a.vT,{})," ",(0,t.jsx)(n.a,{href:"https://www.youtube.com/watch?v=EcMxRVHVWpE",children:(0,t.jsx)(n.strong,{children:"Cocos Creator Gets a Major\nUpgrade"})})," by\n",(0,t.jsx)(n.a,{href:"https://www.youtube.com/@gamefromscratch",children:"Gamefromscratch"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["\uD83C\uDFAC ",(0,t.jsx)(a.lS,{})," ",(0,t.jsx)(n.a,{href:"https://www.youtube.com/watch?v=u_8-rzGkDjA",children:(0,t.jsx)(n.strong,{children:"Porting Unreal Scenes to Browser with\nPlayCanvas"})})," by ",(0,t.jsx)(n.a,{href:"https://x.com/PlayingInCanvas",children:"Leonidas\nMaliokas"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:["âï¸ ",(0,t.jsx)(a.BE,{}
1)," ",(0,t.jsx)(n.a,{href:"https://www.construct.net/en/blogs/ashleys-blog-2/rts-devlog-beat-lag-1607",children:(0,t.jsx)(n.strong,{children:"RTS Devlog #8: How To Beat\nLag"})}),"\n(",(0,t.jsx)(n.a,{href:"https://www.construct.net/en",children:"Construct"})," engine) by ",(0,t.jsx)(n.a,{href:"https://x.com/AshleyGullen",children:"Ashley\nGullen"})]}),"\n",(0,t.jsxs)(n.li,{children:["âï¸ ",(0,t.jsx)(a.k9,{})," ",(0,t.jsx)(n.a,{href:"https://velasquezdaniel.com/blog/rendering-100k-spheres-instantianing-and-draw-calls/",children:(0,t.jsx)(n.strong,{children:"Rendering 100k spheres, instantiating and draw\ncalls"})})," by\n",(0,t.jsx)(n.a,{href:"https://x.com/Anemolito",children:"Daniel Velasquez"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:s[3].id,children:s[3].value}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\uD83C\uDFAE ",(0,t.jsx)(a.k9,{})," ",(0,t.jsx)(n.a,{href:"https://summer-afternoon.vlucendo.com/",children:(0,t.jsx)(n.strong,{children:"Summer Afternoon"})})," by ",(0,t.jsx)(n.a,{href:"https://x.com/vlucendo",children:"Vicente\nLucendo"}),". A very charming and relaxing multiplayer experiment. \uD83D\uDC52"]}),"\n",(0,t.jsxs)(n.li,{children:["\uD83C\uDFAE ",(0,t.jsx)(a.oO,{})," ",(0,t.jsx)(n.a,{href:"https://www.keyboard-heroes.com/",children:(0,t.jsx)(n.strong,{children:"Keyboard Heroes"})})," by\n",(0,t.jsx)(n.a,{href:"https://x.com/Console_buche",children:"console_buche"}),". Guitar Hero meets speed typing. \uD83E\uDD18"]}),"\n",(0,t.jsxs)(n.li,{children:["\uD83C\uDFAE ",(0,t.jsx)(a.oO,{})," ",(0,t.jsx)(n.a,{href:"https://candy-riot-cosmitar.vercel.app/",children:(0,t.jsx)(n.strong,{children:"Candy Riot"})})," by ",(0,t.jsx)(n.a,{href:"https://x.com/LongSto10058277",children:"Long Story Short\nGames"}),". A cute and spooky game that came out for Halloween.\n\uD83C\uDF83"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["See more on the ⨠",(0,t.jsx)(n.a,{href:"https://www.webgamedev.com/games-demos",children:(0,t.jsx)(n.strong,{children:"Games & Demos"})})," page or \uD83C\uDFAE ",(0,t.jsx)(n.a,{href:"https://webgamer.io/",children:(0,t.jsx)(n.strong,{children:"WebGamer.io"})}),"."]}),"\n",(0,t.jsx)(n.h2,{id:s[4].id,children:s[4].value}),"\n",(0,t.jsxs)(n.p,{children:["We had our second ",(0,t.jsx)(n.a,{href:"https://www.webgamedev.com/discord",children:(0,t.jsx)(n.strong,{children:"Discord video meetup"})})," on ",(0,t.jsx)(n.strong,{children:"January 12th"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.lS,{})," ",(0,t.jsx)(n.a,{href:"https://www.renegadelabstudios.com/",children:"Renegade Lab Studios"})," presented\n",(0,t.jsx)(n.a,{href:"https://x.com/game_exiles",children:(0,t.jsx)(n.strong,{children:"Exiles"})}),", their upcoming multiplayer futuristic vehicular combat\ngame."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(a.k9,{})," ",(0,t.jsx)(n.a,{href:"https://x.com/anslogen",children:"Anslo"})," explained the procedural ",(0,t.jsx)(n.a,{href:"https://anslo.medium.com/slow-roads-tl-dr-a664ac6bce40",children:"terrain generation\ntechniques"})," used in ",(0,t.jsx)(n.a,{href:"https://slowroads.io/",children:(0,t.jsx)(n.strong,{children:"Slow\nRoads"})}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.a,{href:"https://x.com/TrezyCodes",children:"Trezy"})," presented his upcoming ",(0,t.jsx)(n.a,{href:"https://debug.game/",children:(0,t.jsx)(n.strong,{children:"Debug"})})," puzzle game (custom engine), based on his js13k 2020 game: ",(0,t.jsx)(n.a,{href:"https://js13kgames.com/entries/not-found",children:(0,t.jsx)(n.strong,{children:"Not Found"})}),"."]}),"\n"]}),"\n",(0,t.jsx)(o.lz,{tweetId:"1615357076607471617"})]})},"/newsletter/005",{filePath:"src/pages/newsletter/005.mdx",pageMap:i.v,frontMatter:{},title:"Newsletter â Issue 005"},"undefined"==typeof RemoteContent?d:RemoteContent.useTOC)},7024:(e,s,n)=>{"use strict";n.d(s,{V:()=>r});var t=n(5893);let r=e=>{let{value:s}=e;return(0,t.jsxs)("div",{style:{textAlign:"center",marginTop:"1rem"},children:["\uD83D\uDCC6 ",s]})}},8445:(e,s,n)=>{"use strict";n.d(s,{O5:()=>c,ZP:()=>d,lz:()=>h,mN:()=>a});var t=n(5893),r=n(1664),i=n.n(r),l=n(2702);let o=()=>(0,t.jsx)("div",{style:{margin:"16px auto",borderRadius:5,maxWidth:338,overflow:"hidden",display:"flex",justifyContent:"center"},children:(0,t.jsx)("iframe",{className:"newsletter-iframe",scrolling:"no",src:"https://buttondown.email/webgamedev?as_embed=true"})}),a=()=>(0,t.jsxs)("p",{style:{textAlign:"center"},children:["You can also ",(0,t.jsx)("b",{children:"subscribe"})," to the \uD83D\uDC8C"," ",(0,t.jsx)(i(),{href:"/newsletter",className:"_text-primary-600 _underline _decoration-from-font [text-underline-position:under]",children:(0,t.jsx)("b",{children:"newsletter"})})," ","to keep up with the web game dev world!"]}),h=e=>{let{tweetId:s,blueskyUrl:n}=e;return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)("p",{style:{textAlign:"center",marginTop:30,marginBottom:0},children:["Liked this issue? \uD83D\uDC26"," ",(0,t.jsx)(l.Z,{href:"https://x.com/intent/retweet?tweet_id=".concat(s),target:"_blank",rel:"noopener",children:(0,t.jsx)("b",{children:"Retweet it"})}),","," ",n&&(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(l.Z,{href:n,target:"_blank",rel:"noopener",children:(0,t.jsx)("b",{children:"\uD83E\uDD8B Repost it on Bluesky"})}),","," "]}),"join our"," ",(0,t.jsx)(l.Z,{href:"https://www.webgamedev.com/discord",children:(0,t.jsx)("b",{children:"Discord"})}),", and ",(0,t.jsx)("b",{children:"Subscribe"})," below!"]}),(0,t.jsx)(o,{})]})},c=()=>(0,t.jsx)(l.Z,{href:"https://www.webgamedev.com/discord",target:"_blank",rel:"noopener",children:(0,t.jsx)("b",{children:"Discord"})}),d=o},6454:(e,s,n)=>{"use strict";n.d(s,{Bk:()=>a,Gw:()=>l,TK:()=>o});var t=n(5893),r=n(645),i=n.n(r);let l=()=>(0,t.jsx)(i(),{id:"b1873e13791f1664",children:"main ul{list-style-type:none!important;margin-left:0!important}main ul img{margin-right:2px}@media(max-width:500px){article main ul{margin-left:0!important}}"}),o=()=>(0,t.jsx)(i(),{id:"e396f806efe464a1",children:"main ul{line-height:1.6rem}"}),a=()=>
1(0,t.jsx)(i(),{id:"407caf13b3605e72",children:"main h1 img,main h2 img,main h3 img,main h4 img,main h5 img,main h6 img{position:relative;top:-2px}"})},8925:(e,s,n)=>{"use strict";n.d(s,{a:()=>a});var t=n(1151),r=n(5675),i=n.n(r),l=n(7294);let o={img:e=>(0,l.createElement)("object"==typeof e.src?i():"img",e)},a=e=>(0,t.a)({...o,...e})},7812:(e,s,n)=>{"use strict";n.d(s,{c:()=>h});var t=n(5893),r=n(3665),i=n(8644);let l=(0,n(7294).createContext)({}),o=l.Provider;l.displayName="SSG";var a=n(8925);function h(e,s,n,t){let i=globalThis[r.ud];return i.route=s,i.pageMap=n.pageMap,i.context[s]={Content:e,pageOpts:n,useTOC:t},c}function c({__nextra_pageMap:e=[],__nextra_dynamic_opts:s,...n}){let l=globalThis[r.ud],{Layout:a,themeConfig:h}=l,{route:c,locale:x}=(0,i.t)(),j=l.context[c];if(!j)throw Error(`No content found for the "${c}" route. Please report it as a bug.`);let{pageOpts:u,useTOC:m,Content:p}=j;if(c.startsWith("/["))u.pageMap=e;else for(let{route:s,children:n}of e){let e=s.split("/").slice(x?2:1);(function e(s,[n,...t]){for(let r of s)if("children"in r&&n===r.name)return t.length?e(r.children,t):r})(u.pageMap,e).children=n}if(s){let{title:e,frontMatter:n}=s;u={...u,title:e,frontMatter:n}}return(0,t.jsx)(a,{themeConfig:h,pageOpts:u,pageProps:n,children:(0,t.jsx)(o,{value:n,children:(0,t.jsx)(d,{useTOC:m,children:(0,t.jsx)(p,{...n})})})})}function d({children:e,useTOC:s}){let{wrapper:n}=(0,a.a)();return(0,t.jsx)(x,{useTOC:s,wrapper:n,children:e})}function x({children:e,useTOC:s,wrapper:n,...r}){let i=s(r);return n?(0,t.jsx)(n,{toc:i,children:e}):e}}},e=>{var s=s=>e(e.s=s);e.O(0,[1304,7654,2888,9774,179],()=>s(1640)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.