#[Сокровищница]

Ответ на пост: Анекдот

45

Ответ на пост Анекдот

Всем привет!

Расскажу свой первый (и последний) выученный анекдот.

Идет мальчишка по улице, видит, милиционер идет, подскакивает к нему и говорит "Дяденька, а дяденька! А раскусите орешек!"

Ну милиционер попался добрый, раскусил орешек и дальше пошел.

Через некоторое время таже история "Дяденька, а дяденька! А раскусите орешек!"

Ну милиционер раскусил и пошел своей дорогой.

Спустя некоторое время снова подбегает мальчик к милиционеру "Дяденька! А дяденька! А раскусите орешек!"

Милиционер рассердился, говорит "ты чего их по одному таскаешь, от дел отвлекаешь? Давай тащи их все сразу, я тебе их сразу все и раскушу!"

Мальчик и отвечает:

"Эээээ, нет дяденька, думаете их так просто на помойке искать?"

Осуждаем, но не от всего сердца

В Индии женщина обманом заставила полицию и коммунальные службы три часа чистить открытую канализацию, ложно заявив, что кто-то упал в нее.

46

не понял, на этом сайте низя видосики постить?

Graphuary 2026

День 27 | Высохший

46

Что же там было:

Попа – это удовольствие, ящитаю

Почти NSFW
Почти NSFW

Совинный парламент)

48

Оставался кусочек дерева и решил его превратить в что-нибудь прикольное) а то просто выкинуть жалко.
Приятного просмотра)

Источник:

Hudson Hornet 1954 года. Стендовая модель в масштабе 1/25

Всем привет, лисятки!

45
Читалка
►
The Medallions Feat. Vernon Green - Speedin.mp3

Эту свою работу я вам уже показывал пару лет назад на Капи. Но так как она мне очень нравится, пусть и здесь тоже будет. Может кто не видел. Но всё равно извините за повтор:)) Ну и этот пост чуть более расширенный:)

Так выглядит коробка с моделью в авто-маштабе 1 к 25. И литниковые рамки. Фото из интернетов, поскольку свой экземпляр я почти не снимал в процессе сборки и окраски:)

Забавно как ко мне попала эта коробка. Я заказал её на Ебэй из магазина в США, ещё до всяких санкций. А потом отслеживал по трекингу. Шла она ко мне больше месяца, сначала приехав в Европу, потом была отправлена на Тайвань, оттуда во Владивосток, потом поехала зачем-то в Москву, и только оттуда была отправлена ко мне. Очень странный путь. Эта моделька совершила кругосветку, по сути. Я за всю жизнь столько не напутешествую:)
Забавно как ко мне попала эта коробка. Я заказал её на Ебэй из магазина в США, ещё до всяких санкций. А потом отслеживал по трекингу. Шла она ко мне больше месяца, сначала приехав в Европу, потом была отправлена на Тайвань, оттуда во Владивосток, потом поехала зачем-то в Москву, и только оттуда была отправлена ко мне. Очень странный путь. Эта моделька совершила кругосветку, по сути. Я за всю жизнь столько не напутешествую:)
Детали на литниковых рамках.
Детали на литниковых рамках.

Сбока: Всё по классике, детали откусываются с рамок, зачищаются, подгоняются, проклеиваются специальным клеем. Модели автомобилей в этом масштабе не представляют особой сложности в сборке. Нужны только хорошие инструменты, аккуратность и некоторые доработки, если модель грубовата.
Делал модель, так же как и Мерседес, поздним летом на даче, заседая в теплице с томатами, чтобы не благоухать химозными ароматами.

После сборки кузова, наносится грунтовка, затем краска и лак. С краской я заморочился - это настоящая автомобильная краска, которую мне намешали колористы в автомастерской. Вышло дороже, чем обычный акрил, конечно. Но зато именно такой цвет, как я хотел. Лак тоже автомобильный, двухкомпонентный. Шлифовать и полировать его потом то ещё удовольствие. Зато как сияеть!
И краска и лак разодятся до более жидкого состояния чем для покраски реального автомобиля. Наносятся из аэрографа в несколько слоёв, при давлении 1,5 - 2 атмосфер.

Передний и задний бампера идут из набора уже хромированными деталями. Остальные элементы - молдинги, оконные рамки и т.д металлизировал сам, с помощью специальной самоклеющейся фольги для моделистов, заказаной так же на ебэях. Углубления пролиты тёмно-синей жидко разведённой масляной краской, для имитации объёма. Стандартный приём в моделизме. Называется "Смывка".

Салон окрашен обычным акрилом и масляными красками. Сделаны покрытия салона из кусочков замши.

Подставка для фотосессии как всегда самодел - из куска двп. Нанёс на него цементный клей для плитки и выложил брусчатку. Использовал камешки для аквариумистики. Обочина - обычный песок, пыль и модельные пигменты на ПВА и разный флок для имитации травы.

