Четверг, 26 Декабря 2024, 04:03

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Проблемы в ходе создания игры
vladbossДата: Пятница, 27 Июля 2012, 19:17 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Всем добрый вечер)
Вопрос также по поводу браузерки..

игру проработал, бой на арене, магазин и т.д. проблемы возникли с таким пунктом, как "работа".
конкретно проблема вот в чем..

когда игрок зайдет на работу и выберет, сколько часов он будет работать, допустим 2 часа выбрал..нужен таймер обратного отчета, я пробывал самостоятельно что то замутить, но при обновлении страницы таймер заного считать начинает, может его как то в базу данных загнать? и пока идет время работы игрок не может что либо делать(учавствовать в боях и т.д.)


-помог ставь +

АБП production ©
NosorogДата: Пятница, 27 Июля 2012, 19:29 | Сообщение # 2
участник
Сейчас нет на сайте
А зачем спрашивать, если сам знаешь как сделать?! smile

Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
llibertyДата: Пятница, 27 Июля 2012, 19:30 | Сообщение # 3
был не раз
Сейчас нет на сайте
А в чем проблема? сделайте в таблице персонажа еще одно поле: работает до...
Когда игрок начинает работать, пишете туда (текущее время + 2 часа). И если игрок пытается зайти в бой или на другую работу - проверяете поле, и если время не истекло говорите ему что придется подождать...


Сообщение отредактировал lliberty - Пятница, 27 Июля 2012, 19:31
vladbossДата: Пятница, 27 Июля 2012, 22:31 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Quote (Nosorog)
А зачем спрашивать, если сам знаешь как сделать?!

хахах ну логично, только вот нюанс..я теоритически знаю но воплотить не могу, видимо не хватает знания в программировании..но я верю в чюдо:D

lliberty,
у меня такие мысли были..вот что я не могу додумать..
получается я начал работу, 2 часа записались в базу, дальше все как ты расписал.
НО таймер... как его написать так, чтобы в базе данных не на века поселились эти 2 часа, а чтобы отчет обратный шел)

в гугле юзал, нашел скрипт таймера, или его каким то образом записывать в БД, или что, он заного начинает считать как обновлю страницу, а это не интересно:D

вроде доступно обьяснил, ща еще раз прочитаю что написал:D


-помог ставь +

АБП production ©


Сообщение отредактировал vladboss - Пятница, 27 Июля 2012, 22:32
NosorogДата: Пятница, 27 Июля 2012, 22:56 | Сообщение # 5
участник
Сейчас нет на сайте
Quote (vladboss)
как его написать так, чтобы в базе данных не на века поселились эти 2 часа, а чтобы отчет обратный шел)

Quote (lliberty)
текущее время + 2 часа

Зачем обратный отсчет?!!!
Code
time()+7200
пишешь в бд, затем если юзер собрался атаковать кого-то, то проверяешь если (time()>то что ты записал в бд) атакуем! иначе эхо иди работай!


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
vladbossДата: Пятница, 27 Июля 2012, 23:07 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
уважаемый Носорог, походу ночь на меня плохо влияет, и я не догоняю..
про time() лучше поконкретнее мне распиши, а то как в стенку..
мини скрипт..ситуация, допустим выбрал я работать "n" часов..как дальше, ход событий..


-помог ставь +

АБП production ©
NosorogДата: Суббота, 28 Июля 2012, 00:38 | Сообщение # 7
участник
Сейчас нет на сайте
Отправляем юзера на работу
Code
<?
//Получаем количество часов работы, которые выбрал пользователь и переводим в секунды 1час=3600секунд
switch ($_POST['work']){
case 1:
$work_time=3600;
case 2:
$work_time=7200;
case 8:
$work_time=28800;
}
//Получаем время окончания работы в формате Unix time, функция time()==текущее время
$end_work=time()+$work_time;
//Предварительно в базу данных добавляем новый столбец INT(11) к таблице пользователей...
// и выполняем запрос
mysql_query("UPDATE `users` SET `end_work`='{$end_work}' WHERE `id_user`='{$_SESSION[id]}'");
?>

Там где нужно проверить работает ли пользователь или нет вставляем что-то типо этого
Code
<?

mysql_query("SELECT end_work FROM users WHERE `id_user`='{$_SESSION[id]}'");
//...
//Проверяем - закончил ли пользователь работать, сравнивая текущее время time() с временем окончания работы
if(time()>$result['end_work']){
// Скрипт продолжает свою работу
}
else echo "Иди работай...";

?>


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
llibertyДата: Суббота, 28 Июля 2012, 00:47 | Сообщение # 8
был не раз
Сейчас нет на сайте
Игрок с айди $userID начал работать, вычисляем время.
Code

$time = mktime(); //текущее время
//нам надо что бы он закончил через 2 часа (60 секунд*60 минут*2часа = 7200 секунд).
$time+=7200;
//Пишем в базу
$sh = mysql_query("UPDATE `users` SET work_time={$time} WHERE user_id={$userID};");
...


