[{"data":1,"prerenderedAt":1418},["ShallowReactive",2],{"doc:\u002Fgame-engine\u002Fsystems\u002Faudio":3,"surround:\u002Fgame-engine\u002Fsystems\u002Faudio":1167,"navigation":1178},{"id":4,"title":5,"body":6,"description":1160,"extension":1161,"meta":1162,"navigation":82,"path":1163,"seo":1164,"stem":1165,"__hash__":1166},"docs\u002F01.game-engine\u002F06.systems\u002F05.audio.md","Audio (AudioManager)",{"type":7,"value":8,"toc":1149},"minimark",[9,14,21,28,31,41,143,147,264,269,273,356,361,522,526,758,762,776,1041,1051,1055,1091,1114,1118,1139,1145],[10,11,13],"h2",{"id":12},"kanały-i-głośność","Kanały i głośność",[15,16,17],"p",{},[18,19,20],"code",{},"AudioChannel = \"master\" | \"music\" | \"sfx\" | \"ui\"",[15,22,23,24,27],{},"Domyślne głośności: ",[18,25,26],{},"{ master: 1, music: 0.7, sfx: 1, ui: 0.9 }",".",[15,29,30],{},"Efektywna głośność dźwięku to iloczyn:",[32,33,39],"pre",{"className":34,"code":36,"language":37,"meta":38},[35],"language-text","effectiveVolume = master × channel × volume\n","text","",[18,40,36],{"__ignoreMap":38},[32,42,46],{"className":43,"code":44,"language":45,"meta":38,"style":38},"language-ts shiki shiki-themes github-light github-dark","const audio = this.getAudio()\n\naudio.setMasterVolume(0.8)\naudio.setVolume('music', 0.5)\naudio.setVolume('sfx', 1)\n","ts",[18,47,48,77,84,102,124],{"__ignoreMap":38},[49,50,53,57,61,64,67,70,74],"span",{"class":51,"line":52},"line",1,[49,54,56],{"class":55},"szBVR","const",[49,58,60],{"class":59},"sj4cs"," audio",[49,62,63],{"class":55}," =",[49,65,66],{"class":59}," this",[49,68,27],{"class":69},"sVt8B",[49,71,73],{"class":72},"sScJk","getAudio",[49,75,76],{"class":69},"()\n",[49,78,80],{"class":51,"line":79},2,[49,81,83],{"emptyLinePlaceholder":82},true,"\n",[49,85,87,90,93,96,99],{"class":51,"line":86},3,[49,88,89],{"class":69},"audio.",[49,91,92],{"class":72},"setMasterVolume",[49,94,95],{"class":69},"(",[49,97,98],{"class":59},"0.8",[49,100,101],{"class":69},")\n",[49,103,105,107,110,112,116,119,122],{"class":51,"line":104},4,[49,106,89],{"class":69},[49,108,109],{"class":72},"setVolume",[49,111,95],{"class":69},[49,113,115],{"class":114},"sZZnC","'music'",[49,117,118],{"class":69},", ",[49,120,121],{"class":59},"0.5",[49,123,101],{"class":69},[49,125,127,129,131,133,136,138,141],{"class":51,"line":126},5,[49,128,89],{"class":69},[49,130,109],{"class":72},[49,132,95],{"class":69},[49,134,135],{"class":114},"'sfx'",[49,137,118],{"class":69},[49,139,140],{"class":59},"1",[49,142,101],{"class":69},[10,144,146],{"id":145},"odtwarzanie","Odtwarzanie",[32,148,150],{"className":43,"code":149,"language":45,"meta":38,"style":38},"const handle = this.playSound('pickup', { channel: 'sfx', volume: 0.9 })\nconst music = this.playMusic('theme', { loop: true, volume: 0.6 })\n\nthis.stopMusic()\nthis.stopSounds()\nthis.stopSounds('game')\n",[18,151,152,187,221,225,237,248],{"__ignoreMap":38},[49,153,154,156,159,161,163,165,168,170,173,176,178,181,184],{"class":51,"line":52},[49,155,56],{"class":55},[49,157,158],{"class":59}," handle",[49,160,63],{"class":55},[49,162,66],{"class":59},[49,164,27],{"class":69},[49,166,167],{"class":72},"playSound",[49,169,95],{"class":69},[49,171,172],{"class":114},"'pickup'",[49,174,175],{"class":69},", { channel: ",[49,177,135],{"class":114},[49,179,180],{"class":69},", volume: ",[49,182,183],{"class":59},"0.9",[49,185,186],{"class":69}," })\n",[49,188,189,191,194,196,198,200,203,205,208,211,214,216,219],{"class":51,"line":79},[49,190,56],{"class":55},[49,192,193],{"class":59}," music",[49,195,63],{"class":55},[49,197,66],{"class":59},[49,199,27],{"class":69},[49,201,202],{"class":72},"playMusic",[49,204,95],{"class":69},[49,206,207],{"class":114},"'theme'",[49,209,210],{"class":69},", { loop: ",[49,212,213],{"class":59},"true",[49,215,180],{"class":69},[49,217,218],{"class":59},"0.6",[49,220,186],{"class":69},[49,222,223],{"class":51,"line":86},[49,224,83],{"emptyLinePlaceholder":82},[49,226,227,230,232,235],{"class":51,"line":104},[49,228,229],{"class":59},"this",[49,231,27],{"class":69},[49,233,234],{"class":72},"stopMusic",[49,236,76],{"class":69},[49,238,239,241,243,246],{"class":51,"line":126},[49,240,229],{"class":59},[49,242,27],{"class":69},[49,244,245],{"class":72},"stopSounds",[49,247,76],{"class":69},[49,249,251,253,255,257,259,262],{"class":51,"line":250},6,[49,252,229],{"class":59},[49,254,27],{"class":69},[49,256,245],{"class":72},[49,258,95],{"class":69},[49,260,261],{"class":114},"'game'",[49,263,101],{"class":69},[15,265,266,27],{},[18,267,268],{},"PlaySoundOptions = { channel?, volume?, loop?, rate?, owner? }",[10,270,272],{"id":271},"soundhandle","SoundHandle",[32,274,276],{"className":43,"code":275,"language":45,"meta":38,"style":38},"handle.id\nhandle.assetId\nhandle.channel\nhandle.owner\nhandle.loop\nhandle.rate\nhandle.volume\nhandle.effectiveVolume\nhandle.isPlaying\nhandle.statusName\nhandle.setVolume(0.5)\nhandle.stop()\n",[18,277,278,283,288,293,298,303,308,314,320,326,332,346],{"__ignoreMap":38},[49,279,280],{"class":51,"line":52},[49,281,282],{"class":69},"handle.id\n",[49,284,285],{"class":51,"line":79},[49,286,287],{"class":69},"handle.assetId\n",[49,289,290],{"class":51,"line":86},[49,291,292],{"class":69},"handle.channel\n",[49,294,295],{"class":51,"line":104},[49,296,297],{"class":69},"handle.owner\n",[49,299,300],{"class":51,"line":126},[49,301,302],{"class":69},"handle.loop\n",[49,304,305],{"class":51,"line":250},[49,306,307],{"class":69},"handle.rate\n",[49,309,311],{"class":51,"line":310},7,[49,312,313],{"class":69},"handle.volume\n",[49,315,317],{"class":51,"line":316},8,[49,318,319],{"class":69},"handle.effectiveVolume\n",[49,321,323],{"class":51,"line":322},9,[49,324,325],{"class":69},"handle.isPlaying\n",[49,327,329],{"class":51,"line":328},10,[49,330,331],{"class":69},"handle.statusName\n",[49,333,335,338,340,342,344],{"class":51,"line":334},11,[49,336,337],{"class":69},"handle.",[49,339,109],{"class":72},[49,341,95],{"class":69},[49,343,121],{"class":59},[49,345,101],{"class":69},[49,347,349,351,354],{"class":51,"line":348},12,[49,350,337],{"class":69},[49,352,353],{"class":72},"stop",[49,355,76],{"class":69},[357,358,360],"h3",{"id":359},"przykład-wyciszanie-muzyki-w-dialogu","Przykład: wyciszanie muzyki w dialogu",[32,362,364],{"className":43,"code":363,"language":45,"meta":38,"style":38},"class DialogScene extends Scene {\n  private music: SoundHandle | null = null\n\n  create() {\n    this.music = this.playMusic('dialog-theme', { loop: true })\n    this.music?.setVolume(0.3)\n  }\n\n  close() {\n    this.music?.stop()\n    this.getEvents().emit('dialog:closed')\n  }\n}\n",[18,365,366,383,408,412,420,448,464,469,473,480,490,512,516],{"__ignoreMap":38},[49,367,368,371,374,377,380],{"class":51,"line":52},[49,369,370],{"class":55},"class",[49,372,373],{"class":72}," DialogScene",[49,375,376],{"class":55}," extends",[49,378,379],{"class":72}," Scene",[49,381,382],{"class":69}," {\n",[49,384,385,388,391,394,397,400,403,405],{"class":51,"line":79},[49,386,387],{"class":55},"  private",[49,389,193],{"class":390},"s4XuR",[49,392,393],{"class":55},":",[49,395,396],{"class":72}," SoundHandle",[49,398,399],{"class":55}," |",[49,401,402],{"class":59}," null",[49,404,63],{"class":55},[49,406,407],{"class":59}," null\n",[49,409,410],{"class":51,"line":86},[49,411,83],{"emptyLinePlaceholder":82},[49,413,414,417],{"class":51,"line":104},[49,415,416],{"class":72},"  create",[49,418,419],{"class":69},"() {\n",[49,421,422,425,428,431,433,435,437,439,442,444,446],{"class":51,"line":126},[49,423,424],{"class":59},"    this",[49,426,427],{"class":69},".music ",[49,429,430],{"class":55},"=",[49,432,66],{"class":59},[49,434,27],{"class":69},[49,436,202],{"class":72},[49,438,95],{"class":69},[49,440,441],{"class":114},"'dialog-theme'",[49,443,210],{"class":69},[49,445,213],{"class":59},[49,447,186],{"class":69},[49,449,450,452,455,457,459,462],{"class":51,"line":250},[49,451,424],{"class":59},[49,453,454],{"class":69},".music?.",[49,456,109],{"class":72},[49,458,95],{"class":69},[49,460,461],{"class":59},"0.3",[49,463,101],{"class":69},[49,465,466],{"class":51,"line":310},[49,467,468],{"class":69},"  }\n",[49,470,471],{"class":51,"line":316},[49,472,83],{"emptyLinePlaceholder":82},[49,474,475,478],{"class":51,"line":322},[49,476,477],{"class":72},"  close",[49,479,419],{"class":69},[49,481,482,484,486,488],{"class":51,"line":328},[49,483,424],{"class":59},[49,485,454],{"class":69},[49,487,353],{"class":72},[49,489,76],{"class":69},[49,491,492,494,496,499,502,505,507,510],{"class":51,"line":334},[49,493,424],{"class":59},[49,495,27],{"class":69},[49,497,498],{"class":72},"getEvents",[49,500,501],{"class":69},"().",[49,503,504],{"class":72},"emit",[49,506,95],{"class":69},[49,508,509],{"class":114},"'dialog:closed'",[49,511,101],{"class":69},[49,513,514],{"class":51,"line":348},[49,515,468],{"class":69},[49,517,519],{"class":51,"line":518},13,[49,520,521],{"class":69},"}\n",[10,523,525],{"id":524},"api","API",[32,527,529],{"className":43,"code":528,"language":45,"meta":38,"style":38},"audio.play(assetId, options?): SoundHandle | null\naudio.playMusic(assetId, options?): SoundHandle | null\naudio.stopMusic(); audio.getMusic()\naudio.stop(handle): boolean; audio.stopAsset(assetId): number\naudio.stopOwner(owner): number; audio.stopAll()\naudio.pauseAll(); audio.resumeAll(); audio.isPaused()\n\naudio.setVolume(channel, value); audio.setMasterVolume(value)\naudio.getVolume(channel?); audio.getVolumes()\naudio.setMuted(bool); audio.mute(); audio.unmute(); audio.toggleMute(); audio.isMuted()\n\naudio.isUnlocked(); audio.unlock(): boolean; audio.onUnlock(listener)\naudio.getHandleCount(); audio.getPendingCount(); audio.getState(): AudioState\n",[18,530,531,557,577,591,606,621,640,644,658,678,708,712,738],{"__ignoreMap":38},[49,532,533,535,538,541,544,547,549,552,555],{"class":51,"line":52},[49,534,89],{"class":69},[49,536,537],{"class":72},"play",[49,539,540],{"class":69},"(assetId, options",[49,542,543],{"class":55},"?",[49,545,546],{"class":69},")",[49,548,393],{"class":55},[49,550,551],{"class":69}," SoundHandle ",[49,553,554],{"class":55},"|",[49,556,407],{"class":59},[49,558,559,561,563,565,567,569,571,573,575],{"class":51,"line":79},[49,560,89],{"class":69},[49,562,202],{"class":72},[49,564,540],{"class":69},[49,566,543],{"class":55},[49,568,546],{"class":69},[49,570,393],{"class":55},[49,572,551],{"class":69},[49,574,554],{"class":55},[49,576,407],{"class":59},[49,578,579,581,583,586,589],{"class":51,"line":86},[49,580,89],{"class":69},[49,582,234],{"class":72},[49,584,585],{"class":69},"(); audio.",[49,587,588],{"class":72},"getMusic",[49,590,76],{"class":69},[49,592,593,595,597,600,603],{"class":51,"line":104},[49,594,89],{"class":69},[49,596,353],{"class":72},[49,598,599],{"class":69},"(handle): boolean; audio.",[49,601,602],{"class":72},"stopAsset",[49,604,605],{"class":69},"(assetId): number\n",[49,607,608,610,613,616,619],{"class":51,"line":126},[49,609,89],{"class":69},[49,611,612],{"class":72},"stopOwner",[49,614,615],{"class":69},"(owner): number; audio.",[49,617,618],{"class":72},"stopAll",[49,620,76],{"class":69},[49,622,623,625,628,630,633,635,638],{"class":51,"line":250},[49,624,89],{"class":69},[49,626,627],{"class":72},"pauseAll",[49,629,585],{"class":69},[49,631,632],{"class":72},"resumeAll",[49,634,585],{"class":69},[49,636,637],{"class":72},"isPaused",[49,639,76],{"class":69},[49,641,642],{"class":51,"line":310},[49,643,83],{"emptyLinePlaceholder":82},[49,645,646,648,650,653,655],{"class":51,"line":316},[49,647,89],{"class":69},[49,649,109],{"class":72},[49,651,652],{"class":69},"(channel, value); audio.",[49,654,92],{"class":72},[49,656,657],{"class":69},"(value)\n",[49,659,660,662,665,668,670,673,676],{"class":51,"line":322},[49,661,89],{"class":69},[49,663,664],{"class":72},"getVolume",[49,666,667],{"class":69},"(channel",[49,669,543],{"class":55},[49,671,672],{"class":69},"); audio.",[49,674,675],{"class":72},"getVolumes",[49,677,76],{"class":69},[49,679,680,682,685,688,691,693,696,698,701,703,706],{"class":51,"line":328},[49,681,89],{"class":69},[49,683,684],{"class":72},"setMuted",[49,686,687],{"class":69},"(bool); audio.",[49,689,690],{"class":72},"mute",[49,692,585],{"class":69},[49,694,695],{"class":72},"unmute",[49,697,585],{"class":69},[49,699,700],{"class":72},"toggleMute",[49,702,585],{"class":69},[49,704,705],{"class":72},"isMuted",[49,707,76],{"class":69},[49,709,710],{"class":51,"line":334},[49,711,83],{"emptyLinePlaceholder":82},[49,713,714,716,719,721,724,727,729,732,735],{"class":51,"line":348},[49,715,89],{"class":69},[49,717,718],{"class":72},"isUnlocked",[49,720,585],{"class":69},[49,722,723],{"class":72},"unlock",[49,725,726],{"class":69},"()",[49,728,393],{"class":55},[49,730,731],{"class":69}," boolean; audio.",[49,733,734],{"class":72},"onUnlock",[49,736,737],{"class":69},"(listener)\n",[49,739,740,742,745,747,750,752,755],{"class":51,"line":518},[49,741,89],{"class":69},[49,743,744],{"class":72},"getHandleCount",[49,746,585],{"class":69},[49,748,749],{"class":72},"getPendingCount",[49,751,585],{"class":69},[49,753,754],{"class":72},"getState",[49,756,757],{"class":69},"(): AudioState\n",[10,759,761],{"id":760},"blokada-autoplay-i-unlock","Blokada autoplay i unlock",[15,763,764,765,768,769,772,773,393],{},"Przeglądarki blokują audio bez gestu użytkownika. Żądania odtwarzania trafiają wtedy do kolejki ",[18,766,767],{},"pending",", a ",[18,770,771],{},"unlock()"," odtwarza je po kolei i emituje ",[18,774,775],{},"audio:unlocked",[32,777,779],{"className":43,"code":778,"language":45,"meta":38,"style":38},"class MenuScene extends Scene {\n  create() {\n    this.playMusic('theme', { loop: true })\n\n    const start = this.createText('start', { x: 640, y: 500, text: 'Kliknij, aby zacząć' })\n    start.setRender({ type: 'text', text: 'Kliknij, aby zacząć', interactive: true })\n\n    this.getEvents().on('audio:unlocked', () => {\n      this.getLogger().info('Audio odblokowane')\n    })\n  }\n\n  update() {\n    if (this.getInput().getPointer().isDown) {\n      this.getAudio().unlock()\n      this.getEvents().emit('request:scene', { to: 'game' })\n    }\n  }\n}\n",[18,780,781,794,800,818,822,864,889,893,919,941,946,950,954,961,985,1000,1025,1031,1036],{"__ignoreMap":38},[49,782,783,785,788,790,792],{"class":51,"line":52},[49,784,370],{"class":55},[49,786,787],{"class":72}," MenuScene",[49,789,376],{"class":55},[49,791,379],{"class":72},[49,793,382],{"class":69},[49,795,796,798],{"class":51,"line":79},[49,797,416],{"class":72},[49,799,419],{"class":69},[49,801,802,804,806,808,810,812,814,816],{"class":51,"line":86},[49,803,424],{"class":59},[49,805,27],{"class":69},[49,807,202],{"class":72},[49,809,95],{"class":69},[49,811,207],{"class":114},[49,813,210],{"class":69},[49,815,213],{"class":59},[49,817,186],{"class":69},[49,819,820],{"class":51,"line":104},[49,821,83],{"emptyLinePlaceholder":82},[49,823,824,827,830,832,834,836,839,841,844,847,850,853,856,859,862],{"class":51,"line":126},[49,825,826],{"class":55},"    const",[49,828,829],{"class":59}," start",[49,831,63],{"class":55},[49,833,66],{"class":59},[49,835,27],{"class":69},[49,837,838],{"class":72},"createText",[49,840,95],{"class":69},[49,842,843],{"class":114},"'start'",[49,845,846],{"class":69},", { x: ",[49,848,849],{"class":59},"640",[49,851,852],{"class":69},", y: ",[49,854,855],{"class":59},"500",[49,857,858],{"class":69},", text: ",[49,860,861],{"class":114},"'Kliknij, aby zacząć'",[49,863,186],{"class":69},[49,865,866,869,872,875,878,880,882,885,887],{"class":51,"line":250},[49,867,868],{"class":69},"    start.",[49,870,871],{"class":72},"setRender",[49,873,874],{"class":69},"({ type: ",[49,876,877],{"class":114},"'text'",[49,879,858],{"class":69},[49,881,861],{"class":114},[49,883,884],{"class":69},", interactive: ",[49,886,213],{"class":59},[49,888,186],{"class":69},[49,890,891],{"class":51,"line":310},[49,892,83],{"emptyLinePlaceholder":82},[49,894,895,897,899,901,903,906,908,911,914,917],{"class":51,"line":316},[49,896,424],{"class":59},[49,898,27],{"class":69},[49,900,498],{"class":72},[49,902,501],{"class":69},[49,904,905],{"class":72},"on",[49,907,95],{"class":69},[49,909,910],{"class":114},"'audio:unlocked'",[49,912,913],{"class":69},", () ",[49,915,916],{"class":55},"=>",[49,918,382],{"class":69},[49,920,921,924,926,929,931,934,936,939],{"class":51,"line":322},[49,922,923],{"class":59},"      this",[49,925,27],{"class":69},[49,927,928],{"class":72},"getLogger",[49,930,501],{"class":69},[49,932,933],{"class":72},"info",[49,935,95],{"class":69},[49,937,938],{"class":114},"'Audio odblokowane'",[49,940,101],{"class":69},[49,942,943],{"class":51,"line":328},[49,944,945],{"class":69},"    })\n",[49,947,948],{"class":51,"line":334},[49,949,468],{"class":69},[49,951,952],{"class":51,"line":348},[49,953,83],{"emptyLinePlaceholder":82},[49,955,956,959],{"class":51,"line":518},[49,957,958],{"class":72},"  update",[49,960,419],{"class":69},[49,962,964,967,970,972,974,977,979,982],{"class":51,"line":963},14,[49,965,966],{"class":55},"    if",[49,968,969],{"class":69}," (",[49,971,229],{"class":59},[49,973,27],{"class":69},[49,975,976],{"class":72},"getInput",[49,978,501],{"class":69},[49,980,981],{"class":72},"getPointer",[49,983,984],{"class":69},"().isDown) {\n",[49,986,988,990,992,994,996,998],{"class":51,"line":987},15,[49,989,923],{"class":59},[49,991,27],{"class":69},[49,993,73],{"class":72},[49,995,501],{"class":69},[49,997,723],{"class":72},[49,999,76],{"class":69},[49,1001,1003,1005,1007,1009,1011,1013,1015,1018,1021,1023],{"class":51,"line":1002},16,[49,1004,923],{"class":59},[49,1006,27],{"class":69},[49,1008,498],{"class":72},[49,1010,501],{"class":69},[49,1012,504],{"class":72},[49,1014,95],{"class":69},[49,1016,1017],{"class":114},"'request:scene'",[49,1019,1020],{"class":69},", { to: ",[49,1022,261],{"class":114},[49,1024,186],{"class":69},[49,1026,1028],{"class":51,"line":1027},17,[49,1029,1030],{"class":69},"    }\n",[49,1032,1034],{"class":51,"line":1033},18,[49,1035,468],{"class":69},[49,1037,1039],{"class":51,"line":1038},19,[49,1040,521],{"class":69},[1042,1043,1045],"callout",{"type":1044},"tip",[15,1046,1047,1048,1050],{},"Nie walcz z blokadą autoplay — kolejka ",[18,1049,767],{}," jest po to, żeby muzyka wystartowała dokładnie przy pierwszym kliknięciu, bez podwójnego odtwarzania i bez błędów w konsoli.",[10,1052,1054],{"id":1053},"mute-i-pauza","Mute i pauza",[32,1056,1058],{"className":43,"code":1057,"language":45,"meta":38,"style":38},"audio.toggleMute()\n\nengine.pause()\nengine.resume()\n",[18,1059,1060,1068,1072,1082],{"__ignoreMap":38},[49,1061,1062,1064,1066],{"class":51,"line":52},[49,1063,89],{"class":69},[49,1065,700],{"class":72},[49,1067,76],{"class":69},[49,1069,1070],{"class":51,"line":79},[49,1071,83],{"emptyLinePlaceholder":82},[49,1073,1074,1077,1080],{"class":51,"line":86},[49,1075,1076],{"class":69},"engine.",[49,1078,1079],{"class":72},"pause",[49,1081,76],{"class":69},[49,1083,1084,1086,1089],{"class":51,"line":104},[49,1085,1076],{"class":69},[49,1087,1088],{"class":72},"resume",[49,1090,76],{"class":69},[15,1092,1093,1096,1097,118,1100,1103,1104,1107,1108,1111,1112,27],{},[18,1094,1095],{},"engine.pause()"," woła ",[18,1098,1099],{},"audio.pauseAll()",[18,1101,1102],{},"resume()"," — ",[18,1105,1106],{},"audio.resumeAll()",". Każdy dźwięk ma właściciela (scenę), więc ",[18,1109,1110],{},"shutdown()"," sceny zatrzymuje tylko jej dźwięki przez ",[18,1113,612],{},[10,1115,1117],{"id":1116},"stan-audio","Stan audio",[32,1119,1121],{"className":43,"code":1120,"language":45,"meta":38,"style":38},"const state = audio.getState()\n",[18,1122,1123],{"__ignoreMap":38},[49,1124,1125,1127,1130,1132,1135,1137],{"class":51,"line":52},[49,1126,56],{"class":55},[49,1128,1129],{"class":59}," state",[49,1131,63],{"class":55},[49,1133,1134],{"class":69}," audio.",[49,1136,754],{"class":72},[49,1138,76],{"class":69},[15,1140,1141,1144],{},[18,1142,1143],{},"AudioState"," zawiera kanały, głośności, mute, unlock i liczby uchwytów — gotowe do nakładki debug i raportu diagnostycznego.",[1146,1147,1148],"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":38,"searchDepth":86,"depth":86,"links":1150},[1151,1152,1153,1156,1157,1158,1159],{"id":12,"depth":79,"text":13},{"id":145,"depth":79,"text":146},{"id":271,"depth":79,"text":272,"children":1154},[1155],{"id":359,"depth":86,"text":360},{"id":524,"depth":79,"text":525},{"id":760,"depth":79,"text":761},{"id":1053,"depth":79,"text":1054},{"id":1116,"depth":79,"text":1117},"Cztery kanały, efektywna głośność, SoundHandle, mute i kolejka autoplay. Jak grać dźwięki bez problemów z blokadą przeglądarki.","md",{},"\u002Fgame-engine\u002Fsystems\u002Faudio",{"title":5,"description":1160},"01.game-engine\u002F06.systems\u002F05.audio","y0zPrWLQI3azfvei2WkoLuvQspFfwRHXsLcDYIApzYU",[1168,1173],{"title":1169,"path":1170,"stem":1171,"description":1172,"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.",{"title":1174,"path":1175,"stem":1176,"description":1177,"children":-1},"Tweeny i easing","\u002Fgame-engine\u002Fsystems\u002Ftweens","01.game-engine\u002F06.systems\u002F06.tweens","to, from, delay, sekwencje, 28 krzywych easingu, repeat\u002Fyoyo i anulowanie. Animacje właściwości bez dotykania renderera.",[1179,1290,1351],{"title":1180,"path":1181,"stem":1182,"children":1183},"2D Game Engine","\u002Fgame-engine","01.game-engine\u002F01.index",[1184,1186,1190,1194,1198,1224,1244,1257,1278,1282,1286],{"title":1185,"path":1181,"stem":1182},"Przegląd",{"title":1187,"path":1188,"stem":1189},"Szybki start","\u002Fgame-engine\u002Fgetting-started","01.game-engine\u002F02.getting-started",{"title":1191,"path":1192,"stem":1193},"Konfiguracja","\u002Fgame-engine\u002Fconfiguration","01.game-engine\u002F03.configuration",{"title":1195,"path":1196,"stem":1197},"Architektura","\u002Fgame-engine\u002Farchitecture","01.game-engine\u002F04.architecture",{"title":1199,"path":1200,"stem":1201,"children":1202,"page":1223},"Rdzeń","\u002Fgame-engine\u002Fcore","01.game-engine\u002F05.core",[1203,1207,1211,1215,1219],{"title":1204,"path":1205,"stem":1206},"Silnik i cykl życia","\u002Fgame-engine\u002Fcore\u002Fengine","01.game-engine\u002F05.core\u002F01.engine",{"title":1208,"path":1209,"stem":1210},"Czas i pętla gry","\u002Fgame-engine\u002Fcore\u002Ftime","01.game-engine\u002F05.core\u002F02.time",{"title":1212,"path":1213,"stem":1214},"Sceny","\u002Fgame-engine\u002Fcore\u002Fscenes","01.game-engine\u002F05.core\u002F03.scenes",{"title":1216,"path":1217,"stem":1218},"Obiekty i komponenty","\u002Fgame-engine\u002Fcore\u002Fobjects","01.game-engine\u002F05.core\u002F04.objects",{"title":1220,"path":1221,"stem":1222},"Zdarzenia i harmonogram","\u002Fgame-engine\u002Fcore\u002Fevents","01.game-engine\u002F05.core\u002F05.events",false,{"title":1225,"path":1226,"stem":1227,"children":1228,"page":1223},"Systemy","\u002Fgame-engine\u002Fsystems","01.game-engine\u002F06.systems",[1229,1233,1237,1241,1242,1243],{"title":1230,"path":1231,"stem":1232},"Zasoby (AssetManager)","\u002Fgame-engine\u002Fsystems\u002Fassets","01.game-engine\u002F06.systems\u002F01.assets",{"title":1234,"path":1235,"stem":1236},"Wejście (InputManager)","\u002Fgame-engine\u002Fsystems\u002Finput","01.game-engine\u002F06.systems\u002F02.input",{"title":1238,"path":1239,"stem":1240},"Fizyka (PhysicsManager)","\u002Fgame-engine\u002Fsystems\u002Fphysics","01.game-engine\u002F06.systems\u002F03.physics",{"title":1169,"path":1170,"stem":1171},{"title":5,"path":1163,"stem":1165},{"title":1174,"path":1175,"stem":1176},{"title":1245,"path":1246,"stem":1247,"children":1248,"page":1223},"Dane i zapisy","\u002Fgame-engine\u002Fdata","01.game-engine\u002F07.data",[1249,1253],{"title":1250,"path":1251,"stem":1252},"Format projektu","\u002Fgame-engine\u002Fdata\u002Fproject-format","01.game-engine\u002F07.data\u002F01.project-format",{"title":1254,"path":1255,"stem":1256},"Zapisy gry","\u002Fgame-engine\u002Fdata\u002Fsaves","01.game-engine\u002F07.data\u002F02.saves",{"title":1258,"path":1259,"stem":1260,"children":1261,"page":1223},"Zaawansowane","\u002Fgame-engine\u002Fadvanced","01.game-engine\u002F08.advanced",[1262,1266,1270,1274],{"title":1263,"path":1264,"stem":1265},"Pluginy","\u002Fgame-engine\u002Fadvanced\u002Fplugins","01.game-engine\u002F08.advanced\u002F01.plugins",{"title":1267,"path":1268,"stem":1269},"WebAssembly","\u002Fgame-engine\u002Fadvanced\u002Fwasm","01.game-engine\u002F08.advanced\u002F02.wasm",{"title":1271,"path":1272,"stem":1273},"Debugowanie","\u002Fgame-engine\u002Fadvanced\u002Fdebugging","01.game-engine\u002F08.advanced\u002F03.debugging",{"title":1275,"path":1276,"stem":1277},"Wydajność i benchmarki","\u002Fgame-engine\u002Fadvanced\u002Fperformance","01.game-engine\u002F08.advanced\u002F04.performance",{"title":1279,"path":1280,"stem":1281},"Wdrożenie","\u002Fgame-engine\u002Fdeployment","01.game-engine\u002F09.deployment",{"title":1283,"path":1284,"stem":1285},"Przykłady","\u002Fgame-engine\u002Fexamples","01.game-engine\u002F10.examples",{"title":1287,"path":1288,"stem":1289},"Decyzje architektoniczne","\u002Fgame-engine\u002Fadr","01.game-engine\u002F11.adr",{"title":1291,"path":1292,"stem":1293,"children":1294},"Reverse Proxy","\u002Freverse-proxy","02.reverse-proxy\u002F01.index",[1295,1296,1299,1302,1323],{"title":1185,"path":1292,"stem":1293},{"title":1187,"path":1297,"stem":1298},"\u002Freverse-proxy\u002Fgetting-started","02.reverse-proxy\u002F02.getting-started",{"title":1191,"path":1300,"stem":1301},"\u002Freverse-proxy\u002Fconfiguration","02.reverse-proxy\u002F03.configuration",{"title":1303,"path":1304,"stem":1305,"children":1306,"page":1223},"Ruch i odporność","\u002Freverse-proxy\u002Ftraffic","02.reverse-proxy\u002F04.traffic",[1307,1311,1315,1319],{"title":1308,"path":1309,"stem":1310},"Load balancing","\u002Freverse-proxy\u002Ftraffic\u002Fload-balancing","02.reverse-proxy\u002F04.traffic\u002F01.load-balancing",{"title":1312,"path":1313,"stem":1314},"Health checks","\u002Freverse-proxy\u002Ftraffic\u002Fhealth-checks","02.reverse-proxy\u002F04.traffic\u002F02.health-checks",{"title":1316,"path":1317,"stem":1318},"Circuit breaker i retry","\u002Freverse-proxy\u002Ftraffic\u002Fresilience","02.reverse-proxy\u002F04.traffic\u002F03.resilience",{"title":1320,"path":1321,"stem":1322},"Rate limiting","\u002Freverse-proxy\u002Ftraffic\u002Frate-limiting","02.reverse-proxy\u002F04.traffic\u002F04.rate-limiting",{"title":1324,"path":1325,"stem":1326,"children":1327,"page":1223},"Operacje i wdrożenie","\u002Freverse-proxy\u002Foperations","02.reverse-proxy\u002F05.operations",[1328,1332,1336,1340,1343,1347],{"title":1329,"path":1330,"stem":1331},"Admin API","\u002Freverse-proxy\u002Foperations\u002Fadmin-api","02.reverse-proxy\u002F05.operations\u002F01.admin-api",{"title":1333,"path":1334,"stem":1335},"Metryki i monitoring","\u002Freverse-proxy\u002Foperations\u002Fobservability","02.reverse-proxy\u002F05.operations\u002F02.observability",{"title":1337,"path":1338,"stem":1339},"Bezpieczeństwo","\u002Freverse-proxy\u002Foperations\u002Fsecurity","02.reverse-proxy\u002F05.operations\u002F03.security",{"title":1279,"path":1341,"stem":1342},"\u002Freverse-proxy\u002Foperations\u002Fdeployment","02.reverse-proxy\u002F05.operations\u002F04.deployment",{"title":1344,"path":1345,"stem":1346},"Benchmarki","\u002Freverse-proxy\u002Foperations\u002Fbenchmarks","02.reverse-proxy\u002F05.operations\u002F05.benchmarks",{"title":1348,"path":1349,"stem":1350},"Troubleshooting","\u002Freverse-proxy\u002Foperations\u002Ftroubleshooting","02.reverse-proxy\u002F05.operations\u002F06.troubleshooting",{"title":1352,"path":1353,"stem":1354,"children":1355},"Vector Engine","\u002Fvector-engine","03.vector-engine\u002F01.index",[1356,1357,1360,1381,1394,1414],{"title":1185,"path":1353,"stem":1354},{"title":1187,"path":1358,"stem":1359},"\u002Fvector-engine\u002Fgetting-started","03.vector-engine\u002F02.getting-started",{"title":1361,"path":1362,"stem":1363,"children":1364,"page":1223},"Scena","\u002Fvector-engine\u002Fscene","03.vector-engine\u002F03.scene",[1365,1369,1373,1377],{"title":1366,"path":1367,"stem":1368},"Format sceny 1.0","\u002Fvector-engine\u002Fscene\u002Fscene-format","03.vector-engine\u002F03.scene\u002F01.scene-format",{"title":1370,"path":1371,"stem":1372},"Obiekty sceny","\u002Fvector-engine\u002Fscene\u002Fobjects","03.vector-engine\u002F03.scene\u002F02.objects",{"title":1374,"path":1375,"stem":1376},"Gradienty i warstwy","\u002Fvector-engine\u002Fscene\u002Fgradients-layers","03.vector-engine\u002F03.scene\u002F03.gradients-layers",{"title":1378,"path":1379,"stem":1380},"Przykłady scen","\u002Fvector-engine\u002Fscene\u002Fexamples","03.vector-engine\u002F03.scene\u002F04.examples",{"title":1382,"path":1383,"stem":1384,"children":1385,"page":1223},"Eksport","\u002Fvector-engine\u002Fexport","03.vector-engine\u002F04.export",[1386,1390],{"title":1387,"path":1388,"stem":1389},"Formaty eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-formats","03.vector-engine\u002F04.export\u002F01.export-formats",{"title":1391,"path":1392,"stem":1393},"Proces eksportu","\u002Fvector-engine\u002Fexport\u002Fexport-workflow","03.vector-engine\u002F04.export\u002F02.export-workflow",{"title":1395,"path":1396,"stem":1397,"children":1398,"page":1223},"Wnętrze silnika","\u002Fvector-engine\u002Finternals","03.vector-engine\u002F05.internals",[1399,1402,1406,1410],{"title":1195,"path":1400,"stem":1401},"\u002Fvector-engine\u002Finternals\u002Farchitecture","03.vector-engine\u002F05.internals\u002F01.architecture",{"title":1403,"path":1404,"stem":1405},"WebAssembly i workery","\u002Fvector-engine\u002Finternals\u002Fwasm","03.vector-engine\u002F05.internals\u002F02.wasm",{"title":1407,"path":1408,"stem":1409},"Workspace i panele","\u002Fvector-engine\u002Finternals\u002Fworkspace","03.vector-engine\u002F05.internals\u002F03.workspace",{"title":1411,"path":1412,"stem":1413},"Breakpointy","\u002Fvector-engine\u002Finternals\u002Fbreakpoints","03.vector-engine\u002F05.internals\u002F04.breakpoints",{"title":1415,"path":1416,"stem":1417},"Wdrożenie na Vercel","\u002Fvector-engine\u002Fdeployment","03.vector-engine\u002F06.deployment",1793986307694]