Подставка получилась тяжёлая, но симпатичная. Буду её ещё потом использовать для съёмок других моделей ретро-авто.
Подставка получилась тяжёлая, но симпатичная. Буду её ещё потом использовать для съёмок других моделей ретро-авто.

И финальный фотосет. Со стороны это выглядит вот так:

Спасибо за просмотр:)

«Танчики» на HTML5

Состояния игры и графика

48
Читалка

Изначально этим этапом должны были быть только состояния (начало пауза, геймовер), но так как два из трёх состояний я сделал ещё в прошлом этапе, то тут я добавил паузу, заготовку для главного меню и решил, что этого мало и перешёл сразу к следующему этапу, а именно замена временных квадратов на спрайты. Я решил не использовать то, что выдаёт там интернет, но постарался сам нарисовать близко по стилистике

По спецификациям спрайтов: сделал по два кадра на все танки, чтоб сделать анимацию гусениц. три кадра на воду. остальные по одному кадру

базовый враг
базовый враг
кусты лёд
кусты лёд
вода
вода

Вообще вот столько спрайтшитов отрисовал:

Результат сейчас выглядит вот так

В процессе записи понял, что забыл реализовать возрождение игрока после смерти :)

Для водички отдельная функция появилась:

export function updateWaterAnimation() {
  waterAnimationFrame = (waterAnimationFrame + 1) % WATER_SPRITE.frameCount;
}
//Ну и в рисовании фона вода теперь принимает непосредственное участие в отрисовки фона
renderBackground(gameMap, getWaterAnimationFrame());
//И внутри рендера ещё добавлен фолбек, чтобы в случае чего рисовать квадратики, как раньше.
//Чтоб не получилось что и-за какой-то ошибки на экране будет пустой квадрат
// Попробуем отрисовать спрайт
      const spriteDrawn = renderTileSprite(
        ctx, tileId, x, y, px, py, size,
        gameMap, wallsSprite, waterSprite, forestIceSprite, waterFrame
      );

      // Если спрайт не нарисован - fallback на цветной квадрат
      if (!spriteDrawn) {
        renderTileFallback(ctx, tileDef, x, y, px, py, size, gameMap);
      }

Конфигурация эффектов так же содержит фолбэк

/**
 * Конфигурация эффектов
 */
const EFFECT_CONFIG = {
    [EffectType.EXPLOSION_SMALL]: {
        maxFrames: EXPLOSION_SMALL_SPRITE.frameCount,  // 3 кадра
        frameTime: 3,  // 3 игровых кадра на кадр анимации (100ms при 30 FPS)
        size: TANK_SIZE,  // 16x16
        colors: ['#FFFF00', '#FFA500', '#FF4500']  // Fallback: Жёлтый → оранжевый → красный
    },
    [EffectType.EXPLOSION_BIG]: {
        maxFrames: EXPLOSION_BIG_SPRITE.frameCount,  // 4 кадра
        frameTime: 3,
        size: TANK_SIZE,  // 16x16
        colors: ['#FFFFFF', '#FFFF00', '#FFA500', '#FF4500']  // Fallback
    },
    [EffectType.SPAWN]: {
        maxFrames: SPAWN_SPRITE.frameCount,  // 5 кадров
        frameTime: 4,
        size: TANK_SIZE,  // 16x16
        colors: ['#FFFFFF', '#AAAAAA', '#FFFFFF', '#AAAAAA', '#FFFFFF']  // Fallback: Мигание
    }
};

Размер тут, правда, как будто излишен, так как все спрайты 16 на 16 и не пока не вижу необходимости делать другие, но посмотрю, может появился необходимость делать что-то больше чем 1 клетка размером, если нет, удалю.

Дальше по состояниям. В main.js появился метод и много его вызовов:

if (uiActions.pause) {
        setState(GameState.PAUSED);
}
export function setState(newState) {
    if (currentState === newState) return;

    const oldState = currentState;
    console.log(`State: ${oldState} -> ${newState}`);
    currentState = newState;
    stateTimer = 0;

    // Вызываем callback если установлен
    if (onStateChangeCallback) {
        onStateChangeCallback(newState, oldState);
    }
}

export function setOnStateChange(callback) {
    onStateChangeCallback = callback;
}

// Последний метод вызывается один раз при инициализации:
setOnStateChange(handleStateChange);

function handleStateChange(newState, oldState) {
  // При переходе из STAGE_COMPLETE в STAGE_INTRO (по таймеру) — инициализируем уровень
  if (oldState === GameState.STAGE_COMPLETE && newState === GameState.STAGE_INTRO) {
    initializeLevel(getCurrentStage());
  }
}
// это нам пригодится в будущем

План действий