Когда игрок совершает какое-то действие, проверяем:
Code

$now_time = mktime();
//Берем данные из базы
$sh = mysql_query("SELECT work_time FROM `users` WHERE user_id={$userID};");
$ar = mysql_fetch_row($sh);
if($now_time < $ar[0]){
    //Игрок еще работает!    
}else{
    //Работа завершена
}



-------
Пока текст набирал, уже ответили xD


Сообщение отредактировал lliberty - Суббота, 28 Июля 2012, 00:49
NosorogДата: Суббота, 28 Июля 2012, 00:47 | Сообщение # 9
участник
Сейчас нет на сайте
Quote (vladboss)
уважаемый Носорог

Не люблю, когда в неофициальной обстановке, ко мне так обращаются. Да и какой же я уважаемый на этот форуме, если моя репутация такая никчемная.


Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
vladbossДата: Понедельник, 30 Июля 2012, 00:26 | Сообщение # 10
постоянный участник
Сейчас нет на сайте
Nosorog,
Спасибо, как домой приеду, так попробую сделать, пока что залипаю на хате:D
по поводу репутации, она у тебя приличная, и если я пишу уважаемый то это не с проста, ты мне помогаешь и я благодарен:D
lliberty,
ахах, быстрее надо набирать:D
спасибо)

Добавлено (30.07.2012, 00:26)
---------------------------------------------
что я делаю не так?
у меня в базу записывается число типа "1343622201" такого..

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


-помог ставь +

АБП production ©
NosorogДата: Понедельник, 30 Июля 2012, 01:18 | Сообщение # 11
участник
Сейчас нет на сайте
Загляни сюда

Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
vladbossДата: Понедельник, 30 Июля 2012, 11:24 | Сообщение # 12
постоянный участник
Сейчас нет на сайте
наконец то меня осенило, только что понял суть того что вы мне написали:D
сейчас попробую сделать)

Добавлено (30.07.2012, 11:19)
---------------------------------------------
Так, у меня получилось, немного по своему сделал, спасибо огромное)
еще однин вопрос, как преобразовать в часы минуты 3600 или 3475секунд???
для того чтобы игрок знал сколько ему осталось..

Добавлено (30.07.2012, 11:24)
---------------------------------------------
я пишу так..
вам осталось (здесь секунды типо 13506) до завершения работы..
мне надо (чч:мм)


-помог ставь +

АБП production ©
gmmmmДата: Понедельник, 30 Июля 2012, 11:32 | Сообщение # 13
почетный гость
Сейчас нет на сайте
Code
<?php
$time = 3600; //допустим это время в секундах
$time = $time / 60; //вычисляем минуты
intval($time); // преобразуем в int
echo $time;
?>


получаем 60 минут.
думаю вы поняли.


пусто!)

Сообщение отредактировал gmmmm - Понедельник, 30 Июля 2012, 11:34
MrNeshДата: Понедельник, 30 Июля 2012, 11:34 | Сообщение # 14
Воин добра и света
Сейчас нет на сайте
Quote (vladboss)
мне надо (чч:мм)

Нуу сделай...блин ты только начал длать или
Quote (vladboss)
игру проработал, бой на арене, магазин и т.д. проблемы возникли с таким пунктом, как "работа".

smile




Сообщение отредактировал jiumx60rus - Понедельник, 30 Июля 2012, 11:35
vladbossДата: Понедельник, 30 Июля 2012, 11:47 | Сообщение # 15
постоянный участник
Сейчас нет на сайте
jiumx60rus,
если я проработал бой на арене и магазин, и вообще все то что не косается времени, а именно работа, аренда, это не значит что я вру и надо понижать репу)
я спрашиваю то в чем не разбираюсь, мне помогли, написали что да как, и теперь промозговав это, я знаю каким образом это делается..

Добавлено (30.07.2012, 11:47)
---------------------------------------------
gmmmm,
а если $time=не ровно 3600, а $time=3251(секунд)
поделишь не целое число же получится..
и тем более ты в минуты только преобразовал, а надо вывести (чч:мм)

напишите пожалуйста на примере пусть осталось до конца "13946" секунд


-помог ставь +

АБП production ©


Сообщение отредактировал vladboss - Понедельник, 30 Июля 2012, 11:56
gmmmmДата: Понедельник, 30 Июля 2012, 12:00 | Сообщение # 16
почетный гость
Сейчас нет на сайте
Quote
а если $time=не ровно 3600, а $time=3251(секунд)
поделишь не целое число же получится..
и тем более ты в минуты только преобразовал, а надо вывести (чч:мм)
к примеру(00:24)

Code
<?php
$time = 3641; //допустим это время в секундах
$time = (int)($time / 60); //вычисляем минуты
echo $time;
?>


Моя ошибка, дико извиняюсь.
Сейчас допишу для вас
Quote
(00:24)


пусто!)
MrNeshДата: Понедельник, 30 Июля 2012, 12:04 | Сообщение # 17
Воин добра и света
Сейчас нет на сайте
vladboss, но то что ты спрашиваешь это как бы основы biggrin



