Главная
Регистрация
Вход
Авторизироваться
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: ADMIN, Nextik  
Нужен тестер РПГ игры (игра большая и серьёзная :) )
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
блин, нужно время чтобы переварить то что ты написал
 
  • Страница 3 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: