Онлайн кликкер ч.1(JSON,AJAX,PHP)

уроки, мануалы, советы по Construct 2

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 15 май 2015, 17:26

Всем привет! Это мой первый урок на этом формуме,так что за оформление не судите строго :smile:
В этом курсе уроков я пошагово рассмотрю создание простенького кликкера с максимальной онлайн составляющей(админ панель,возможность управления с сайта,блок новостей,и.т.д.). Подробнее розписал по спойлерам.
 Подготовка к работе
Для начала работы нам понадобиться
-Notepad++ или любой другой текстовый редактор(т.к. мы будем работать с исходным кодом php);
-Зарегестрированый хостинг(абсолютно любой с php+mysql,более подробная информация есть в других уроках.Не буду описывать еще раз.);
-Базовые знания C2(данный урок рассчитан на более менее продвинутых пользователей);
Так же перед началом работы рекомендую подробно ознакомится с уроками endermAH. :ok:

 Результат этой части урока
Онлайн демо

 Клиентская часть (Construct 2)
Поскольку наша игра будет онлайн понятное дело нам понадобиться логин и регистрация,которые уже подробно описаны в других уроках,по этому я просто приложу бланк над которым мы будем работать.
Clicker.capx
(12.79 КБ) Скачиваний: 94
Бланк для работы(Регистрация+Логин)
:smile:
Скачиваем,открываем. Первым делом идем на слой Game и создаем главный спрайт(например монетку),и три текста(1-й отвечает за количество "монеток" а 2-й за "Баксы" а третий будет логом игры),также добавим две кнопки отвечающие за вход в меню и за сохранение. Теперь создадим системные объекты : Touch(для обработки нажатий),Array(для хранения данных)с параметрами 10,1,1(размер с запасом для будущих манипуляций).
Выйдет как-то так
Изображение
Теперь перейдем в слой событий.
Первое событие которое мы создадим - обработку клика по нашей монетке
Изображение
Условие события думаю всем понятно.Первое действие - спавн объекта частиц в точке касания(для украшения).Второе же действие - предписание значению в массиве системного выражения floor-округление к целому меньшему((random(0,5))по Х=1 Y=1 Z=1 но в коде указан 0 т.к. в Construct 2 используется счет с нуля(как и в многих Я.П.). Думаю с этим событием все ясно.Теперь приступим к созданию UI.
Изображение
Синхронизируем значения текста и значений в массиве 0,0,0 - монетки 1,0,0 - баксы.
Далее создадим новый слой для суб-меню который в будущем свяжем с PHP,MySql
Изображение
Привязываем переход на него к кнопке "Меню"
Теперь начинается самое интересное :cool:
Изображение
Создаем обработчик нажатия на кнопку "Сохранить" и привязываем к нему запрос на скрипт save.php(смотри спойлер PHP)
Рассмотрим по подробнее сам запрос
Изображение
Параметры:
Tag-параметр отвечающий за "тэг" обработчика,то есть "имя" нашего задания
URL-адрес на скрипт
Data-основное поле,в данном случае поле обработчика POST
Method- в нашем случае используем POST(передача php),также существует не один обработчик(GET и другие,возможно рассмотрю в других уроках)
Выражения:
Array.AsJSON - перекодировка массива в единую строку,для последуйщего удобного хранения.(очень пригодиться для использования массива вместо переменных в больших играх)

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

 Серверная Часть(MySQL подготовка)
Для начала данной части работы нам понадобится создать на нашем хостинге базу данных с такой структурой
Изображение
В колонке username будем хранить имя пользователя
В колонке password будем хранить пароль пользователя(в будущем допишу к уроку инструкцию по md5 шифровке)
В колонке data мы будем хранить строчку JSON(наш закодированый массив)

Теперь перейдем к написанию наших PHP скриптов

 save.php
Если не интересно читать - исходный код прикреплен в конце спойлера :unknown:

Подробное рассмотрение кода:
Изображение
Разрешаем кросс-доменные запросы и назначаем системным переменным свои значения
имя хоста,пользователь,бд,пароль.
Изображение
Осуществляем подключение к БД создаем системную переменную-обработчик.
mysql_connect - Подключение к MySql серверу
mysql_select_db - Выбор БД на Mysql сервере
or - оператор или (отличается от else тем что возможен только для двух вариантов)
die - набор текста на экран
Так же прошу обратить внимание на то что в конце каждой команды стоит символ ";"
Изображение
Теперь рассмотрим блоки If - в данном случае применяем для проверки данных
$_POST['переменная'] - способ получения переменной из другого источника с помощью метода "POST"
Теперь рассмотрим функции метода Mysql_query(php функции работы с MySQL)
Изображение
SELECT- выбрать
* - все колонки
FROM - из
registration - имя таблицы
WHERE - где колонка username равна переменной полученой из POST
if(mysql_num_rows($q1)==0) - если количество строк равно 0 то выводим что аккаунта не существует
else (упомянутый выше - or ,в переводе на русский "если не"
UPDATE - обновить значения
SET - установить значение

Так же не забывайте что php код надо закрывать :biggrin:
Изображение

Код: Выделить всё
<?php
header ('Access-Control-Allow-Origin: *');

$mysql_host = "mysql.hostinger.com.ua";
$mysql_database = "u199033043_click";
$mysql_user = "u199033043_adm";
$mysql_password = "********************";

$link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Ошибочка вышла...");
mysql_select_db($mysql_database, $link) or die ("Ой...");

if($_POST['username'] == "")
      echo 'Аккаунта не существует!';
   else
      $username = $_POST['username'];
if($_POST['data'] == "")
      echo 'Системная ошибка!';
   else
      $data = $_POST['data'];

         $q1 = mysql_query("SELECT * FROM registration WHERE username='".$username."'");
         if(mysql_num_rows($q1)==0)
               {   
                  echo 'Аккаунта не существует!';
               }
            else
               {
                  mysql_query("UPDATE registration SET data='".$data."' WHERE username='".$username."'");
                  echo 'Успешно сохранено';
               }
?>

 load.php
В этом скрипте объяснить осталось пожалуй только одну ф-цию
Изображение
mysql_result($q2, 0) - вывод первой(заметьте что счет в php тоже с нуля) строки обработчика $q2 (строкой выше)
Код: Выделить всё
<?php
header ('Access-Control-Allow-Origin: *');

$mysql_host = "mysql.hostinger.com.ua";
$mysql_database = "u199033043_click";
$mysql_user = "u199033043_adm";
$mysql_password = "*********";

$link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Ошибочка вышла...");
mysql_select_db($mysql_database, $link) or die ("Ой...");

if($_POST['username'] == "")
{
      echo 'Аккаунта не существует!';
}
      else
{
      $username = $_POST['username'];

         $q1 = mysql_query("SELECT * FROM registration WHERE username='".$username."'");
         if(mysql_num_rows($q1)==0)
               {   
                  echo 'Аккаунта не существует!';
               }
            else
               {
                   $q2 =  mysql_query("SELECT data FROM registration WHERE username='".$username."'");
                  echo mysql_result($q2, 0);
               }
}
?>

 login.php
Подробно описан в уроке "Вход"
Исходный код :
Код: Выделить всё
<?php
header ('Access-Control-Allow-Origin: *');//Разрешили кроссдоменные запросы

$mysql_host = "mysql.hostinger.com.ua";
$mysql_database = "u199033043_click";
$mysql_user = "u199033043_adm";
$mysql_password = "**********";

$link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Ошибочка вышла...");
mysql_select_db($mysql_database, $link) or die ("Ой...");//Подключились к базе

$username = $_POST['username'];
$password = $_POST['password'];

$q1 = mysql_query("SELECT password FROM registration WHERE username='".$username."'");//Присваиваем идентификатор переменной
      if(mysql_num_rows($q1) == 0)//проверяем: есть ли такой пользователь
         {
            echo "Нет такого пользователя!";//Тут всё ясно
         }
         else
         {
            $real = mysql_result($q1, 0);//Извлекаем сам пароль (если есть такой пользователь!!!)
            if ($real === $password)//Сравниваем полученный парль (ставим регистрозависимое ===)
               {   
                  echo "Всё верно!";//Тут понятно
               }
               else
               {
                  echo "Такой пары ник-пароль не обнаружено!";//Тут так же понятно ))
               }   
         }
?>

 registration.php
Подробно описан в уроке "Регистрация"
Исх.Код
Код: Выделить всё
<?php
header ('Access-Control-Allow-Origin: *');//Разрешили кроссдоменные запросы

$mysql_host = "mysql.hostinger.com.ua";
$mysql_database = "u199033043_click";
$mysql_user = "u199033043_adm";
$mysql_password = "**********";

$link = mysql_connect($mysql_host, $mysql_user, $mysql_password) or die("Ошибочка вышла...");
mysql_select_db($mysql_database, $link) or die ("Ой...");//Подключились к базе

if($_POST['username'] == "")
      echo 'Введите имя пользователя!';
   else
      $username = $_POST['username'];
if($_POST['password'] == "")
      echo 'Введите пароль!';
   else
      $password = $_POST['password'];
if(isset($username) && isset($password))//Тут я всё-таки использоват isset :)
      {
         $q1 = mysql_query("SELECT * FROM registration WHERE username='".$username."'");//Извлекаем все строки с указанным именем пользователя
         if(mysql_num_rows($q1)==0)//Если количество строк с таким именем пользователя = 0 ,то добавляем юзера и отвечаем спасибо за регистрацию
               {
                  mysql_query("INSERT INTO registration (username, password ) VALUES ('".$username."' , '".$password."')");
                  echo 'Спасибо за регистрацию';
               }
            else// А если есть такой юзер сожелеем об этом :)
               {
                  echo 'К сожалению, такое имя пользователя уже занято';
               }
      }
?>

Надеюсь вам понравилось wink:: Продолжение напишу на неделе.
Буду рад конструктивной критике и советам :yes: Жду ваших отзывов. :rolleyes:
Аватара пользователя

Участник
Сообщений: 59
Я тут с 02 окт 2014
Репутация 5 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 16 май 2015, 10:41

imperror, в скрипте save не обязательно сначала проверять есть ли аккаунт в базе, в любом случае человек уже вошел, да и если аккаунта не будет, апдейт вернет ошибку, а перебирать базу нет смысла, ресурсы только тратятся, а так очень даже неплохой урок)
Аватара пользователя

Участник
Сообщений: 60
Я тут с 04 сен 2014
Репутация 15 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 16 май 2015, 11:22

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

Участник
Сообщений: 59
Я тут с 02 окт 2014
Репутация 5 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 16 май 2015, 21:45

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

ERROR: Неизвестная пунктуация @ 1
STR: <?
SQL: <?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');<?php
header ('Access-Control-Allow-Origin: *');

SQL-запрос:

<?php header ('Access-Control-Allow-Origin: *');

Ответ MySQL: Документация

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '<?php
header ('Access-Control-Allow-Origin: *')' at line 1




Ошибка когда заливаю PHP save , что делать?
Аватара пользователя

Участник
Сообщений: 2
Я тут с 12 май 2015
Репутация 0 [ ? ]


Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 21 фев 2017, 08:47

Можно выложить нормальный исходник? половину событий нет...
Изображение
Аватара пользователя

Участник + TDS
Сообщений: 114
Я тут с 14 фев 2013
Лицензия: Personal
Репутация 6 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 22 фев 2017, 17:25

В уроке нет даже банальной проверки соединения на наличие HTTPS на стороне сервера.
Код: Выделить всё
if( empty($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == "off") die("Нету HTTPS!");

Без него можно перехватить и подделать запросы к серверу(и начитерить всё что угодно).
Аватара пользователя

Участник
Сообщений: 54
Я тут с 26 май 2014
Двиг: Construct 2
Лицензия: Personal
Skype: mc_45green
VK: 45green
Репутация −1 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 27 июн 2017, 15:38

45Green писал(а):В уроке нет даже банальной проверки соединения на наличие HTTPS на стороне сервера.
Код: Выделить всё
if( empty($_SERVER['HTTPS']) or $_SERVER['HTTPS'] == "off") die("Нету HTTPS!");

Без него можно перехватить и подделать запросы к серверу(и начитерить всё что угодно).

Что бы проверять HTTPS нужно для начала что бы он вообще был :biggrin:
Урок расчитан на новичков в с2 и php, а если говорить о таких вещах как безопастность, то можно написать гайд по сохранению 1 переменной на очень много страниц. И в таком гайде уже прийдется упомянуть md5 кеш, timestamp, authkey и прочие фишки защиты от фейковых запросов.
Аватара пользователя

Участник
Сообщений: 59
Я тут с 02 окт 2014
Репутация 5 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 30 июн 2017, 23:27

imperror писал(а):Что бы проверять HTTPS нужно для начала что бы он вообще был :biggrin:
Урок расчитан на новичков в с2 и php, а если говорить о таких вещах как безопастность, то можно написать гайд по сохранению 1 переменной на очень много страниц. И в таком гайде уже прийдется упомянуть md5 кеш, timestamp, authkey и прочие фишки защиты от фейковых запросов.

Как соединить load.php с C2. Целыми днями мучаюсь, не могу понять :unknown:
Аватара пользователя

Участник
Сообщений: 25
Я тут с 22 июн 2017
Репутация 0 [ ? ]

Сообщение Онлайн кликкер ч.1(JSON,AJAX,PHP)
» 02 июл 2017, 11:26

Все неплохо, вот только вроде бы mysqli_connect и mysqli_select_db вроде можно в одну функцию совместить (ну или нет, может я путаю чего), да и вообще лучше PDO юзать, без него вся схема будет очень уязвима для SQL Injection.
Аватара пользователя

Участник
Сообщений: 2
Я тут с 02 июл 2017
Репутация 0 [ ? ]



Вернуться в Уроки по Construct 2

Сейчас эту тему просматривают

Зарегистрированные пользователи: нет зарегистрированных пользователей

Наверх