Сообщение отредактировал jiumx60rus - Понедельник, 30 Июля 2012, 12:06
gmmmmДата: Понедельник, 30 Июля 2012, 12:55 | Сообщение # 18
почетный гость
Сейчас нет на сайте
Code
<?php
function toMinandHo ($t)
   {
if ($t < 60)
{
echo $t . "секунд";
}
else if ($t < 3600)
{
echo (int)($t / 60). "минут";
}
else
{
$kv = substr($t, 0, strlen($t) - 1) . "0";
$ost = $t - $kv;
echo (int)($t / 3600). "часов" . $ost . "минут";
}
   }

toMinandHo(36666); // число для подсчета.
?>


Итог: 10 часов 6 минут.
Не знаю, должно работать. Если не работает напиши - посмотрим как исправить.


пусто!)
TimKruzДата: Понедельник, 30 Июля 2012, 14:50 | Сообщение # 19
старожил
Сейчас нет на сайте
Quote (vladboss)
пока идет время работы игрок не может что либо делать(учавствовать в боях и т.д.)

Алгоритм:
1. Игрок сделал запрос на начало работы.
2. Получили время начала в секундах, прибавили N секунд.
3. Полученное время - в базу данных.
4. Если игрок делает запрос о времени или попытку делать что-то ещё, например, обновление страницы с выводящимся таймером (таймер делается банальным обратным отсчётом на JS), запрос на действие, вход в игру (с отображением таймера или статуса действия), - либо считываем и отправляем игроку время, когда работа будет закончена (а JS-скрипт обработает), либо вычисляем оставшееся время и отправляем. Тут замечание:
4.1. Если при проверке выяснится, что время уже прошло - просто удаляем (обнуляем) запись в базе данных, и формируем страницу, соответствующую состоянию простоя (персонаж ничего не делает), либо, если игрок уже запросил действие, осуществляем это действие, т.е. переходим к пункту 1.
4.2. Счётчик на JS, при достижении 0, просто выводит сообщение о завершении работы и, возможно, переводит страницу в состояние простоя (заменяет табличку с таймером на табличку с сообщением о бездействии). При этом запись в базе данных будет удалена только тогда, когда игрок сделает новый запрос, однако по этому поводу беспокоиться не нужно, т.к. по сути эта запись в БД никому не мешает.
4.3. Возможен ещё один вариант удаления записи из БД: если кто-то зайдёт на страницу профиля игрока, на которой отображается статус персонажа. Тогда при следующем запросе от самого игрока ничего удалять не придётся, там и так будет стоять 0.

На счёт времени. В PHP-коде переводить часы в минуты и т.п. тебе в принципе-то и не нужно, ты оперируешь с секундами. Например, если операция длится 1 час - прибавь к текущему времени 3600 и запиши в базу. Скорей всего, ты будешь переводить секунды в часы на JS, а там специальные функции обработки времени есть. Да и в PHP есть, но тебе же не нужны статичные HTML-страницы, нужна хоть какая-то динамика...

Для ясности приведу пример.
1. Игрок нажал на кнопку "рубить дрова 1 час".
2. Сервер получил запрос, считал текущее время - 150000, прибавил к нему 3600, внёс в базу данных статус - "рубка дров" и число 153600.
3. Игрок получил страницу с таймером на JS. Этот таймер каждую секунду вычитает из 3600 единицу, переводит это число в строку типа "Осталось HH:mm" и выводит как текст в блок типа <div> на странице. Возможно дополнение - "Завершение работы в HH:mm, DD MM YYYY".
4. Игрок сделал запрос, когда было только 152000 секунд.
5. Сервер проверил БД: завершение в 153600, а 153600 больше, чем текущее время (серверной машины) - 152000. Он просто отправляет ту же страницу, что и была, но с сообщением "невозможно начать новую работу до завершения старой", при этом оставшиеся секунды сменяются с 3600 на 1600, потому что JS-таймер после перезагрузки страницы будет сброшен.
6. Наступило время X, JS-таймер досчитал до 0, выдал в <div> информацию о завершении и отключился.
7. Во время 154000 игрок снова сделал запрос.
8. Сервер проверил БД: завершение в 153600, однако уже 154000, т.е. 153600 меньше 154000. Сервер удаляет эту запись и отправляет игроку запрашиваемую страницу (выполняет требуемую задачу, возвращаясь к пункту 2).

Как-то так. Все необходимые функции можешь легко найти в справочниках по PHP и JS.


AnarchystДата: Понедельник, 30 Июля 2012, 14:52 | Сообщение # 20
Chaotic Evil
Сейчас нет на сайте
Мне лень читать все, так что мб сказали уже до меня:
Записываем в ячейку БД время, до которого игрок бездействует. При заходе сверяем это время и текущее (на сервере, офк). Все.


Good отстой, Neutral - параша, Evil, хой, победа наша!
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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