[{"data":1,"prerenderedAt":1481},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fsystems\u002Finput":3,"surround:\u002Fgame-engine\u002Fsystems\u002Finput":1230,"navigation":1241},{"id":4,"title":5,"body":6,"description":1223,"extension":1224,"meta":1225,"navigation":88,"path":1226,"seo":1227,"stem":1228,"__hash__":1229},"docs\u002F01.game-engine\u002F06.systems\u002F02.input.md","Wejście (InputManager)",{"type":7,"value":8,"toc":1213},"minimark",[9,14,35,198,252,264,268,367,371,413,417,551,556,803,807,909,915,926,930,1206,1209],[10,11,13],"h2",{"id":12},"akcje-nie-klawisze","Akcje, nie klawisze",[15,16,17,18,22,23,27,28,27,31,34],"p",{},"Logika gry czyta ",[19,20,21],"strong",{},"akcje"," (",[24,25,26],"code",{},"move-left",", ",[24,29,30],{},"jump",[24,32,33],{},"interact","), nigdy surowe kody klawiszy. Dzięki temu remapowanie sterowania nie dotyka kodu rozgrywki.",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-ts shiki shiki-themes github-light github-dark","update(dt: number) {\n  const input = this.getInput()\n\n  if (input.isActionDown('move-left')) this.player.translate(-240 * dt, 0)\n  if (input.isActionPressed('jump')) this.jump()\n  if (input.isActionReleased('interact')) this.closeDialog()\n}\n","ts","",[24,43,44,57,83,90,141,166,192],{"__ignoreMap":41},[45,46,49,53],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"sScJk","update",[45,54,56],{"class":55},"sVt8B","(dt: number) {\n",[45,58,60,64,68,71,74,77,80],{"class":47,"line":59},2,[45,61,63],{"class":62},"szBVR","  const",[45,65,67],{"class":66},"sj4cs"," input",[45,69,70],{"class":62}," =",[45,72,73],{"class":66}," this",[45,75,76],{"class":55},".",[45,78,79],{"class":51},"getInput",[45,81,82],{"class":55},"()\n",[45,84,86],{"class":47,"line":85},3,[45,87,89],{"emptyLinePlaceholder":88},true,"\n",[45,91,93,96,99,102,105,109,112,115,118,121,123,126,129,132,135,138],{"class":47,"line":92},4,[45,94,95],{"class":62},"  if",[45,97,98],{"class":55}," (input.",[45,100,101],{"class":51},"isActionDown",[45,103,104],{"class":55},"(",[45,106,108],{"class":107},"sZZnC","'move-left'",[45,110,111],{"class":55},")) ",[45,113,114],{"class":66},"this",[45,116,117],{"class":55},".player.",[45,119,120],{"class":51},"translate",[45,122,104],{"class":55},[45,124,125],{"class":62},"-",[45,127,128],{"class":66},"240",[45,130,131],{"class":62}," *",[45,133,134],{"class":55}," dt, ",[45,136,137],{"class":66},"0",[45,139,140],{"class":55},")\n",[45,142,144,146,148,151,153,156,158,160,162,164],{"class":47,"line":143},5,[45,145,95],{"class":62},[45,147,98],{"class":55},[45,149,150],{"class":51},"isActionPressed",[45,152,104],{"class":55},[45,154,155],{"class":107},"'jump'",[45,157,111],{"class":55},[45,159,114],{"class":66},[45,161,76],{"class":55},[45,163,30],{"class":51},[45,165,82],{"class":55},[45,167,169,171,173,176,178,181,183,185,187,190],{"class":47,"line":168},6,[45,170,95],{"class":62},[45,172,98],{"class":55},[45,174,175],{"class":51},"isActionReleased",[45,177,104],{"class":55},[45,179,180],{"class":107},"'interact'",[45,182,111],{"class":55},[45,184,114],{"class":66},[45,186,76],{"class":55},[45,188,189],{"class":51},"closeDialog",[45,191,82],{"class":55},[45,193,195],{"class":47,"line":194},7,[45,196,197],{"class":55},"}\n",[199,200,201,214],"table",{},[202,203,204],"thead",{},[205,206,207,211],"tr",{},[208,209,210],"th",{},"Metoda",[208,212,213],{},"Znaczenie",[215,216,217,228,242],"tbody",{},[205,218,219,225],{},[220,221,222],"td",{},[24,223,224],{},"isActionDown(action)",[220,226,227],{},"Akcja trzymana w tej klatce",[205,229,230,235],{},[220,231,232],{},[24,233,234],{},"isActionPressed(action)",[220,236,237,238,241],{},"Akcja wciśnięta ",[19,239,240],{},"w tej klatce"," (edge)",[205,243,244,249],{},[220,245,246],{},[24,247,248],{},"isActionReleased(action)",[220,250,251],{},"Akcja puszczona w tej klatce (edge)",[15,253,254,255,27,258,27,261,76],{},"To samo dla surowych kodów: ",[24,256,257],{},"isKeyDown",[24,259,260],{},"isKeyPressed",[24,262,263],{},"isKeyReleased",[10,265,267],{"id":266},"api","API",[36,269,271],{"className":38,"code":270,"language":40,"meta":41,"style":41},"attach(port); detach(); isAttached(); update()\nisKeyDown(code); isKeyPressed(code); isKeyReleased(code)\nisActionDown(action); isActionPressed(action); isActionReleased(action)\ngetPointer(): PointerState\ngetPointerPosition(); getPointerWorldPosition()\nsetActionMap(map); getActionMap(); remapAction(action, codes)\n",[24,272,273,296,312,328,336,348],{"__ignoreMap":41},[45,274,275,278,281,284,287,290,292,294],{"class":47,"line":48},[45,276,277],{"class":51},"attach",[45,279,280],{"class":55},"(port); ",[45,282,283],{"class":51},"detach",[45,285,286],{"class":55},"(); ",[45,288,289],{"class":51},"isAttached",[45,291,286],{"class":55},[45,293,52],{"class":51},[45,295,82],{"class":55},[45,297,298,300,303,305,307,309],{"class":47,"line":59},[45,299,257],{"class":51},[45,301,302],{"class":55},"(code); ",[45,304,260],{"class":51},[45,306,302],{"class":55},[45,308,263],{"class":51},[45,310,311],{"class":55},"(code)\n",[45,313,314,316,319,321,323,325],{"class":47,"line":85},[45,315,101],{"class":51},[45,317,318],{"class":55},"(action); ",[45,320,150],{"class":51},[45,322,318],{"class":55},[45,324,175],{"class":51},[45,326,327],{"class":55},"(action)\n",[45,329,330,333],{"class":47,"line":92},[45,331,332],{"class":51},"getPointer",[45,334,335],{"class":55},"(): PointerState\n",[45,337,338,341,343,346],{"class":47,"line":143},[45,339,340],{"class":51},"getPointerPosition",[45,342,286],{"class":55},[45,344,345],{"class":51},"getPointerWorldPosition",[45,347,82],{"class":55},[45,349,350,353,356,359,361,364],{"class":47,"line":168},[45,351,352],{"class":51},"setActionMap",[45,354,355],{"class":55},"(map); ",[45,357,358],{"class":51},"getActionMap",[45,360,286],{"class":55},[45,362,363],{"class":51},"remapAction",[45,365,366],{"class":55},"(action, codes)\n",[10,368,370],{"id":369},"domyślna-mapa-akcji","Domyślna mapa akcji",[15,372,373,376,377,27,380,27,383,27,385,27,388,27,390,27,392,27,395,27,398,27,401,27,404,27,407,27,410,76],{},[24,374,375],{},"defaultInputMap",": ",[24,378,379],{},"move-up",[24,381,382],{},"move-down",[24,384,26],{},[24,386,387],{},"move-right",[24,389,33],{},[24,391,30],{},[24,393,394],{},"restart",[24,396,397],{},"menu",[24,399,400],{},"pause",[24,402,403],{},"time-slow",[24,405,406],{},"time-fast",[24,408,409],{},"time-normal",[24,411,412],{},"mute",[10,414,416],{"id":415},"remapowanie","Remapowanie",[36,418,420],{"className":38,"code":419,"language":40,"meta":41,"style":41},"const input = this.getInput()\n\ninput.remapAction('jump', ['Space', 'KeyW', 'ArrowUp'])\n\ninput.setActionMap({\n  'move-left': ['KeyA'],\n  'move-right': ['KeyD'],\n  jump: ['Space'],\n  interact: ['KeyE'],\n  pause: ['Escape']\n})\n",[24,421,422,439,443,473,477,486,500,512,522,533,545],{"__ignoreMap":41},[45,423,424,427,429,431,433,435,437],{"class":47,"line":48},[45,425,426],{"class":62},"const",[45,428,67],{"class":66},[45,430,70],{"class":62},[45,432,73],{"class":66},[45,434,76],{"class":55},[45,436,79],{"class":51},[45,438,82],{"class":55},[45,440,441],{"class":47,"line":59},[45,442,89],{"emptyLinePlaceholder":88},[45,444,445,448,450,452,454,457,460,462,465,467,470],{"class":47,"line":85},[45,446,447],{"class":55},"input.",[45,449,363],{"class":51},[45,451,104],{"class":55},[45,453,155],{"class":107},[45,455,456],{"class":55},", [",[45,458,459],{"class":107},"'Space'",[45,461,27],{"class":55},[45,463,464],{"class":107},"'KeyW'",[45,466,27],{"class":55},[45,468,469],{"class":107},"'ArrowUp'",[45,471,472],{"class":55},"])\n",[45,474,475],{"class":47,"line":92},[45,476,89],{"emptyLinePlaceholder":88},[45,478,479,481,483],{"class":47,"line":143},[45,480,447],{"class":55},[45,482,352],{"class":51},[45,484,485],{"class":55},"({\n",[45,487,488,491,494,497],{"class":47,"line":168},[45,489,490],{"class":107},"  'move-left'",[45,492,493],{"class":55},": [",[45,495,496],{"class":107},"'KeyA'",[45,498,499],{"class":55},"],\n",[45,501,502,505,507,510],{"class":47,"line":194},[45,503,504],{"class":107},"  'move-right'",[45,506,493],{"class":55},[45,508,509],{"class":107},"'KeyD'",[45,511,499],{"class":55},[45,513,515,518,520],{"class":47,"line":514},8,[45,516,517],{"class":55},"  jump: [",[45,519,459],{"class":107},[45,521,499],{"class":55},[45,523,525,528,531],{"class":47,"line":524},9,[45,526,527],{"class":55},"  interact: [",[45,529,530],{"class":107},"'KeyE'",[45,532,499],{"class":55},[45,534,536,539,542],{"class":47,"line":535},10,[45,537,538],{"class":55},"  pause: [",[45,540,541],{"class":107},"'Escape'",[45,543,544],{"class":55},"]\n",[45,546,548],{"class":47,"line":547},11,[45,549,550],{"class":55},"})\n",[552,553,555],"h3",{"id":554},"przykład-ekran-ustawień-sterowania","Przykład: ekran ustawień sterowania",[36,557,559],{"className":38,"code":558,"language":40,"meta":41,"style":41},"class ControlsScene extends Scene {\n  private listeningFor: string | null = null\n\n  startRebind(action: string) {\n    this.listeningFor = action\n  }\n\n  update() {\n    if (!this.listeningFor) return\n    const input = this.getInput()\n    for (const code of ['KeyW', 'KeyA', 'KeyS', 'KeyD', 'Space', 'KeyE']) {\n      if (input.isKeyPressed(code)) {\n        input.remapAction(this.listeningFor, [code])\n        this.listeningFor = null\n        break\n      }\n    }\n  }\n}\n",[24,560,561,578,604,608,625,639,644,648,656,674,691,735,748,763,775,781,787,793,798],{"__ignoreMap":41},[45,562,563,566,569,572,575],{"class":47,"line":48},[45,564,565],{"class":62},"class",[45,567,568],{"class":51}," ControlsScene",[45,570,571],{"class":62}," extends",[45,573,574],{"class":51}," Scene",[45,576,577],{"class":55}," {\n",[45,579,580,583,587,590,593,596,599,601],{"class":47,"line":59},[45,581,582],{"class":62},"  private",[45,584,586],{"class":585},"s4XuR"," listeningFor",[45,588,589],{"class":62},":",[45,591,592],{"class":66}," string",[45,594,595],{"class":62}," |",[45,597,598],{"class":66}," null",[45,600,70],{"class":62},[45,602,603],{"class":66}," null\n",[45,605,606],{"class":47,"line":85},[45,607,89],{"emptyLinePlaceholder":88},[45,609,610,613,615,618,620,622],{"class":47,"line":92},[45,611,612],{"class":51},"  startRebind",[45,614,104],{"class":55},[45,616,617],{"class":585},"action",[45,619,589],{"class":62},[45,621,592],{"class":66},[45,623,624],{"class":55},") {\n",[45,626,627,630,633,636],{"class":47,"line":143},[45,628,629],{"class":66},"    this",[45,631,632],{"class":55},".listeningFor ",[45,634,635],{"class":62},"=",[45,637,638],{"class":55}," action\n",[45,640,641],{"class":47,"line":168},[45,642,643],{"class":55},"  }\n",[45,645,646],{"class":47,"line":194},[45,647,89],{"emptyLinePlaceholder":88},[45,649,650,653],{"class":47,"line":514},[45,651,652],{"class":51},"  update",[45,654,655],{"class":55},"() {\n",[45,657,658,661,663,666,668,671],{"class":47,"line":524},[45,659,660],{"class":62},"    if",[45,662,22],{"class":55},[45,664,665],{"class":62},"!",[45,667,114],{"class":66},[45,669,670],{"class":55},".listeningFor) ",[45,672,673],{"class":62},"return\n",[45,675,676,679,681,683,685,687,689],{"class":47,"line":535},[45,677,678],{"class":62},"    const",[45,680,67],{"class":66},[45,682,70],{"class":62},[45,684,73],{"class":66},[45,686,76],{"class":55},[45,688,79],{"class":51},[45,690,82],{"class":55},[45,692,693,696,698,700,703,706,709,711,713,715,717,720,722,724,726,728,730,732],{"class":47,"line":547},[45,694,695],{"class":62},"    for",[45,697,22],{"class":55},[45,699,426],{"class":62},[45,701,702],{"class":66}," code",[45,704,705],{"class":62}," of",[45,707,708],{"class":55}," [",[45,710,464],{"class":107},[45,712,27],{"class":55},[45,714,496],{"class":107},[45,716,27],{"class":55},[45,718,719],{"class":107},"'KeyS'",[45,721,27],{"class":55},[45,723,509],{"class":107},[45,725,27],{"class":55},[45,727,459],{"class":107},[45,729,27],{"class":55},[45,731,530],{"class":107},[45,733,734],{"class":55},"]) {\n",[45,736,738,741,743,745],{"class":47,"line":737},12,[45,739,740],{"class":62},"      if",[45,742,98],{"class":55},[45,744,260],{"class":51},[45,746,747],{"class":55},"(code)) {\n",[45,749,751,754,756,758,760],{"class":47,"line":750},13,[45,752,753],{"class":55},"        input.",[45,755,363],{"class":51},[45,757,104],{"class":55},[45,759,114],{"class":66},[45,761,762],{"class":55},".listeningFor, [code])\n",[45,764,766,769,771,773],{"class":47,"line":765},14,[45,767,768],{"class":66},"        this",[45,770,632],{"class":55},[45,772,635],{"class":62},[45,774,603],{"class":66},[45,776,778],{"class":47,"line":777},15,[45,779,780],{"class":62},"        break\n",[45,782,784],{"class":47,"line":783},16,[45,785,786],{"class":55},"      }\n",[45,788,790],{"class":47,"line":789},17,[45,791,792],{"class":55},"    }\n",[45,794,796],{"class":47,"line":795},18,[45,797,643],{"class":55},[45,799,801],{"class":47,"line":800},19,[45,802,197],{"class":55},[10,804,806],{"id":805},"pointer","Pointer",[36,808,810],{"className":38,"code":809,"language":40,"meta":41,"style":41},"const pointer = this.getInput().getPointer()\n\nconst screen = this.getInput().getPointerPosition()\nconst world = this.getInput().getPointerWorldPosition()\n\nif (pointer.isDown) {\n  this.spawnAt(world.x, world.y)\n}\n",[24,811,812,834,838,859,880,884,892,905],{"__ignoreMap":41},[45,813,814,816,819,821,823,825,827,830,832],{"class":47,"line":48},[45,815,426],{"class":62},[45,817,818],{"class":66}," pointer",[45,820,70],{"class":62},[45,822,73],{"class":66},[45,824,76],{"class":55},[45,826,79],{"class":51},[45,828,829],{"class":55},"().",[45,831,332],{"class":51},[45,833,82],{"class":55},[45,835,836],{"class":47,"line":59},[45,837,89],{"emptyLinePlaceholder":88},[45,839,840,842,845,847,849,851,853,855,857],{"class":47,"line":85},[45,841,426],{"class":62},[45,843,844],{"class":66}," screen",[45,846,70],{"class":62},[45,848,73],{"class":66},[45,850,76],{"class":55},[45,852,79],{"class":51},[45,854,829],{"class":55},[45,856,340],{"class":51},[45,858,82],{"class":55},[45,860,861,863,866,868,870,872,874,876,878],{"class":47,"line":92},[45,862,426],{"class":62},[45,864,865],{"class":66}," world",[45,867,70],{"class":62},[45,869,73],{"class":66},[45,871,76],{"class":55},[45,873,79],{"class":51},[45,875,829],{"class":55},[45,877,345],{"class":51},[45,879,82],{"class":55},[45,881,882],{"class":47,"line":143},[45,883,89],{"emptyLinePlaceholder":88},[45,885,886,889],{"class":47,"line":168},[45,887,888],{"class":62},"if",[45,890,891],{"class":55}," (pointer.isDown) {\n",[45,893,894,897,899,902],{"class":47,"line":194},[45,895,896],{"class":66},"  this",[45,898,76],{"class":55},[45,900,901],{"class":51},"spawnAt",[45,903,904],{"class":55},"(world.x, world.y)\n",[45,906,907],{"class":47,"line":514},[45,908,197],{"class":55},[15,910,911,914],{},[24,912,913],{},"getPointerWorldPosition()"," uwzględnia pozycję i zoom kamery — kliknięcie trafia w świat gry, nie w ekran.",[916,917,919],"callout",{"type":918},"info",[15,920,921,922,925],{},"Adapter blokuje domyślne zachowanie przeglądarki (scrollowanie spacją, strzałkami) ",[19,923,924],{},"tylko w obszarze gry",". Poza canvasem strona działa normalnie.",[10,927,929],{"id":928},"przykład-komponent-sterowania","Przykład: komponent sterowania",[36,931,933],{"className":38,"code":932,"language":40,"meta":41,"style":41},"export class PlayerController extends Component {\n  phase = 'input' as const\n  private speed = 260\n\n  onUpdate(dt: number) {\n    const input = this.owner.getInput()\n    const vx = (input.isActionDown('move-right') ? 1 : 0) - (input.isActionDown('move-left') ? 1 : 0)\n    const vy = (input.isActionDown('move-down') ? 1 : 0) - (input.isActionDown('move-up') ? 1 : 0)\n    const len = Math.hypot(vx, vy) || 1\n    this.owner.translate((vx \u002F len) * this.speed * dt, (vy \u002F len) * this.speed * dt)\n  }\n}\n",[24,934,935,953,969,981,985,1002,1019,1076,1129,1153,1198,1202],{"__ignoreMap":41},[45,936,937,940,943,946,948,951],{"class":47,"line":48},[45,938,939],{"class":62},"export",[45,941,942],{"class":62}," class",[45,944,945],{"class":51}," PlayerController",[45,947,571],{"class":62},[45,949,950],{"class":51}," Component",[45,952,577],{"class":55},[45,954,955,958,960,963,966],{"class":47,"line":59},[45,956,957],{"class":585},"  phase",[45,959,70],{"class":62},[45,961,962],{"class":107}," 'input'",[45,964,965],{"class":62}," as",[45,967,968],{"class":62}," const\n",[45,970,971,973,976,978],{"class":47,"line":85},[45,972,582],{"class":62},[45,974,975],{"class":585}," speed",[45,977,70],{"class":62},[45,979,980],{"class":66}," 260\n",[45,982,983],{"class":47,"line":92},[45,984,89],{"emptyLinePlaceholder":88},[45,986,987,990,992,995,997,1000],{"class":47,"line":143},[45,988,989],{"class":51},"  onUpdate",[45,991,104],{"class":55},[45,993,994],{"class":585},"dt",[45,996,589],{"class":62},[45,998,999],{"class":66}," number",[45,1001,624],{"class":55},[45,1003,1004,1006,1008,1010,1012,1015,1017],{"class":47,"line":168},[45,1005,678],{"class":62},[45,1007,67],{"class":66},[45,1009,70],{"class":62},[45,1011,73],{"class":66},[45,1013,1014],{"class":55},".owner.",[45,1016,79],{"class":51},[45,1018,82],{"class":55},[45,1020,1021,1023,1026,1028,1030,1032,1034,1037,1040,1043,1046,1049,1052,1054,1056,1058,1060,1062,1064,1066,1068,1070,1072,1074],{"class":47,"line":194},[45,1022,678],{"class":62},[45,1024,1025],{"class":66}," vx",[45,1027,70],{"class":62},[45,1029,98],{"class":55},[45,1031,101],{"class":51},[45,1033,104],{"class":55},[45,1035,1036],{"class":107},"'move-right'",[45,1038,1039],{"class":55},") ",[45,1041,1042],{"class":62},"?",[45,1044,1045],{"class":66}," 1",[45,1047,1048],{"class":62}," :",[45,1050,1051],{"class":66}," 0",[45,1053,1039],{"class":55},[45,1055,125],{"class":62},[45,1057,98],{"class":55},[45,1059,101],{"class":51},[45,1061,104],{"class":55},[45,1063,108],{"class":107},[45,1065,1039],{"class":55},[45,1067,1042],{"class":62},[45,1069,1045],{"class":66},[45,1071,1048],{"class":62},[45,1073,1051],{"class":66},[45,1075,140],{"class":55},[45,1077,1078,1080,1083,1085,1087,1089,1091,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1117,1119,1121,1123,1125,1127],{"class":47,"line":514},[45,1079,678],{"class":62},[45,1081,1082],{"class":66}," vy",[45,1084,70],{"class":62},[45,1086,98],{"class":55},[45,1088,101],{"class":51},[45,1090,104],{"class":55},[45,1092,1093],{"class":107},"'move-down'",[45,1095,1039],{"class":55},[45,1097,1042],{"class":62},[45,1099,1045],{"class":66},[45,1101,1048],{"class":62},[45,1103,1051],{"class":66},[45,1105,1039],{"class":55},[45,1107,125],{"class":62},[45,1109,98],{"class":55},[45,1111,101],{"class":51},[45,1113,104],{"class":55},[45,1115,1116],{"class":107},"'move-up'",[45,1118,1039],{"class":55},[45,1120,1042],{"class":62},[45,1122,1045],{"class":66},[45,1124,1048],{"class":62},[45,1126,1051],{"class":66},[45,1128,140],{"class":55},[45,1130,1131,1133,1136,1138,1141,1144,1147,1150],{"class":47,"line":524},[45,1132,678],{"class":62},[45,1134,1135],{"class":66}," len",[45,1137,70],{"class":62},[45,1139,1140],{"class":55}," Math.",[45,1142,1143],{"class":51},"hypot",[45,1145,1146],{"class":55},"(vx, vy) ",[45,1148,1149],{"class":62},"||",[45,1151,1152],{"class":66}," 1\n",[45,1154,1155,1157,1159,1161,1164,1167,1170,1173,1175,1178,1180,1183,1185,1187,1189,1191,1193,1195],{"class":47,"line":535},[45,1156,629],{"class":66},[45,1158,1014],{"class":55},[45,1160,120],{"class":51},[45,1162,1163],{"class":55},"((vx ",[45,1165,1166],{"class":62},"\u002F",[45,1168,1169],{"class":55}," len) ",[45,1171,1172],{"class":62},"*",[45,1174,73],{"class":66},[45,1176,1177],{"class":55},".speed ",[45,1179,1172],{"class":62},[45,1181,1182],{"class":55}," dt, (vy ",[45,1184,1166],{"class":62},[45,1186,1169],{"class":55},[45,1188,1172],{"class":62},[45,1190,73],{"class":66},[45,1192,1177],{"class":55},[45,1194,1172],{"class":62},[45,1196,1197],{"class":55}," dt)\n",[45,1199,1200],{"class":47,"line":547},[45,1201,643],{"class":55},[45,1203,1204],{"class":47,"line":737},[45,1205,197],{"class":55},[15,1207,1208],{},"Normalizacja wektora sprawia, że ruch po skosie nie jest szybszy niż w poziomie.",[1210,1211,1212],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":41,"searchDepth":85,"depth":85,"links":1214},[1215,1216,1217,1218,1221,1222],{"id":12,"depth":59,"text":13},{"id":266,"depth":59,"text":267},{"id":369,"depth":59,"text":370},{"id":415,"depth":59,"text":416,"children":1219},[1220],{"id":554,"depth":85,"text":555},{"id":805,"depth":59,"text":806},{"id":928,"depth":59,"text":929},"Akcje zamiast kodów klawiszy, stan klawiatury, pointer i remapowanie. Jak czytać wejście w komponentach i scenach.","md",{},"\u002Fgame-engine\u002Fsystems\u002Finput",{"title":5,"description":1223},"01.game-engine\u002F06.systems\u002F02.input","h5teH_sEfNx610C_Rk7Bo1xWNoWyrspKisJhOd1xsa4",[1231,1236],{"title":1232,"path":1233,"stem":1234,"description":1235,"children":-1},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets","Manifest, statusy ładowania, uchwyty właścicieli, refcounting, GC i raporty rozmiarów. Jak ładować assety bez wycieków.",{"title":1237,"path":1238,"stem":1239,"description":1240,"children":-1},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics","Phaser Arcade Physics — ciała, prędkości, collidery, overlap i granice świata. Bez własnego silnika fizyki.",[1242,1353,1414],{"title":1243,"path":1244,"stem":1245,"children":1246},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1247,1249,1253,1257,1261,1287,1307,1320,1341,1345,1349],{"title":1248,"path":1244,"stem":1245},"Przegląd",{"title":1250,"path":1251,"stem":1252},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1254,"path":1255,"stem":1256},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1258,"path":1259,"stem":1260},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1262,"path":1263,"stem":1264,"children":1265,"page":1286},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1266,1270,1274,1278,1282],{"title":1267,"path":1268,"stem":1269},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1271,"path":1272,"stem":1273},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1275,"path":1276,"stem":1277},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":1279,"path":1280,"stem":1281},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":1283,"path":1284,"stem":1285},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":1288,"path":1289,"stem":1290,"children":1291,"page":1286},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1292,1293,1294,1295,1299,1303],{"title":1232,"path":1233,"stem":1234},{"title":5,"path":1226,"stem":1228},{"title":1237,"path":1238,"stem":1239},{"title":1296,"path":1297,"stem":1298},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":1300,"path":1301,"stem":1302},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":1304,"path":1305,"stem":1306},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":1308,"path":1309,"stem":1310,"children":1311,"page":1286},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1312,1316],{"title":1313,"path":1314,"stem":1315},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1317,"path":1318,"stem":1319},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":1321,"path":1322,"stem":1323,"children":1324,"page":1286},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1325,1329,1333,1337],{"title":1326,"path":1327,"stem":1328},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1330,"path":1331,"stem":1332},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1334,"path":1335,"stem":1336},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1338,"path":1339,"stem":1340},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1342,"path":1343,"stem":1344},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1346,"path":1347,"stem":1348},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1350,"path":1351,"stem":1352},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1354,"path":1355,"stem":1356,"children":1357},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1358,1359,1362,1365,1386],{"title":1248,"path":1355,"stem":1356},{"title":1250,"path":1360,"stem":1361},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1254,"path":1363,"stem":1364},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1366,"path":1367,"stem":1368,"children":1369,"page":1286},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1370,1374,1378,1382],{"title":1371,"path":1372,"stem":1373},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1375,"path":1376,"stem":1377},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1379,"path":1380,"stem":1381},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1383,"path":1384,"stem":1385},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1387,"path":1388,"stem":1389,"children":1390,"page":1286},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1391,1395,1399,1403,1406,1410],{"title":1392,"path":1393,"stem":1394},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1396,"path":1397,"stem":1398},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1400,"path":1401,"stem":1402},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1342,"path":1404,"stem":1405},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1407,"path":1408,"stem":1409},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1411,"path":1412,"stem":1413},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1415,"path":1416,"stem":1417,"children":1418},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1419,1420,1423,1444,1457,1477],{"title":1248,"path":1416,"stem":1417},{"title":1250,"path":1421,"stem":1422},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1424,"path":1425,"stem":1426,"children":1427,"page":1286},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1428,1432,1436,1440],{"title":1429,"path":1430,"stem":1431},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1433,"path":1434,"stem":1435},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1437,"path":1438,"stem":1439},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1441,"path":1442,"stem":1443},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1445,"path":1446,"stem":1447,"children":1448,"page":1286},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1449,1453],{"title":1450,"path":1451,"stem":1452},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1454,"path":1455,"stem":1456},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1458,"path":1459,"stem":1460,"children":1461,"page":1286},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1462,1465,1469,1473],{"title":1258,"path":1463,"stem":1464},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1466,"path":1467,"stem":1468},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1470,"path":1471,"stem":1472},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1474,"path":1475,"stem":1476},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1478,"path":1479,"stem":1480},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307624]