+7 999 240-80-21
Санкт-Петербург
Астана
Екатеринбург, Кировский район
Ковров
Краснодар, Прикубанский округ
Красноярск
Москва, метро Физтех
Новосибирск
Санкт-Петербург
Севастополь
Ташкент
Томск
О нас
Курсы
Отзывы
Адреса
Записаться
+7 999 240-80-21
Личный кабинет
Лента
Франшиза
Санкт-Петербург
Астана
Екатеринбург, Кировский район
Ковров
Краснодар, Прикубанский округ
Красноярск
Москва, метро Физтех
Новосибирск
Санкт-Петербург
Севастополь
Ташкент
Томск
О нас
Курсы
Отзывы
Адреса
Записаться
+7 999 240-80-21
Личный кабинет
Лента
Франшиза
13.04.2025
проект
игра с концом
Карма
0
Рейтинг
3 148,50
Денис Д.
004382
Нравится
0
1 уравинь препятствия 2 острова лабиринт 3 магазин 4 босс
Нравится
0
Комментарии (2)
23 мая, 2025 в 23:53
Денис Д.
004382
// Тайлы: https://storage.yandexcloud.net/platform-prod/content/65ffac0d988c4.png // Игрок: https://storage.yandexcloud.net/platform-prod/content/6606bf603267d.png // Монета: https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ac92f050.png // Враги: https://storage.yandexcloud.net/platform-prod/content/demons_67fc2b4309bf7.png // Фоновая музыка: https://storage.yandexcloud.net/platform-prod/content/music_67fc2b95ab9b3.mp3 // Звук сбора монеты: https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ba28c0a8.mp3 // Звук gameover: https://storage.yandexcloud.net/platform-prod/content/gameover_67fc2bbce9d07.mp3 //хороште тайлы https://storage.yandexcloud.net/platform-prod/content/ts_6803604e7d844.png const TILE_WIDTH = 64; // ширина тайла const TILE_HEIGHT = 64; // высота тайла let game = new Game(4096, 1280); game.debugCollider = true; // выключить видимость коллайдеров game.debugColor = 'yellow'; // цвет коллайдеров let menuStage = new Stage(); menuStage.addBackground("фон.png") let gameStage = new Stage(); gameStage.addSound('https://storage.yandexcloud.net/platform-prod/content/music_67fc2b95ab9b3.mp3', 'music'); let ay = new Sprite(gameStage); ay.addCostume('кисть босс 2.png'); ay.layer = 5 ay.size = 20 ay.hidden = true let button = new Sprite(menuStage); button.addCostume('СТАРТ.png'); // Тайлы let tile = new Sprite(gameStage); tile.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/ts_6803604e7d844.png', { cols: 5, rows: 3 }); tile.size = 200; tile.x = TILE_WIDTH / 2; tile.y = TILE_HEIGHT / 2; tile.layer = 0; tile.hidden = true; tile.removeCollider(); // удаляем коллайдер для исходного тайла // Игрок let player = new Sprite(gameStage); player.addCostumeGrid("https://storage.yandexcloud.net/platform-prod/content/6606bf603267d.png", { cols: 4, rows: 4, crop: 8, // убираем 8 пикселей с каждой стороны костюма cropLeft: 12, // но слева убираем 12 пикселей cropRight: 12 // но справа убираем 12 пикселей }); player.layer = 2; player.x = TILE_WIDTH + TILE_WIDTH / 2; // отступаем 1,5 тайла слева player.y = TILE_HEIGHT + TILE_HEIGHT * 5 // отступаем 1,5 тайла сверху //player.x = TILE_WIDTH * 1.5; // отступаем 1,5 тайла слева //player.y = gameStage.height - TILE_HEIGHT * 4.5 let b1 = new Sprite(gameStage); b1.addCostume('огонь (1).png'); b1.hidden = true; b1.size = 5; let canFire = true let strikeTimer = 0 let pulaTimer = 0 function bulletSpawn(){ if (game.keyPressed('e') && canFire == true) { let cloneB1 = b1.createClone(); cloneB1.x = player.x cloneB1.y = player.y cloneB1.hidden = false; cloneB1.addTag('pula') cloneB1.forever(bulletMove); canFire = false; } strikeTimer += 1 if (strikeTimer >= 100) { canFire = true; strikeTimer = 0; } } function bulletMove(cloneB1) { if (game.keyPressed("s")){ cloneB1.direction = 180 cloneB1.move(40); pulaTimer+= 1 } if (game.keyPressed("d")){ cloneB1.direction = 90 cloneB1.move(40); pulaTimer+=1 } if (game.keyPressed("w")){ cloneB1.direction = 0 cloneB1.move(40); pulaTimer += 1 } if (game.keyPressed("a")){ cloneB1.direction = 270 cloneB1.move(40); pulaTimer+=1 } if (cloneB1.touchEdge()) { cloneB1.delete(); } if (pulaTimer >=10 ) { cloneB1.delete() pulaTimer = 0 } } gameStage.forever(bulletSpawn) gameStage.forever(bulletSpawn) gameStage.forever(bulletSpawn) player.size = 75; player.state = 'idle'; player.addSound('https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ba28c0a8.mp3', 'coin'); player.addSound('https://storage.yandexcloud.net/platform-prod/content/gameover_67fc2bbce9d07.mp3', 'gameover'); // Монета let coin = new Sprite(gameStage); coin.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ac92f050.png', { cols: 9, rows: 1 }); coin.size = 150; coin.layer = 1; // размещаем на слой выше карты coin.hidden = true; coin.removeCollider(); // удаляем коллайдер у оригинала // Противник let enemy = new Sprite(gameStage); enemy.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/demons_67fc2b4309bf7.png', { cols: 5, rows: 3, offset: 13, // взять костюм с 13 включительно limit: 2, // по 14 включительно }); enemy.size = 50; enemy.layer = 1; // размещаем на слой выше карты enemy.hidden = true; enemy.direction = 90 enemy.rotateStyle = 'none'; // запрещаем визуальный поворот спрайта enemy.removeCollider(); // удаляем коллайдер у оригинала // Карта let levelIndex = 0; let levels = [ // Level 0 { map: [ [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,0,5], [0,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,1,5,11,0,11,11,11,11,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,1,1,5,5,0,11,11,0,11,11,11,11,11,11,11,11,5,5,5,5,5,5,5,0,0,0,0,0,5], [0,1,1,1,1,1,1,1,1,1,8,8,0,5,5,5,5,5,0,5,0,8,8,0,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,4,0,5], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5] ], objects: [ [0, 2, 0, 0, 0, 0, 0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 1, 2, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ], }, // Level 1 { map: [ [5, 5, 5, 5, 5, 0, 5, 5,5,5,5,5,5,5,5,5,5,5,5], [5, 5, 5, 5, 5, 0, 5, 5,5,5,5,5,5,5,5,5,5,5,5], [1, 1, 1, 5, 5, 0, 5, 5,5,5,5,0,1,1,1,5,5,5,5], [0, 0, 0, 5, 5, 0, 5, 5,5,5,5,0,5,5,5,5,5,5,5], [5, 5, 5, 5, 5, 0, 1, 1,5,5,5,0,5,5,5,5,0,0,0], [5, 5, 5, 5, 5, 5, 5, 5,5,5,5,0,5,5,5,5,5,5,5], [5, 5, 1, 5, 5, 5, 5, 5,5,5,5,0,5,5,5,5,5,5,4], [5, 5, 1, 5, 5, 1, 1, 1,1,5,5,0,1,1,5,5,1,1,1], ], objects: [ [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,1], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ], }, { map: [ [12, 12, 12], [12, 12, 12], [1, 1, 1], [12, 12, 12], [12, 12, 12], [12, 12, 4], [1, 1, 1], ], objects: [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ], }, { map: [ [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0], [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0], [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0], [0,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0], [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,0], [0,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,0,5,5,0], [0,1,1,1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ], objects: [ [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ], }, ]; // Функция для генерации карты function renderLevel(levelIndex) { let level = levels[levelIndex]; if (!level) { return; } // Удаление клонов тайлов и других объектов tile.deleteClones(); coin.deleteClones(); enemy.deleteClones(); // Карта for (let row = 0; row < level.map.length; row++) { for (let col = 0; col < level.map[row].length; col++) { let tileIndex = level.map[row][col]; // Индекс костюма карты let objectIndex = level.objects[row][col]; // Индекс объекта // Место для вашей логики let tileClone = tile.createClone(); tileClone.switchCostume(tileIndex); tileClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; tileClone.y = TILE_HEIGHT / 2 + TILE_HEIGHT * row; tileClone.hidden = false; if (tileIndex == 0 || tileIndex == 1) { tileClone.addTag('wall'); // добавили тег для стен tileClone.setCostumeCollider('main'); // добавим коллайдер } if (tileIndex == 4) { tileClone.addTag('door'); // добавили тег для двери tileClone.setCostumeCollider('main'); // добавим коллайдер } // монета if (objectIndex == 1) { // монете будет соответствовать цифра "1" на карте let coinClone = coin.createClone(); coinClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; coinClone.y = TILE_HEIGHT / 2 + TILE_HEIGHT * row; coinClone.hidden = false; coinClone.setCostumeCollider('main'); // добавляем коллайдер coinClone.addTag('coin'); // добавляем тег coinClone.forever(coinAnimation, 70) // анимация монеты } // противник if (objectIndex == 2) { let enemyClone = enemy.createClone(); enemyClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; enemyClone.y = TILE_HEIGHT / 2 *13 ; enemyClone.hidden = false; enemyClone.setCostumeCollider('main'); // помним про коллайдер enemyClone.addTag('enemy'); // добавляем тег "enemy" enemyClone.forever(enemyControl); // движение противника enemyClone.forever(enemyAnimation, 300); // анимация противника } if (tileIndex == 8) { tileClone.addTag('thorns'); // добавили тег для двери tileClone.setCostumeCollider('main') } if (objectIndex == 5) { let ayClone = ay.createClone(); ayClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; ayClone.y = TILE_HEIGHT / 2 + TILE_HEIGHT * row; ayClone.hidden = false; ayClone.setCostumeCollider('main'); ayClone.addTag('ay'); ayClone.forever(function(){ ayClone.pointForward(player); ayClone.move(2); }); } } } } let catched = 0 // Управление игроком function playerControl(player) { ySpeed += 0.1 player.y += ySpeed if (player.touchTag("wall")){ if (ySpeed > 0) { ySpeed = 0 player.bottomY = player.otherSprite.topY if (game.keyPressed("space")) { ySpeed = -6.5 } } else { player.topY = player.otherSprite.bottomY ySpeed = 0 } } if (game.keyPressed("a")) { player.direction = 0 player.x -=5 if (player.touchTag("wall")){ player.x +=5 } } if (game.keyPressed("d")) { player.direction = 0 player.x += 5 if (player.touchTag("wall")){ player.x -=5 } } if (player.touchTag('door')) { levelIndex++; // меняем индекс уровня renderLevel(levelIndex); // перерисовываем карту для нового уровня // перемещаем игрока в исходную позицию на карте player.x = TILE_WIDTH + TILE_WIDTH / 2; player.y = TILE_HEIGHT + TILE_HEIGHT / 2; } if (player.touchTag('coin')) { catched += 1 player.otherSprite.delete(); // удалить монету player.startSound('coin'); // этот звук может накладываться друг на друга } if (player.touchTag('enemy')) { player.state = 'idle'; // устанавливаем вид анимации hp -= 1 // gameStage.pauseSound('music'); // остановить музыку // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // } // if (player.touchTag("")){ // gameover() } if (player.touchTag('thorns')) { player.state = 'idle'; // устанавливаем вид анимации hp -= 1 // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // } // if (player.touchTag("thorns")){ // GameOver() } if (player.touchTag('ay')) { player.state = 'idle'; // устанавливаем вид анимации hp -= 1 // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // } // if (player.touchTag("ay")){ // GameOver() } } let ySpeed = 0 function drawScore(context) { context.font = '50px Yesterday'; context.fillStyle = 'red'; context.fillText('Собрано:' + catched, 50, 100,); } let hp = 3 function drawScore1(context) { context.font = '50px Yesterday'; context.fillStyle = 'red'; context.fillText('сердец:' - hp, 50, 100); } // function b(player) { // if(xp < 1){ // player.state = 'idle'; // устанавливаем вид анимации // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // if (player.touchTag("")){ // gameover() // } // } // } function playerAnimation(player) { if (player.state == 'top') { // анимация: идет вверх player.nextCostume(12, 15); } if (player.state == 'down') { // анимация: идет вниз player.nextCostume(0, 3); } if (player.state == 'right') { // анимация: идет вправо player.nextCostume(8, 11); } if (player.state == 'left') { // анимация: идет влево player.nextCostume(4, 7) } if (player.state == 'idle') { // включаем первый костюм player.switchCostume(0) } } function gameCycle() { if (button.touchMouse()) { button.size = menuStage.height / 14; if (game.mouseDown()) { game.run(gameStage) } } else { button.size = menuStage.height / 16 } } menuStage.forever(gameCycle) function coinAnimation(coin) { coin.nextCostume(); } function enemyControl(enemy) { enemy.move(2); if (enemy.touchTag('wall')) { enemy.direction += 180; } } function enemyAnimation(enemy) { enemy.nextCostume(); } function gameover() { player.delete(); game.stop(); } function dieAnimation(player) { player.hidden = !player.hidden; } // Функция которая будет вызвана когда все необходимые ассеты будут загружены function beforeStart() { renderLevel(levelIndex); } function startMusic() { gameStage.playSound('music', { loop: true // звук будет проигрываться постоянно }); } // Функция рисования на экране function drawOnStage(context, stage) { // только когда игра остановлена и игрок был удален if (stage.stopped && player.deleted) { // сместим координаты надписи в центр context.textAlign = 'center'; context.textBaseline = 'middle'; // разместим текст "Game Over!" context.fillStyle = 'red'; context.font = '48px bold Impact'; context.fillText('Game Over!', stage.width / 4, stage.height / 6); } } gameStage.pen(drawOnStage,5); // слой должен быть выше других объектов gameStage.onReady(beforeStart); game.onUserInteracted(startMusic); gameStage.pen(drawScore,5); player.forever(playerControl); //player.forever(fly); player.forever(drawScore1,5); //player.forever(b); player.forever(playerAnimation, 100); game.run(menuStage); // function gameCycle() { // if (button1.touchMouse()) { // button1.switchCostume(1); // if (game.mouseDown()) { // game.run(stage2) // } // } else { // button1.switchCostume(0); // } // } // function gameCycle2() { // if (button2.touchMouse()) { // button2.switchCostume(1); // if (game.mouseDown()) { // game.run(stage1) // } // } else { // button2.switchCostume(0); // } // } // game.run(stage) // function fly(player) { // if(player.y > 800){ // if (player.touchTag('')) { // player.state = 'idle'; // устанавливаем вид анимации // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // } // if (player.touchTag("")){ // GameOver() // } // } //}
24 мая, 2025 в 00:04
Денис Д.
004382
// Тайлы: https://storage.yandexcloud.net/platform-prod/content/65ffac0d988c4.png // Игрок: https://storage.yandexcloud.net/platform-prod/content/6606bf603267d.png // Монета: https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ac92f050.png // Враги: https://storage.yandexcloud.net/platform-prod/content/demons_67fc2b4309bf7.png // Фоновая музыка: https://storage.yandexcloud.net/platform-prod/content/music_67fc2b95ab9b3.mp3 // Звук сбора монеты: https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ba28c0a8.mp3 // Звук gameover: https://storage.yandexcloud.net/platform-prod/content/gameover_67fc2bbce9d07.mp3 //хороште тайлы https://storage.yandexcloud.net/platform-prod/content/ts_6803604e7d844.png const TILE_WIDTH = 64; // ширина тайла const TILE_HEIGHT = 64; // высота тайла let game = new Game(4096, 1280); game.debugCollider = false; // выключить видимость коллайдеров game.debugColor = 'yellow'; // цвет коллайдеров let gameStage = new Stage(); gameStage.addSound('https://storage.yandexcloud.net/platform-prod/content/music_67fc2b95ab9b3.mp3', 'music'); // Тайлы let tile = new Sprite(gameStage); tile.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/ts_6803604e7d844.png', { cols: 5, rows: 3 }); tile.size = 200; tile.x = TILE_WIDTH / 2; tile.y = TILE_HEIGHT / 2; tile.layer = 0; tile.hidden = true; tile.removeCollider(); // удаляем коллайдер для исходного тайла // Игрок let player = new Sprite(gameStage); player.addCostumeGrid("https://storage.yandexcloud.net/platform-prod/content/6606bf603267d.png", { cols: 4, rows: 4, crop: 8, // убираем 8 пикселей с каждой стороны костюма cropLeft: 12, // но слева убираем 12 пикселей cropRight: 12 // но справа убираем 12 пикселей }); player.layer = 2; player.x = TILE_WIDTH + TILE_WIDTH / 2; // отступаем 1,5 тайла слева player.y = TILE_HEIGHT + TILE_HEIGHT * 5 // отступаем 1,5 тайла сверху //player.x = TILE_WIDTH * 1.5; // отступаем 1,5 тайла слева //player.y = gameStage.height - TILE_HEIGHT * 4.5 player.size = 75; player.state = 'idle'; player.addSound('https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ba28c0a8.mp3', 'coin'); player.addSound('https://storage.yandexcloud.net/platform-prod/content/gameover_67fc2bbce9d07.mp3', 'gameover'); // Монета let coin = new Sprite(gameStage); coin.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/coin_67fc2ac92f050.png', { cols: 9, rows: 1 }); coin.size = 150; coin.layer = 1; // размещаем на слой выше карты coin.hidden = true; coin.removeCollider(); // удаляем коллайдер у оригинала // Противник let enemy = new Sprite(gameStage); enemy.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/demons_67fc2b4309bf7.png', { cols: 5, rows: 3, offset: 13, // взять костюм с 13 включительно limit: 2, // по 14 включительно }); enemy.size = 50; enemy.layer = 1; // размещаем на слой выше карты enemy.hidden = true; enemy.direction = 90 enemy.rotateStyle = 'none'; // запрещаем визуальный поворот спрайта enemy.removeCollider(); // удаляем коллайдер у оригинала // let enemy1 = new Sprite(gameStage); // enemy1.addCostumeGrid('https://storage.yandexcloud.net/platform-prod/content/demons_67fc2b4309bf7.png', { // cols: 5, // rows: 3, // offset: 13, // взять костюм с 13 включительно // limit: 2, // по 14 включительно // }); // enemy1.size = 50; // enemy1.layer = 1; // размещаем на слой выше карты // enemy1.hidden = true; // enemy1.direction = 90 // enemy1.rotateStyle = 'none'; // запрещаем визуальный поворот спрайта // enemy1.removeCollider(); // Карта let levelIndex = 0; let levels = [ // Level 0 { map: [ [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,0,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,5,5,5,5,5,5,1,1,5,5,5,5,5,0,5], [0,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,5,5,5,5,1,5,11,0,11,11,11,11,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0,5], [0,5,5,5,5,5,5,5,5,5,5,5,5,1,1,5,1,1,5,5,0,11,11,0,11,11,11,11,11,11,11,11,5,5,5,5,5,5,5,0,0,0,0,0,5], [0,1,1,1,1,1,1,1,1,1,8,8,0,5,5,5,5,5,0,5,0,8,8,0,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,4,0,5], [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5] ], objects: [ [0, 2, 0, 0, 0, 0, 0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 1, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], [0, 0, 0, 0, 0, 0, 0, 0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ], }, // Level 1 { map: [ [5, 5, 5, 5, 5, 0, 5, 5,5,5,5,5,5,5,5,5,5,5,5], [5, 5, 5, 5, 5, 0, 5, 5,5,5,5,5,5,1,1,1,5,5,5], [1, 1, 1, 5, 5, 0, 1, 1,5,5,5,5,5,0,5,5,5,5,5], [5, 5, 0, 5, 5, 5, 5, 5,5,5,5,5,5,0,5,5,1,1,1], [5, 5, 5, 5, 5, 5, 5, 5,5,5,5,1,1,0,5,5,5,5,5], [5, 5, 5, 5, 5, 1, 1, 1,5,5,5,0,0,5,5,5,5,5,4], [5, 5, 0, 5, 5, 0, 0, 0,5,5,5,0,0,5,1,1,5,5,1,] ], objects: [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ], }, { map: [ [11, 11, 11, 11, 11, 11, 11, 11,11,11,11,11,11,11,11,11,11,11,11], [11, 11, 11, 11, 11, 11, 11, 11,11,11,11,11,11,11,11,11,11,11,11], [1, 1, 1, 11, 11, 11, 11, 11,11,11,11,11,11,11,11,11,11,11,11], ], objects: [ [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0] ], }, ]; // Функция для генерации карты function renderLevel(levelIndex) { let level = levels[levelIndex]; if (!level) { return; } // Удаление клонов тайлов и других объектов tile.deleteClones(); coin.deleteClones(); enemy.deleteClones(); // enemy1.deleteClones(); // Карта for (let row = 0; row < level.map.length; row++) { for (let col = 0; col < level.map[row].length; col++) { let tileIndex = level.map[row][col]; // Индекс костюма карты let objectIndex = level.objects[row][col]; // Индекс объекта // Место для вашей логики let tileClone = tile.createClone(); tileClone.switchCostume(tileIndex); tileClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; tileClone.y = TILE_HEIGHT / 2 + TILE_HEIGHT * row; tileClone.hidden = false; if (tileIndex == 0 || tileIndex == 1) { tileClone.addTag('wall'); // добавили тег для стен tileClone.setCostumeCollider('main'); // добавим коллайдер } if (tileIndex == 4) { tileClone.addTag('door'); // добавили тег для двери tileClone.setCostumeCollider('main'); // добавим коллайдер } // монета if (objectIndex == 1) { // монете будет соответствовать цифра "1" на карте let coinClone = coin.createClone(); coinClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; coinClone.y = TILE_HEIGHT / 2 + TILE_HEIGHT * row; coinClone.hidden = false; coinClone.setCostumeCollider('main'); // добавляем коллайдер coinClone.addTag('coin'); // добавляем тег coinClone.forever(coinAnimation, 70) // анимация монеты } // противник if (objectIndex == 2) { let enemyClone = enemy.createClone(); enemyClone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; enemyClone.y = TILE_HEIGHT / 2 *13 ; enemyClone.hidden = false; enemyClone.setCostumeCollider('main'); // помним про коллайдер enemyClone.addTag('enemy'); // добавляем тег "enemy" enemyClone.forever(enemyControl); // движение противника enemyClone.forever(enemyAnimation, 300); // анимация противника } // if (objectIndex == 3) { // let enemy1Clone = enemy1.createClone(); // enemy1Clone.x = TILE_WIDTH / 2 + TILE_WIDTH * col; // enemy1Clone.y = TILE_HEIGHT / 2 *13 ; // enemy1Clone.hidden = false; // enemy1Clone.setCostumeCollider('main'); // помним про коллайдер // enemy1Clone.addTag('enemy1'); // добавляем тег "enemy" // enemy1Clone.forever(enemy1Control); // движение противника // enemy1Clone.forever(enem1Animation, 300); // анимация противника // } if (tileIndex == 8) { tileClone.addTag('thorns'); // добавили тег для двери tileClone.setCostumeCollider('main') } } } } let catched = 0 // Управление игроком function playerControl(player) { ySpeed += 0.1 player.y += ySpeed if (player.touchTag("wall")){ if (ySpeed > 0) { ySpeed = 0 player.bottomY = player.otherSprite.topY if (game.keyPressed("space")) { ySpeed = -6 } } else { player.topY = player.otherSprite.bottomY ySpeed = 0 } } if (game.keyPressed("a")) { player.direction = 0 player.x -=5 if (player.touchTag("wall")){ player.x +=5 } } if (game.keyPressed("d")) { player.direction = 0 player.x += 5 if (player.touchTag("wall")){ player.x -=5 } } if (player.touchTag('door')) { levelIndex++; // меняем индекс уровня renderLevel(levelIndex); // перерисовываем карту для нового уровня // перемещаем игрока в исходную позицию на карте player.x = TILE_WIDTH + TILE_WIDTH / 2; player.y = TILE_HEIGHT + TILE_HEIGHT / 2; } if (player.touchTag('coin')) { catched += 1 player.otherSprite.delete(); // удалить монету player.startSound('coin'); // этот звук может накладываться друг на друга } if (player.touchTag('enemy')) { player.state = 'idle'; // устанавливаем вид анимации gameStage.pauseSound('music'); // остановить музыку player.playSound('gameover'); // включить звук проигрыша // анимация проигрыша будет повторена 9 рез и затем игра остановится player.repeat(dieAnimation, 9, 100, null, gameover); // остановить выполнение цикла playerControl() return false; } if (player.touchTag("enemy")){ GameOver() } // if (player.touchTag('enemy1')) { // player.state = 'idle'; // устанавливаем вид анимации // gameStage.pauseSound('music'); // остановить музыку // player.playSound('gameover'); // включить звук проигрыша // // анимация проигрыша будет повторена 9 рез и затем игра остановится // player.repeat(dieAnimation, 9, 100, null, gameover); // // остановить выполнение цикла playerControl() // return false; // } // if (player.touchTag("enemy1")){ // GameOver() // } if (player.touchTag('thorns')) { player.state = 'idle'; // устанавливаем вид анимации gameStage.pauseSound('music'); // остановить музыкy player.playSound('gameover'); // включить звук проигрыша // анимация проигрыша будет повторена 9 рез и затем игра остановится player.repeat(dieAnimation, 9, 100, null, gameover); // остановить выполнение цикла playerControl() return false; } if (player.touchTag("thorns")){ gameover() } } let ySpeed = 0 function drawScore(context) { context.font = '50px Yesterday'; context.fillStyle = 'red'; context.fillText('Собрано:' + catched, 50, 100); } function flay (player) { if (player.y > 900 ){ gameover() } } function playerAnimation(player) { if (player.state == 'top') { // анимация: идет вверх player.nextCostume(12, 15); } if (player.state == 'down') { // анимация: идет вниз player.nextCostume(0, 3); } if (player.state == 'right') { // анимация: идет вправо player.nextCostume(8, 11); } if (player.state == 'left') { // анимация: идет влево player.nextCostume(4, 7) } if (player.state == 'idle') { // включаем первый костюм player.switchCostume(0) } } function coinAnimation(coin) { coin.nextCostume(); } function enemyControl(enemy) { enemy.move(2); if (enemy.touchTag('wall')) { enemy.direction += 180; } } function enemyAnimation(enemy) { enemy.nextCostume(); } // function enemyControl(enemy1) { // enemy1.move(2); // if (enemy1.touchTag('wall')) { // enemy1.direction += 180; // } // } // function enemyAnimation(enemy1) { // enemy1.nextCostume(); // } function gameover() { player.delete(); game.stop(); } function dieAnimation(player) { player.hidden = !player.hidden; } // Функция которая будет вызвана когда все необходимые ассеты будут загружены function beforeStart() { renderLevel(levelIndex); } function startMusic() { gameStage.playSound('music', { loop: true // звук будет проигрываться постоянно }); } // Функция рисования на экране function drawOnStage(context, stage) { // только когда игра остановлена и игрок был удален if (stage.stopped && player.deleted) { // сместим координаты надписи в центр context.textAlign = 'center'; context.textBaseline = 'middle'; // разместим текст "Game Over!" context.fillStyle = 'red'; context.font = '48px bold Impact'; context.fillText('Game Over!', stage.width / 4, stage.height / 6); } } gameStage.pen(drawOnStage,5); // слой должен быть выше других объектов player.forever(flay) gameStage.onReady(beforeStart); game.onUserInteracted(startMusic); gameStage.pen(drawScore,5); player.forever(playerControl); player.forever(playerAnimation, 100); game.run();