Newer
Older
2024-c1230660 / kadai_a_6-1.js
const scene = new THREE.Scene();
const camera = new THREE.OrthographicCamera(
    window.innerWidth / -2, window.innerWidth / 2,
    window.innerHeight / 2, window.innerHeight / -2,
    1, 1000
);
camera.position.z = 10;

const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// プレイヤー召喚
const playerGeometry = new THREE.BoxGeometry(30, 30, 1);
const playerMaterial = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const player = new THREE.Mesh(playerGeometry, playerMaterial);
player.position.x = -200;
scene.add(player);

// 弾と敵のグループ
const bullets = [];
const enemies = [];

// 入力関連
const keys = { up: false, down: false,  left: false, right: false, space: false};

document.addEventListener('keydown', (event) => {
    if (event.key === 'w') {
        keys.up = true;
        console.log("w pressed - Move Up");
    }
    if (event.key === 's') {
        keys.down = true;
        console.log("s pressed - Move Down");
    }
    if (event.key === 'a') {
        keys.left = true;
        console.log("s pressed - Move Left");
    }
    if (event.key === 'd') {
        keys.right = true;
        console.log("s pressed - Move Right");
    }
    if (event.key === ' ') {  // スペースキー
        keys.space = true;
        console.log("Space pressed");
    }
});

document.addEventListener('keyup', (event) => {
    if (event.key === 'w') {
        keys.up = false;
    }
    if (event.key === 's') {
        keys.down = false;
    }
    if (event.key === 'a') {
        keys.left = false;
    }
    if (event.key === 'd') {
        keys.right = false;
    }
    if (event.key === ' ') {
        keys.space = false;
    }
});

// ループ処理
let lastShot = 0;
function animate() {
    requestAnimationFrame(animate);
    const time = performance.now();

    // プレイヤーの移動
    if (keys.up) { player.position.y += 6; }
    if (keys.down) { player.position.y -= 6; }
    if (keys.left) { player.position.x -= 6; }
    if (keys.right) { player.position.x += 6; }

    // 弾の発射
    if (keys.space && time - lastShot > 250) {
        const bulletGeometry = new THREE.BoxGeometry(5, 5, 1);
        const bulletMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 });
        const bullet = new THREE.Mesh(bulletGeometry, bulletMaterial);
        bullet.position.set(player.position.x + 20, player.position.y, 0);
        bullets.push(bullet);
        scene.add(bullet);
        lastShot = time;
    }

    // 弾の移動
    bullets.forEach((bullet, index) => {
        bullet.position.x += 15;
        if (bullet.position.x > window.innerWidth / 2) {
            scene.remove(bullet);
            bullets.splice(index, 1);
        }
    });

    // 敵の生成
    if (Math.random() < 0.02) {
        const enemyGeometry = new THREE.BoxGeometry(30, 30, 1);
        const enemyMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
        const enemy = new THREE.Mesh(enemyGeometry, enemyMaterial);
        enemy.position.set(window.innerWidth / 2, (Math.random() - 0.5) * window.innerHeight, 0);
        enemies.push(enemy);
        scene.add(enemy);
    }

    // 敵の移動と弾との衝突判定
    enemies.forEach((enemy, enemyIndex) => {
        enemy.position.x -= 3;

        bullets.forEach((bullet, bulletIndex) => {
            if (bullet.position.distanceTo(enemy.position) < 20) {
                scene.remove(enemy);
                enemies.splice(enemyIndex, 1);
                scene.remove(bullet);
                bullets.splice(bulletIndex, 1);
            }
        });

        // 画面外の敵削除処理
        if (enemy.position.x < -window.innerWidth / 2) {
            scene.remove(enemy);
            enemies.splice(enemyIndex, 1);
        }
    });

    renderer.render(scene, camera);
}

animate();