Понедельник, 25 Ноября 2024, 20:08

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите с написанием чата для браузерной игры.
SouzNikДата: Среда, 04 Января 2012, 18:14 | Сообщение # 1
был не раз
Сейчас нет на сайте
Кто знаком с PHP и JS помогите пожалуйста написать чат для браузерной игры. Главное - чтобы был без фреймов. Их у меня хостинг не поддерживает.
Я сам с PHP, MySQL знаком, просто не получается представить как это все будет.
Выглядеть сообщения должны примерно так:
[12:38] Вася: привет!
[12:40] Петя: привет.
[12:52] Петя: как дела?
P.s. Регистрацию, авторизацию уже реализовал. Логин записан в $login.
Если времени мало, просто помогите мне представить как сделать, чтобы чат обновлялся только когда надо, как реализовать прокрутку области с отправленными сообщениями, и сама страница не обновлялась, а то не удобно будет играть, когда страница постоянно обновляется. Дальше я сам справлюсь.


Сообщение отредактировал SouzNik - Среда, 04 Января 2012, 18:20
anton-garДата: Среда, 04 Января 2012, 19:07 | Сообщение # 2
WEBmaster
Сейчас нет на сайте
Во-первых, для игры не хостинг, а сервер нужен.
Во-вторых, обновляй с помощью js, без перезапуска страницы будет.
Глянь в нете готовые релизы, если же совсем ничего не выйдет, то стучись в л.с..


SouzNikДата: Четверг, 05 Января 2012, 10:51 | Сообщение # 3
был не раз
Сейчас нет на сайте
спасибо, только денег на сервер нет. пока, на стадии разработки обойдусь хостингом. потом найду какой - нибудь способ.

Сообщение отредактировал SouzNik - Четверг, 05 Января 2012, 14:59
XakepДата: Пятница, 06 Января 2012, 17:04 | Сообщение # 4
めちゃくちゃちゃ
Сейчас нет на сайте
если знаком с PHP и MySQL то в чем проблема??
создаешь таблицу типа
id login text
через Ajax можешь обновлять только чат а не всю страницу.
ну и сам чат что-то вроде :
вывести все записи из таблицы
нарисовать форму для чата
при нажатии на кнопку "Отправить" подаешь запрос типа
mysql_query("INSERT INTO `chat`, SET `login` = '".$user['login']."', 'text' = '".$_POST['text']."'");
вот и все. Либо поищи в интернете готовые решение, коих очень много.

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


Сообщение отредактировал Xakep - Пятница, 06 Января 2012, 17:07
SouzNikДата: Пятница, 06 Января 2012, 18:05 | Сообщение # 5
был не раз
Сейчас нет на сайте
Знаю, я уже пытался сделать сервером свой комп. У меня даже Денвер не идёт, так как у меня ОС - Win Server 2003. И он занимает 80 порт.

