지난 프로젝트를 업데이트하기 위해 배운 것을 적용하기
12988 단어 gamedevjavascript
내가 추가/변경한 것들
창 크기에 따라 게임 크기 조정
처음 게임을 만들 때 캔버스의 높이와 너비를 하드코딩했습니다. 다른 창 크기로 크기를 조정하는 방법을 몰랐고 크기를 변경하면 게임 스프라이트의 모양과 충돌 감지에 영향을 미쳤습니다. 마감일이 있었기 때문에 완료해야 할 다른 측면에 집중하기 위해 그대로 두었습니다.
JS13k용 게임을 만들 때 크기를 조정할 수 있기를 원했기 때문에 많은 조사를 했고 그 방법에 대한 글을 썼습니다. 이 기술을 사용함으로써 기본 게임 플레이 해상도가 캔버스 해상도와 별개이기 때문에 스프라이트 크기나 충돌 감지를 변경할 필요가 없었습니다.
JavaScript로 배경 만들기
초기 배경은 우주에 있는 매우 큰 .png 별이었습니다. JS13k 게임의 경우 JavaScript를 사용하여 별이 빛나는 우주 배경을 만들었으므로 여기에서도 이미지 대신 해당 기술을 사용하기로 결정했습니다.
이 효과를 만들기 위해 모든 게임 플레이가 포함된 캔버스 뒤에 별도의 캔버스를 추가했습니다. 창 크기를 반복하고 임의의 x/y 지점에 흰색 픽셀을 배치하는 함수를 만들었습니다. 루프 변수를 32씩 증가시켜 별의 간격을 두었습니다. 32는 내가 함께 갔던 임의의 값이었습니다. 원하는 별의 수에 따라 값을 늘리거나 줄일 수 있습니다.
function buildBackground(ctx) {
for (let i = 0; i < window.innerWidth; i += 32) {
for (let j = 0; j < window.innerHeight; j += 32) {
const randX = Math.floor(Math.random() * window.innerWidth);
const randY = Math.floor(Math.random() * window.innerHeight);
ctx.fillStyle = 'white';
ctx.fillRect(randX, randY, 1, 1);
}
}
}
이 함수는 시작 시 한 번 실행되며 이 캔버스에 다시 그릴 필요가 없습니다.
P-폭탄
이것은 제가 처음에 정말로 추가하고 싶었지만 시간이 다 된 기능입니다. 내 다른 개인 Pixel이 Penny의 꿈에서 역할을 맡는다면 멋질 것이라고 생각했습니다. 이제 Penny는 3개의 P-Bomb을 배치할 수 있으며 Pixel은 화면을 빠르게 가로질러 적 다람쥐를 향해 총을 쏠 것입니다.
P-Bomb을 생성하기 위해 P-Bomb이 300ms마다 새로운
Player
을 생성해야 하므로 현재 활성화된 P-Bomb이 있는지, 얼마나 남아 있는지, 간격 ID를 추적하기 위해 BulletObject
클래스에 몇 가지 속성을 추가했습니다. .완전히 새로운 클래스를 만들고 충돌을 추가하는 대신 P-Bomb 자체를 또 다른 "플레이어"로 만들었지만 사용자가 이동을 제어하는 대신
moveLeft
속성을 true
으로 설정하여 자체적으로 화면을 가로질러 이동합니다. .(하드코딩된 값은 내 스프라이트 시트의 위치에 해당하며 더 적절한 크기를 위해 절반으로 나뉩니다.)
pBombShootAction(gameWidth, gameHeight) {
// create
this.pBombs--;
this.pBomb = new Player(gameWidth, gameHeight);
this.pBomb.spriteObj.sourceX = 224;
this.pBomb.spriteObj.sourceWidth = 219;
this.pBomb.spriteObj.sourceHeight = 157;
this.pBomb.spriteObj.x = gameWidth + 219;
this.pBomb.spriteObj.y = gameHeight - 157 / 2 - 30;
this.pBomb.spriteObj.width = 219 / 2;
this.pBomb.spriteObj.height = 157 / 2;
this.pBombActive = true;
this.pBomb.moveLeft = true;
this.pBomb.type = 'pBomb';
// shoot
this.pBombIntervalId = setInterval(() => {
const { x, y, width, height } = this.pBomb.spriteObj, speed = 30;
new BulletObject("playerBullet", speed, { x, y, width, height });
}, 300)
}
이제 플레이어 업데이트 기능은 P-Bomb이 활성화되어 있는지 여부를 확인하고 그에 따라 반응합니다.
if (this.pBombShoot) {
this.pBombShootAction(gameWidth, gameHeight);
this.pBombShoot = false;
}
if (this.pBombActive) {
if (this.pBomb.spriteObj.x + this.pBomb.spriteObj.width < 0) {
this.stopPBomb();
}
}
쿨다운 기능 및 유체 이동
플레이어 이동 방식을 변경하기로 했습니다. 이전에는 사용자가 키를 누르고 있는 대신 왼쪽이나 오른쪽을 반복해서 탭해야 했습니다. 유동적으로 움직일 수 있다면 적의 총알을 피하고 적을 쏘는 것이 너무 쉬워보여서 그렇게 만들었습니다. 나는 플레이어가 슛 키를 스팸하는 것을 막기 위해 쿨다운 기능을 추가했고, 이것은 내가 플레이어 움직임을 개선할 수 있게 해주었다.
쿨다운을 만들기 위해 플레이어가 스페이스바를 누를 때 true로 설정되는 부울 속성을 플레이어에 추가했습니다. 그런 다음 1300ms 동안 타임아웃을 생성하고 그 시간이 지나면 쿨다운 속성이 다시 false로 설정되고 플레이어가 다시 쏠 수 있습니다.
if (!game.player.isBarkCooldown) {
game.player.shoot = true;
game.player.isBarkCooldown = true;
setTimeout(() => {
game.player.isBarkCooldown = false;
}, 1300)
}
--
이것이 내가 만든 주요 변경 사항이지만 추가하고 싶은 몇 가지 사항이 여전히 있습니다. 내 다음 업데이트는 현재 데스크톱에서만 작동하므로 모바일용 터치 컨트롤이 될 것 같습니다.
Reference
이 문제에 관하여(지난 프로젝트를 업데이트하기 위해 배운 것을 적용하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/robotspacefish/applying-what-i-ve-learned-to-update-a-past-project-217e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)