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

Graphuary, день 18

Шум в голове

39

Сегодня ради пущей красоты воспользовалась ещё белым поверх, но зато маркера два, а не три, всё (почти) честно :)

АХТУНГ! Подведение итогов

44

Я собирался в понедельник итоги подвести, но работа меня съела и я забыл...

Если кто-то пропустил, загляните вот сюда.

В целом, количество голосов сейчас равно 22, что близко к числу постоянно активных пользователей, так что кворум можно считать набранным, но подожду до завтрашнего утра, вдруг кто-то не проголосовал ещё, а хотел.

Graphuary 2026

День 18 | Шум в голове

38

Бойцов всё меньше:

Ну и моё переосмысление арта, который я видел в интернете лет 10 назад...

А что? Так можно было?

Канешна!!! Нужно!

39
Читалка

Ответ на пост Ответ на пост: А что? Так можно было?

Дорогой, уважаемый ебать его в рот доктор @Pepels рассказал практически типичную ситуацию про становление личности. От юного и неопытного наивного мальчика до взрослого состоявшегося мужчины, у которого есть свое мнение и право послать нахуй в любой подходящий момент.

Эту ситуацию можно разобрать по кирпичикам и разложить по полочкам.

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

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

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

И тут уже включается знаменитая на весь мир пословица "Кто везет, на том и едут" (Кэп, из раннего). Это в наше время даже не метафора, это прямо какой-то аксиома, закон. Есть одна лошадь, которая всегда согласна тащить телегу, даже с квадратными колесами. Ну нахуя трогать другую? Сейчас это сдохнет, тогда возьмем другую. Правильно? Правильно. Идеально.

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

Приходит время, и мы замечаем, что наши дела стоят.

Наши дела.

Планы какие-то начинают рушиться. Жизнь проходит мимо, потому что ты постоянно решаешь чужие проблемы.

Да схуяли.

А те, кому ты помогаешь, даже не замечают этого. Они уже стали, как за здрасте, ходить, обращаться к тебе, и для них твоя помощь становится не каким-то там подвигом, это обыденность, это уже стало почти твоей обязанностью. Ты же всегда помогаешь, ты же всегда добрый, ты же не отказываешь.

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

И тут к нам потихонечку подходит другой этап. Причем настойчиво нас стучит по плечу и говорит "Вась, очнись".

И назовем мы эту фазу идите нахуй, пидоры ебаные. Ну, эмансипация через матюки.

Окей.

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

Не сразу, конечно, сначала такой тихий шепот: а может пошел он нахуй?

а потом чуть громче

Потом приходит понимание, чтотого человека люто ненавидим. И вообще он пидор какой-то. Вообще охуел просить тут что-то. Блядь, иди сам делай хуйло.

И тут начинается фаза вежливых отказов.

Сначала вежливо, потом не очень. Потом через хуй. И самое удивительное, что мир не разрушился, все заебись. Те, кто привык на тебе ездить, сначала охуевают, а потом обижаются. А потом начинают искать другую лошадь. Потому что они, блядь, не привыкли ебашить сами. Они могут только кого-то запрячь. И находят они эту другую лошадь. Она есть. Она все время была там в стойле. Отъедалась, блядь. Оказывается, они вполне могут решать свои проблемы сами или найти другого лоха. Просто в тот момент времени было удобнее пользоваться тобой.

Вот и подошли мы с вами к зрелости, которую назовем деньги, плюшки или иди нахуй. Все, никакой морали. Мы выходим на новый уровень.

Наконец-то до нас дошло, что наше время, наши силы и наш ресурс в современном мире это товар. Мы готовы помогать.

Так, блять, легко.

В душе-то мы все равно добрые остались.

Но теперь доброта имеет свою цену.

Хочешь, чтоб я отложил свои дела и решил твою проблему? Отлично. Вот цена. Значит, давай. Пузырь конины, другой магарыч какой-то, либо баблом. В деньгах, в услуге, в выходном, в ящике коньяка.