Вот недавно нашел на этом же сайте статью ассасина про создание чата на JS + PHP + MySQl.
Только я в JS мало понимаю, а там надо некоторый код подредактировать. Помогите кто нибудь сделать так, чтоб этот код использовал уже зареганных пользователей, а не регал их сам, а если пользователь не авторизован, пересылал на страницу авторизации (login.php)
P.S. Пользователи находятся в таблице users, а у авторизованных логин и пароль находятся в куках ($_COOKIE['zbgame_login'] и $_COOKIE['zbgame_pass'].

XakepДата: Пятница, 06 Января 2012, 18:16 | Сообщение # 6
めちゃくちゃちゃ
Сейчас нет на сайте
кинь мне их отдельными файлами, не удобно читать код
SouzNikДата: Пятница, 06 Января 2012, 19:13 | Сообщение # 7
был не раз
Сейчас нет на сайте
Кинул на ЛС.
Кстате, насчет аякс - я с ним не знаком.
XakepДата: Пятница, 06 Января 2012, 19:43 | Сообщение # 8
めちゃくちゃちゃ
Сейчас нет на сайте
ну вот смотри чтобы переходить на форму логи меняем код:
Code

    if (mysql_num_rows($sql) == 0) {   
     mysql_query("INSERT INTO `users` (`user_name`,`user_online`,`last_update`) VALUES ('".$name."','1','".time()."')");   
     $data['ans'] = 0;   
     $_SESSION['name'] = $name;   
     $data['login'] = $_SESSION['name'];   
     $msg_row = mysql_fetch_array(mysql_query("SELECT `post_id` FROM `post` ORDER BY `post_id` ASC"));   
     $data['id'] = $msg_row['post_id'];   
    }


на

Code

    if (mysql_num_rows($sql) == 0) {   
      $url = "login.php";
      echo "<HTML><HEAD>
             <META HTTP-EQUIV = 'Refresh' CONTENT = '3; URL = $url'>
             </HEAD></HTML>";
      exit;
    }


а остальное вроде все нормально там.
вот кстати почитай: http://gcup.ru/forum/51-17743-1


Сообщение отредактировал Xakep - Пятница, 06 Января 2012, 19:43
SouzNikДата: Воскресенье, 29 Января 2012, 12:24 | Сообщение # 9
был не раз
Сейчас нет на сайте
Спасибо, правда как раз оттуда я этот код и взял))

Добавлено (29.01.2012, 12:24)
---------------------------------------------
Я немного изменил код. Но не получается сделать вход не по логину, а по логину и паролю. Помогите кто нибудь, пожалуйста.

Script.js

Code

$(document).ready(function(){/* Как только загрузится документ, начинает работать код, который расположен внутри */  
   var name = null, // Будущее имя пользователя  
    id = 0; // id последнего сообщения  
   /* Начало работы, создаем запрос, который отсылает в скрипт core.php данные start=true методом POST ($_POST['start']=true) и принимаем от сервера данные в формате json */  
   $.ajax({  
    type: "POST",  
    url: "core.php",  
    data: "start=true",  
    dataType: 'json',  
    success: function(data) {  
     /* Если пришла ошибка от сервера, то показываем её пользователю и перезагружаем страницу */  
     if (data.err) {  
      if (data.err == 2) {  
       apprise('Невозможно найти БД', {}, function(r){  
        location.href = "index.html";  
       });  
      } else if (data.err == 1) {  
       apprise('База данных ушла в себя', {}, function(r){  
        location.href = "index.html";  
       });  
      }  
      return false;  
     }  
     /* Если ошибок нет и получен ответ = 0 то показываем пользователю всплывающее окно */  
     if (data.ans == 0) {  
      apprise('Логин:', {'input': true}, function(login){ /* Если пользователь не ввел логин либо нажал "Отменить" перезагружаем страницу */  
       if (login == false) {  
        location.href = "index.html";  
       } else {/* Если ввел логин, то отправляем в файл core.php введеный логин и принимаем ответ опять же в формате json */  
        $.ajax({  
         type: "POST",  
         url: "core.php",  
         data: "name="+login,  
         dataType: 'json',  
         success: function(data) {  
          /* Если ответ = 0, то запоминаем имя пользователя и id последнего сообщения */  
          if (data.ans == 0) {  
           name = data.login;  
           id = data.id;  
          } else { /* Иначе выдаем ошибку и перезагружаем страницу */  
           apprise('Такой логин уже используется', function(r){  
                    location.href = "index.html";  
           });  
          }  
         }  
        });  
       }  
      });  
     } else { /* Если получаем ответ != 0, то запоминаем имя пользователя и id последнего сообщения */  
      name = data.login;  
      id = data.id;  
     }  
    }  
   });  
   /* Функция которая возвращает сообщения и пользователей онлайн, обновляется каждые 2 сек (2000 милисек) */  
   update();  
   setInterval(update, "2000");  
     
   function update() {  
    /* Отправляем на сервер (файл core.php) данные update=1 и id последнего сообщения */  
    $.ajax({  
     type: "POST",  
     url: "core.php",  
     data: "update=1&id="+id,  
     dataType: 'json',  
     success: function(data) {  
      /* Проверяем наличие ошибок */  
      if (data.err) {  
       if (data.err == 2) {  
        apprise('Невозможно найти БД', {}, function(r){  
         location.href = "index.html";  
        });  
       } else if (data.err == 1) {  
        apprise('База данных ушла в себя', {}, function(r){  
         location.href = "index.html";  
        });  
       }  
       return false;  
      }  
      /* Обновляем список пользователей */  
      if (data.user != $("#user .d").html()) {  
       $("#user .d").html(data.user);  
      }  
      /* Добавляем новое сообщение на экран, прокручиваем скролл вниз и удаляем старые сообщения, оставивши последние 10 */  
      if (data.msg != "") {  
       id = data.id;  
       $('#message .d').append(data.msg);  
       $('#message').scrollTop($('#message')[0].scrollHeight);  
       var size = $("#message .d div").size();  
       if (size > 10) {  
        for (var i = 0; i < size-10; i++) {  
         $("#message .d div").eq(i).remove();  
        }  
       }  
      }  
     }  
    });  
    /* удаляем старые сообщения, оставивши последние 10. Данное действие дублируется, т.к. при загрузке страницы с чатом удаляются сообщения и при каждом новом полученом сообщении */  
    var size = $("#message .d div").size();  
    if (size > 10) {  
     for (var i = 0; i < size-10; i++) {  
      $("#message .d div").eq(i).remove();  
     }  
    }  
   }  
   /* Отслеживаем нажатие клавиш */  
   $('.msg').keydown(function(event){  
    if (event.which == 13) { /* Если нажато Enter, запоминаем сообщение и  */  
     var msg = $(this).val(),  
      then = $(this); /* Обращение на самого себя, т.е. на элемент, который имеет класс msg (в нашем случае это input) */  
     if (msg == "") { /* Если сообщение пустое, то прекращаем выполнять следующий код*/  
      return false;  
     }  
     /* Отправляем на сервер сообщение и если пришел положительный ответ (!= 0) то прокручиваем блок сообщений вниз и очищаем строку в которую вводим сообщение */  
     $.ajax({  
      type: "POST",  
      url: "core.php",  
      data: "msg="+msg,  
      dataType: 'json',  
      success: function(data) {  
       if (data.ans != 0) {  
        $('#message').scrollTop($('#message')[0].scrollHeight);  
        then.val("");  
       }  
      }  
     });  
    };  
   });  
});

