๐ ์์ฉ ๋ฐ ๋ ์์๋ณด๊ธฐ
๐ฆ ๋ก์ปฌ ์ ์ฅ์์ ํฌํ ์ฌ์ฉํ๊ธฐ
๋ก์ปฌ ์ ์ฅ์๋ฅผ ์ฌ์ฉํ์ฌ, ํฌํ๋ก ๋งต์ ์ด๋ํด๋ ๋์ผํ ์ ๋ณด๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
์ ์ฅํ ๊ฐ์ ๋ ๊ฐ์ง ์ข ๋ฅ๋ก ๋๋ ์ ์์ต๋๋ค. ๊ณตํต์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฐ๊ณผ ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฐ์ ๋๋ค.
๊ณตํต์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฐ
์ ๊ทผ์ ์ฉ์ดํ๊ฒ ํ๋ช
_๋ณ์๋ช
์ผ๋ก ์์ดํ
์ด๋ฆ์ ์ง์ ๋ฐ ์ ์ฅํ ์ ์์ต๋๋ค.
์ง์ ํ ์์ดํ
์ด๋ฆ์ ํตํด ๋ก์ปฌ ์ ์ฅ์์์ ์ํ๋ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ฒ์์ด ์๊ธฐ์น ๋ชปํ๊ฒ ์ข ๋ฃ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋จน์ ๋๋ง๋ค ์ฆ๊ฐ์ ์ผ๋ก ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅํ๋๋ก ํฉ๋๋ค.
// ...
// ์์ง ์ ์ฅ์ด ๋์ง ์์ ๊ฒฝ์ฐ, null์ ๋ฐํ. null์ผ ๊ฒฝ์ฐ 0์ผ๋ก ์ด๊ธฐํ
let gemCount = localStorage.getItem("teamDave_gemCount") ?? 0;
const gemCountGUI = GUI.getObject("GEM_COUNT");
gemCountGUI.setText(`GEM: ${gemCount}`);
for(let i = 0; i < 6; i++) {
const gem = WORLD.getObject(`GEM_${i}`);
gem.onCollide(PLAYER, () => {
gemCount++;
gemCountGUI.setText(`GEM: ${gemCount}`);
gem.kill();
setTimeout(() => gem.revive(), 1000);
// ๋จน๋ ์ฆ์, ๋ก์ปฌ ์ ์ฅ์์ ์ ์ฅ
localStorage.setItem("teamDave_gemCount", gemCount);
});
}
// ...
๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฐ
์๋๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฐ์ ์ค๋ณต๋ ์ ์๋ ๊ฐ์ธ pid์ ๋ณ์๋ช ์ ๋ถ์ฌ ์์ดํ ์ด๋ฆ์ ์ง์ ๋ฐ ์ ์ฅํด์ค๋๋ค.
์์๊ฐ(์ซ์, ๋ฌธ์์ด, Boolean, โฆ)์ด ์๋ ๊ฐ์ JSON ๋ฌธ์์ด ํํ๋ก ์ ์ฅํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด JSON.stringify()
๋ก ๋ณํํ๊ณ , JSON.parse()
๋ก ๋ค์ ์ฌ์ฉํ ์ ์๋ ํํ๋ก ๋ณต์ํ๋ฉด ๋ฉ๋๋ค.
// ...
// ํ์ฌ ์ฌ์ดํธ์ URL์์ pid ๋ถ๋ถ์ ์ถ์ถ, ์ด๋ฅผ ํตํด ์์ดํ
์ด๋ฆ ์ง์
const urlParams = new URLSearchParams(window.location.search);
GLOBAL.PID = urlParams.get('pid');
// JSON ๋ฌธ์์ด๋ก ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฝ์ด์์, ์ฌ์ฉํ ์ ์๋ ํํ๋ก ๋ณ๊ฒฝ
const lastPosition = JSON.parse(localStorage.getItem(`${GLOBAL.PID}_lastPosition`));
if(lastPosition) {
lastPosition.y += 3;
PLAYER.position.copy(lastPosition);
PLAYER.body.needUpdate = true;
}
const portal = WORLD.getObject("PORTAL");
portal.onCollide(PLAYER, () => {
// ํ๋ ์ด์ด์ ๋ง์ง๋ง ์์น๋ฅผ JSON ๋ฌธ์์ด ํํ๋ก ๋ณ๊ฒฝํ์ฌ ์ ์ฅ
localStorage.setItem(`${GLOBAL.PID}_lastPosition`, JSON.stringify(PLAYER.position));
});
// ...
๐ฅ ๋ญํน ์์คํ ์ถ๊ฐํ๊ธฐ
Redbrick์์ ์ ๊ณตํ๋ ๋ด์ฅ ๋ชจ๋์ ํตํด ์์ฝ๊ฒ ๋ญํน ์์คํ
์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
ํ์ฌ ๋ญํน ํ์ ์ ํ์ ์ผ๋ฐ์ ์ธ ์ ์์ ์๊ฐ, ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ ์ ์ ์ฅํ๊ธฐ
์ ์๋ ์ ์๋ก ์ ์ฅ๋๋ฏ๋ก, ์ ์ ์์คํ
์ ์ค๊ณํ ๋ ์ ์๋ก ๊ณ์ฐ๋๋๋ก ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ ์๊ฐ ์๋ ๊ฒฝ์ฐ, ์์ ๋ถ๋ถ์ ๋ฐ์ฌ๋ฆผ๋์ด ์ ์๋ก ๋ณํ๋ฉ๋๋ค.
1. ์ผ๋ฐ์ ์ธ ์ ์ ์ ์ฅํ๊ธฐ
// ... ์ ์ ๋ณ์(myScore) ์ ์ธ ๋ฐ ์ ์๋์ด ์๊ณ , ์ด๋์ ๊ฐ ์ ์ ์ฆ๊ฐ
REDBRICK.Rank.saveScore({ score: myScore });
// ...
2. ์๊ฐ์ ์ ์๋ก ์ ์ฅํ๊ธฐ
์ ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํฐ ์์์ ์์ ์๋ก ์ ๋ ฌ๋์ด ์ ์ฅ๋ฉ๋๋ค.
ํ์ง๋ง ํ์์ดํ์ ๊ฒฝ์ฐ์๋ ์์์๋ก ์์๊ฐ ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ์ต์
์ ์ถ๊ฐํด์ฃผ์ด์ผ ํฉ๋๋ค. order: "ASC"
๋ณ๋์ ์ ๋ ฌ ์ต์
์ ์ถ๊ฐํ์ง ์๋ ๊ฒฝ์ฐ, ๊ธฐ๋ณธ๊ฐ์ธ order: "DESC"
๋ก ์ ์ฅ๋ฉ๋๋ค.
// Redbrick ๋ด์ฅ ๋ชจ๋ Timer ์ฌ์ฉํ๊ธฐ
const timer = new REDRBICK.Timer();
timer.start(); // ํ์ด๋จธ ์์
timer.pause(); // ํ์ด๋จธ ์ผ์์ ์ง
// ์ ์๋ ์ ์ ์ ์ฅ, ์๋ฅผ ๋ค์ด ํ์ด๋จธ๊ฐ 9.33์ด๋ผ๋ฉด ๋ฐ์ฌ๋ฆผํ์ฌ 9์ด๋ก ์ ์ฅ
REDBRICK.Rank.saveScore({ score: timer.getTime(), order: "ASC" });
// ...
์ ์ ์ ์ฅ์ ํ ๊ฒ์์ด ๋๋๋ฉด ํ ๋ฒ๋ง ํธ์ถ๋์ด์ผ ํฉ๋๋ค.
Update
๋ setInterval
๊ณผ ๊ฐ์ ๋ฃจํ์์ ํธ์ถํ๋ค๋ฉด ์กฐ๊ฑด์ ํตํด ํ ๋ฒ๋ง ํธ์ถ๋ ์ ์๊ฒ ํด์ฃผ์ธ์.
๋ญํน ๋ณด์ฌ์ฃผ๊ธฐ
1. ์ผ๋ฐ์ ์ธ ์ ์ ๋ญํน ๋ณด์ฌ์ฃผ๊ธฐ
REDBRICK.Rank.show();
2. ์๊ฐ์ผ๋ก ๋ญํน ๋ณด์ฌ์ฃผ๊ธฐ
์ ์๋ฅผ ์ ์ฅํ ๋, ์ ์ฉํ๋ ์ ๋ ฌ ์ต์ ์ ๊ทธ๋๋ก ์ ์ฉํด์ฃผ์ด์ผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ญํน์ด ํ์๋ฉ๋๋ค.
REDBRICK.Rank.show({ type: "time", order: "ASC" });
GUI์ ์ฐ๊ฒฐํ์ฌ ๋ญํน ๋ณด์ฌ์ฃผ๊ธฐ
GUI์ onClick()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ญํน์ ๋ณด์ฌ์ค ์ ์์ต๋๋ค.
this.onClick(() => {
REDBRICK.Rank.show({ type: "time", order: "ASC" });
});
๋ ์์ธํ ๋ด์ฉ์ Rank ํ์ด์ง๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์!
๐ก onCollide()
์ธ์ ๋ ๋ค๋ฅธ ์ถฉ๋ ๋ฐฉ์
๊ฑฐ๋ฆฌ ๊ณ์ฐ์ ํตํด ์ถฉ๋ ํ์ ์ ํ ์ ์์ต๋๋ค.
distanceTo()
๋ฉ์๋๋ฅผ ํตํด ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ๊ณ ์ถฉ๋ ํ์ ๊ฑฐ๋ฆฌ๋ณด๋ค ์์ ๊ฒฝ์ฐ, ์ถฉ๋ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋๋ค.
์ถฉ๋ ์ ์ถฉ๋ ๊ฐ์งํ ์ค๋ธ์ ํธ ๋ฐฐ์ด์์ ์ญ์ ํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ญ์ ๋ฅผ ํด๋ ์์๊ฐ ๋ณ๊ฒฝ๋์ง ์๊ฒ ๋ฐฐ์ด์ ๋งจ ๋ค์์๋ถํฐ ์ํํฉ๋๋ค.
// ... objects ๋ฐฐ์ด ์ ์ธ ๋ฐ ์ค๋ธ์ ํธ ์ถ๊ฐ
function Update(dt) {
for(let i = objects.length - 1; i >= 0; i--) {
// ํ๋ ์ด์ด ๊ธฐ์ค์ผ๋ก ํน์ ์ค๋ธ์ ํธ๋ค๊ณผ์ ๊ฑฐ๋ฆฌ ๊ณ์ฐ
if(PLAYER.position.distanceTo(objects[i].position) < 10) {
// ๊ฑฐ๋ฆฌ๊ฐ 10 ๋ฏธ๋ง์ด๋ฉด ์ถฉ๋ ํ์ ์ด ๋์ด, ํด๋น ์ค๋ธ์ ํธ๋ฅผ ์ญ์ ํ๊ณ ์ถฉ๋ ๊ฐ์งํ ์ค๋ธ์ ํธ ๋ฐฐ์ด์์๋ ์ญ์
objects[i].kill();
objects.splice(i, 1);
}
}
}
// ...