[{"data":1,"prerenderedAt":1362},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fsystems\u002Fphysics":3,"surround:\u002Fgame-engine\u002Fsystems\u002Fphysics":1111,"navigation":1122},{"id":4,"title":5,"body":6,"description":1104,"extension":1105,"meta":1106,"navigation":231,"path":1107,"seo":1108,"stem":1109,"__hash__":1110},"docs\u002F01.game-engine\u002F06.systems\u002F03.physics.md","Fizyka (PhysicsManager)",{"type":7,"value":8,"toc":1094},"minimark",[9,14,27,31,166,176,180,296,299,382,386,423,427,433,476,482,595,600,1034,1056,1060,1079,1090],[10,11,13],"h2",{"id":12},"arcade-nie-własny-silnik","Arcade, nie własny silnik",[15,16,17,21,22,26],"p",{},[18,19,20],"code",{},"PhysicsManager"," to cienka warstwa nad ",[23,24,25],"strong",{},"Phaser Arcade Physics",". Świadoma decyzja: prosta fizyka AABB wystarcza dla gier 2D, a własny silnik to tysiące linii do utrzymania.",[10,28,30],{"id":29},"api","API",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-ts shiki shiki-themes github-light github-dark","attach(port); detach(); isAttached()\nsetWorldBounds(x, y, w, h)\nattachBody(object); detachBody(object); readPosition(object)\nsetVelocity(object, vx, vy); getVelocity(object)\nsetImmovable(object, bool); setCollideWorldBounds(object, bool)\naddCollider(a, b, handler?): ColliderHandle\naddOverlap(a, b, handler): ColliderHandle\nclear(): void\n","ts","",[18,39,40,65,74,94,108,123,145,154],{"__ignoreMap":37},[41,42,45,49,53,56,59,62],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sScJk","attach",[41,50,52],{"class":51},"sVt8B","(port); ",[41,54,55],{"class":47},"detach",[41,57,58],{"class":51},"(); ",[41,60,61],{"class":47},"isAttached",[41,63,64],{"class":51},"()\n",[41,66,68,71],{"class":43,"line":67},2,[41,69,70],{"class":47},"setWorldBounds",[41,72,73],{"class":51},"(x, y, w, h)\n",[41,75,77,80,83,86,88,91],{"class":43,"line":76},3,[41,78,79],{"class":47},"attachBody",[41,81,82],{"class":51},"(object); ",[41,84,85],{"class":47},"detachBody",[41,87,82],{"class":51},[41,89,90],{"class":47},"readPosition",[41,92,93],{"class":51},"(object)\n",[41,95,97,100,103,106],{"class":43,"line":96},4,[41,98,99],{"class":47},"setVelocity",[41,101,102],{"class":51},"(object, vx, vy); ",[41,104,105],{"class":47},"getVelocity",[41,107,93],{"class":51},[41,109,111,114,117,120],{"class":43,"line":110},5,[41,112,113],{"class":47},"setImmovable",[41,115,116],{"class":51},"(object, bool); ",[41,118,119],{"class":47},"setCollideWorldBounds",[41,121,122],{"class":51},"(object, bool)\n",[41,124,126,129,132,136,139,142],{"class":43,"line":125},6,[41,127,128],{"class":47},"addCollider",[41,130,131],{"class":51},"(a, b, handler",[41,133,135],{"class":134},"szBVR","?",[41,137,138],{"class":51},")",[41,140,141],{"class":134},":",[41,143,144],{"class":51}," ColliderHandle\n",[41,146,148,151],{"class":43,"line":147},7,[41,149,150],{"class":47},"addOverlap",[41,152,153],{"class":51},"(a, b, handler): ColliderHandle\n",[41,155,157,160,163],{"class":43,"line":156},8,[41,158,159],{"class":47},"clear",[41,161,162],{"class":51},"(): ",[41,164,165],{"class":134},"void\n",[15,167,168,171,172,175],{},[18,169,170],{},"ColliderPair"," to jeden obiekt albo tablica obiektów — np. ",[18,173,174],{},"findByTag('wall')",".",[10,177,179],{"id":178},"ciało-obiektu","Ciało obiektu",[32,181,183],{"className":34,"code":182,"language":36,"meta":37,"style":37},"const player = this.createSprite('hero', { x: 100, y: 200 })\n\nthis.getPhysics().attachBody(player)\nthis.getPhysics().setCollideWorldBounds(player, true)\nthis.getPhysics().setVelocity(player, 0, 0)\n",[18,184,185,227,233,251,272],{"__ignoreMap":37},[41,186,187,190,194,197,200,202,205,208,212,215,218,221,224],{"class":43,"line":44},[41,188,189],{"class":134},"const",[41,191,193],{"class":192},"sj4cs"," player",[41,195,196],{"class":134}," =",[41,198,199],{"class":192}," this",[41,201,175],{"class":51},[41,203,204],{"class":47},"createSprite",[41,206,207],{"class":51},"(",[41,209,211],{"class":210},"sZZnC","'hero'",[41,213,214],{"class":51},", { x: ",[41,216,217],{"class":192},"100",[41,219,220],{"class":51},", y: ",[41,222,223],{"class":192},"200",[41,225,226],{"class":51}," })\n",[41,228,229],{"class":43,"line":67},[41,230,232],{"emptyLinePlaceholder":231},true,"\n",[41,234,235,238,240,243,246,248],{"class":43,"line":76},[41,236,237],{"class":192},"this",[41,239,175],{"class":51},[41,241,242],{"class":47},"getPhysics",[41,244,245],{"class":51},"().",[41,247,79],{"class":47},[41,249,250],{"class":51},"(player)\n",[41,252,253,255,257,259,261,263,266,269],{"class":43,"line":96},[41,254,237],{"class":192},[41,256,175],{"class":51},[41,258,242],{"class":47},[41,260,245],{"class":51},[41,262,119],{"class":47},[41,264,265],{"class":51},"(player, ",[41,267,268],{"class":192},"true",[41,270,271],{"class":51},")\n",[41,273,274,276,278,280,282,284,286,289,292,294],{"class":43,"line":110},[41,275,237],{"class":192},[41,277,175],{"class":51},[41,279,242],{"class":47},[41,281,245],{"class":51},[41,283,99],{"class":47},[41,285,265],{"class":51},[41,287,288],{"class":192},"0",[41,290,291],{"class":51},", ",[41,293,288],{"class":192},[41,295,271],{"class":51},[15,297,298],{},"Albo przez deskryptor przy tworzeniu:",[32,300,302],{"className":34,"code":301,"language":36,"meta":37,"style":37},"const wall = this.createRect(280, 24, { x: 520, y: 420, fill: '#3a4256' })\nthis.getPhysics().attachBody(wall)\nthis.getPhysics().setImmovable(wall, true)\n",[18,303,304,348,363],{"__ignoreMap":37},[41,305,306,308,311,313,315,317,320,322,325,327,330,332,335,337,340,343,346],{"class":43,"line":44},[41,307,189],{"class":134},[41,309,310],{"class":192}," wall",[41,312,196],{"class":134},[41,314,199],{"class":192},[41,316,175],{"class":51},[41,318,319],{"class":47},"createRect",[41,321,207],{"class":51},[41,323,324],{"class":192},"280",[41,326,291],{"class":51},[41,328,329],{"class":192},"24",[41,331,214],{"class":51},[41,333,334],{"class":192},"520",[41,336,220],{"class":51},[41,338,339],{"class":192},"420",[41,341,342],{"class":51},", fill: ",[41,344,345],{"class":210},"'#3a4256'",[41,347,226],{"class":51},[41,349,350,352,354,356,358,360],{"class":43,"line":67},[41,351,237],{"class":192},[41,353,175],{"class":51},[41,355,242],{"class":47},[41,357,245],{"class":51},[41,359,79],{"class":47},[41,361,362],{"class":51},"(wall)\n",[41,364,365,367,369,371,373,375,378,380],{"class":43,"line":76},[41,366,237],{"class":192},[41,368,175],{"class":51},[41,370,242],{"class":47},[41,372,245],{"class":51},[41,374,113],{"class":47},[41,376,377],{"class":51},"(wall, ",[41,379,268],{"class":192},[41,381,271],{"class":51},[10,383,385],{"id":384},"granice-świata","Granice świata",[32,387,389],{"className":34,"code":388,"language":36,"meta":37,"style":37},"this.getPhysics().setWorldBounds(0, 0, 2000, 1400)\n",[18,390,391],{"__ignoreMap":37},[41,392,393,395,397,399,401,403,405,407,409,411,413,416,418,421],{"class":43,"line":44},[41,394,237],{"class":192},[41,396,175],{"class":51},[41,398,242],{"class":47},[41,400,245],{"class":51},[41,402,70],{"class":47},[41,404,207],{"class":51},[41,406,288],{"class":192},[41,408,291],{"class":51},[41,410,288],{"class":192},[41,412,291],{"class":51},[41,414,415],{"class":192},"2000",[41,417,291],{"class":51},[41,419,420],{"class":192},"1400",[41,422,271],{"class":51},[10,424,426],{"id":425},"kolizje-i-overlap","Kolizje i overlap",[15,428,429,432],{},[23,430,431],{},"Collider"," — fizyczne zderzenie (ciała się odbijają\u002Fzatrzymują):",[32,434,436],{"className":34,"code":435,"language":36,"meta":37,"style":37},"const walls = this.findByTag('wall')\nthis.getPhysics().addCollider(player, walls)\n",[18,437,438,461],{"__ignoreMap":37},[41,439,440,442,445,447,449,451,454,456,459],{"class":43,"line":44},[41,441,189],{"class":134},[41,443,444],{"class":192}," walls",[41,446,196],{"class":134},[41,448,199],{"class":192},[41,450,175],{"class":51},[41,452,453],{"class":47},"findByTag",[41,455,207],{"class":51},[41,457,458],{"class":210},"'wall'",[41,460,271],{"class":51},[41,462,463,465,467,469,471,473],{"class":43,"line":67},[41,464,237],{"class":192},[41,466,175],{"class":51},[41,468,242],{"class":47},[41,470,245],{"class":51},[41,472,128],{"class":47},[41,474,475],{"class":51},"(player, walls)\n",[15,477,478,481],{},[23,479,480],{},"Overlap"," — wykrycie przecięcia bez reakcji fizycznej (pickupy, strefy):",[32,483,485],{"className":34,"code":484,"language":36,"meta":37,"style":37},"const coins = this.findByTag('coin')\nthis.getPhysics().addOverlap(player, coins, (playerObj, coinObj) => {\n  this.score += 1\n  this.playSound('pickup', { channel: 'sfx' })\n  this.destroyObject(coinObj)\n})\n",[18,486,487,509,542,556,578,590],{"__ignoreMap":37},[41,488,489,491,494,496,498,500,502,504,507],{"class":43,"line":44},[41,490,189],{"class":134},[41,492,493],{"class":192}," coins",[41,495,196],{"class":134},[41,497,199],{"class":192},[41,499,175],{"class":51},[41,501,453],{"class":47},[41,503,207],{"class":51},[41,505,506],{"class":210},"'coin'",[41,508,271],{"class":51},[41,510,511,513,515,517,519,521,524,528,530,533,536,539],{"class":43,"line":67},[41,512,237],{"class":192},[41,514,175],{"class":51},[41,516,242],{"class":47},[41,518,245],{"class":51},[41,520,150],{"class":47},[41,522,523],{"class":51},"(player, coins, (",[41,525,527],{"class":526},"s4XuR","playerObj",[41,529,291],{"class":51},[41,531,532],{"class":526},"coinObj",[41,534,535],{"class":51},") ",[41,537,538],{"class":134},"=>",[41,540,541],{"class":51}," {\n",[41,543,544,547,550,553],{"class":43,"line":76},[41,545,546],{"class":192},"  this",[41,548,549],{"class":51},".score ",[41,551,552],{"class":134},"+=",[41,554,555],{"class":192}," 1\n",[41,557,558,560,562,565,567,570,573,576],{"class":43,"line":96},[41,559,546],{"class":192},[41,561,175],{"class":51},[41,563,564],{"class":47},"playSound",[41,566,207],{"class":51},[41,568,569],{"class":210},"'pickup'",[41,571,572],{"class":51},", { channel: ",[41,574,575],{"class":210},"'sfx'",[41,577,226],{"class":51},[41,579,580,582,584,587],{"class":43,"line":110},[41,581,546],{"class":192},[41,583,175],{"class":51},[41,585,586],{"class":47},"destroyObject",[41,588,589],{"class":51},"(coinObj)\n",[41,591,592],{"class":43,"line":125},[41,593,594],{"class":51},"})\n",[596,597,599],"h3",{"id":598},"przykład-platformer-z-fixedupdate","Przykład: platformer z fixedUpdate",[32,601,603],{"className":34,"code":602,"language":36,"meta":37,"style":37},"class PlatformerScene extends Scene {\n  private player!: GameObject\n  private walls: GameObject[] = []\n\n  create() {\n    this.getPhysics().setWorldBounds(0, 0, 2000, 1400)\n\n    this.player = this.createSprite('hero', { x: 100, y: 300 })\n    this.getPhysics().attachBody(this.player)\n    this.getPhysics().setCollideWorldBounds(this.player, true)\n\n    for (const spec of WALLS) {\n      const wall = this.createRect(spec.width, spec.height, { x: spec.x, y: spec.y })\n      this.getPhysics().attachBody(wall)\n      this.getPhysics().setImmovable(wall, true)\n      this.walls.push(wall)\n    }\n\n    this.getPhysics().addCollider(this.player, this.walls)\n  }\n\n  fixedUpdate() {\n    const input = this.getInput()\n    const vx = input.isActionDown('move-right') ? 240 : input.isActionDown('move-left') ? -240 : 0\n    this.getPhysics().setVelocity(this.player, vx, 0)\n  }\n}\n",[18,604,605,621,634,654,658,666,697,701,731,751,775,780,803,822,838,857,870,876,881,905,911,916,924,944,999,1023,1028],{"__ignoreMap":37},[41,606,607,610,613,616,619],{"class":43,"line":44},[41,608,609],{"class":134},"class",[41,611,612],{"class":47}," PlatformerScene",[41,614,615],{"class":134}," extends",[41,617,618],{"class":47}," Scene",[41,620,541],{"class":51},[41,622,623,626,628,631],{"class":43,"line":67},[41,624,625],{"class":134},"  private",[41,627,193],{"class":526},[41,629,630],{"class":134},"!:",[41,632,633],{"class":47}," GameObject\n",[41,635,636,638,640,642,645,648,651],{"class":43,"line":76},[41,637,625],{"class":134},[41,639,444],{"class":526},[41,641,141],{"class":134},[41,643,644],{"class":47}," GameObject",[41,646,647],{"class":51},"[] ",[41,649,650],{"class":134},"=",[41,652,653],{"class":51}," []\n",[41,655,656],{"class":43,"line":96},[41,657,232],{"emptyLinePlaceholder":231},[41,659,660,663],{"class":43,"line":110},[41,661,662],{"class":47},"  create",[41,664,665],{"class":51},"() {\n",[41,667,668,671,673,675,677,679,681,683,685,687,689,691,693,695],{"class":43,"line":125},[41,669,670],{"class":192},"    this",[41,672,175],{"class":51},[41,674,242],{"class":47},[41,676,245],{"class":51},[41,678,70],{"class":47},[41,680,207],{"class":51},[41,682,288],{"class":192},[41,684,291],{"class":51},[41,686,288],{"class":192},[41,688,291],{"class":51},[41,690,415],{"class":192},[41,692,291],{"class":51},[41,694,420],{"class":192},[41,696,271],{"class":51},[41,698,699],{"class":43,"line":147},[41,700,232],{"emptyLinePlaceholder":231},[41,702,703,705,708,710,712,714,716,718,720,722,724,726,729],{"class":43,"line":156},[41,704,670],{"class":192},[41,706,707],{"class":51},".player ",[41,709,650],{"class":134},[41,711,199],{"class":192},[41,713,175],{"class":51},[41,715,204],{"class":47},[41,717,207],{"class":51},[41,719,211],{"class":210},[41,721,214],{"class":51},[41,723,217],{"class":192},[41,725,220],{"class":51},[41,727,728],{"class":192},"300",[41,730,226],{"class":51},[41,732,734,736,738,740,742,744,746,748],{"class":43,"line":733},9,[41,735,670],{"class":192},[41,737,175],{"class":51},[41,739,242],{"class":47},[41,741,245],{"class":51},[41,743,79],{"class":47},[41,745,207],{"class":51},[41,747,237],{"class":192},[41,749,750],{"class":51},".player)\n",[41,752,754,756,758,760,762,764,766,768,771,773],{"class":43,"line":753},10,[41,755,670],{"class":192},[41,757,175],{"class":51},[41,759,242],{"class":47},[41,761,245],{"class":51},[41,763,119],{"class":47},[41,765,207],{"class":51},[41,767,237],{"class":192},[41,769,770],{"class":51},".player, ",[41,772,268],{"class":192},[41,774,271],{"class":51},[41,776,778],{"class":43,"line":777},11,[41,779,232],{"emptyLinePlaceholder":231},[41,781,783,786,789,791,794,797,800],{"class":43,"line":782},12,[41,784,785],{"class":134},"    for",[41,787,788],{"class":51}," (",[41,790,189],{"class":134},[41,792,793],{"class":192}," spec",[41,795,796],{"class":134}," of",[41,798,799],{"class":192}," WALLS",[41,801,802],{"class":51},") {\n",[41,804,806,809,811,813,815,817,819],{"class":43,"line":805},13,[41,807,808],{"class":134},"      const",[41,810,310],{"class":192},[41,812,196],{"class":134},[41,814,199],{"class":192},[41,816,175],{"class":51},[41,818,319],{"class":47},[41,820,821],{"class":51},"(spec.width, spec.height, { x: spec.x, y: spec.y })\n",[41,823,825,828,830,832,834,836],{"class":43,"line":824},14,[41,826,827],{"class":192},"      this",[41,829,175],{"class":51},[41,831,242],{"class":47},[41,833,245],{"class":51},[41,835,79],{"class":47},[41,837,362],{"class":51},[41,839,841,843,845,847,849,851,853,855],{"class":43,"line":840},15,[41,842,827],{"class":192},[41,844,175],{"class":51},[41,846,242],{"class":47},[41,848,245],{"class":51},[41,850,113],{"class":47},[41,852,377],{"class":51},[41,854,268],{"class":192},[41,856,271],{"class":51},[41,858,860,862,865,868],{"class":43,"line":859},16,[41,861,827],{"class":192},[41,863,864],{"class":51},".walls.",[41,866,867],{"class":47},"push",[41,869,362],{"class":51},[41,871,873],{"class":43,"line":872},17,[41,874,875],{"class":51},"    }\n",[41,877,879],{"class":43,"line":878},18,[41,880,232],{"emptyLinePlaceholder":231},[41,882,884,886,888,890,892,894,896,898,900,902],{"class":43,"line":883},19,[41,885,670],{"class":192},[41,887,175],{"class":51},[41,889,242],{"class":47},[41,891,245],{"class":51},[41,893,128],{"class":47},[41,895,207],{"class":51},[41,897,237],{"class":192},[41,899,770],{"class":51},[41,901,237],{"class":192},[41,903,904],{"class":51},".walls)\n",[41,906,908],{"class":43,"line":907},20,[41,909,910],{"class":51},"  }\n",[41,912,914],{"class":43,"line":913},21,[41,915,232],{"emptyLinePlaceholder":231},[41,917,919,922],{"class":43,"line":918},22,[41,920,921],{"class":47},"  fixedUpdate",[41,923,665],{"class":51},[41,925,927,930,933,935,937,939,942],{"class":43,"line":926},23,[41,928,929],{"class":134},"    const",[41,931,932],{"class":192}," input",[41,934,196],{"class":134},[41,936,199],{"class":192},[41,938,175],{"class":51},[41,940,941],{"class":47},"getInput",[41,943,64],{"class":51},[41,945,947,949,952,954,957,960,962,965,967,969,972,975,977,979,981,984,986,988,991,994,996],{"class":43,"line":946},24,[41,948,929],{"class":134},[41,950,951],{"class":192}," vx",[41,953,196],{"class":134},[41,955,956],{"class":51}," input.",[41,958,959],{"class":47},"isActionDown",[41,961,207],{"class":51},[41,963,964],{"class":210},"'move-right'",[41,966,535],{"class":51},[41,968,135],{"class":134},[41,970,971],{"class":192}," 240",[41,973,974],{"class":134}," :",[41,976,956],{"class":51},[41,978,959],{"class":47},[41,980,207],{"class":51},[41,982,983],{"class":210},"'move-left'",[41,985,535],{"class":51},[41,987,135],{"class":134},[41,989,990],{"class":134}," -",[41,992,993],{"class":192},"240",[41,995,974],{"class":134},[41,997,998],{"class":192}," 0\n",[41,1000,1002,1004,1006,1008,1010,1012,1014,1016,1019,1021],{"class":43,"line":1001},25,[41,1003,670],{"class":192},[41,1005,175],{"class":51},[41,1007,242],{"class":47},[41,1009,245],{"class":51},[41,1011,99],{"class":47},[41,1013,207],{"class":51},[41,1015,237],{"class":192},[41,1017,1018],{"class":51},".player, vx, ",[41,1020,288],{"class":192},[41,1022,271],{"class":51},[41,1024,1026],{"class":43,"line":1025},26,[41,1027,910],{"class":51},[41,1029,1031],{"class":43,"line":1030},27,[41,1032,1033],{"class":51},"}\n",[1035,1036,1039],"callout",{"title":1037,"type":1038},"Fizyka w fixedUpdate","warning",[15,1040,1041,1042,1045,1046,1049,1050,1052,1053,175],{},"Ustawianie prędkości rób w ",[18,1043,1044],{},"fixedUpdate",", nie w ",[18,1047,1048],{},"update"," — inaczej przy spadku FPS fizyka stanie się niedeterministyczna. Render może zostać w ",[18,1051,1048],{}," z interpolacją przez ",[18,1054,1055],{},"fixedAlpha",[10,1057,1059],{"id":1058},"sprzątanie","Sprzątanie",[32,1061,1063],{"className":34,"code":1062,"language":36,"meta":37,"style":37},"this.getPhysics().clear()\n",[18,1064,1065],{"__ignoreMap":37},[41,1066,1067,1069,1071,1073,1075,1077],{"class":43,"line":44},[41,1068,237],{"class":192},[41,1070,175],{"class":51},[41,1072,242],{"class":47},[41,1074,245],{"class":51},[41,1076,159],{"class":47},[41,1078,64],{"class":51},[15,1080,1081,1082,1085,1086,1089],{},"Przy ",[18,1083,1084],{},"shutdown()"," sceny ciała i collidery są usuwane razem z obiektami. ",[18,1087,1088],{},"clear()"," przydaje się przy przebudowie poziomu bez zmiany sceny.",[1091,1092,1093],"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 .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 .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 pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":37,"searchDepth":76,"depth":76,"links":1095},[1096,1097,1098,1099,1100,1103],{"id":12,"depth":67,"text":13},{"id":29,"depth":67,"text":30},{"id":178,"depth":67,"text":179},{"id":384,"depth":67,"text":385},{"id":425,"depth":67,"text":426,"children":1101},[1102],{"id":598,"depth":76,"text":599},{"id":1058,"depth":67,"text":1059},"Phaser Arcade Physics — ciała, prędkości, collidery, overlap i granice świata. Bez własnego silnika fizyki.","md",{},"\u002Fgame-engine\u002Fsystems\u002Fphysics",{"title":5,"description":1104},"01.game-engine\u002F06.systems\u002F03.physics","0FLb3-k4S3CXgMlyEfM_ut3FTy_MO4fPHVIeMO3LrsQ",[1112,1117],{"title":1113,"path":1114,"stem":1115,"description":1116,"children":-1},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input","Akcje zamiast kodów klawiszy, stan klawiatury, pointer i remapowanie. Jak czytać wejście w komponentach i scenach.",{"title":1118,"path":1119,"stem":1120,"description":1121,"children":-1},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera","Follow, zoom, granice, efekty shake\u002Ffade\u002Fflash i konwersja worldToScreen. Z fallbackiem dla backendów bez efektów.",[1123,1234,1295],{"title":1124,"path":1125,"stem":1126,"children":1127},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1128,1130,1134,1138,1142,1168,1188,1201,1222,1226,1230],{"title":1129,"path":1125,"stem":1126},"Przegląd",{"title":1131,"path":1132,"stem":1133},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1135,"path":1136,"stem":1137},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1139,"path":1140,"stem":1141},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1143,"path":1144,"stem":1145,"children":1146,"page":1167},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1147,1151,1155,1159,1163],{"title":1148,"path":1149,"stem":1150},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1152,"path":1153,"stem":1154},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1156,"path":1157,"stem":1158},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":1160,"path":1161,"stem":1162},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":1164,"path":1165,"stem":1166},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":1169,"path":1170,"stem":1171,"children":1172,"page":1167},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1173,1177,1178,1179,1180,1184],{"title":1174,"path":1175,"stem":1176},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":1113,"path":1114,"stem":1115},{"title":5,"path":1107,"stem":1109},{"title":1118,"path":1119,"stem":1120},{"title":1181,"path":1182,"stem":1183},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":1185,"path":1186,"stem":1187},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":1189,"path":1190,"stem":1191,"children":1192,"page":1167},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1193,1197],{"title":1194,"path":1195,"stem":1196},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1198,"path":1199,"stem":1200},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":1202,"path":1203,"stem":1204,"children":1205,"page":1167},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1206,1210,1214,1218],{"title":1207,"path":1208,"stem":1209},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1211,"path":1212,"stem":1213},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1215,"path":1216,"stem":1217},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1219,"path":1220,"stem":1221},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1223,"path":1224,"stem":1225},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1227,"path":1228,"stem":1229},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1231,"path":1232,"stem":1233},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1235,"path":1236,"stem":1237,"children":1238},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1239,1240,1243,1246,1267],{"title":1129,"path":1236,"stem":1237},{"title":1131,"path":1241,"stem":1242},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1135,"path":1244,"stem":1245},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1247,"path":1248,"stem":1249,"children":1250,"page":1167},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1251,1255,1259,1263],{"title":1252,"path":1253,"stem":1254},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1256,"path":1257,"stem":1258},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1260,"path":1261,"stem":1262},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1264,"path":1265,"stem":1266},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1268,"path":1269,"stem":1270,"children":1271,"page":1167},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1272,1276,1280,1284,1287,1291],{"title":1273,"path":1274,"stem":1275},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1277,"path":1278,"stem":1279},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1281,"path":1282,"stem":1283},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1223,"path":1285,"stem":1286},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1288,"path":1289,"stem":1290},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1292,"path":1293,"stem":1294},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1296,"path":1297,"stem":1298,"children":1299},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1300,1301,1304,1325,1338,1358],{"title":1129,"path":1297,"stem":1298},{"title":1131,"path":1302,"stem":1303},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1305,"path":1306,"stem":1307,"children":1308,"page":1167},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1309,1313,1317,1321],{"title":1310,"path":1311,"stem":1312},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1314,"path":1315,"stem":1316},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1318,"path":1319,"stem":1320},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1322,"path":1323,"stem":1324},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1326,"path":1327,"stem":1328,"children":1329,"page":1167},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1330,1334],{"title":1331,"path":1332,"stem":1333},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1335,"path":1336,"stem":1337},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1339,"path":1340,"stem":1341,"children":1342,"page":1167},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1343,1346,1350,1354],{"title":1139,"path":1344,"stem":1345},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1347,"path":1348,"stem":1349},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1351,"path":1352,"stem":1353},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1355,"path":1356,"stem":1357},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1359,"path":1360,"stem":1361},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307636]