Core.php
Code


<?php  
session_start();  
/* Данные для подключения к БД */  
define("DB_HOST", "localhost");  
define("DB_USER", "12345");  
define("DB_PASS", "12345");  
define("DB_NAME", "12345");  
/* Фильтрация всех получаемых переменных */  
$start = htmlspecialchars(stripslashes($_POST['start']));  
$name = htmlspecialchars(stripslashes($_POST['name']));  
$msg = htmlspecialchars(stripslashes($_POST['msg']));  
$update = htmlspecialchars(stripslashes($_POST['update']));  
$id = htmlspecialchars(stripslashes($_POST['id']));  
/* Соединение с БД и если не удачное, то отправка ошибок клиенту */  
$connect = mysql_connect(DB_HOST, DB_USER, DB_PASS);  
if (!$connect) {  
   $data['err'] = 1;  
   echo json_encode($data);  
   exit;  
}  
$db_sel = mysql_select_db(DB_NAME,$connect);  
if (!$db_sel) {  
   $data['err'] = 2;  
   echo json_encode($data);  
   exit;  
}  
# Установка языка записи в БД  
mysql_query("SET NAMES utf8");  
/* Если игрок загрузил страницу чата, то наш script.js передает серверу данные $_POST['start'] вот и обрабатываем эти данные */  
if (!empty($start)) {  
   /* Если не существует сессия name, то возвращаем 0, в другом случае указываем логин игрока, который хранится в сессии, передаем id последнего сообщения */  
   if (empty($_SESSION['name'])) {  
    $data['ans'] = 0;  
   } else {  
    $data['ans'] = 1;  
    $data['login'] = $_SESSION['name'];  
    $msg_row = mysql_fetch_array(mysql_query("SELECT `post_id` FROM `post` ORDER BY `post_id` ASC"));  
    $data['id'] = $msg_row['post_id'];  
   }  
   echo json_encode($data); // Отправляем данные в формате json  
   exit;  
}  
/* Если переменная $name не пуста, то выполняем код */  
if (!empty($name)) {  
   /* Ищем игрока в БД */  
   $sql = mysql_query("SELECT * FROM `users` WHERE `user_name`='".$name."'");  
   if (mysql_num_rows($sql) == 0) {  
    /* Если не находим, то создаем новую запись, запоминаем логин и передаем клиенту логин и id последнего сообщения */  
    mysql_query("INSERT INTO `users` (`user_name`,`user_online`,`last_update`) VALUES ('".$name."','1','".time()."')");  
    $data['ans'] = 0;  
    $_SESSION['name'] = $name;  
    $data['login'] = $_SESSION['name'];  
    $msg_row = mysql_fetch_array(mysql_query("SELECT `post_id` FROM `post` ORDER BY `post_id` ASC"));  
    $data['id'] = $msg_row['post_id'];  
   } else {  
    /* Если игрок в БД уже есть, то проверяем онлайн он или нет. Если онлайн, то выдаем ошибку, если нет, то делаем его онлайн и передаем нужные данные клиенту */  
    $row = mysql_fetch_array($sql);  
    if ($row['user_online'] == 0) {  
     $t = time();
     mysql_query("UPDATE users SET last_update = '".$t."', user_online = '1' WHERE user_name = '".$_SESSION['name']."'");  
     $data['ans'] = 0;
     $_SESSION['name'] = $name;  
     $data['login'] = $_SESSION['name'];  
     $msg_row = mysql_fetch_array(mysql_query("SELECT `post_id` FROM `post` ORDER BY `post_id` ASC"));  
     $data['id'] = $msg_row['post_id'];  
    } else {  
     $data['ans'] = 1;  
    }  
   }  
   echo json_encode($data);  
   exit;  
}  
/* Получение нового сообщения */  
if (!empty($msg)) {  
   if (empty($msg)) { /* Если переменная пуста, то возвращаем 0 */  
    $data['ans'] = 0;  
   } else { /* В другом случае записываем в БД сообщение, обновляем запись игрока в БД (указываем что игрок онлайн и обновляем время последнего действия, нужно для отслеживания игроков онлайн) и отправляем нужные данные клиенту */  
    $t = time();  
    mysql_query("INSERT INTO `post` (`post_login`,`post_time`,`post_txt`) VALUES ('".$_SESSION['name']."','".$t."','".$msg."')");  
    mysql_query("UPDATE `users` SET `last_update`='".$t."', `user_online`='1' WHERE `user_name`='".$_SESSION['name']."'");  
    $data['ans'] = 1;  
    $data['login'] = $_SESSION['name'];  
    $data['time'] = date('H:i:s', $t);  
    $data['msg'] = $msg;  
   }  
   echo json_encode($data);  
   exit;  
}  
/* Если переменная $update не пуста (функция обновления на стороне клиента) */  
if (!empty($update)) {  
   if (empty($update)) {  
    $data['ans'] = 0;  
   } else {  
    /* Выбираем всех игроков с базы */  
    $user = mysql_query("SELECT * FROM `users`");  
    $data['user'] = "";  
    while ($user_row = mysql_fetch_array($user)) {  
     /* Если игрок онлайн, то проверяем время его последнего действия и добавляем к нему 1 час (3600 сек) и запоминаем для передачи его имени клиенту. Если игрок в течении часа ничего не делал, то переводим его в режим оффлайн и убираем из списка игроков. Перевод игрока в режим оффлайн будет состоятся только в том случае если хоть 1 пользователь будет находится в чате. */  
     if ($user_row['user_online'] == 1) {  
      $t = $user_row['last_update']+3600;  
      if ($t >= time()) {  
       $data['user'] .= "<div>".$user_row['user_name']."</div>";  
      } else {  
       mysql_query("UPDATE `users` SET `user_online`='0' WHERE `user_name`='".$user_row['user_name']."'");  
      }  
     }  
    }  
    /* Выбираем все сообщения */  
    $msg_sql = mysql_query("SELECT * FROM `post` ORDER BY `post_id` ASC");  
    $data['msg'] = "";  
    while ($msg_row = mysql_fetch_array($msg_sql)) {  
     /* Производим проверку id. Если id игрока меньше чем id последнего сообщения, значит в БД появилось новое сообщение, выбираем его и запоминаем для передачи клиенту. Данное действие нужно для того что бы в чат клиенту добавлять по несколько сообщений, а не обновлять весь блок (div). Т.к. бывает нужно выделить какое то сообщение, а не можешь, т.к. блок обновляется и выделение сбрасывается. */  
     if ($id < $msg_row['post_id']) {  
      $data['msg'] .= "<div><font color='grey'>[".date('H:i:s', $msg_row['post_time'])."]</font> <strong>".$msg_row['post_login']." : </strong>".$msg_row['post_txt']."</div>";  
      $data['id'] = $msg_row['post_id'];  
     }  
    }  
   }  
   echo json_encode($data);  
   exit;  
}  

