Проблемы в ходе создания игры
| |
vladboss | Дата: Пятница, 27 Июля 2012, 19:17 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| Всем добрый вечер) Вопрос также по поводу браузерки..
игру проработал, бой на арене, магазин и т.д. проблемы возникли с таким пунктом, как "работа". конкретно проблема вот в чем..
когда игрок зайдет на работу и выберет, сколько часов он будет работать, допустим 2 часа выбрал..нужен таймер обратного отчета, я пробывал самостоятельно что то замутить, но при обновлении страницы таймер заного считать начинает, может его как то в базу данных загнать? и пока идет время работы игрок не может что либо делать(учавствовать в боях и т.д.)
-помог ставь +
АБП production ©
|
|
| |
Nosorog | Дата: Пятница, 27 Июля 2012, 19:29 | Сообщение # 2 |
участник
Сейчас нет на сайте
| А зачем спрашивать, если сам знаешь как сделать?!
Классическая ошибка, которую совершают проектировщики абсолютно надёжных систем, - недооценка изобретательности клинических идиотов.
|
|
| |
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 часа Зачем обратный отсчет?!!! пишешь в бд, затем если юзер собрался атаковать кого-то, то проверяешь если (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) игру проработал, бой на арене, магазин и т.д. проблемы возникли с таким пунктом, как "работа".
Сообщение отредактировал 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; ?>
Моя ошибка, дико извиняюсь. Сейчас допишу для вас
пусто!)
|
|
| |
MrNesh | Дата: Понедельник, 30 Июля 2012, 12:04 | Сообщение # 17 |
Воин добра и света
Сейчас нет на сайте
| vladboss, но то что ты спрашиваешь это как бы основы
Сообщение отредактировал 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, хой, победа наша!
|
|
| |
|