Старина атлас
Старше меня
Вот такое есть старое. И это не самое старое. Но зато тут Шри-Ланка ещё Цейлон под протекторатом Великобритании.
Вот такое есть старое. И это не самое старое. Но зато тут Шри-Ланка ещё Цейлон под протекторатом Великобритании.
Всем завтрак!
Вкусный и, возможно, даже полезный.
За основу берём тесто вот из этого рецепта. Прям грамм в грамм.
А потом катаем из него небольшие шарики и кидает в разогретое где-то до 170 градусов масло
Ждём три минуты.
Получаем бомбический десерт
Это изобретение моей мамы. Она говорила, что когда лень было заморачиваться с сырникам делала такие пончики.
Возможно, это блюдо даже на самом деле существует, кто знает
Нашла на нижней полке, вымыла как могла от пылищи, и в честь среды принесла вам. Жабку подарили когда-то давно и не из-за жабки, а из-за котика, потому что дело было на выставке кошек )
У нас есть заготовка для рендера и отрисовка игрового уровня. Пора по нему побегать.
В инициализации появилась пара новых строчек
// Инициализация обработчика ввода
initInput();
Так внутри всё достаточно просто
export function initInput() {
// Слушатели клавиатуры
window.addEventListener('keydown', handleKeyDown);
window.addEventListener('keyup', handleKeyUp);
// Слушатели геймпада
window.addEventListener('gamepadconnected', handleGamepadConnected);
window.addEventListener('gamepaddisconnected', handleGamepadDisconnected);
console.log('Input handler initialized');
}
Изначально я хотел добавить поддержку геймпада только на финальном этапе разработки, но получилось так, что это делается достаточно просто, поэтому засунул сразу.
Пойдём по порядку
function handleKeyDown(e) {
keys[e.code] = true; // аккумулируем все нажатия, чтоб потом обработать
// Предотвращаем прокрутку страницы стрелками и пробелом
if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space'].includes(e.code)) {
e.preventDefault();
}
}
function handleKeyUp(e) {
keys[e.code] = false; // "забываем" отпущенную кнопку
}
function handleGamepadConnected(e) {
console.log(`Gamepad connected: ${e.gamepad.id}`);
gamepadIndex = e.gamepad.index;
}
function handleGamepadDisconnected(e) {
console.log(`Gamepad disconnected: ${e.gamepad.id}`);
if (gamepadIndex === e.gamepad.index) {
gamepadIndex = null;
}
}
В отличии от клавиатуры, которая отдаёт браузеру события о нажатии на кнопка, с геймпадом такой финт ушами не прокатывает и надо опрашивать его состояние самостоятельно (прям как на привычных движках в старые добрые времена).
Дальше заспавним наш "танк" на игровой сцене
const spawnX = 4 * CELL_SIZE; // 4 клетки от левого края = 64 px
const spawnY = 24 * 8 - 32; // Чуть выше базы = 160 px
player = new Tank(spawnX, spawnY, TANK_PLAYER);
Класс танка достаточно большой, он ко конструкторе принимает значения координат спавна и типа танка (танк игрока или тип врага). Ему устанавливается "здоровье" (сколько раз в него надо попасть, чтобы убить), сколько активных патронов есть и т.д.
constructor(x, y, type = TANK_PLAYER) {
this.x = x;
this.y = y;
// Направление (0=вверх, 1=вправо, 2=вниз, 3=влево)
this.direction = DIR_UP;
this.speed = TANK_SPEED_NORMAL; // в пекселях за кадр
// Тип танка
this.type = type;
this.health = 1;
this.destroyed = false;
// Флаг движения в текущем кадре
this.moving = false; // Пока только задаётся, но нигде не используется. Есть мысли на будущее, но если не понадобится, удалю
// Апгрейды (для игрока)
this.bulletLevel = 0; // 0=обычная, 1=быстрая, 2=усиленная
this.bulletCount = 1; // Макс. пуль на экране
this.hasShield = false; // Временная защита
this.hasBoat = false; // Движение по воде
// Активные пули (для подсчёта лимита)
this.activeBullets = 0;
}
Непосредственно движение выгляди таким образом:
move(direction) {
// Сначала поворачиваем, если нужно
if (this.direction !== direction) {
this.turn(direction);
return; // В оригинале, если повернуть, танк не двигается в этом кадре, может уберу, если плейтесты покажут необходимость
}
// Вычисляем смещение по направлению
let dx = 0;
let dy = 0;
switch (direction) {
case DIR_UP: dy = -this.speed; break;
case DIR_DOWN: dy = this.speed; break;
case DIR_LEFT: dx = -this.speed; break;
case DIR_RIGHT: dx = this.speed; break;
}
// Новая позиция
let newX = this.x + dx;
let newY = this.y + dy;
// Ограничение границами игрового поля
newX = Math.max(0, Math.min(newX, LOGICAL_FIELD_SIZE - TANK_SIZE));
newY = Math.max(0, Math.min(newY, LOGICAL_FIELD_SIZE - TANK_SIZE));
// TODO: Проверка коллизий с тайлами (Этап 4)
// TODO: Проверка коллизий с другими танками (Этап 7)
// Применяем новую позицию
this.x = newX;
this.y = newY;
this.moving = true;
}
Ну и рисование танка на игровом поле
render() {
if (this.destroyed) return;
const ctx = foregroundCtx;
// Конвертация логических координат в физические
const px = GAME_FIELD_X + this.x * GAME_SCALE;
const py = GAME_FIELD_Y + this.y * GAME_SCALE;
const size = TANK_SIZE * GAME_SCALE;
// Цвет танка в зависимости от типа, пока всего два, потом будут новые типы и новые цвета
// Основной квадрат танка
ctx.fillStyle = this.type === TANK_PLAYER ? COLOR_TANK_PLAYER : COLOR_TANK_ENEMY;
ctx.fillRect(px, py, size, size);
// Индикатор направления (треугольник)
this.renderDirectionIndicator(ctx, px, py, size); // понял, что просто квадрато недостаточно, поэтому добавил "морду"
}
Рендер танка вызывается в методе основного рендера после очистки всего динамического слоя
// Foreground canvas — очищаем и рисуем сущности каждый кадр
clearForeground();
// Рендер танка игрока
if (player) {
player.render();
}
// TODO: Здесь будет рендер врагов, пуль, эффектов
Результат всего этого безобразия
Танк ездит сквозь стены, потому что "физического" движка ещё нет. Проверка коллизий как раз на очереди.
Масленица она же не только про блины, но и про солнышко.
Это солнышко уже погасло, но оставило после себя столько тёплых воспоминаний!
Это Сосиска. В принципе я пекла блины только ради неё. Сама я их не настолько люблю, мужа вполне устроят покупные замороженные, а Сосисочка очень любила, когда я пеку блины. Ещё на стадии замеса теста приходила и начинала ждать. А потом, дождавшись первого, начинала спрашивать - мяу?
На самом деле у нас остальные кошки даже не знают, что можно что-то со стола спросить, потому что они громогласные и наглые, один раз дай - и на шею сядут.
А Сосисочка была деликатная кисонька, спрашивала тихо и скромно. И кто я, чтобы ей отказать? Главное чтобы остальные это не видели.
В те времена печь блины было особо некогда, но каждую масленицу я стралась сделать это хотя бы один раз для этого солнышка 💖
Передаю лисоспасательную эстафету @Rian
Тонкорукая чесночница из семейства рогатых чесночниц похожа на мурлока. На рогатую чесночницу она не очень похожа.
Эта малышка выделяется своими яркими глазами и тонкими лапками без перепонок и присосок. Коричневый окрас с пятнами способствует маскировке.
Вид распространён в Таиланде, Индонезии и Малайзии. Предпочитают они заболоченные леса и ведут наземный образ жизни. Едят всяких насекомых и червячков.
Тут особо много текста не будет, мне просто нравится, как она выглядит :)
Штош. Давайте попробуем в качестве эксперимента отойти от традиции…
Пишите так же 2 числа: страницу и строку книги.
В этой книге 166 страниц, текст начинается с 1-й, а на странице по ~40 строк.
Слова-ответы в комментах я в этот раз писать не буду, я их выкачу сразу в пятницу голосованием. То есть сегодня попробуем в формате быстром - пару дней на написание чисел (поэтому ебанула сегодня, а не в четверг, а то ваще как-то мало времени будет иначе), и потом один день на голосование.
В субботу выкачу слово и с ним тоже попробуем ещё один эксперимент - сразу под словом можно будет начинать писать числа уже для следующего голосования.
И уже в следующий четверг я его запущу. Там уже будет больше времени и для написания чисел, и само голосование будет идти с четверга, т.е. 2 дня. Такой вариант лично мне кажется самым удобным на будущее, если всё-таки что-то будем менять. Но это мне. Я могу и ошибаться))
Поэтому, пишите числа…ну и пишите, как вам такие изменения. Толька чесна!!)) По итогам следующей недели, может быть, тоже проведу опрос касаемо формата выбора слова, чтобы решить - дальше действовать по новой системе или мне лучше вернуть всё как было и не ебать вам мозги)))
Если в итоге вернёмся к старой привычной системе, то можно будет использовать голосования в случаях, когда несколько слов бьются за победу)
И спасибо всем большое за ваши предложения ❤
Изображение галактики NGC 4402 демонстрирует характерные признаки стриппинга под действием динамического давления: диск из газа и пыли имеет изогнутую (выпуклую) форму из-за воздействия горячего межгалактического газа. Свечение диска подсвечивает завихрения пыли, которые выметаются потоком этого газа.
Изучение этого явления помогает астрономам лучше понять механизмы, управляющие эволюцией галактик, а также то, как подавляется звездообразование в очень плотных областях Вселенной, таких как скопления галактик.
Ответ на пост Graphuary 2026
Что же, это не рисунок. Но история, которая хочет быть рассказанной. Я учился на ПМ, то есть прикольная прикладная математика. И был у нас такой курс по дифференциальным уравнениям. (Вспомнить страшно).
Преподавал его человек страшный.
Суровый, требовательный.
Он был замом декана, а имя и отчество складывалось в АД.
В общем, когда пришла пора сдавать экзамен, мы с товарищем сели готовится. А так получилось, что препод считал, что практика, которую мы как бы ещё сдавали на зачёт, важнее теории. Потому задачи не решил, ни на что не рассчитывай. Задачи решил считай удовл. У тебя в кармане зачётке
И вот сели мы эту практику штурмовать. Это было весной, то есть зимой мы уже подобным занимались и успех был.
В общем, ближе к делу..
Подходим мы значит после занятий в читальном зале в столовую, чай попить да и сожрать что нить.
Товарищ делает заказ..
-Мне чай и...
Зависает
-Сочник?
-Нет, мне...
-Коризинку?
-Нет...
Чеерез несколько итераций буфетчица называется рулет и это верный овтет..
Так вот, спросите причём тут всё это?
И вот, в диф. уравнениях есть один график называется "Фокус"
И вот товарищ говорит.
Стою я значит смотрю на рулет, а в голове только слово "Фокус" и я понимаю, что меня то не поймут..
На спираль вроде тоже как похоже))
Помогат?
Жаль, в коментах не всегда вижу, а кадры реально красивые
"Проникновенье наше по планете особенно заметно вдалеке..." (С) В.С.Высоцкий