Не хочешь платить? Пошел нахуй, решай сам. Ищи лошадь, которая работает бесплатно.

И что самое забавное происходит? Те, кто действительно нас ценит, нас и наше время, с радостью платят, потому что они понимают ценность. А те, кто привык ездить бесплатно, отваливаются сами. Это охуительный фильтр, который сам собой возник. Пришел к нам с нашей зрелостью. Это просто заебись.

И в сухом остатке мы имеем, что фраза "Кто везет, на том и едут" -это не приговор. Это всего лишь маркер неопытности. Если на тебе едут, значит ты либо сам позволил, либо не умеешь говорить "нет", либо боишься показаться плохим.

Но на самом-то деле всем на тебя похуй. Хороший ты, плохой, вообще похуй.

Хуёвый я,да, да и в рот вас ебать. Пока мне платят деньги, мне вообще похуй, что вы там обо мне думаете. Тем более на работе.

Хуй его знает. Может, конечно, у кого-то работа это как семья, благополучная или неблагополучная. Но в принципе это работа, и хожу работу я в первую очередь за деньгами. А потом идите все нахуй.

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

Ещё одно местечко с едой

Пробегом)

39

В одном из тц в центре города пару лет назад открыли такую тему - фудмолл. Большой зал, где куча разных кафешек. Некий новый уровень фудкорта - можешь заказать сразу в нескольких, взять пикающую табличку и сесть за столик. Ну или на качельки, которые там тоже есть))

@kimpokom говорила, шо покажу. Вот))

Мимо пробегали со скоростью, поэтому без подробностей, но там больше 15 точек - ресторанов/кафешек/пекарен/баров. Есть как простенькие фастфудные, так и более хардовое типа ресторанчика с морепродуктами. Помню, видела, что у них там был хот-дог с щуплой осьминожки :D

И в целом есть из чего выбрать: бургеры, хинкали, роллы, пиццы, устрицы, фрукты в шоколаде, кофе, пиво, десерты...китайское, корейское, греческое, итальянское. Любой там найдёт что-то, мне кажется) Игровая комната для детей тоже имеется, плюс у них вечно какие-то фестивальчики, акции проводятся. Короче всё для привлечения внимания)

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

Стрельба | Снаряды

40
Читалка

В прошлой серии вы видели: стены более непротицаемы.

В этой серии мы научим наш так шмалять белыми квадратами по сторонам! И будем убеждать себя, что это снаряды.

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

export class Bullet {
    constructor(x, y, direction, owner, power = 0) {
        this.x = x;
        this.y = y;
        this.direction = direction;
        this.speed = Speed.BULLET;
        this.power = power;
        this.owner = owner;

        // Состояние
        this.active = true;
    }
}

Сущность пули помнит, кто её владелец, знает свою скорость и мощность. Мощность нам понадобится на следующих этапах. Например, стандартная пуля может только «брить» кирпичи, более мощная сможет уничтожать уже и бетонные/стальные блоки. В каких-то версиях пиратских танков была возможность даже сбривать кусты.

Далее у пули есть служебные методы, которые нужны для просчитывания коллизий, отрисовки положения в пространстве и т.д.

