|
22.04.2012, 14:14
|
#256
|
Разработчик
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений (для 53 пользователей)
|
Ответ: Vivo
Где ссылка на скачку демки? (в первом посту искал не нашел)
|
(Offline)
|
|
22.04.2012, 14:33
|
#257
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
http://rghost.ru/36821364
Это последняя версия, на сколько я помню
Копи-паста предыдущего поста(из-за новой страницы его могли не заметить):
Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).
|
(Offline)
|
|
22.04.2012, 16:59
|
#258
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
В общем, что-то наподобие чанков:
Function CreateWorld()
loading_time=MilliSecs()
For i=-5 To 5
For i1=-5 To 5
fl=WriteFile("map\"+i+","+i1+".txt")
For i2=0 To 15
For i3=0 To 15
a=Rnd(20)
If a=1
WriteInt(fl,a)
Else
WriteInt(fl,0)
EndIf
Text R1/2-100,R2/2,"Loading: "+(i+5)*(i1+5)*i2*i3+" tiles generated"
Flip(False)
Cls
Next
Next
CloseFile(fl)
Next
Next
Text R1/2-100,R2/2,"Loading time: "+(MilliSecs()-loading_time)+" millisecs"
Flip
Delay 2000
End Function
Function Update_World()
chunk_x=Int((camera_x+R1/2)/512)
chunk_y=Int((camera_y+R2/2)/512)
For i=chunk_x-1 To chunk_x+1
For i1=chunk_y-1 To chunk_y+1
fl=OpenFile("map\"+i+","+i1+".txt")
For i2=0 To 15
For i3=0 To 15
DrawImage tile(ReadInt(fl)),512*i-camera_x+i2*32,512*i1-camera_y+i3*32
Next
Next
CloseFile(fl)
Next
Next
Посоветуйте что и как можно улучшить. Пока проблема в том, что показывается только нынешний чанк, и то расширенный.
P.S. R1 и R2 - ширина и высота экрана.
Последний раз редактировалось Nikich, 22.04.2012 в 20:19.
|
(Offline)
|
|
22.04.2012, 20:20
|
#259
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
Все, основные баги убраны. Осталось только одно: как увеличить скорость данного кода?
|
(Offline)
|
|
22.04.2012, 21:06
|
#260
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Vivo
Можно например убрать Delay 2000.
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо NitE за это полезное сообщение:
|
|
23.04.2012, 00:27
|
#261
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
Function Update_World()
chunk_x=(camera_x+R1/2)/512
chunk_y=(camera_y+R2/2)/512
For i=chunk_x-1 To chunk_x+1
For i1=chunk_y-1 To chunk_y+1
fl=OpenFile("map\"+i+","+i1+".txt")
For i2=0 To 15
For i3=0 To 15
;;;If 512*i-camera_x+i2*32<camera_x+R1 And 512*i1-camera_y+i3*32<camera_y+R2 And 512*i-camera_x+i2*32>camera_x And 512*i1-camera_y+i3*32>camera_y
DrawImage tile(ReadInt(fl)),512*i-camera_x+i2*32,512*i1-camera_y+i3*32
EndIf
Next
Next
CloseFile(fl)
Next
Next
Часть после ;;; почему-то не работает. Пожалуйста, помогите найти ошибку, но и вопрос с увеличением скорости тоже всё ещё актуален.
|
(Offline)
|
|
23.04.2012, 10:02
|
#262
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Vivo
For i=chunk_x-1 To chunk_x+1
For i1=chunk_y-1 To chunk_y+1
fl=OpenFile("map\"+i+","+i1+".txt")
For i2=0 To 15
For i3=0 To 15
;;;If 512*i-camera_x+i2*32<camera_x+R1 And 512*i1-camera_y+i3*32<camera_y+R2 And 512*i-camera_x+i2*32>camera_x And 512*i1-camera_y+i3*32>camera_y
DrawImage tile(ReadInt(fl)),512*i-camera_x+i2*32,512*i1-camera_y+i3*32
EndIf
Next
Next
CloseFile(fl)
Next
Next
Четверной цикл, это раз. грузишь из файла в главном цикле - это жестокое два.
За оперативку не беспокойся, грузи сразу все чанки своего уровня. А вот проход по чанкам делай в зависимости от того - влазит ли чанк в область экрана или нет. Те что не влазят просто пропускаются.
|
(Offline)
|
|
23.04.2012, 15:44
|
#263
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
Function CreateChunk(i,i1)
fl=WriteFile("map\"+i+","+i1+".txt")
For i2=0 To 15
For i3=0 To 15
a=Rnd(20)
If a=1
WriteInt(fl,a)
Else
WriteInt(fl,0)
EndIf
Next
Next
CloseFile(fl)
End Function
Function ReplaceBlock(i,i1,i2,i3,i4)
fl=ReadFile("map\"+i+","+i1+".txt")
For j=0 To 15
For j1=0 To 15
chunk(j,j1)=ReadInt(fl)
If j=i2 And j1=i3 chunk(j,j1)=i4
Next
Next
CloseFile(fl)
fl=WriteFile("map\"+i+","+i1+".txt")
For j=0 To 15
For j1=0 To 15
WriteInt(fl,chunk(j,j1))
Next
Next
CloseFile(fl)
End Function
Нужна помощи в работе с файлами. Функция ReplaceBlock() работает, но согласитесь медленная она уж слишком. Пробовал через SeekFile, но результата вообще не было. Может кто знает способы получше, ведь мне надо лишь одно число заменить на другое, а значит точно должно быть решение по-лучше.
|
(Offline)
|
|
23.04.2012, 16:33
|
#264
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Vivo
Вообще плохо. Во-первых, ненадо при каждом вызове функций трогать файл. Его просто открываешь при запуске программы, а при выходе закрываешь и всё, больше его не трогаешь. Хотя на самом деле нужно весь файл при запуске слить в оперативку, и потом, при выходе записать туда все изменения.
Также файл - это не список. Тебе не обязательно перебирать все элементы чтобы изменить только один. А мгновенный доступ делается какраз через SeekFile(), просто ты с ним не разобрался. Но опять-же, если работать с данными в оперативке то весь этот лишний гемор будет не нужен.
|
(Offline)
|
|
23.04.2012, 17:53
|
#265
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
На счет файла. Он всегда разный, не откроешь ты его один раз при запуске. Это файл с в котором находится инфа о чанке.
Слить в оперативку тоже не получится, ибо не удобно. В массиве элемент не может быть отрицательным( a(-5) - невозможно ), а х и у чанка могут быть отрицательными. В общем пойду курить SeekFile видимо.
|
(Offline)
|
|
23.04.2012, 18:00
|
#266
|
Разработчик
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений (для 53 пользователей)
|
Ответ: Vivo
Вот я играл в твою демку. Расскажи немного вообще про построение мира. Чанк єто один єкран? И сколько вообще у тебя должно быть чанков? И главное, у тебя по файлу на чанк?
|
(Offline)
|
|
23.04.2012, 18:32
|
#267
|
злобный флудер
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений (для 1,476 пользователей)
|
Ответ: Vivo
фейспалм.жпг
Если у тебя несколько файлов, то открой при запуске сразу все. При выходе соответсвенно все и закрой.
В массиве ествественно не может быть отрицательных элементов, но тебе никто не мешает сделать костыль самому, если уж так хочется.
Например у тебя 50 чанков. Функция вызова:
function getchunk(nr)
return chunkarr[nr+25]
end function
вводим от -25 до 25, на выходе получаем нужный чанк. И никаких проблем.
|
(Offline)
|
|
23.04.2012, 18:34
|
#268
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
Nite
Их бесконечность, понимаешь? Бесконечность. Нету рамок никаких.
В той демке, что я давал все отличается от нынешнего. Могу описать как сейчас дела обстоят, или демку кинуть, для лучшего понимания.
В общем, один чанк это один текстовый файл, название которого равно его координатам. Он состоит из 256 блоков. Их id и хранится в файле. Чанков может быть неограниченое количество( вернее ограниченное свободным местом на диске), так что в рамку их не впишешь.
|
(Offline)
|
|
23.04.2012, 19:09
|
#269
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Vivo
В компьютерном мире нету бесконечности.
|
(Offline)
|
|
23.04.2012, 19:34
|
#270
|
Бывалый
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений (для 275 пользователей)
|
Ответ: Vivo
Хорошо, очень-очень большой мир. Не -25,25, не -250,250, не -25000,25000. Массив не потянет.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:54.
|