forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на BlitzMax (http://forum.boolean.name/forumdisplay.php?f=106)
-   -   Vivo (http://forum.boolean.name/showthread.php?t=16218)

Halk-DS 22.04.2012 14:14

Ответ: Vivo
 
Где ссылка на скачку демки? (в первом посту искал не нашел)

Nikich 22.04.2012 14:33

Ответ: Vivo
 
http://rghost.ru/36821364
Это последняя версия, на сколько я помню:)
Копи-паста предыдущего поста(из-за новой страницы его могли не заметить):


Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).

Nikich 22.04.2012 16:59

Ответ: 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:20

Ответ: Vivo
 
Все, основные баги убраны. Осталось только одно: как увеличить скорость данного кода?

NitE 22.04.2012 21:06

Ответ: Vivo
 
Можно например убрать Delay 2000.

Nikich 23.04.2012 00:27

Ответ: 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

Часть после ;;; почему-то не работает. Пожалуйста, помогите найти ошибку, но и вопрос с увеличением скорости тоже всё ещё актуален.

Жека 23.04.2012 10:02

Ответ: 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

Четверной цикл, это раз. грузишь из файла в главном цикле - это жестокое два. :)
За оперативку не беспокойся, грузи сразу все чанки своего уровня. А вот проход по чанкам делай в зависимости от того - влазит ли чанк в область экрана или нет. Те что не влазят просто пропускаются.

Nikich 23.04.2012 15:44

Ответ: 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, но результата вообще не было. Может кто знает способы получше, ведь мне надо лишь одно число заменить на другое, а значит точно должно быть решение по-лучше.

NitE 23.04.2012 16:33

Ответ: Vivo
 
Вообще плохо. Во-первых, ненадо при каждом вызове функций трогать файл. Его просто открываешь при запуске программы, а при выходе закрываешь и всё, больше его не трогаешь. Хотя на самом деле нужно весь файл при запуске слить в оперативку, и потом, при выходе записать туда все изменения.

Также файл - это не список. Тебе не обязательно перебирать все элементы чтобы изменить только один. А мгновенный доступ делается какраз через SeekFile(), просто ты с ним не разобрался. Но опять-же, если работать с данными в оперативке то весь этот лишний гемор будет не нужен.

Nikich 23.04.2012 17:53

Ответ: Vivo
 
На счет файла. Он всегда разный, не откроешь ты его один раз при запуске. Это файл с в котором находится инфа о чанке.
Слить в оперативку тоже не получится, ибо не удобно. В массиве элемент не может быть отрицательным( a(-5) - невозможно ), а х и у чанка могут быть отрицательными. В общем пойду курить SeekFile видимо.

Halk-DS 23.04.2012 18:00

Ответ: Vivo
 
Вот я играл в твою демку. Расскажи немного вообще про построение мира. Чанк єто один єкран? И сколько вообще у тебя должно быть чанков? И главное, у тебя по файлу на чанк?

NitE 23.04.2012 18:32

Ответ: Vivo
 
фейспалм.жпг

Если у тебя несколько файлов, то открой при запуске сразу все. При выходе соответсвенно все и закрой.

В массиве ествественно не может быть отрицательных элементов, но тебе никто не мешает сделать костыль самому, если уж так хочется.

Например у тебя 50 чанков. Функция вызова:

function getchunk(nr)
return chunkarr[nr+25]
end function

вводим от -25 до 25, на выходе получаем нужный чанк. И никаких проблем.

Nikich 23.04.2012 18:34

Ответ: Vivo
 
Nite
Их бесконечность, понимаешь? Бесконечность. Нету рамок никаких.
В той демке, что я давал все отличается от нынешнего. Могу описать как сейчас дела обстоят, или демку кинуть, для лучшего понимания.
В общем, один чанк это один текстовый файл, название которого равно его координатам. Он состоит из 256 блоков. Их id и хранится в файле. Чанков может быть неограниченое количество( вернее ограниченное свободным местом на диске), так что в рамку их не впишешь.

moka 23.04.2012 19:09

Ответ: Vivo
 
В компьютерном мире нету бесконечности.

Nikich 23.04.2012 19:34

Ответ: Vivo
 
Хорошо, очень-очень большой мир. Не -25,25, не -250,250, не -25000,25000. Массив не потянет.


Часовой пояс GMT +4, время: 14:54.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot