[{"data":1,"prerenderedAt":1814},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fcore\u002Fobjects":3,"surround:\u002Fgame-engine\u002Fcore\u002Fobjects":1563,"navigation":1574},{"id":4,"title":5,"body":6,"description":1556,"extension":1557,"meta":1558,"navigation":96,"path":1559,"seo":1560,"stem":1561,"__hash__":1562},"docs\u002F01.game-engine\u002F05.core\u002F04.objects.md","Obiekty i komponenty",{"type":7,"value":8,"toc":1544},"minimark",[9,14,33,201,205,497,500,504,623,641,645,767,776,780,783,1057,1114,1119,1211,1215,1404,1408,1467,1470,1478,1482,1525,1540],[10,11,13],"h2",{"id":12},"gameobject","GameObject",[15,16,17,20,21,24,25,28,29],"p",{},[18,19,13],"code",{}," to encja domenowa: transform lokalny, tagi, grupy, hierarchia, komponenty oraz deskryptory ",[18,22,23],{},"render"," i ",[18,26,27],{},"body",". ",[30,31,32],"strong",{},"Nie trzyma instancji Phasera.",[34,35,40],"pre",{"className":36,"code":37,"language":38,"meta":39,"style":39},"language-ts shiki shiki-themes github-light github-dark","const player = this.createSprite('hero', { x: 100, y: 200 })\n\nplayer\n  .setPosition(120, 220)\n  .setScale(2)\n  .setDepth(10)\n  .setAlpha(0.9)\n  .addTag('player')\n  .addTag('damageable')\n","ts","",[18,41,42,91,98,104,127,142,157,172,187],{"__ignoreMap":39},[43,44,47,51,55,58,61,65,69,72,76,79,82,85,88],"span",{"class":45,"line":46},"line",1,[43,48,50],{"class":49},"szBVR","const",[43,52,54],{"class":53},"sj4cs"," player",[43,56,57],{"class":49}," =",[43,59,60],{"class":53}," this",[43,62,64],{"class":63},"sVt8B",".",[43,66,68],{"class":67},"sScJk","createSprite",[43,70,71],{"class":63},"(",[43,73,75],{"class":74},"sZZnC","'hero'",[43,77,78],{"class":63},", { x: ",[43,80,81],{"class":53},"100",[43,83,84],{"class":63},", y: ",[43,86,87],{"class":53},"200",[43,89,90],{"class":63}," })\n",[43,92,94],{"class":45,"line":93},2,[43,95,97],{"emptyLinePlaceholder":96},true,"\n",[43,99,101],{"class":45,"line":100},3,[43,102,103],{"class":63},"player\n",[43,105,107,110,113,115,118,121,124],{"class":45,"line":106},4,[43,108,109],{"class":63},"  .",[43,111,112],{"class":67},"setPosition",[43,114,71],{"class":63},[43,116,117],{"class":53},"120",[43,119,120],{"class":63},", ",[43,122,123],{"class":53},"220",[43,125,126],{"class":63},")\n",[43,128,130,132,135,137,140],{"class":45,"line":129},5,[43,131,109],{"class":63},[43,133,134],{"class":67},"setScale",[43,136,71],{"class":63},[43,138,139],{"class":53},"2",[43,141,126],{"class":63},[43,143,145,147,150,152,155],{"class":45,"line":144},6,[43,146,109],{"class":63},[43,148,149],{"class":67},"setDepth",[43,151,71],{"class":63},[43,153,154],{"class":53},"10",[43,156,126],{"class":63},[43,158,160,162,165,167,170],{"class":45,"line":159},7,[43,161,109],{"class":63},[43,163,164],{"class":67},"setAlpha",[43,166,71],{"class":63},[43,168,169],{"class":53},"0.9",[43,171,126],{"class":63},[43,173,175,177,180,182,185],{"class":45,"line":174},8,[43,176,109],{"class":63},[43,178,179],{"class":67},"addTag",[43,181,71],{"class":63},[43,183,184],{"class":74},"'player'",[43,186,126],{"class":63},[43,188,190,192,194,196,199],{"class":45,"line":189},9,[43,191,109],{"class":63},[43,193,179],{"class":67},[43,195,71],{"class":63},[43,197,198],{"class":74},"'damageable'",[43,200,126],{"class":63},[10,202,204],{"id":203},"api","API",[34,206,208],{"className":36,"code":207,"language":38,"meta":39,"style":39},"get destroyed(); get x(); get y(); get alpha(); get depth()\nget rotation(); get scaleX(); get scaleY(); get world(): Transform\n\nsetPosition(x, y); translate(dx, dy); setRotation(rad)\nsetScale(x, y?); setVisible(bool); setActive(bool)\nsetAlpha(a); setDepth(d); setScrollFactor(f); setTint(color | null)\nsetRender(render | null); setBody(body | null)\n\naddTag(tag); removeTag(tag); hasTag(tag); hasAnyTag(tags); hasAllTags(tags)\naddChild(child); removeChild(child)\nadd\u003CT>(component): T; get\u003CT>(ctor); has(ctor); remove(ctor); getComponents()\ndestroy(): void\nmarkWorldDirty(); markRenderDirty()\n",[18,209,210,242,267,271,290,315,347,373,377,406,421,471,483],{"__ignoreMap":39},[43,211,212,215,218,221,224,226,229,231,234,236,239],{"class":45,"line":46},[43,213,214],{"class":63},"get ",[43,216,217],{"class":67},"destroyed",[43,219,220],{"class":63},"(); get ",[43,222,223],{"class":67},"x",[43,225,220],{"class":63},[43,227,228],{"class":67},"y",[43,230,220],{"class":63},[43,232,233],{"class":67},"alpha",[43,235,220],{"class":63},[43,237,238],{"class":67},"depth",[43,240,241],{"class":63},"()\n",[43,243,244,246,249,251,254,256,259,261,264],{"class":45,"line":93},[43,245,214],{"class":63},[43,247,248],{"class":67},"rotation",[43,250,220],{"class":63},[43,252,253],{"class":67},"scaleX",[43,255,220],{"class":63},[43,257,258],{"class":67},"scaleY",[43,260,220],{"class":63},[43,262,263],{"class":67},"world",[43,265,266],{"class":63},"(): Transform\n",[43,268,269],{"class":45,"line":100},[43,270,97],{"emptyLinePlaceholder":96},[43,272,273,275,278,281,284,287],{"class":45,"line":106},[43,274,112],{"class":67},[43,276,277],{"class":63},"(x, y); ",[43,279,280],{"class":67},"translate",[43,282,283],{"class":63},"(dx, dy); ",[43,285,286],{"class":67},"setRotation",[43,288,289],{"class":63},"(rad)\n",[43,291,292,294,297,300,303,306,309,312],{"class":45,"line":129},[43,293,134],{"class":67},[43,295,296],{"class":63},"(x, y",[43,298,299],{"class":49},"?",[43,301,302],{"class":63},"); ",[43,304,305],{"class":67},"setVisible",[43,307,308],{"class":63},"(bool); ",[43,310,311],{"class":67},"setActive",[43,313,314],{"class":63},"(bool)\n",[43,316,317,319,322,324,327,330,333,336,339,342,345],{"class":45,"line":144},[43,318,164],{"class":67},[43,320,321],{"class":63},"(a); ",[43,323,149],{"class":67},[43,325,326],{"class":63},"(d); ",[43,328,329],{"class":67},"setScrollFactor",[43,331,332],{"class":63},"(f); ",[43,334,335],{"class":67},"setTint",[43,337,338],{"class":63},"(color ",[43,340,341],{"class":49},"|",[43,343,344],{"class":53}," null",[43,346,126],{"class":63},[43,348,349,352,355,357,359,361,364,367,369,371],{"class":45,"line":159},[43,350,351],{"class":67},"setRender",[43,353,354],{"class":63},"(render ",[43,356,341],{"class":49},[43,358,344],{"class":53},[43,360,302],{"class":63},[43,362,363],{"class":67},"setBody",[43,365,366],{"class":63},"(body ",[43,368,341],{"class":49},[43,370,344],{"class":53},[43,372,126],{"class":63},[43,374,375],{"class":45,"line":174},[43,376,97],{"emptyLinePlaceholder":96},[43,378,379,381,384,387,389,392,394,397,400,403],{"class":45,"line":189},[43,380,179],{"class":67},[43,382,383],{"class":63},"(tag); ",[43,385,386],{"class":67},"removeTag",[43,388,383],{"class":63},[43,390,391],{"class":67},"hasTag",[43,393,383],{"class":63},[43,395,396],{"class":67},"hasAnyTag",[43,398,399],{"class":63},"(tags); ",[43,401,402],{"class":67},"hasAllTags",[43,404,405],{"class":63},"(tags)\n",[43,407,409,412,415,418],{"class":45,"line":408},10,[43,410,411],{"class":67},"addChild",[43,413,414],{"class":63},"(child); ",[43,416,417],{"class":67},"removeChild",[43,419,420],{"class":63},"(child)\n",[43,422,424,427,430,433,436,439,442,445,448,450,452,455,458,461,464,466,469],{"class":45,"line":423},11,[43,425,426],{"class":67},"add",[43,428,429],{"class":63},"\u003C",[43,431,432],{"class":67},"T",[43,434,435],{"class":63},">(component)",[43,437,438],{"class":49},":",[43,440,441],{"class":53}," T",[43,443,444],{"class":63},"; ",[43,446,447],{"class":67},"get",[43,449,429],{"class":63},[43,451,432],{"class":67},[43,453,454],{"class":63},">(ctor); ",[43,456,457],{"class":67},"has",[43,459,460],{"class":63},"(ctor); ",[43,462,463],{"class":67},"remove",[43,465,460],{"class":63},[43,467,468],{"class":67},"getComponents",[43,470,241],{"class":63},[43,472,474,477,480],{"class":45,"line":473},12,[43,475,476],{"class":67},"destroy",[43,478,479],{"class":63},"(): ",[43,481,482],{"class":49},"void\n",[43,484,486,489,492,495],{"class":45,"line":485},13,[43,487,488],{"class":67},"markWorldDirty",[43,490,491],{"class":63},"(); ",[43,493,494],{"class":67},"markRenderDirty",[43,496,241],{"class":63},[15,498,499],{},"Settery są chainable i oznaczają obiekt jako brudny — renderer dostanie go w najbliższej klatce.",[10,501,503],{"id":502},"transformacje-i-hierarchia","Transformacje i hierarchia",[34,505,507],{"className":36,"code":506,"language":38,"meta":39,"style":39},"const turret = this.createRect(24, 24, { x: 0, y: -20, fill: '#8899aa' })\nconst tank = this.createSprite('tank', { x: 400, y: 300 })\ntank.addChild(turret)\n\ntank.setPosition(500, 300)\nturret.world.x\n",[18,508,509,555,587,597,601,618],{"__ignoreMap":39},[43,510,511,513,516,518,520,522,525,527,530,532,534,536,539,541,544,547,550,553],{"class":45,"line":46},[43,512,50],{"class":49},[43,514,515],{"class":53}," turret",[43,517,57],{"class":49},[43,519,60],{"class":53},[43,521,64],{"class":63},[43,523,524],{"class":67},"createRect",[43,526,71],{"class":63},[43,528,529],{"class":53},"24",[43,531,120],{"class":63},[43,533,529],{"class":53},[43,535,78],{"class":63},[43,537,538],{"class":53},"0",[43,540,84],{"class":63},[43,542,543],{"class":49},"-",[43,545,546],{"class":53},"20",[43,548,549],{"class":63},", fill: ",[43,551,552],{"class":74},"'#8899aa'",[43,554,90],{"class":63},[43,556,557,559,562,564,566,568,570,572,575,577,580,582,585],{"class":45,"line":93},[43,558,50],{"class":49},[43,560,561],{"class":53}," tank",[43,563,57],{"class":49},[43,565,60],{"class":53},[43,567,64],{"class":63},[43,569,68],{"class":67},[43,571,71],{"class":63},[43,573,574],{"class":74},"'tank'",[43,576,78],{"class":63},[43,578,579],{"class":53},"400",[43,581,84],{"class":63},[43,583,584],{"class":53},"300",[43,586,90],{"class":63},[43,588,589,592,594],{"class":45,"line":100},[43,590,591],{"class":63},"tank.",[43,593,411],{"class":67},[43,595,596],{"class":63},"(turret)\n",[43,598,599],{"class":45,"line":106},[43,600,97],{"emptyLinePlaceholder":96},[43,602,603,605,607,609,612,614,616],{"class":45,"line":129},[43,604,591],{"class":63},[43,606,112],{"class":67},[43,608,71],{"class":63},[43,610,611],{"class":53},"500",[43,613,120],{"class":63},[43,615,584],{"class":53},[43,617,126],{"class":63},[43,619,620],{"class":45,"line":144},[43,621,622],{"class":63},"turret.world.x\n",[624,625,626,632,635],"ul",{},[627,628,629,631],"li",{},[18,630,263],{}," to transform po złożeniu z rodzicami — odczyt O(1) po przeliczeniu.",[627,633,634],{},"Zmiana transformacji rodzica unieważnia tylko jego poddrzewo.",[627,636,637,640],{},[18,638,639],{},"setScrollFactor(0)"," przykleja obiekt do ekranu (HUD).",[10,642,644],{"id":643},"tagi-i-wyszukiwanie","Tagi i wyszukiwanie",[34,646,648],{"className":36,"code":647,"language":38,"meta":39,"style":39},"enemy.addTag('enemy').addTag('flying')\n\nthis.findByTag('enemy')\nthis.findByTags(['enemy', 'flying'], 'all')\nthis.find((obj) => obj.hasTag('enemy') && obj.x > 800)\n",[18,649,650,674,678,694,720],{"__ignoreMap":39},[43,651,652,655,657,659,662,665,667,669,672],{"class":45,"line":46},[43,653,654],{"class":63},"enemy.",[43,656,179],{"class":67},[43,658,71],{"class":63},[43,660,661],{"class":74},"'enemy'",[43,663,664],{"class":63},").",[43,666,179],{"class":67},[43,668,71],{"class":63},[43,670,671],{"class":74},"'flying'",[43,673,126],{"class":63},[43,675,676],{"class":45,"line":93},[43,677,97],{"emptyLinePlaceholder":96},[43,679,680,683,685,688,690,692],{"class":45,"line":100},[43,681,682],{"class":53},"this",[43,684,64],{"class":63},[43,686,687],{"class":67},"findByTag",[43,689,71],{"class":63},[43,691,661],{"class":74},[43,693,126],{"class":63},[43,695,696,698,700,703,706,708,710,712,715,718],{"class":45,"line":106},[43,697,682],{"class":53},[43,699,64],{"class":63},[43,701,702],{"class":67},"findByTags",[43,704,705],{"class":63},"([",[43,707,661],{"class":74},[43,709,120],{"class":63},[43,711,671],{"class":74},[43,713,714],{"class":63},"], ",[43,716,717],{"class":74},"'all'",[43,719,126],{"class":63},[43,721,722,724,726,729,732,736,739,742,745,747,749,751,753,756,759,762,765],{"class":45,"line":129},[43,723,682],{"class":53},[43,725,64],{"class":63},[43,727,728],{"class":67},"find",[43,730,731],{"class":63},"((",[43,733,735],{"class":734},"s4XuR","obj",[43,737,738],{"class":63},") ",[43,740,741],{"class":49},"=>",[43,743,744],{"class":63}," obj.",[43,746,391],{"class":67},[43,748,71],{"class":63},[43,750,661],{"class":74},[43,752,738],{"class":63},[43,754,755],{"class":49},"&&",[43,757,758],{"class":63}," obj.x ",[43,760,761],{"class":49},">",[43,763,764],{"class":53}," 800",[43,766,126],{"class":63},[15,768,769,770,772,773,775],{},"Indeks tagów jest aktualizowany przy ",[18,771,179],{},"\u002F",[18,774,386],{},", więc wyszukiwanie nie skanuje wszystkich obiektów.",[10,777,779],{"id":778},"komponenty","Komponenty",[15,781,782],{},"Komponent to klasa z fazą systemową i cyklami życia:",[34,784,786],{"className":36,"code":785,"language":38,"meta":39,"style":39},"import { Component, type GameObject } from '@engine'\n\nexport class PlayerController extends Component {\n  phase = 'input' as const\n  private speed = 240\n\n  onUpdate(dt: number) {\n    const input = this.owner.getInput()\n    let vx = 0\n    let vy = 0\n    if (input.isActionDown('move-left')) vx -= this.speed\n    if (input.isActionDown('move-right')) vx += this.speed\n    if (input.isActionDown('move-up')) vy -= this.speed\n    if (input.isActionDown('move-down')) vy += this.speed\n    this.owner.translate(vx * dt, vy * dt)\n  }\n}\n",[18,787,788,808,812,832,848,861,865,883,903,917,928,955,977,999,1021,1045,1051],{"__ignoreMap":39},[43,789,790,793,796,799,802,805],{"class":45,"line":46},[43,791,792],{"class":49},"import",[43,794,795],{"class":63}," { Component, ",[43,797,798],{"class":49},"type",[43,800,801],{"class":63}," GameObject } ",[43,803,804],{"class":49},"from",[43,806,807],{"class":74}," '@engine'\n",[43,809,810],{"class":45,"line":93},[43,811,97],{"emptyLinePlaceholder":96},[43,813,814,817,820,823,826,829],{"class":45,"line":100},[43,815,816],{"class":49},"export",[43,818,819],{"class":49}," class",[43,821,822],{"class":67}," PlayerController",[43,824,825],{"class":49}," extends",[43,827,828],{"class":67}," Component",[43,830,831],{"class":63}," {\n",[43,833,834,837,839,842,845],{"class":45,"line":106},[43,835,836],{"class":734},"  phase",[43,838,57],{"class":49},[43,840,841],{"class":74}," 'input'",[43,843,844],{"class":49}," as",[43,846,847],{"class":49}," const\n",[43,849,850,853,856,858],{"class":45,"line":129},[43,851,852],{"class":49},"  private",[43,854,855],{"class":734}," speed",[43,857,57],{"class":49},[43,859,860],{"class":53}," 240\n",[43,862,863],{"class":45,"line":144},[43,864,97],{"emptyLinePlaceholder":96},[43,866,867,870,872,875,877,880],{"class":45,"line":159},[43,868,869],{"class":67},"  onUpdate",[43,871,71],{"class":63},[43,873,874],{"class":734},"dt",[43,876,438],{"class":49},[43,878,879],{"class":53}," number",[43,881,882],{"class":63},") {\n",[43,884,885,888,891,893,895,898,901],{"class":45,"line":174},[43,886,887],{"class":49},"    const",[43,889,890],{"class":53}," input",[43,892,57],{"class":49},[43,894,60],{"class":53},[43,896,897],{"class":63},".owner.",[43,899,900],{"class":67},"getInput",[43,902,241],{"class":63},[43,904,905,908,911,914],{"class":45,"line":189},[43,906,907],{"class":49},"    let",[43,909,910],{"class":63}," vx ",[43,912,913],{"class":49},"=",[43,915,916],{"class":53}," 0\n",[43,918,919,921,924,926],{"class":45,"line":408},[43,920,907],{"class":49},[43,922,923],{"class":63}," vy ",[43,925,913],{"class":49},[43,927,916],{"class":53},[43,929,930,933,936,939,941,944,947,950,952],{"class":45,"line":423},[43,931,932],{"class":49},"    if",[43,934,935],{"class":63}," (input.",[43,937,938],{"class":67},"isActionDown",[43,940,71],{"class":63},[43,942,943],{"class":74},"'move-left'",[43,945,946],{"class":63},")) vx ",[43,948,949],{"class":49},"-=",[43,951,60],{"class":53},[43,953,954],{"class":63},".speed\n",[43,956,957,959,961,963,965,968,970,973,975],{"class":45,"line":473},[43,958,932],{"class":49},[43,960,935],{"class":63},[43,962,938],{"class":67},[43,964,71],{"class":63},[43,966,967],{"class":74},"'move-right'",[43,969,946],{"class":63},[43,971,972],{"class":49},"+=",[43,974,60],{"class":53},[43,976,954],{"class":63},[43,978,979,981,983,985,987,990,993,995,997],{"class":45,"line":485},[43,980,932],{"class":49},[43,982,935],{"class":63},[43,984,938],{"class":67},[43,986,71],{"class":63},[43,988,989],{"class":74},"'move-up'",[43,991,992],{"class":63},")) vy ",[43,994,949],{"class":49},[43,996,60],{"class":53},[43,998,954],{"class":63},[43,1000,1002,1004,1006,1008,1010,1013,1015,1017,1019],{"class":45,"line":1001},14,[43,1003,932],{"class":49},[43,1005,935],{"class":63},[43,1007,938],{"class":67},[43,1009,71],{"class":63},[43,1011,1012],{"class":74},"'move-down'",[43,1014,992],{"class":63},[43,1016,972],{"class":49},[43,1018,60],{"class":53},[43,1020,954],{"class":63},[43,1022,1024,1027,1029,1031,1034,1037,1040,1042],{"class":45,"line":1023},15,[43,1025,1026],{"class":53},"    this",[43,1028,897],{"class":63},[43,1030,280],{"class":67},[43,1032,1033],{"class":63},"(vx ",[43,1035,1036],{"class":49},"*",[43,1038,1039],{"class":63}," dt, vy ",[43,1041,1036],{"class":49},[43,1043,1044],{"class":63}," dt)\n",[43,1046,1048],{"class":45,"line":1047},16,[43,1049,1050],{"class":63},"  }\n",[43,1052,1054],{"class":45,"line":1053},17,[43,1055,1056],{"class":63},"}\n",[34,1058,1060],{"className":36,"code":1059,"language":38,"meta":39,"style":39},"player.add(new PlayerController())\nconst controller = player.get(PlayerController)\ncontroller.enabled = false\nplayer.remove(PlayerController)\n",[18,1061,1062,1079,1096,1106],{"__ignoreMap":39},[43,1063,1064,1067,1069,1071,1074,1076],{"class":45,"line":46},[43,1065,1066],{"class":63},"player.",[43,1068,426],{"class":67},[43,1070,71],{"class":63},[43,1072,1073],{"class":49},"new",[43,1075,822],{"class":67},[43,1077,1078],{"class":63},"())\n",[43,1080,1081,1083,1086,1088,1091,1093],{"class":45,"line":93},[43,1082,50],{"class":49},[43,1084,1085],{"class":53}," controller",[43,1087,57],{"class":49},[43,1089,1090],{"class":63}," player.",[43,1092,447],{"class":67},[43,1094,1095],{"class":63},"(PlayerController)\n",[43,1097,1098,1101,1103],{"class":45,"line":100},[43,1099,1100],{"class":63},"controller.enabled ",[43,1102,913],{"class":49},[43,1104,1105],{"class":53}," false\n",[43,1107,1108,1110,1112],{"class":45,"line":106},[43,1109,1066],{"class":63},[43,1111,463],{"class":67},[43,1113,1095],{"class":63},[1115,1116,1118],"h3",{"id":1117},"fazy-systemowe","Fazy systemowe",[1120,1121,1122,1138],"table",{},[1123,1124,1125],"thead",{},[1126,1127,1128,1132,1135],"tr",{},[1129,1130,1131],"th",{},"Faza",[1129,1133,1134],{},"Kiedy w klatce",[1129,1136,1137],{},"Typowe zastosowanie",[1139,1140,1141,1158,1173,1186,1199],"tbody",{},[1126,1142,1143,1149,1155],{},[1144,1145,1146],"td",{},[18,1147,1148],{},"input",[1144,1150,1151,1152],{},"Przed ",[18,1153,1154],{},"Scene.update",[1144,1156,1157],{},"Sterowanie",[1126,1159,1160,1165,1170],{},[1144,1161,1162],{},[18,1163,1164],{},"behavior",[1144,1166,1167,1168],{},"Po ",[18,1169,1154],{},[1144,1171,1172],{},"AI, logika zachowań",[1126,1174,1175,1180,1183],{},[1144,1176,1177],{},[18,1178,1179],{},"physics",[1144,1181,1182],{},"Po behavior",[1144,1184,1185],{},"Siły, prędkości",[1126,1187,1188,1193,1196],{},[1144,1189,1190],{},[18,1191,1192],{},"animation",[1144,1194,1195],{},"Po physics",[1144,1197,1198],{},"Klatki animacji",[1126,1200,1201,1205,1208],{},[1144,1202,1203],{},[18,1204,23],{},[1144,1206,1207],{},"Na końcu",[1144,1209,1210],{},"Przygotowanie renderu",[1115,1212,1214],{"id":1213},"cykl-życia-komponentu","Cykl życia komponentu",[34,1216,1218],{"className":36,"code":1217,"language":38,"meta":39,"style":39},"class Bobbing extends Component {\n  phase = 'behavior' as const\n  private baseY = 0\n  private t = 0\n\n  onAttach() {\n    this.baseY = this.owner.y\n  }\n\n  onUpdate(dt: number) {\n    this.t += dt\n    this.owner.setPosition(this.owner.x, this.baseY + Math.sin(this.t * 3) * 6)\n  }\n\n  onDetach() {}\n  onDestroy() {}\n}\n",[18,1219,1220,1234,1247,1258,1269,1273,1281,1295,1299,1303,1317,1329,1377,1381,1385,1393,1400],{"__ignoreMap":39},[43,1221,1222,1225,1228,1230,1232],{"class":45,"line":46},[43,1223,1224],{"class":49},"class",[43,1226,1227],{"class":67}," Bobbing",[43,1229,825],{"class":49},[43,1231,828],{"class":67},[43,1233,831],{"class":63},[43,1235,1236,1238,1240,1243,1245],{"class":45,"line":93},[43,1237,836],{"class":734},[43,1239,57],{"class":49},[43,1241,1242],{"class":74}," 'behavior'",[43,1244,844],{"class":49},[43,1246,847],{"class":49},[43,1248,1249,1251,1254,1256],{"class":45,"line":100},[43,1250,852],{"class":49},[43,1252,1253],{"class":734}," baseY",[43,1255,57],{"class":49},[43,1257,916],{"class":53},[43,1259,1260,1262,1265,1267],{"class":45,"line":106},[43,1261,852],{"class":49},[43,1263,1264],{"class":734}," t",[43,1266,57],{"class":49},[43,1268,916],{"class":53},[43,1270,1271],{"class":45,"line":129},[43,1272,97],{"emptyLinePlaceholder":96},[43,1274,1275,1278],{"class":45,"line":144},[43,1276,1277],{"class":67},"  onAttach",[43,1279,1280],{"class":63},"() {\n",[43,1282,1283,1285,1288,1290,1292],{"class":45,"line":159},[43,1284,1026],{"class":53},[43,1286,1287],{"class":63},".baseY ",[43,1289,913],{"class":49},[43,1291,60],{"class":53},[43,1293,1294],{"class":63},".owner.y\n",[43,1296,1297],{"class":45,"line":174},[43,1298,1050],{"class":63},[43,1300,1301],{"class":45,"line":189},[43,1302,97],{"emptyLinePlaceholder":96},[43,1304,1305,1307,1309,1311,1313,1315],{"class":45,"line":408},[43,1306,869],{"class":67},[43,1308,71],{"class":63},[43,1310,874],{"class":734},[43,1312,438],{"class":49},[43,1314,879],{"class":53},[43,1316,882],{"class":63},[43,1318,1319,1321,1324,1326],{"class":45,"line":423},[43,1320,1026],{"class":53},[43,1322,1323],{"class":63},".t ",[43,1325,972],{"class":49},[43,1327,1328],{"class":63}," dt\n",[43,1330,1331,1333,1335,1337,1339,1341,1344,1346,1348,1351,1354,1357,1359,1361,1363,1365,1368,1370,1372,1375],{"class":45,"line":473},[43,1332,1026],{"class":53},[43,1334,897],{"class":63},[43,1336,112],{"class":67},[43,1338,71],{"class":63},[43,1340,682],{"class":53},[43,1342,1343],{"class":63},".owner.x, ",[43,1345,682],{"class":53},[43,1347,1287],{"class":63},[43,1349,1350],{"class":49},"+",[43,1352,1353],{"class":63}," Math.",[43,1355,1356],{"class":67},"sin",[43,1358,71],{"class":63},[43,1360,682],{"class":53},[43,1362,1323],{"class":63},[43,1364,1036],{"class":49},[43,1366,1367],{"class":53}," 3",[43,1369,738],{"class":63},[43,1371,1036],{"class":49},[43,1373,1374],{"class":53}," 6",[43,1376,126],{"class":63},[43,1378,1379],{"class":45,"line":485},[43,1380,1050],{"class":63},[43,1382,1383],{"class":45,"line":1001},[43,1384,97],{"emptyLinePlaceholder":96},[43,1386,1387,1390],{"class":45,"line":1023},[43,1388,1389],{"class":67},"  onDetach",[43,1391,1392],{"class":63},"() {}\n",[43,1394,1395,1398],{"class":45,"line":1047},[43,1396,1397],{"class":67},"  onDestroy",[43,1399,1392],{"class":63},[43,1401,1402],{"class":45,"line":1053},[43,1403,1056],{"class":63},[10,1405,1407],{"id":1406},"deskryptory-render-i-body","Deskryptory render i body",[34,1409,1411],{"className":36,"code":1410,"language":38,"meta":39,"style":39},"player.setRender({ type: 'sprite', textureId: 'hero', frame: 0 })\nplayer.setBody({ type: 'arcade', width: 24, height: 32, immovable: false })\n",[18,1412,1413,1437],{"__ignoreMap":39},[43,1414,1415,1417,1419,1422,1425,1428,1430,1433,1435],{"class":45,"line":46},[43,1416,1066],{"class":63},[43,1418,351],{"class":67},[43,1420,1421],{"class":63},"({ type: ",[43,1423,1424],{"class":74},"'sprite'",[43,1426,1427],{"class":63},", textureId: ",[43,1429,75],{"class":74},[43,1431,1432],{"class":63},", frame: ",[43,1434,538],{"class":53},[43,1436,90],{"class":63},[43,1438,1439,1441,1443,1445,1448,1451,1453,1456,1459,1462,1465],{"class":45,"line":93},[43,1440,1066],{"class":63},[43,1442,363],{"class":67},[43,1444,1421],{"class":63},[43,1446,1447],{"class":74},"'arcade'",[43,1449,1450],{"class":63},", width: ",[43,1452,529],{"class":53},[43,1454,1455],{"class":63},", height: ",[43,1457,1458],{"class":53},"32",[43,1460,1461],{"class":63},", immovable: ",[43,1463,1464],{"class":53},"false",[43,1466,90],{"class":63},[15,1468,1469],{},"Deskryptor to dane, nie instancja runtime. Adapter tłumaczy je na obiekty Phasera i synchronizuje tylko gdy są brudne.",[1471,1472,1475],"callout",{"title":1473,"type":1474},"Dlaczego nie ECS?","tip",[15,1476,1477],{},"Prototyp ECS został oceniony i odrzucony (ADR 0003). Komponenty z fazami dają przewidywalną kolejność i prostszy model mentalny przy zachowaniu wydajności: 0,72 ms\u002Fklatkę dla 20 000 obiektów.",[10,1479,1481],{"id":1480},"usuwanie-obiektów","Usuwanie obiektów",[34,1483,1485],{"className":36,"code":1484,"language":38,"meta":39,"style":39},"this.destroyObject(bullet)\nthis.destroyObject('hud-temp')\nthis.destroyAllObjects()\n",[18,1486,1487,1499,1514],{"__ignoreMap":39},[43,1488,1489,1491,1493,1496],{"class":45,"line":46},[43,1490,682],{"class":53},[43,1492,64],{"class":63},[43,1494,1495],{"class":67},"destroyObject",[43,1497,1498],{"class":63},"(bullet)\n",[43,1500,1501,1503,1505,1507,1509,1512],{"class":45,"line":93},[43,1502,682],{"class":53},[43,1504,64],{"class":63},[43,1506,1495],{"class":67},[43,1508,71],{"class":63},[43,1510,1511],{"class":74},"'hud-temp'",[43,1513,126],{"class":63},[43,1515,1516,1518,1520,1523],{"class":45,"line":100},[43,1517,682],{"class":53},[43,1519,64],{"class":63},[43,1521,1522],{"class":67},"destroyAllObjects",[43,1524,241],{"class":63},[15,1526,1527,1528,1531,1532,1535,1536,1539],{},"Usuwanie jest kolejkowane (",[18,1529,1530],{},"pendingDestroy",") i wykonywane na końcu klatki: potomkowie liść-pierwszy → ",[18,1533,1534],{},"onDestroy"," komponentów → usunięcie z indeksu → ",[18,1537,1538],{},"render.destroy",". Nigdy nie mutujesz listy obiektów w trakcie iteracji.",[1541,1542,1543],"style",{},"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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":39,"searchDepth":100,"depth":100,"links":1545},[1546,1547,1548,1549,1550,1554,1555],{"id":12,"depth":93,"text":13},{"id":203,"depth":93,"text":204},{"id":502,"depth":93,"text":503},{"id":643,"depth":93,"text":644},{"id":778,"depth":93,"text":779,"children":1551},[1552,1553],{"id":1117,"depth":100,"text":1118},{"id":1213,"depth":100,"text":1214},{"id":1406,"depth":93,"text":1407},{"id":1480,"depth":93,"text":1481},"GameObject, transformacje, tagi, hierarchia i komponenty z fazami systemowymi. Jak budować zachowania bez ECS.","md",{},"\u002Fgame-engine\u002Fcore\u002Fobjects",{"title":5,"description":1556},"01.game-engine\u002F05.core\u002F04.objects","zMHQWA6B8ZNmLNyoRM00fWusEJcV_gIp982tF55Y_oo",[1564,1569],{"title":1565,"path":1566,"stem":1567,"description":1568,"children":-1},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes","Cykl życia sceny, SceneManager, dane startowe, fabryki obiektów i automatyczne sprzątanie przy shutdown.",{"title":1570,"path":1571,"stem":1572,"description":1573,"children":-1},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events","EventBus, Scheduler, Timer i Random — komunikacja między systemami, zadania z uchwytami, izolacja błędów i deterministyczna losowość.",[1575,1686,1747],{"title":1576,"path":1577,"stem":1578,"children":1579},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1580,1582,1586,1590,1594,1611,1640,1653,1674,1678,1682],{"title":1581,"path":1577,"stem":1578},"Przegląd",{"title":1583,"path":1584,"stem":1585},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1587,"path":1588,"stem":1589},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1591,"path":1592,"stem":1593},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1595,"path":1596,"stem":1597,"children":1598,"page":1610},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1599,1603,1607,1608,1609],{"title":1600,"path":1601,"stem":1602},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1604,"path":1605,"stem":1606},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1565,"path":1566,"stem":1567},{"title":5,"path":1559,"stem":1561},{"title":1570,"path":1571,"stem":1572},false,{"title":1612,"path":1613,"stem":1614,"children":1615,"page":1610},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1616,1620,1624,1628,1632,1636],{"title":1617,"path":1618,"stem":1619},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":1621,"path":1622,"stem":1623},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":1625,"path":1626,"stem":1627},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":1629,"path":1630,"stem":1631},"Kamera (CameraManager)","\u002Fgame-engine\u002Fsystems\u002Fcamera","01.game-engine\u002F06.systems\u002F04.camera",{"title":1633,"path":1634,"stem":1635},"Audio (AudioManager)","\u002Fgame-engine\u002Fsystems\u002Faudio","01.game-engine\u002F06.systems\u002F05.audio",{"title":1637,"path":1638,"stem":1639},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens",{"title":1641,"path":1642,"stem":1643,"children":1644,"page":1610},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1645,1649],{"title":1646,"path":1647,"stem":1648},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1650,"path":1651,"stem":1652},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":1654,"path":1655,"stem":1656,"children":1657,"page":1610},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1658,1662,1666,1670],{"title":1659,"path":1660,"stem":1661},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1663,"path":1664,"stem":1665},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1667,"path":1668,"stem":1669},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1671,"path":1672,"stem":1673},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1675,"path":1676,"stem":1677},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1679,"path":1680,"stem":1681},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1683,"path":1684,"stem":1685},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1687,"path":1688,"stem":1689,"children":1690},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1691,1692,1695,1698,1719],{"title":1581,"path":1688,"stem":1689},{"title":1583,"path":1693,"stem":1694},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1587,"path":1696,"stem":1697},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1699,"path":1700,"stem":1701,"children":1702,"page":1610},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1703,1707,1711,1715],{"title":1704,"path":1705,"stem":1706},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1708,"path":1709,"stem":1710},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1712,"path":1713,"stem":1714},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1716,"path":1717,"stem":1718},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1720,"path":1721,"stem":1722,"children":1723,"page":1610},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1724,1728,1732,1736,1739,1743],{"title":1725,"path":1726,"stem":1727},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1729,"path":1730,"stem":1731},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1733,"path":1734,"stem":1735},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1675,"path":1737,"stem":1738},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1740,"path":1741,"stem":1742},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1744,"path":1745,"stem":1746},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1748,"path":1749,"stem":1750,"children":1751},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1752,1753,1756,1777,1790,1810],{"title":1581,"path":1749,"stem":1750},{"title":1583,"path":1754,"stem":1755},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1757,"path":1758,"stem":1759,"children":1760,"page":1610},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1761,1765,1769,1773],{"title":1762,"path":1763,"stem":1764},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1766,"path":1767,"stem":1768},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1770,"path":1771,"stem":1772},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1774,"path":1775,"stem":1776},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1778,"path":1779,"stem":1780,"children":1781,"page":1610},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1782,1786],{"title":1783,"path":1784,"stem":1785},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1787,"path":1788,"stem":1789},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1791,"path":1792,"stem":1793,"children":1794,"page":1610},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1795,1798,1802,1806],{"title":1591,"path":1796,"stem":1797},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1799,"path":1800,"stem":1801},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1803,"path":1804,"stem":1805},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1807,"path":1808,"stem":1809},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1811,"path":1812,"stem":1813},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307394]