Graphuary день 23
Оглянуться
Я вчера закончила первую свою картину по номерам, которую дарила коллега на новый год. Начало поста тут. Надо ж показать, что получилось и свои впечатления от такого времяпровождения.
Как всегда вам все покажет сын
Если посчитать, то я ее быстро закончила, сильно не напрягаясь и не стараясь все делать ровно. Но чаще я вышивала крестиком, чем занималась этой картиной. Теперь думаю куда ее определить, скорее всего унесу на работу, там ее куда-нибудь определю в кабинет.
Вывод: интересно, но вышивка мне нравится больше, и запасов так много, что на другие виды времени практически нет. Скорее всего, сама себе я такие картины не куплю, только если опять подарят. Дарили алмазную мозаику, я ее тоже закончила и подарила дарителю)
Что же там было:
Попа – это удовольствие, ящитаю
Оставался кусочек дерева и решил его превратить в что-нибудь прикольное) а то просто выкинуть жалко.
Приятного просмотра)
Эту свою работу я вам уже показывал пару лет назад на Капи. Но так как она мне очень нравится, пусть и здесь тоже будет. Может кто не видел. Но всё равно извините за повтор:)) Ну и этот пост чуть более расширенный:)
Так выглядит коробка с моделью в авто-маштабе 1 к 25. И литниковые рамки. Фото из интернетов, поскольку свой экземпляр я почти не снимал в процессе сборки и окраски:)
Сбока: Всё по классике, детали откусываются с рамок, зачищаются, подгоняются, проклеиваются специальным клеем. Модели автомобилей в этом масштабе не представляют особой сложности в сборке. Нужны только хорошие инструменты, аккуратность и некоторые доработки, если модель грубовата.
Делал модель, так же как и Мерседес, поздним летом на даче, заседая в теплице с томатами, чтобы не благоухать химозными ароматами.
После сборки кузова, наносится грунтовка, затем краска и лак. С краской я заморочился - это настоящая автомобильная краска, которую мне намешали колористы в автомастерской. Вышло дороже, чем обычный акрил, конечно. Но зато именно такой цвет, как я хотел. Лак тоже автомобильный, двухкомпонентный. Шлифовать и полировать его потом то ещё удовольствие. Зато как сияеть!
И краска и лак разодятся до более жидкого состояния чем для покраски реального автомобиля. Наносятся из аэрографа в несколько слоёв, при давлении 1,5 - 2 атмосфер.
Передний и задний бампера идут из набора уже хромированными деталями. Остальные элементы - молдинги, оконные рамки и т.д металлизировал сам, с помощью специальной самоклеющейся фольги для моделистов, заказаной так же на ебэях. Углубления пролиты тёмно-синей жидко разведённой масляной краской, для имитации объёма. Стандартный приём в моделизме. Называется "Смывка".
Салон окрашен обычным акрилом и масляными красками. Сделаны покрытия салона из кусочков замши.
Подставка для фотосессии как всегда самодел - из куска двп. Нанёс на него цементный клей для плитки и выложил брусчатку. Использовал камешки для аквариумистики. Обочина - обычный песок, пыль и модельные пигменты на ПВА и разный флок для имитации травы.
И финальный фотосет. Со стороны это выглядит вот так:
Спасибо за просмотр:)
Изначально этим этапом должны были быть только состояния (начало пауза, геймовер), но так как два из трёх состояний я сделал ещё в прошлом этапе, то тут я добавил паузу, заготовку для главного меню и решил, что этого мало и перешёл сразу к следующему этапу, а именно замена временных квадратов на спрайты. Я решил не использовать то, что выдаёт там интернет, но постарался сам нарисовать близко по стилистике
По спецификациям спрайтов: сделал по два кадра на все танки, чтоб сделать анимацию гусениц. три кадра на воду. остальные по одному кадру
Вообще вот столько спрайтшитов отрисовал:
Результат сейчас выглядит вот так
Для водички отдельная функция появилась:
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());
}
}
// это нам пригодится в будущем
План действий
вычо там совсем штоле? О_О
Яндекс говорит что берега будет через два дня, а сейчас ольха, у меня вообще никогда не было аллергии весной, только на кошку нашу периодически бывает, но так стремно не выглядит)
я не смотрела доктора кто, не подскажу))