?>
HerrPotapovДата: Воскресенье, 29 Января 2012, 17:00 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
anton-gar, здесь идет речь о чем-то, находящемся в пре-пре-альфе. Обычного хостинга будет вполне достаточно smile

Discord: alpotapov#1741

Интервью с разработчиком WarCastle - Читаем и вникаем!
UzzzerДата: Воскресенье, 29 Января 2012, 22:46 | Сообщение # 11
участник
Сейчас нет на сайте
Я для моб писал, без яваскрипта!

База
chat_id bigint(20)
chat_room varchar(32)
user_login varchar(32)
chat_text varchar(255)
chat_date time

вывод
HerrPotapovДата: Понедельник, 30 Января 2012, 01:47 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
Code

$result = mysql_query($sql);
$chat_row = mysql_fetch_array($result);  
do  
{  
echo $chat_row['user_login']."</div>";  
echo " [".$chat_row['chat_date']."]<br>";  
echo $chat_row['chat_text']."<br><br>";  
}  
while($chat_row= mysql_fetch_array($result));


Поправьте меня если я не прав, но do...while - не самый лучший вариант. По-крайней мере с точки зрения читабельности кода это лучше записать так:

Code
$result = mysql_query($sql);
while($chat_row= mysql_fetch_array($result))  
{  
echo $chat_row['user_login']."</div>";  
echo " [".$chat_row['chat_date']."]<br>";  
echo $chat_row['chat_text']."<br><br>";  
}


Discord: alpotapov#1741

Интервью с разработчиком WarCastle - Читаем и вникаем!
UzzzerДата: Понедельник, 30 Января 2012, 10:34 | Сообщение # 13
участник
Сейчас нет на сайте
HerrPotapov,
Возможно и да, но из за if(mysql_num_rows($result) == 0) { echo "В чате еще нет сообщений!";} else { все и так пашет норм!
DinoieraДата: Понедельник, 27 Февраля 2012, 11:42 | Сообщение # 14
участник
Сейчас нет на сайте
Quote (anton-gar)
Во-первых, для игры не хостинг, а сервер нужен.

Полностью хватает хостинга.. не надо брать машину для обработки браузерных данных


Помогаю чем могу и прошу взаимной помощи)
DCH - сайт разработчиков игр(новый проект)
ctpzДата: Воскресенье, 27 Мая 2012, 22:49 | Сообщение # 15
участник
Сейчас нет на сайте
Может не к месту, но попробуйте задать таймаут размером 1/20 секунды (или больше) и обновлять содержимое чата в соответствии с истечением времени, указанном в таймауте.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг