All streams
Search
Write a publication
Pull to refresh
-14
0
Сергей @Druj

Почти программист за почти деньги

Send message
И всё, мысль закончена. А мнения пользователей о современном геймдеве можете найти под любой соответствующей статьей, они довольно однозначны.
Тем что это прецедент который может лечь в основу неприятной цепочки:
1. Дети читерят, а давайте дадим возможность закрыть просмотр исходного кода.
2. Ой, эта фича такая популярная, давайте сделаем просмотр закрытым по умолчанию и вынесем его включение в настройки.
3. Ой, обычные пользователи его не включают, давайте вообще в about:config
4. Ой, оказывается об этой фиче знают только разработчики. Давайте же накатим DRM.

66. На этом шаге сайты отдаются в виде подписанных бинарников, пользователи рады скорости, бизнес рад тому что больше не палит код написанный разработчиками, гугл счастлив что его зонды/рекламу больше не вырезать.
Это новость из разряда «Бузова показала новый наряд, ШОК» в реалиях хабра. И такие новости будут плодиться пока за них не начнут наказывать.
2 недели? Пфф, это же как на цепи у розетки сидеть, мой Philips живет 2-3 месяца без зарядки. Книжка на e-inke, к сожалению, редко держит даже месяц.
Если по всем странам мира собрать рейтинг развития в них российской космонавтики то РФ займёт первое место, гордитесь.
Отличный повод для написания первой статьи.
Vue ещё ничего, Press F за ребят которые увлекутся Svelte.
Arc::clone(&self.world).lock().unwrap().as_ref().unwrap().clone();

Arc + Mutex используются чтобы раскидать ссылки на одну и ту же пямять по тредам и из каждого гарантировать владение этой памятью ровно одним тредом в конкретный момент. У вас же я не вижу ручного создания тредов, вы просто отдаете владение своим состоянием PlayGame в фреймворк а дальше из обработчика получаете &self этого состояния. Следовательно в self.world можете сразу хранить Mutex
Arc::clone(&self.world).lock().unwrap().as_ref().unwrap().clone();

Вы достаёте MutexGuard, через Deref вызываете as_ref преобразуя &Option в Option<&World> достаете &World и полностью клонируете чтобы получить World далее по коду вы просто читаете из него нужные вам поля. Лучшее что вы можете тут сделать без серьёзных изменений — убрать последний .clone(). Это архитектурная проблема возникающая из за того что Option используется как указатель в C постоянными проверками на NULL. Приведу пример, у вас количество игроков и сам мир находятся в двух независимых Option, хотя во время раунда очевидно что если есть игроки то они находятся в мире который не может быть None, однако вам придется делать unwrap. Вместо этого предлагаю заранее определить инварианты игры, выглядеть будет примерно так:
struct RoundState {/* Игроки, позиции обьектов, etc */}

struct RoundResult { /* Победители, очки, etc */ }

enum Round {
  Lobby(/* кто в лобби и т.д*/),
  Game(RoundState),
  Finished(RoundResult),
}

struct Game {
  round: Round
  /* Тут всякие статические штуки которые не зависят от раунда
  *  Имя серевера, MOTD и прочее
  */
}

И когда вам придётся обработать запрос вам нужно просто проверить допустим ли он для этого инварианта, остальные проверки отпадут сами собой. Если раунд идёт то для него есть мир, если раунд закончился то есть статистика и т.д:
async fn fetch_map(&self, ...) -> ... {
  ...
  match round {
    Round::Game(RoundState{players, map, ...}) => {
      /* Актуальные данные вы получили строкой выше
       * осталось бех всяких проверок обработать запрос
       */
    },
    _ => {
      /* Попытка получить карту когда игра не запущена */
    }
  }
}
Статью не читал но за ссылку на реддит-пост огромное спасибо, там чистая платина.
Теперь о каждом пластыре отдельная новость нужна?
Разрешите докопаться:

Раз
let world = Arc::clone(&self.world).lock().unwrap().as_ref().unwrap().clone();

Знаменитое удобство многопоточности в расте, ну вы знаете. Я не могу разобраться зачем вы так делаете, но наверное не стоит клонировать world просто чтобы взять параметры и использовать везде Option/Result без обработки ошибок

Два
ball: Option::Some(Ball {
    position: Option::Some(FloatTuple {
        x: world.ball.position.x,
        y: world.ball.position.y,
    }),
    velocity: Option::Some(FloatTuple {
        x: world.ball.velocity.x,
        y: world.ball.velocity.y,
    }),
}),
/* #### */
let ball_position = Vec2::new(
    ball_position.x,
    ball_position.y,
);

Код на 40% состоит из преобразований FloatTuple <-> Vec2, просто реализуйте трейт From<...> для этих типов.
Плюс Option уже есть в std::prelude, можно использовать Some(...).

Три
let mut ball_velocity = 0f32;
if players_count >= 2 {
    let num = rand::thread_rng().gen_range(0..2);
    if num == 0 {
        ball_velocity = -BALL_SPEED;
    } else {
        ball_velocity = BALL_SPEED;
    }
}

Тут ball_velocity не должна быть мутабельной, вы просто инициализируете её одним из трёх значений, для этого есть специальный сахар, например:
let velocity = { if ... { value1 } else { if ... { ... } else { ... } } };


Ну а статья норм, приятно смотреть как другие изучают то что самому учить лень.
Если гугл прогибается:

  1. Удаление любых роликов по желанию левой пятки
  2. Деанон любого неугодного пользователя

Если гугл не прогибается(что не случится):

  1. Гугл теряет пользователей и рекламодателей из РФ
  2. Пользователи из РФ теряют доступ к нежелательному контенту
  3. Часть освободившейся от монополии ютюба аудитории приходит на отчественные площадки, рутуб или, вангую, созданный после блокировки сервис от Яндекса/Сбера который разовьется очень быстро потому что для контентмейкеров(и не только) деньги > совесть.


Заинтересованные в плюсе при любом раскладе. А градус накала метрика сомнительная, т.к. уже не раз было показано что прогулки по улицам можно игнорировать.
У вас предвзятое мнение о фанатах Пратчетта.
Вы думаете что ваш ребенок в состоянии пользоваться телефоном/телеграмом но не в состоянии понять что терроризм/экстремизм/Навальный это плохо?
Я не правительство, но тоже не понимаю почему людям, которые пользователи, плохо без Фейсбука.
Да нет, вакансии открыты, руководители нормальные, зарплаты чуть выше чем у других специалистов по предприятию. Просто никто не хочет работать за обычную зарплату с технологиями о которых не пишут на хабре по 20 статей в день.
Ну и да, приезжего кодера оторвут с руками.
Скрыт от людских глаз в АСУТП заводов и предприятий и ищут туда людей не через рекрутеров или likedin а по знакомству.
У вас не было разрыва шаблона когда оказалось что в стоковой прошивке нельзя поменять время без синхронизации с телефоном? Я не пользователь умных часов, возможно это обычная ситуация.

Information

Rating
Does not participate
Location
Беларусь
Registered
Activity