update(gameMap) {
        if (!this.active) return;

        // Вычисляем смещение
        let dx = 0;
        let dy = 0;

        switch (this.direction) {
            case Direction.UP:
                dy = -this.speed;
                break;
            case Direction.DOWN:
                dy = this.speed;
                break;
            case Direction.LEFT:
                dx = -this.speed;
                break;
            case Direction.RIGHT:
                dx = this.speed;
                break;
        }

        // Новая позиция
        const newX = this.x + dx;
        const newY = this.y + dy;

        // Проверка границ карты
        if (newX < 0 || newX + BULLET_SIZE > LOGICAL_FIELD_SIZE ||
            newY < 0 || newY + BULLET_SIZE > LOGICAL_FIELD_SIZE) {
            this.destroy();
            return;
        }

        // Проверка коллизий с тайлами
        if (gameMap && this.checkTileCollision(newX, newY, gameMap)) {
            return; // Пуля уничтожена в checkTileCollision
        }

        this.x = newX;
        this.y = newY;
    }

    checkTileCollision(newX, newY, gameMap) {
        const tiles = getTilesUnderEntity(newX, newY, BULLET_SIZE, BULLET_SIZE);

        for (const {tx, ty} of tiles) {
            const tileId = gameMap.getTile(tx, ty);
            const tileDef = TILE_DEFS[tileId];

            if (!tileDef) continue;

            // Пуля блокируется этим тайлом?
            if (tileDef.blocksBullet) {
                this.destroy();
                // TODO: Разрушение тайла (на следующем этапе)
                return true;
            }
        }

        return false;
    }

    destroy() {
        if (!this.active) return;
        this.active = false;

        if (this.owner) {
            this.owner.activeBullets = Math.max(0, this.owner.activeBullets - 1);
        }

        // TODO: Создание эффекта взрыва (Не скоро, ещё этапа через три)
    }

    render() {
        if (!this.active) return;

        const ctx = foregroundCtx;

        // Конвертация логических координат в физические
        const px = GAME_FIELD_X + this.x * GAME_SCALE;
        const py = GAME_FIELD_Y + this.y * GAME_SCALE;
        const size = BULLET_SIZE * GAME_SCALE;

        // Рисуем пулю как белый квадрат
        ctx.fillStyle = Colors.BULLET;
        ctx.fillRect(px, py, size, size);
    }

    getBounds() {
        return {
            x: this.x,
            y: this.y,
            width: BULLET_SIZE,
            height: BULLET_SIZE
        };
    }

В самом танке обновляем метод стрельбы. Раньше там не было нифига, теперь вот:

shoot() {
        if (this.activeBullets >= this.bulletCount) {
            return null;
        }
        //return null; - так было

        // так стало: 
        // Вычисляем позицию пули (центр передней части танка)
        let bulletX, bulletY;
        const centerOffset = (TANK_SIZE - BULLET_SIZE) / 2;

        switch (this.direction) {
            case Direction.UP:
                bulletX = this.x + centerOffset;
                bulletY = this.y - BULLET_SIZE;
                break;
            case Direction.DOWN:
                bulletX = this.x + centerOffset;
                bulletY = this.y + TANK_SIZE;
                break;
            case Direction.LEFT:
                bulletX = this.x - BULLET_SIZE;
                bulletY = this.y + centerOffset;
                break;
            case Direction.RIGHT:
                bulletX = this.x + TANK_SIZE;
                bulletY = this.y + centerOffset;
                break;
        }

        // Создаём пулю
        const bullet = new Bullet(bulletX, bulletY, this.direction, this, this.bulletLevel);
        this.activeBullets++;

        return bullet;
    }

Изменилась обработка пользовательского ввода

function processInput(player, gameMap = null, bullets = []) {
    if (!player || player.destroyed) return;

    // Обрабатываем клавиатуру
    processKeyboardInput(player, gameMap, bullets);

    // Обрабатываем геймпад
    processGamepadInput(player, gameMap, bullets);
}

И вот тут я прям серьёзно задумался: «А не хуйню ли я делаю?». Как будто передавать карту и массив снарядов в обработку инпутов – гавно идея...

К следующему посту поправлю.

А пока вот так:

if (keys['Space'] || keys['Enter']) {
        if (player.canShoot()) {
            const bullet = player.shoot();
            if (bullet) {
                bullets.push(bullet);
            }
        }
    }

В основном методе update теперь вызываем и апдейт всех пуль

for (const bullet of bullets) {
    bullet.update(gameMap);
  }

И в основном рендере их рисуем

// Рендер пуль
  for (const bullet of bullets) {
    bullet.render();
  }

Если есть идеи по улучшению кода, рад буду почитать

Результат

План на следующий этап

Всем хороших книг!