Вобщем я хочу чтоб моя игра имела вид 2д бегалки как бои в z-war или time-zero, но не только бои, а весь процесс беганья по карте. Тоесть игровое поле делиться на клетки(или гексы, но пока-что пусть будут клетки). На каждой клетке может находиться только 1 юзер. Главная особенность - можно модифицировать игровое поле. Тоесть выкопать окоп на одной клетке, и став на него, например, добавиться 3 уворота. Или построить укрепление, на которое нельзя наступить. Спрятавшись за него можно укрыться от пуль. Вобщем чтоб можно было менять параметры каждой клетки, если есть соответствующий навык. Я еще только учу пхп\мускул\ас3, поэтому помогите плз
Вот как я думаю это сделать: Допустим у нас есть поле 5на5 клеток. Создаем массив, в котором 5 массивов. Тоесть массив [5][5]. Это будут значения каждого сектора на нашем поле. Изначально каждое значение в массивах равно 1. Это значит, что все клетки сейчас равны "земля". Еще может быть значение 2(окоп) и 3 (укрепление). Делаем в базе данных таблицу sector_id, в которой содержится информация типа: Тип клетки: проходимость, пропускание пуль, прочность, возможность строить, бонус при нахождении на клетке, картинка клетки 1 = 1,1,0,1,0, ground.png 2 = 1,1,30,0,3 trench.png 3 = 0,0,50,0,0 wall.png У игрока при нажатии на сектор появляеться меню, в котором можно его изменить (вырыть окоп или построить укрепление). Он выбирает построить укрепление. Отсылаеться запрос в БД, в котором содержаться координаты клетки в нашем массиве и запрос на изменение их значений на 3 (потому что строим укрепление). Образно выражаясь: if (массивы клеток [х][у] = 1,1) //тоесть если клетка равняеться "земля", {SET массивы клеток to [3][3];} else {$error1 = 1 ;}
Итак графическая часть будет в флеше. Он считывает из базы данных наш массив [5][5]. Потом он считывает таблицу sector_id и прорисовывает каждую клетку в соответствии её значению.
Вот так я придумал. Это все схематически, но надеюсь вы поняли. Скажите плз это рационально? Или можно как-то реализовать это проще? Посоветуйте что-то плз. И второй вопрос: как сделать так, чтоб все манипуляции с БД выполнялись на сервере, а не клиенте. Потому что кулхацкеры просто заменят if (массивы клеток [х][у] = 1,1) {SET массивы клеток to [3][3];} else {$error1 = 1 ;} на SET массивы клеток to [3][3]; и не будут париться.
Сообщение отредактировал Sektoid - Пятница, 08 Июля 2011, 15:04
чтоб все манипуляции с БД выполнялись на сервере, а не клиенте
Ну в php все манипуляции с бд и так на стороне сервера происходят. Бесплатный хостинг для начинающих игроделов. Представляю начинающим игроделам браузерных игр бесплатный хостинг, с вашим доменном или своим поддоменом Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. "Титаник" - проффесионалами... То что я пишу большей частью ИМХО. Помог? ставь +
двумерный массив, 5х5 вполне рационально, само собой все действия на сервере, отправил запрос на отработку -> получил ответ клиент только отсылает и отображает данные Разработка и продвижение сайтов. Дизайн
Ну например, у тебя укрепление имеет 50 очков прочности. В неё выстрелили, должно убавиться 1 очко. Где ты сохранишь эти данные? В массивах только тип, а в базе только общие (стартовые) сведения. Т.е. так можно реализовать только статичные клетки, они не могут изменять своих свойств. Для простых игр подобного плана, бывает достаточно одного байта для описания всех свойств клетки, а дальше их можно вкл/выкл. Т.е. каждый бит задаёт какое-то одно свойство объекта/клетки карты. Но у тебя, я вижу, много данных... Можно поступить так: отпустить несколько байт каждой ячейки в двумерном массиве, и в одном байте будут указываться простые свойства (проходимость, простреливаемость, разрушаемость, нанесение ущерба персонажам и т.п.), а в остальных байтах - числовые данные (прочность, бонус, и т.п.). Можно будет обращаться всё время к массиву, но если нужно создать или восстановить тип клетки - обращаться к базе данных. Т.е. текстура указывается в базе для типов, также как и стартовые значения; стартовые значения переносятся в массив и там обрабатываются... Ну и т.д. Если база - файл, неудобно будет её всё время читать, вот я к чему. А занимать лишними данными ОП тоже невыгодно... А вообще-то, проще будет сделать по-другому: тип поверхности - земля, вода, песок, и т.п., а окопы, укрепления, лес, и т.п. - это уже объекты, которые хранятся в отдельном массиве и выводятся поверх земли. Т.е. у земли и т.п. только простые свойства, а объекты уже имеют прочность, бонусы и т.п. Я вот только одного не понял.
Quote (Sektoid)
Создаем массив, в котором 5 массивов. Тоесть массив [5][5].
В твоём языке программирования нет, что ли, двумерных массивов? Двумерным компактнее и проще будет. В нормальных языках N-мерные массивы создаются... Кстати, есть в твоём ЯП (на котором идёт разработка игры) объекты? С ними было бы проще. P.S. Для больших карт придётся выгружать/подгружать все эти клетки из базы и сортировать их (смещать). Сложновато и затратно на ресурсы, но именно так и делают в современных играх, если я ничего не путаю.
Quote (Sektoid)
или гексы
Я вообще не понимаю, как можно сделать карту из шестиугольников... Да и зачем?.. Ходить по такой карте сложнее будет, чем по квадратной.
юзер не может поменять код в game.php (если не взломает сайт конечно), а то что приходит на скрипт от юзера должно в обязательном порядке на правильность проверяться Разработка и продвижение сайтов. Дизайн
отпустить несколько байт каждой ячейки в двумерном массиве, и в одном байте будут указываться простые свойства (проходимость, простреливаемость, разрушаемость, нанесение ущерба персонажам и т.п.), а в остальных байтах - числовые данные (прочность, бонус, и т.п.).
Вот тут недопонял Это уже 3хмерный массив? Можешь показать на примере плз?
Quote (TimKruz)
А вообще-то, проще будет сделать по-другому: тип поверхности - земля, вода, песок, и т.п., а окопы, укрепления, лес, и т.п. - это уже объекты, которые хранятся в отдельном массиве и выводятся поверх земли. Т.е. у земли и т.п. только простые свойства, а объекты уже имеют прочность, бонусы и т.п.
У земли тоже будут свойства - плотность (сколько надо копать чтоб вырыть окоп. Чем больше скилл землекопа, тем быстрее копается) и т.д. Так что смысла разделять их нету, потому что фактически земля это такой же обьект как укрепление. Только у неё не будет некоторых свойств, которые есть у укрепления, и наоборот.
Quote (lvovand)
а то что приходит на скрипт от юзера должно в обязательном порядке на правильность проверяться
как?
Сообщение отредактировал Sektoid - Пятница, 08 Июля 2011, 15:48
Создал новую структуру: struct KLETKA { int pro4nost; //тут будет храниться прочность клетки int uvorot; //тут будет шанс уворота от пули int type1,type2; //тут будет храниться тип 1,1 (земля) или 3,3 (окоп или что там у тебя) int user; //номер воина стоящего тут (ведь только 1 может стоять здесь, правильно?) };
Потом создаю массив: KLETKA pole_boya[y][x]; // где "KLETKA" - нас класс, "pole_boya" - название переменной, "x" -ширина, "y" - высота
И работать с массивом. Предворительно можно создать пару функций для перемещения, попадания пуль и рытья окопов. Надеюсь принцип ты понял. Если есть вопросы - обращайся!
довольно интересный вопрос и имеет множество способов решения то что тут рассказывают это конечно прелесть но давай подумаем над уровнем ваших знаний? самый простой способ : JS PHP MYSQL
дам вам кусочек от JS (map.js)
Code
function travel() {
var ajaxRequest; // The variable that makes Ajax possible!
try{ // Opera 8.0+, Firefox, Safari ajaxRequest = new XMLHttpRequest(); } catch (e){ // Internet Explorer Browsers try{ ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try{ ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e){ // Something went wrong alert("Your browser broke!"); return false; } } } ajaxRequest.onreadystatechange = function(){ if(ajaxRequest.readyState == 4){ var l = 0; var blanktag = ""; for (l=0;l<500;l++) { blanktag = "div" + l; document.getElementById(blanktag).innerHTML=""; } var playeramount = ajaxRequest.responseText.split("?"); var netplayers = playeramount[0].split("/"); var i = 0; var counter1 = 0; var counter2 = 1; var counter3 = 2; var counter4 = 3; var counter5 = 4; var playertag = playeramount[1]; //alert(netplayers[0]); for (i=0;i<playeramount[2];i++) {
Что ли бо коментировать я не буду) для подробностей пишите мне в аську
Добавлено (08.07.2011, 20:27) --------------------------------------------- зы комнентить тут не буду так как это часть курса карта полностью будет визуальной.
уж лучше тогда jQuery или prototype либо другой фреймворк подключить, если уж аякс начали затрагивать, иначе знатный мазохизм будет Разработка и продвижение сайтов. Дизайн
если человек не знает как орагнизовать такую карту) то зачем затрагивать jq пусть Js покурит) Если на то пошло то вэбсокеты и socket.io на поддержки HTML5 http://GAMESKROL.RU Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально !
Создал новую структуру: struct KLETKA { int pro4nost; //тут будет храниться прочность клетки int uvorot; //тут будет шанс уворота от пули int type1,type2; //тут будет храниться тип 1,1 (земля) или 3,3 (окоп или что там у тебя) int user; //номер воина стоящего тут (ведь только 1 может стоять здесь, правильно?) };
Потом создаю массив: KLETKA pole_boya[y][x]; // где "KLETKA" - нас класс, "pole_boya" - название переменной, "x" -ширина, "y" - высота
И работать с массивом. Предворительно можно создать пару функций для перемещения, попадания пуль и рытья окопов. Надеюсь принцип ты понял. Если есть вопросы - обращайся!
Вот это нравиться, щас буду пытаться.
Добавлено (03.08.2011, 14:24) --------------------------------------------- Вобщем сделал что-то такое:
Code
<?php class Sector { var $type; var $id_x; var $id_y; }
//Допустим у меня есть сектор 4-7 $x=4; $y=7; $sector [$x][$y]= new Sector; $sector [$x][$y]->id_x = $x; $sector [$x][$y]->id_y = $y;
$type='grass'; $sector [$x][$y]->type = $type; ?>
Как мне теперь передать это в JavaScript? Допустим вот кусок кода js:
//Это был массив, в котором потом в зависимости от числа будет определятся номер значения картинки из следущего массива:
var tiles = [ 'media/images/grass.jpg', 'media/images/water.jpg' ]; </script>
Вопрос: как мне засунуть в первый массив значения 0 и 1 в зависимости от $sector [$x][$y]->type = $type из пхп кода? Надо чтоб JS считал эти данные и засунул в массив значения - если grass, то 0, а если water, то 1?
Сообщение отредактировал Sektoid - Среда, 03 Августа 2011, 00:31
<?php class User { var $user_sector_x; var $user_sector_y; var $user_ava; }
$query = "SELECT * FROM ".TABLES_USERS." WHERE map_user='map1'"; $result = mysql_query ($query); //Выбираем игроков, которые на этой карте
$query_count = "SELECT COUNT(map_user) AS nc FROM ".TABLES_USERS." WHERE map_user='map1'"; $result_count = mysql_query ($query_count); $check_count = mysql_fetch_array($result_count); //Пощитали сколько игроков на карте чтобы создать в джаваскрипте массив
echo "<script type='text/javascript'> var users_avas=new Array (".$check_count['nc']."); </script>"; //Создаем массив в JS с аватарами. Его длинна равна количеству игроков на map1
for ($c=0; $c=$check_count['nc']; $c++){ $check_id_user = "".($check['id_user']).""; //Записываем в переменную id пользователя $check_user_sector_x = "".$check['user_sector_x'].""; //Записываем в переменную его кординату х $check_user_sector_y = "".$check['user_sector_y'].""; //Записываем в переменную его кординату у $user [''.$check_id_user.''] = new User; //Создаем обьект класса User, номер которого = id юзера $user [''.$check_id_user.'']->user_sector_x = ''.$check_user_sector_x.''; //Забиваем туда его координату х $user [''.$check_id_user.'']->user_sector_y = ''.$check_user_sector_y.''; //Забиваем туда его координату у $query_ava_vid = "SELECT vid FROM avatar where id_ava='".$check_id_user."'"; //Считываем аву с БД $user [''.$check_id_user.'']->user_ava = ''.$query_ava_vid.''; //Забиваем туда его аву
Но при загрузке страницы хром выдает опаньки. Искал ошибки - не смог найти. Может кто найдет что не так плзззз? ЗЫ: код писал сам, так что понимаю что он может выглядеть ужасно, но прокоментировал вроде что надо.
Сообщение отредактировал Sektoid - Пятница, 05 Августа 2011, 01:47
У вас совершенно не рабочий код! Вы тянете из базы помимо аватарки, еще и кординаты игрока, но непонятно как их используете.
Я так понимаю, что вам нужно все данные о персонаже передать в js? Я бы сделал следующим образом: 1) Вместо массива использовал хеш; 2) Структура хеша следующего типа: var users_avas = {'user_id': { 'ava':'sprtire.gif', 'sector_x':'0', 'sector_y':'0'}} Тогда при обращении по users_avas['user_id']['ava'] получим аву игрок, естественно, вместо user_id должно быть числовое представление id игрока.
//Выбираем игроков, которые на этой карте, их координаты и авы $query = "SELECT u.id_user, u.user_sector_x, u.user_sector_y, av.vid FROM ".TABLES_USERS." AS u, avatar AS av WHERE u.map_user='map1' AND av.id_ava=u.id_user";
У вас совершенно не рабочий код! Вы тянете из базы помимо аватарки, еще и кординаты игрока, но непонятно как их используете.
Ну он стал нерабочим когда я аватары начал загружать. А если убрать с него загрузку аватаров, то все работает Тоесть координаты и местонахождение игрока определяет нормально. А вот аватары принесли с собой опаньки А JS я не вылаживал, потому что ошибка где-то в php, и она связана с аватарами. Спасибо за помощь
Добавлено (23.09.2011, 04:01) --------------------------------------------- Вобщем теперь возникла потребность юзать ajax. Персонажа мы грузим, обьекты тоже. Надо отображать всех персонажей и отслеживать их перемещение не перезагружая страницу. Погуглил, почитал. Все конечно хорошо, но я не нашел нормальных примеров. Приведите плз пару примеров использования ajax. Что должно быть на стороне сервера, а что на стороне клиента? Ато реально читаю - вроде понятно, но хз что с этим делать теперь. А как посмотрю на пример - сразу все понятно)
Сообщение отредактировал Sektoid - Пятница, 23 Сентября 2011, 04:16