Нужен тестер РПГ игры (игра большая и серьёзная :) )
| |
Nextik | Дата: Пятница, 11.11.2011, 11:32 | Сообщение # 31 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| Quote (PassCall) Всесто него мы делаем AWW иии... я что то не понял что это значит
|
|
| |
PassCall | Дата: Пятница, 11.11.2011, 16:58 | Сообщение # 32 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| Ну AfterWaterWorld =)
Почитать о ходе разработки можно: тут http://mobitree.ru/preview/858-afterwaterworld.html тут http://mobitree.ru/preview....ld.html и тут http://forum.boolean.name/showthread.php?t=14657
Новую демку не покажем. Секрет. =| Релиз будет в этом году (крайний срок - 31 декабря 23:59:59)
Сообщение отредактировал PassCall - Пятница, 11.11.2011, 17:01 |
|
| |
Nextik | Дата: Суббота, 12.11.2011, 11:18 | Сообщение # 33 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| хм... Ты хоть уверен что она запустится на мобильном? Иногда, если часто менять настройки проекта, на телефонах мидлет не запустится вообще, будет писать неверный jar файл. + OutOfMemory на некоторых телефонах + на некоторых устройствах отображается половина экрана... Это реальные проблемы людей с телефонами и найти причину той или иной ошибки будет трудно. Поэтому я свой проект выложил на публику, тихонько тестируя каждую альфу версию и исправляя баги, выпускаю версию за версией. Пользователи по моему рады, но надолго ли это...
|
|
| |
PassCall | Дата: Суббота, 12.11.2011, 11:54 | Сообщение # 34 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| я проводил некоторые испытания и выяснил что мы использовали около 20% от общей памяти телефона так что не парься
|
|
| |
Nextik | Дата: Суббота, 12.11.2011, 12:41 | Сообщение # 35 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| хех, а с моими алгоритмами игра будет жрать постепенно всё больше и больше памяти... Ну, это по мере возрастания объектов для прорисовки в игре
|
|
| |
Nextik | Дата: Суббота, 12.11.2011, 12:43 | Сообщение # 36 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| слушай, а если сделать квадратный массив [1..5000,1..5000] телефон выдержит? =) + мне нужно будет проверять его на наличие нужных чисел... Я боюсь что будет OutOfMemory, но черт, работать было бы гораздо легче!
|
|
| |
PassCall | Дата: Суббота, 12.11.2011, 13:06 | Сообщение # 37 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| Я не могу понять, зачем такой ОГРОМЕННЫЙ(с) массив. ладно, в ширину. а в высоту зачем?
Путем простейших математических вычислений (как умно сказал, а?) можно высчитать, что, имея размер тайла 20 пикс. общая ширина поля составит 20*5000=100000 пикс., что равно 100000/240=416 экранов телефона в ширину. вот скажи, найдется хоть один человек, который доживет до того времени, как игра дойдет до своего края?
Я бы посоветовал следующее: - сделать размер массива в разумных пределах (высота 50-100, ширина 100-200). - каждые 100 (к примеру) смещений сохранять текущий экран в память телефона и загружать следующий. - если скорость работы приложения не важна, можно использовать тип char вместо integer. То, что в мидлетпаскале нет типа byte, очень и очень плохо (интежер занимает аж 6 байт, а байт... хм... 1 байт. Разница налицо).
Использовать так (пример): запись: map_array[x,y]:=chr(number) чтение: drawimage(ord(tile[map_array[i,j]])
Также есть такие вкусности как графический буфер, но в данном случае его использовать невыгодно. Впрочем спрашивай если что
Сообщение отредактировал PassCall - Суббота, 12.11.2011, 13:08 |
|
| |
Nextik | Дата: Суббота, 12.11.2011, 13:20 | Сообщение # 38 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| ладно, мне нужен массив такого типа [1..5000,1..128]. Ширина и высота моих "картинок" 16 пиксилей если что =). И в моем случае скорость мидлета как я считаю не важна, хотя было бы хорошо найти оптимальное решение при котором скорость мидлета была бы в пределах разумного...
|
|
| |
PassCall | Дата: Суббота, 12.11.2011, 13:28 | Сообщение # 39 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| Давай посчитаем сколько будет занимать весь массив:
5000*128=640кб. это в случае, если мы будем использовать char а если integer, то и вовсе 3.840 Мб
яж говорю, сделай ширину массива 200, а когда подойдем к краю, сохраним текущий экран в память телефона и загрузим следующий. таким образом, теоретически, можно сделать ширину игрового пространства бесконечной, лишь бы памяти было. Если использовать компрессию, то один экран будет занимать около 2 килобайт. если на телефоне будет свободно хотя бы 3 мегабайта, то мы сможем сделать игровое поле размером 50х300000. хватит?
|
|
| |
PassCall | Дата: Суббота, 12.11.2011, 13:30 | Сообщение # 40 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| А вообще в игру следует добавить игрока, монстров и прочий антураж MineCraft. Могу даже реализовать мультиплеер по блютузу, типо 2 игрока крадут друг у друга ресурсы и сражаются. Как тебе идея?
|
|
| |
Nextik | Дата: Суббота, 12.11.2011, 13:41 | Сообщение # 41 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| насчет поля - мало... Ладно, шучу =) У меня проблема с загрузкой блоков после их сохранения у меня есть такие переменные для записи: Code blok_rss:RecordStore; index_blok_posX:array [1..MAX_BLOCK] of integer; index_blok_posY:array [1..MAX_BLOCK] of integer; index_blok_postavlen:array [1..MAX_BLOCK] of integer; index_blok_tip:array [1..MAX_BLOCK] of integer; вот код записи: Code Procedure save_world; var i:integer; in_blok_postavlen:array [1..MAX_BLOCK] of integer; begin //конвертируем данные - показываем SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Конвертирование данных',0,0); repaint; //конвертируем true в 1 и записываем в отдельный массив for i:=1 to MAX_BLOCK do begin if (blok[i].postavlen=true) then begin in_blok_postavlen[i]:=1 end else begin in_blok_postavlen[i]:=0 end; end; //Запись началась - показываем SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Запись пошла поехала...',0,0); repaint; //открываем хранилище блоков blok_rss:=OpenRecordStore('blok_rss'); SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Хранилище открыто...',0,0); repaint; delay(200); for i:=1 to MAX_BLOCK do begin if (blok[i].postavlen=true) then begin index_blok_posX[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].posX); end; if (blok[i].postavlen=true) then begin index_blok_posY[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].posY); end; if (blok[i].postavlen=true) then begin index_blok_tip[i]:=AddRecordStoreEntry(blok_rss,''+blok[i].ID); end; if (blok[i].postavlen=true) then begin index_blok_postavlen[i]:=AddRecordStoreEntry(blok_rss,''+in_blok_postavlen[i]); end; SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Записано:'+(i),0,0); repaint; end; CloseRecordStore(blok_rss);//закрыли хранилище SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Запись закончена...',0,0); repaint; delay(400); end; а вот код загрузки: Code Procedure load_world; var i:integer; strings:array [1..MAX_BLOCK] of string; in_blok_postavlen:array [1..MAX_BLOCK] of integer; begin //Чтение данных SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Чтение из хранилища',0,0); repaint; //Открываем хранилище и читаем и читаем... <img src="http://s21.ucoz.net/sm/23/biggrin.gif" border="0" align="absmiddle" alt="biggrin" /> blok_rss:=OpenRecordStore('blok_rss'); for i:=1 to MAX_BLOCK do begin //postavlen - конвертирование и тут же запись новых данных(не в хранилище) strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_postavlen[i]); in_blok_postavlen[i]:=StringToInteger(strings[i]); if in_blok_postavlen[i]=1 then begin blok[i].postavlen:=true end else begin blok[i].postavlen:=false end; //теперь исходя из того поставлен ли блок, читаем его свтойства... if (blok[i].postavlen=true) then begin //X strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_posX[i]); blok[i].posX:=StringToInteger(strings[i]); //Y strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_posY[i]); blok[i].posY:=StringToInteger(strings[i]); //ID strings[i]:=ReadRecordStoreEntry(blok_rss,index_blok_tip[i]); blok[i].ID:=StringToInteger(strings[i]); end; SetColor(0,0,0); FillRect(0,0,240,320); SetColor(255,255,255); DrawText('Прочитано:'+(i),0,0); repaint; end; CloseRecordStore(blok_rss);//закрыли хранилище end; запись идет нормально, а после того как перезайти в приложение и начать загружать мир, то ничего не загрузиться даже!!! Как будто всё испарилось... А насчет того что в антураже MineCraft - всё сам =) Мне нужно опыта набираться всё таки...
|
|
| |
Nextik | Дата: Суббота, 12.11.2011, 13:43 | Сообщение # 42 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| а насчет игры по блютузу - тоже сам =) мне нужно максимально эффективно использовать то что сейчас есть у меня
|
|
| |
PassCall | Дата: Суббота, 12.11.2011, 14:00 | Сообщение # 43 |
Знающий
Группа: Проверенные
Сообщений: 89
Награды: 0
Репутация:
« 4 »
Статус: Offline
| Бля... слишком много букафф.
Нельзя ли сделать так: procedure save(num:integer); begin deleterecordstore ('savemap_'+integertostring(num));//нужно удалить старую базу иначе каждый раз к ней будут приписываться новые данные, изза чего размер её раздуется до нереальных размеров rs:=OpenRecordStore('savemap_'+integertostring(num));//открывает/создает базу данных for i:=1 to WORLD_HEIGHT do begin S:=''; for j:=1 to WORLD_WIDTH do S:=S+integertostring (map_array[i,j]); temp:=AddRecordStoreEntry (rs,S);//записываем. возвращает номер строчки, в которую и была совершена запись. end; closerecordstore (rs); end;
Для загрузки: procedure load(num:integer); begin rs:=OpenRecordStore('savemap_'+integertostring(num)); for i:=1 to WORLD_HEIGHT do begin S:=readRecordStoreEntry ('savemap_'+integertostring(num),i); for j:=1 to WORLD_WIDTH do map_array[i,j]:=stringtointeger(GetChar(S,j-1)); end; closerecordstore (rs); end;
Вот примерно так. Хотя конечно следовало бы записывать байтами, а не числами, но суть понятна
Сообщение отредактировал PassCall - Суббота, 12.11.2011, 14:02 |
|
| |
Nextik | Дата: Суббота, 12.11.2011, 14:05 | Сообщение # 44 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| О_О
|
|
| |
Nextik | Дата: Суббота, 12.11.2011, 14:06 | Сообщение # 45 |
Программист
Группа: Проверенные
Сообщений: 273
Награды: 0
Репутация:
« 42 »
Статус: Offline
| блин, нужно время чтобы переварить то что ты написал
|
|
| |
|