スマホだけで簡単に始めるゲームの作り方|初心者向け完全ガイド

スマートフォンの普及に伴い、多くのゲーム開発アプリが登場し、簡単にゲームを制作できるようになりました。
パソコンや専門的なソフトウェアがなくても、スマホ一台でゲーム制作が可能です。
本記事では、初心者向けに「スマホだけでゲームを作る方法」を詳しく解説します。
各ファイルに、下記のコードを入力します。
index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ブロック崩しゲーム</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<canvas id="myCanvas"></canvas>
<button id="pauseButton">Pause</button>
<script src="script.js"></script>
</body>
</html>
script.js
const canvas = document.getElementById("myCanvas");
const ctx = canvas.getContext("2d");
const pauseButton = document.getElementById("pauseButton");
let ballRadius = 10;
let x, y, dx, dy, paddleX;
const paddleHeight = 10;
const paddleWidth = 75;
let rightPressed = false;
let leftPressed = false;
let paused = false;
const brickRowCount = 3;
const brickColumnCount = 5;
const brickWidth = 75;
const brickHeight = 20;
const brickPadding = 10;
let brickOffsetTop = 30;
let brickOffsetLeft;
let brickColors = ["#FF5733", "#33FF57", "#3357FF", "#FF33A1", "#A133FF"];
let bricks = [];
initializeBricks();
function initializeBricks() {
bricks = [];
brickOffsetLeft = (canvas.width - (brickColumnCount * (brickWidth + brickPadding) - brickPadding)) / 2;
for (let c = 0; c < brickColumnCount; c++) {
bricks[c] = [];
for (let r = 0; r < brickRowCount; r++) {
bricks[c][r] = { x: 0, y: 0, status: 1, color: brickColors[Math.floor(Math.random() * brickColors.length)] };
}
}
}
function resizeCanvas() {
const width = window.innerWidth > 335 ? 335 : window.innerWidth - 20;
const height = width * 16 / 9;
canvas.width = width;
canvas.height = height;
x = canvas.width / 2;
y = canvas.height - 30;
dx = 2;
dy = -2;
paddleX = (canvas.width - paddleWidth) / 2;
initializeBricks(); // サイズ変更時にブロックの位置を再計算
draw();
}
document.addEventListener("keydown", keyDownHandler, false);
document.addEventListener("keyup", keyUpHandler, false);
canvas.addEventListener("touchstart", touchHandler, false);
canvas.addEventListener("touchmove", touchHandler, false);
pauseButton.addEventListener("click", togglePause, false);
window.addEventListener("resize", resizeCanvas, false);
resizeCanvas();
function keyDownHandler(e) {
if (e.key == "Right" || e.key == "ArrowRight") {
rightPressed = true;
} else if (e.key == "Left" || e.key == "ArrowLeft") {
leftPressed = true;
}
}
function keyUpHandler(e) {
if (e.key == "Right" || e.key == "ArrowRight") {
rightPressed = false;
} else if (e.key == "Left" || e.key == "ArrowLeft") {
leftPressed = false;
}
}
function touchHandler(e) {
const touchX = e.touches[0].clientX - canvas.getBoundingClientRect().left;
paddleX = Math.max(0, Math.min(canvas.width - paddleWidth, touchX - paddleWidth / 2));
e.preventDefault();
}
function togglePause() {
paused = !paused;
if (!paused) {
draw();
}
pauseButton.textContent = paused ? "Resume" : "Pause";
}
function collisionDetection() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
let b = bricks[c][r];
if (b.status == 1) {
if (x > b.x && x < b.x + brickWidth && y > b.y && y < b.y + brickHeight) {
dy = -dy;
b.status = 0;
}
}
}
}
if (allBricksCleared()) {
initializeBricks();
}
}
function allBricksCleared() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
if (bricks[c][r].status == 1) {
return false;
}
}
}
return true;
}
function drawBall() {
ctx.beginPath();
ctx.arc(x, y, ballRadius, 0, Math.PI * 2);
ctx.fillStyle = "#FFA500"; // オレンジ色に変更
ctx.fill();
ctx.closePath();
}
function drawPaddle() {
ctx.beginPath();
ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
ctx.fillStyle = "#0095DD";
ctx.fill();
ctx.closePath();
}
function drawBricks() {
for (let c = 0; c < brickColumnCount; c++) {
for (let r = 0; r < brickRowCount; r++) {
if (bricks[c][r].status == 1) {
let brickX = (c * (brickWidth + brickPadding)) + brickOffsetLeft;
let brickY = (r * (brickHeight + brickPadding)) + brickOffsetTop;
bricks[c][r].x = brickX;
bricks[c][r].y = brickY;
ctx.beginPath();
ctx.rect(brickX, brickY, brickWidth, brickHeight);
ctx.fillStyle = bricks[c][r].color;
ctx.fill();
ctx.closePath();
}
}
}
}
function draw() {
if (paused) return; // ポーズ中は描画を停止
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawBricks();
drawBall();
drawPaddle();
collisionDetection();
if (x + dx > canvas.width - ballRadius || x + dx < ballRadius) {
dx = -dx;
}
if (y + dy < ballRadius) {
dy = -dy;
} else if (y + dy > canvas.height - ballRadius) {
if (x > paddleX && x < paddleX + paddleWidth) {
dy = -dy;
} else {
document.location.reload();
}
}
if (rightPressed && paddleX < canvas.width - paddleWidth) {
paddleX += 7;
} else if (leftPressed && paddleX > 0) {
paddleX -= 7;
}
x += dx;
y += dy;
requestAnimationFrame(draw);
}
draw();
style.css
body {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f3f3f3;
}
canvas {
border: 1px solid #000;
width: 90%; /* 画面幅の90%を使用 */
max-width: 335px; /* iPhone SE3の幅から少し余裕を持たせる */
height: auto;
}
#pauseButton {
margin-top: 20px;
padding: 10px 20px;
font-size: 16px;
background-color: #0095DD;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
#pauseButton:active {
background-color: #007BB5;
}
各ファイルにコードを入力し終えたら、右上の三角のアイコンをタップします。
アイコンをタップして、以下のような画面が表示されれば完成です。
ブロック崩しゲームを実際にプレイして、遊ぶことができます。
まとめ|スマートフォンだけで始めるゲーム制作
スマートフォン一台で、ブロック崩しゲームを作る方法を解説しました。
高性能なパソコンや専門のソフトウェアがなくても、スマホ一台でゲームのアイデアを形にすることが可能です。
ノーコードでゲームを制作できるアプリを使用すれば、初心者でも直感的にゲームを作成できます。
Springin'やEpic Game Maker: Sandbox Craftなどのアプリは、簡単な操作でゲームデザインやプログラムの設定を行うことができ、楽しみながら学ぶことができます。
これらのツールを活用することで、子供から大人まで、誰もがゲーム開発のプロセスを体験できます。
さらに、Spck Editorのようなコードエディターを使用することで、より高度なカスタマイズやプログラミングの学習が可能です。
リアルタイムのデバッグを行いながら、より複雑なゲームを開発ができます。
GAMEMOでは、ChatGPTを活用して、プログラミングの知識がなくてもゲームを制作できる方法も紹介しています。
ぜひそちらも参考にして、ゲーム制作の第一歩を踏み出し、あなたのゲームのアイデアを具体化させてください。