Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты на BlitzMax

Ответ
 
Опции темы
Старый 22.04.2012, 14:14   #256
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Vivo

Где ссылка на скачку демки? (в первом посту искал не нашел)
(Offline)
 
Ответить с цитированием
Старый 22.04.2012, 14:33   #257
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

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


Пока моделлер работает, заняться мне нечем, поэтому решил-ка я позаниматься этим проектам. По-сколько кроме быдлокода я ничего в исходниках не нашёл, решил писать всё заново, отказавшись от экранов. Они были удобны, но многие говорили что это убивает геймлей. В общем, помогите с выбором:
1). Делать 9 чанков размером с экран, чтобы они окружали текущий экран.
2). Делать уйму маленьких чанков.
3). Послать всех и оставить экраны
P.S. в первых двух случаях игрок находится всегда в центре экрана.
И ещё, вдруг у кого завалялась инфа по данной теме, поделитесь, буду признателен( тоже к двум первым случаям относится).
(Offline)
 
Ответить с цитированием
Старый 22.04.2012, 16:59   #258
Nikich
Бывалый
 
Регистрация: 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
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

Все, основные баги убраны. Осталось только одно: как увеличить скорость данного кода?
(Offline)
 
Ответить с цитированием
Старый 22.04.2012, 21:06   #260
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Vivo

Можно например убрать Delay 2000.
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо NitE за это полезное сообщение:
Hulk-DS (22.04.2012), Reks888 (22.04.2012), Черный крыс (02.06.2012)
Старый 23.04.2012, 00:27   #261
Nikich
Бывалый
 
Регистрация: 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
Nikich
Бывалый
 
Регистрация: 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
NitE
злобный флудер
 
Регистрация: 10.07.2007
Сообщений: 2,585
Написано 789 полезных сообщений
(для 1,476 пользователей)
Ответ: Vivo

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

Также файл - это не список. Тебе не обязательно перебирать все элементы чтобы изменить только один. А мгновенный доступ делается какраз через SeekFile(), просто ты с ним не разобрался. Но опять-же, если работать с данными в оперативке то весь этот лишний гемор будет не нужен.
(Offline)
 
Ответить с цитированием
Старый 23.04.2012, 17:53   #265
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

На счет файла. Он всегда разный, не откроешь ты его один раз при запуске. Это файл с в котором находится инфа о чанке.
Слить в оперативку тоже не получится, ибо не удобно. В массиве элемент не может быть отрицательным( a(-5) - невозможно ), а х и у чанка могут быть отрицательными. В общем пойду курить SeekFile видимо.
(Offline)
 
Ответить с цитированием
Старый 23.04.2012, 18:00   #266
Halk-DS
Разработчик
 
Аватар для Halk-DS
 
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений
(для 53 пользователей)
Ответ: Vivo

Вот я играл в твою демку. Расскажи немного вообще про построение мира. Чанк єто один єкран? И сколько вообще у тебя должно быть чанков? И главное, у тебя по файлу на чанк?
(Offline)
 
Ответить с цитированием
Старый 23.04.2012, 18:32   #267
NitE
злобный флудер
 
Регистрация: 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
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

Nite
Их бесконечность, понимаешь? Бесконечность. Нету рамок никаких.
В той демке, что я давал все отличается от нынешнего. Могу описать как сейчас дела обстоят, или демку кинуть, для лучшего понимания.
В общем, один чанк это один текстовый файл, название которого равно его координатам. Он состоит из 256 блоков. Их id и хранится в файле. Чанков может быть неограниченое количество( вернее ограниченное свободным местом на диске), так что в рамку их не впишешь.
(Offline)
 
Ответить с цитированием
Старый 23.04.2012, 19:09   #269
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Vivo

В компьютерном мире нету бесконечности.
(Offline)
 
Ответить с цитированием
Старый 23.04.2012, 19:34   #270
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com