• Какие советы дадите для создания игры для компьютера?

    Exomode
    @Exomode
    Архитектор ПО
    Ни на один из четырёх вопросов нельзя дать конкретного ответа. Даже если попытаться, то получится примерно следующее:

    1) На тех, которые знаете или готовы изучать, потому что их возможности вас устраивают. Для программирования - IDE вроде Visual Studio, Eclipse и другие, можно даже в Notepad++ по олдскульному хардкору писать и потом собирать через консоль, никто не запрещает. Вопрос лишь в том, удобно ли оно вам будет в процессе и оптимально ли скажется на цикле разработки. Для текстурирования - Adobe Photoshop и прочие аналоги, для моделирования - Autodesk 3ds Max, Maya, Blender и прочие. Для шейдеров и материалов - те же самые IDE + в большинстве SDK для разработки игровых проектов уже идут в комплекте мощные визуальные средства. Для работы с аудио - Ableton, FL Studio, Cubase и прочие секвенсоры, для работы с видео - Adobe After Effect и аналоги. Выбор конкретного софта ложится полностью на вас и у всех он разный.

    2) Любой, который позволит получить требуемый результат и который вы знаете, на котором умеете работать и который максимально продуктивно отразится на цикле разработки. От C/C++ до Java и Lua.

    3) Любой подойдёт, который по возможностям удовлетворяет требованиям будущего продукта (конечные платформы, поддержка требуемого стека технологий, лицензия, 2D/3D и тд).

    4) На вкус и цвет... Сколько людей - столько и мнений. Устраивайте опросы друзей и заинтересованных лиц, исследуйте аналитику опросов других компаний, следите за тенденциями игрового рынка, делайте выводы.

    Главное чётко наметьте цели и следуйте им, не ставьте планку выше головы, не ровняйтесь на кого-то, пока у вас не будет несколько законченных рабочих продуктов. Иначе проект будет обречён ещё до старта разработки. 40% Indie-проектов умирает, 50% в итоге полная шляпа и лишь 10% выстреливают. И среди них мало шутеров и RPG, на самом-то деле. Каждый такой проект необычен и уникален, привносящий что-то новое в умирающий сеттинг или вообще открывающий новый.
    Ответ написан
    Комментировать
  • Как отключить стили таблицы шорткода темы?

    Exomode
    @Exomode
    Архитектор ПО
    Переназначьте новые правила после первого объявления, например:
    table th, table td {
        padding: 10px;
        text-align: center;
        border-width: 1px;
        border-style: solid;
        vertical-align: middle;
    }
    
    table th, table td {
        text-align: left;
    }

    или просто закомментируйте правило в основном стиле:
    table th, table td {
        padding: 10px;
        /*text-align: center;*/
        border-width: 1px;
        border-style: solid;
        vertical-align: middle;
    }

    Для того, чтобы указать конкретным столбцам свои правила, можно сделать так:
    table th:nth-child(2), table td:nth-child(2),
    table th:nth-child(4), table td:nth-child(4) {
        text-align: left;
    }

    Выравнивание слева будет применено лишь ко второму и четвёртому столбцам и их заголовкам.
    Ответ написан
    Комментировать
  • Как восстановить android (6.0.1) на Nexus 5 после неудачного выключения?

    Exomode
    @Exomode
    Архитектор ПО
    1. Подключиться через adb к компу.
    2. Сделать бэкап данных.
    3. Поставить рекавери.
    4. Сделать вайп данных.
    5. Накатить ROM с системой.
    6. Восстановить данные.

    Изобилие информации по теме можно найти на 4pda.ru, ищите в поиске по форуму свою модель и соответствующую тему по перепрошивке, там же найдёте нужные вам ROM-архивы. Я свой Samsung Galaxy Note 3 перепрошивал на мод прошивки от SGN7, первый раз набокопорил с софтом и превратил в "кирпич", спустя несколько часов гугления смог благополучно "оживить" и допрошить без сторонней помощи специалистов. Уже год работает как часы и никаких нареканий. Потом восстанавливал прошивку на LG G2 девушки, тоже по мануалам 4pda и тоже успешно. Дерзайте, главное следовать инструкциям в мануалах и не пугаться если что-то пойдёт не так.
    Ответ написан
    4 комментария
  • Как сделать так чтобы js код действовал только для div с определенным классом?

    Exomode
    @Exomode
    Архитектор ПО
    Если нужно учитывать высоту только тех блоков, у которых класс hdr:
    function setEqualHeight(columns) {
      var tallestcolumn = 0;
    
      columns.each(function () {
        currentHeight = $(this).height();
        if (currentHeight > tallestcolumn) {
          tallestcolumn = currentHeight;
        }
      });
    
      columns.height(tallestcolumn);
    }
    
    $(document).ready(function () {
      setEqualHeight($(".columns > div.hdr"));
    });

    Если нужно учитывать высоту всех блоков, а применять лишь к тем, у которых класс hdr:
    function setEqualHeight(columns) {
      var tallestcolumn = 0;
    
      columns.each(function (i, e) {
        currentHeight = $(e).height();
    
        if (currentHeight > tallestcolumn) {
          tallestcolumn = currentHeight;
        }
      });
    
      columns.each(function (i, e) {
        if ($(e).hasClass("hdr")) {
          $(e).height(tallestcolumn);
        }
    }
    
    $(document).ready(function () {
      setEqualHeight($(".columns > div"));
    });
    Ответ написан
    Комментировать
  • Какая должна быть правильная авторизация на php?

    Exomode
    @Exomode
    Архитектор ПО
    Лучше всего навигацию по сайту реализовывать через паттерн проектирования, например, самые классические MVC/HMVC или компонентные. Тогда у вас будет всего одна точка входа в систему и не придётся в каждом скрипте писать проверки, инклуды и тд.

    Далее, касательно самой авторизации - тут тоже масса вариантов реализации, но самый минимальный и более-менее правильный вариант - организовать проверку на сессиях или куках, проверять методом наличие сессии или куки, если есть - пользователь авторизован, делать перенаправление со страницы авторизации на нужную, либо же динамически отдавать контент, в зависимости от того как у вас там спроектирована система. Если нет - отдать контент страницы авторизации или перенаправить на нее. SEO здесь так же влияет, если необходима индексация страницы авторизации, то только перенаправлять.

    Чтоб сессии работали, ничего инклудить не обязательно, главное чтоб вначале скрипта всегда выполнялся session_start(). В итоге проверка отработает на всех ваших скриптах страниц, которые должны делать редирект в случае если пользователь не авторизован.
    Ответ написан
    9 комментариев
  • Как улучшить внешний вид изображения?

    Exomode
    @Exomode
    Архитектор ПО
    Делаете обертку-родителя, вставляете в него изображение через background-image, делаете дочерний блок, тоже вставляете в него изображение через background-image, далее уже от вашей фантазии зависит, позиционировать можно как угодно, рамку, эффекты, анимации, фильтры, тексты, события, другие блоки - все что пожелаете.
    Ответ написан
    Комментировать
  • Как вызвать событие на определённом элементе?

    Exomode
    @Exomode
    Архитектор ПО
    $("#elements > .test:nth-child(2)").click();
    или
    $("#elements > .test").each(function (i, e) {
      if (i == 1) {
        $(e).click();
      }
    });

    или
    var tests = $("#elements > .test");
    
    for (var i = 0; i < tests.length; i++) {
      if (i == 1) {
        $(tests[i]).click();
        break;
      }
    });
    Ответ написан
    3 комментария
  • Как правильно расположить блоки с кнопками?

    Exomode
    @Exomode
    Архитектор ПО
    Набросал я вам тут вариантик на досуге...
    https://codepen.io/Exomode/pen/OjJdma - с применением JavaScript, самый надёжный, но более сложный и требует JS, что само по себе иногда может быть не так производительно как на чистом CSS.
    флоатов и таблиц здесь нет, а это значит что верстка будет отзывчивой для разрешений экранов различных устройств и может содержать в себе неограниченное количество блоков.
    Ответ написан
  • Можно ли открыть JSON файл через JS без AJAX-а?

    Exomode
    @Exomode
    Архитектор ПО
    Если файл лежит на сервере, то понятное дело что его придется как-то грузить в клиент. Как - зависит от вашего выбора, фантазии и задачи, способов множество. Если файл планируется читать и парсить локально, то в JS есть FileReader, это можно сделать с помощью него.
    Ответ написан
    Комментировать
  • Как добавить событие click на новый DOM имеющий тот же класс, что и старые (несгенерированные DOM)?

    Exomode
    @Exomode
    Архитектор ПО
    $(document).on('click', '.photo__link', function() {
        var photoId = $(this).data('id');
        callAjaxModal(photoId);
      });
    Ответ написан
    Комментировать
  • Как сделать такие линии?

    Exomode
    @Exomode
    Архитектор ПО
    Либо отрисовать канвасом кривую Безье, как указали выше, либо только средствами CSS3, применить трансформацию к блоку с абсолютным позиционированием и скругленным бордером. В обоих случаях линии залить линейным градиентом. Получится примерно такой эффект как на картинке.
    Ответ написан
    Комментировать
  • Vkontakte API (PHP): Можно ли загружать картинки не из файла, а задать URL картинки в Интернете?

    Exomode
    @Exomode
    Архитектор ПО
    В документации явно указано как это работает. Получаете сервер, грузите файл, дальше передаете его идентификатор куда надо. И никак иначе. Если нужно загрузить картинку с другого ресурса - сперва его нужно сохранить к себе локально, и только потом отправлять на сервера VK. Загрузить можно через CURL, поток или file_get_contents().
    Ответ написан
    Комментировать
  • В адресах url сайта появились /#, можно ли это убрать?

    Exomode
    @Exomode
    Архитектор ПО
    Это якори для отсылкам к идентификаторам документа. Удобная штука для навигации по странице и для передачи клиентских параметров без cookie. Работают исключительно на клиенте и на сервер не попадают. Чтобы их убрать, нужно добавить примерно такой js:

    $(window).on('hashchange', function() {
      window.location.hash = null;
    });


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

    $(window).on('hashchange', function() {
      if (window.location.hash == '#') {
        window.location.hash = null;
      }
    });
    Ответ написан
    3 комментария
  • Как сверстать такую секцию landing page?

    Exomode
    @Exomode
    Архитектор ПО
    Можно и на CSS3:

    <div class="background">
      <div class="triangle"></div>
    </div>


    * {
      margin: 0;
      padding: 0;
      outline: 0 none;
      box-sizing: border-box;
    }
    
    .background {
      width: 100vw;
      min-height: 100vh;
      display: block;
      overflow-x: hidden;
    }
    
    .triangle {
      background: #404040;
      height: 100vh;
      display: block;
      position: relative;
    }
    
    .triangle:after {
    	content: '';
      position: absolute;
    	bottom: -15rem;
    	width: 0;
    	height: 0;
    	border: 1rem solid transparent;
      background: transparent;
    	border-bottom: 14rem solid #404040;
    	transform: rotateX(180deg) scaleX(42);
    	left: 48.8%;
    }


    https://codepen.io/Exomode/pen/vJYQjB
    Ответ написан
    Комментировать
  • Как авторизоваться на сайте, использующем OAuth2 из .NET приложения?

    Exomode
    @Exomode
    Архитектор ПО
    С помощью HttpClient, он так же поддерживает HTTPS.

    using (HttpClient client = new HttpClient())
    {
        var response = await client.GetAsync("https://api.vk.com/method?");
    }


    Дальше уже дело техники. Следуете документации, регаете своё приложение, получаете ServiceToken, дальше получаете токены для юзера или для соо. Если лень возиться со своим велосипедом, рекомендую Citrina и подобные фреймверки-обертки над VK.API, их уже не мало реализовано. Для авторизации без OAuth рекомендую VK.NET, но в нем местами встречаются косяки, которые нужно самому править.
    Ответ написан
    Комментировать
  • Как сделать такой эффект?

    Exomode
    @Exomode
    Архитектор ПО
    Там страница разбита на несколько блоков. У самого первого стоит обычный эффект параллакса, происходит смещение фона с более низкой скоростью, чем у самого скролла. В сети есть более 35 готовых реализаций на любой вкус и цвет. Во втором блоке просто идёт активация по триггеру, как только позиция скролла достигает позиции блока, проявляется верхний элемент с надписью, такое тоже не сложно реализовать, в сети есть куча примеров на том же jQuery. У остальных двух блоков эффектов при скроллинге я не заметил.
    Ответ написан
    3 комментария
  • Откуда text.ru берет данные для проверки на плагиат?

    Exomode
    @Exomode
    Архитектор ПО
    Скорее всего, там классический "накопительный" подход бигдаты. Асинхронно в бэкграунде идёт парсинг данных из сети, это позволяет всегда держать данные актуальными и динамически её пополнять. Затем формируются метаданные для быстрого анализа, они уже и хранятся в базе сервиса. Затем, когда Вы уже непосредственно ввели текст и отправили на валидацию, идёт анализ сопоставлений с помощью нечёткого поиска или других оптимизированных алгоритмов работы с текстом, сопоставляются метаданные и выдаётся результат. Конечно, я могу и ошибаться, но если бы мне нужно было реализовать подобное решение, то принцип работы у него был бы схож с вышеописанным.
    Ответ написан
    Комментировать
  • Как правильно реализовать Ajax Передачу данных из ui-dialog в php обработчик?

    Exomode
    @Exomode
    Архитектор ПО
    $(document).on("submit", "#your_form", function (e) {
        var id = $("#your_form input[name='id']").val() >> 0;
        var login = $("#your_form input[name='login']").val();
        var request = {};
    
        if (id > 0) {
            request["id"] = id;
        }
    
        if (login) {
            request["login"] = login;
        }
    
        $.post("/handler.php", request).done(function (response) {
            if (response) {
                 alert(response);
                 return;
            }
    
            window.location.href = "/new/address/";
        });
    
        return false;
    });


    if (!isset($_POST["id"]) || !isset($_POST["login"])) {
        echo "ID и логин обязательны для заполнения";
        exit;
    }
    
    // Обработать $_POST["id"] и $_POST["login"], предусмотреть валидацию и экранирование спецсимволов
    
    exit;


    Используйте метод $.ajax лишь в случае, если вам важна тонкая настройка взаимодействия с сервером или, например, для добавления файлов в форму после их превалидации на клиенте. Для всех остальных случаев методов $.post и $.get более чем достаточно.

    В данном примере я вешаю на событие onsubmit обработчик через $(document).on(), для того, чтобы событие отработало даже если форма была добавлена в DOM уже после загрузки документа. Затем я получаю два поля формы, первый привожу к int с помощью >> 0 (это самый простой и самый производительный способ привести переменную к типу int в JavaScript), а второе поле у меня string. Далее я формирую параметры запроса к серверному обработчику (скрипт /handler.php), предварительно проверив данные на присутствие в форме и корректность int (по моим условиям, он должен быть unsigned), после чего я отправляю данные на обработчик и жду ответа, ответ я получаю в коллбэке done(response), где обрабатываю его. Если ответ пришел - значит ошибка и вывожу в алерте на экран, иначе все валидно и делаю редирект на другой адрес. В конце обработчика формы я прописал return false, если этого не сделать, то форма автоматически перейдет по адресу, указанному в атрибуте action, что нарушит задуманную логику и браузер даже не успеет вывести алерт в случае ошибки.

    С серверным скриптом обработки думаю все и так ясно и объяснять не стоит.

    Данный пример я накидал на импровизации, это один из множества способов реализации необходимой вам задачи и не претендует на эталон, Вы вправе закодировать нужную вам логику как вашей душе угодно как на стороне клиента, так и на серверсайде.
    Ответ написан
    Комментировать
  • Принудительное кеширование Firefox, как заставить игнорировать заголовки?

    Exomode
    @Exomode
    Архитектор ПО
    Приветствую!
    Почему-то не сказано ни слова о том, какими способами уже пробовали побороть проблему. Для старта рекомендую базу - https://www.netangels.ru/support/hosting-howto/hta...
    Весь смысл в том, чтобы указывать в заголовках параметры кэширования. В той статье описан способ автоконтроля заголовков кэширования через конфиг, если не поможет - стоит начать копать в сторону ручной отправки с того же сервера.
    Ответ написан
  • Находил ли кто подобный плагин?

    Exomode
    @Exomode Автор вопроса
    Архитектор ПО
    Аналогов я так и не нашел, вот решение, которое написал за вчера сам:
    var blackCoeff = 1.25;	// Коэффициент затемнения
    
    var sectionList;
    var blackList;
    var counter;
    
    function buildStyles() {
    	var styles = 'body {' +
    					'height: ' + ($("body").height() + 'px;') +
    					'position: relative;' +
    				 '}' +
    				 
    				 '.black {' +
    					'position: absolute;' +
    					'top: 0;' +
    					'left: 0;' +
    					'background: black;' +
    					'opacity: 0.8;' +
    				 '}' +
    					
    				 'section {' +
    					'position: relative;' +
    					'top: 0;' +
    				 '}' +
    				 
    				 'section.fixed {' +
    					'position: fixed;' +
    					'top: 0;' +
    				 '}';
    
    	$('head').append('<style id="sticky-stack-styles" type="text/css">' + styles + '</style>');
    }
    
    $(window).on('scroll', function() {
    	var windowScrollPos = $(window).scrollTop();
    	var tmpCounter = counter;
    	
    	counter = 0;
    	
    	for (var i = 0; i < sectionList.length; i++) {
    		if (windowScrollPos >= $(sectionList[i]).offset().top) {
    			counter++;
    		}
    	}
    	
    	if (counter > 1) {
    		$(blackList[counter - 2]).css("opacity", (windowScrollPos / $(sectionList[counter < sectionList.length ? counter : counter - 1]).offset().top - 1) * (-counter * blackCoeff));
    	}
    	
    	if (counter != tmpCounter) {
    		for (var i = 0; i < sectionList.length; i++) {
    			$(sectionList[i]).removeClass("fixed");
    		}
    		
    		if ((tmpCounter == 2 && counter <= 1)) {
    			return;
    		}
    		
    		$(sectionList[counter - 1]).addClass("fixed");
    	}
    });
    
    $(function () {
    	$("footer").append("<section/>");
    	
    	sectionList = $("section");
    	
    	for (var i = 0; i < sectionList.length; i++) {
    		var zIndex = (sectionList.length - i) * 2;
    		$(sectionList[i]).css("z-index", zIndex);
    		
    		if (i == 0) {
    			continue;
    		}
    		
    		$(sectionList[i]).prepend('<div class="black" style="width: ' + $(sectionList[i]).width() + 'px; height: ' + $(sectionList[i]).height() + 'px; z-index: ' + (zIndex + 1) + '"></div>');
    	}
    	
    	blackList = $(".black");
    	
    	buildStyles();
    });


    Полностью соответствует требованиям задачи ТЗ заказчика, не затрагивает структуру оригинальной верстки и стили, генерит что ему надо на лету, подключается в одну строку.
    Ответ написан
    Комментировать