homework5/main.js
2025-04-21 00:34:13 +09:00

281 lines
6.2 KiB
JavaScript

// alert("hello world");
const tileSize = 16;
// Sprites
let baba_img;
let tile_img, wall_img, rock_img, water_img, lava_img, flag_img;
let win_img, you_img, move_img, stopText_img;
let is_img;
// Map
let tileMap = [
' ',
'wtwwwwwwwwwwwwww',
'wt ttttttt ttttw',
'wt itttttttitttw',
'wtt tt ttttttttw',
'wtttttttttt tttw',
'wt ttttttt ttttw',
'wt ttwtttt ttttw',
'wttt rtt llt ttw',
'wtt tttt ll ttfw',
'w tttaa ttwt ttw',
'wttt aatt wttttw',
'wttttttttttttttw',
'wt*i@ttttt^i#ttw',
'wtttttttt tttttw',
'wwwwwwwwwwwwwwww',
];
let rules = [
["rock", "is", "push"],
["wall", "is", "stop"],
["water", "is", "sink"],
["lava", "is", "hot"]
]
// CaracterMove
let babaX = 0;
let babaY = 0;
// Sounds
let bgm, winSound;
let isPlaying = false;
// Game State
let isGameOver = false;
let isWin = false;
function preload(){
// BGM
bgm = loadSound("/assets/Baba Is You OST - Baba Is You Theme.mp3");
// Spritesd
baba_img = loadImage("/assets/Baba.webp");
tile_img = loadImage("/assets/Tile.webp");
wall_img = loadImage("/assets/Wall.webp");
rock_img = loadImage("/assets/Rock.webp");
water_img = loadImage("/assets/Water.webp");
lava_img = loadImage("/assets/Lava.webp");
flag_img = loadImage("/assets/Flag.webp");
is_img = loadImage("/assets/Text_IS.webp");
win_img = loadImage("/assets/Win.webp");
you_img = loadImage("/assets/You.webp");
move_img = loadImage("/assets/Move.webp");
stopText_img = loadImage("/assets/Stop.webp");
baba_text_img = loadImage("/assets/Text_BABA.webp");
flag_text_img = loadImage("/assets/Text_FLAG.webp");
}
function setup(){
createCanvas(800, 400);
new World();
background(51);
textAlign(CENTER);
// Floor - Tile
let tile = new Group();
tile.img = tile_img;
tile.collider = 'none';
tile.tile = "t";
tile.scale = tileSize/tile_img.width;
// Flag
let flag = new Group();
flag.img = flag_img;
flag.collider = 'none';
flag.tile = "f";
flag.scale = tileSize/flag_img.width;
// WALL
let wall = new Group();
wall.img = wall_img;
wall.collider = 'static';
wall.tile = "w";
wall.scale = tileSize/wall_img.width;
// ROCK
let rock = new Group();
rock.img = rock_img;
rock.collider = 'dynamic';
rock.tile = "r";
rock.scale = tileSize/rock_img.width;
// Water
let water = new Group();
water.img = water_img;
water.collider = 'none';
water.tile = 'a';
water.scale = tileSize/water_img.width;
// Lava
let lava = new Group();
lava.img = lava_img;
lava.collider = 'none';
lava.tile = 'l';
lava.scale = tileSize/lava_img.width;
// TEXTS
// is
let is = new Group();
is.img = is_img;
is.collider = 'dyinamic';
is.tile = 'i';
is.scale = tileSize/is_img.width;
// flag_text
let flag_text = new Group();
flag_text.img = flag_text_img;
flag_text.collider = 'dyinamic';
flag_text.tile = '^';
flag_text.scale = tileSize/flag_text_img.width;
// baba_text
let baba_text = new Group();
baba_text.img = baba_text_img;
baba_text.collider = 'dyinamic';
baba_text.tile = '*';
baba_text.scale = tileSize/baba_text_img.width;
// you
let you = new Group();
you.img = you_img;
you.collider = 'dyinamic';
you.tile = '@';
you.scale = tileSize/you_img.width;
// win
let win_text = new Group();
win_text.img = win_img;
win_text.collider = 'dyinamic';
win_text.tile = '#';
win_text.scale = tileSize/win_img.width;
new Tiles(tileMap, tileSize/2, tileSize/2, tileSize, tileSize);
//BABA
baba = new Sprite(tileSize/2, tileSize/2, tileSize, tileSize);
baba.img = baba_img;
baba.scale = tileSize / baba_img.width;
baba.label = 'you';
}
function draw(){
background(51);
drawSprites();
if (isGameOver) {
fill(255);
textSize(32);
text("Game Over! Press R to Restart", width / 4, height / 4);
}
if(isWin){
fill(255);
textSize(32);
text("Congratulations! Press R to Restart", width / 4, height / 4);
}
}
// Background Music & Soundeffects
function backgroundMusic(){
}
function mousePressed(){
if (isPlaying) {
bgm.pause();
isPlaying = false;
} else {
bgm.loop();
isPlaying = true;
}
}
// Move ASDW
function keyPressed(){
console.log(`key ${key} is pressed.`)
if(isGameOver || isWin){
if(key=='r'||key=='R'){
resetGame();
}
return;
}
const maxX = width - tileSize;
const maxY = height - tileSize;
if((key=='a'||key=='A') && isOpen(baba.x - tileSize, baba.y)) {
if (baba.x - tileSize >= 0) {
baba.x -= tileSize;
console.log('Left');
}
}
if((key=='s'||key=='S') && isOpen(baba.x, baba.y + tileSize)) {
if (baba.y + tileSize <= maxY) {
baba.y += tileSize;
console.log('Down');
}
}
if((key=='d'||key=='D') && isOpen(baba.x + tileSize, baba.y)) {
if (baba.x + tileSize <= maxX) {
baba.x += tileSize;
console.log('Right');
}
}
if((key=='w'||key=='W') && isOpen(baba.x, baba.y - tileSize)) {
if(baba.y - tileSize >= 0){
baba.y -= tileSize;
console.log('Up');
}
}
}
// move only to the opened place
function isOpen(x,y){
let i = floor(x / tileSize);
let j = floor(y / tileSize);
if (j < 0 || j >= tileMap.length || i < 0 || i >= tileMap[0].length) {
return false;
}
let tile = tileMap[j][i];
if (tile == ' ' || tile == 't'){
return true;
} else if (tile == 'a'|| tile=='l'){
gameOver();
return true;
} else if (tile == 'f'){
win();
return true;
} else {
console.log('blocked');
return false;
}
}
function win(){
isWin = true;
baba.remove();
}
function gameOver(){
isGameOver = true;
baba.remove();
}
function resetGame(){
isGameOver = false;
isWin = false;
baba = new Sprite(tileSize/2, tileSize/2, tileSize, tileSize);
baba.img = baba_img;
baba.scale = tileSize / baba_img.width;
baba.label = 'you';
}