Тема: Vivo
Показать сообщение отдельно
Старый 24.04.2012, 20:54   #292
Nikich
Бывалый
 
Регистрация: 22.12.2011
Сообщений: 844
Написано 150 полезных сообщений
(для 275 пользователей)
Ответ: Vivo

Фух, мозг что-то вообще варить перестал, как я за эти массивы взялся. Пожалуйста, можете помочь? Видимо мой способ не является самым лучшим, так как столько геморроя я ещё не испытывал. Сейчас я объясню свою задумку максимально подробно.
Возьмём массив Sector(6,6,15,15), первые два элемента которого отвечают за х и у чанка, относительно игрока(!). Для начала их заполним, взяв всю инфу из файлов. А вот как они должны рисоваться:
for i=0 to 6
for i1=0 to 6
for i2=0 to 15
for i3=0 to 15
drawimage block(Sector(i,i1,i2,i3)),((3-i)+chunk_x)*512+32*i2-camera_x,((3-i1)+chunk_y)*512+32*i3-camera_y
next
next
next
А теперь комментарии. block(Sector(i,i1,i2,i3)) - картинка, соответствующая блоку.((3-i)+chunk_x)*512+32*i2-camera_x - на первый взгляд вообще дикая непонятная формула, в которой никто не захочет разбираться. Но всё достаточно просто. Игрок всегда должен находится в 3 чанке, относительно сектора, поэтому мы берём значение 3. ''-i'' мы берём я определение местоположения чанка относительно чанка в котором расположен игрок.
Таблица, поясняющая суть:

Больший квадрат - сектор, меньшие - чанки, центральный - тот в коором находится игрок. Как вы могли заметить, находить он в 3,3 - вот откуда берётся это i-3. ((3-i)+chunk_x)*512 - почему же 512? Потому что 512 - это количество пикселей, которое занимает один чанк(он состоит из 16 блоков, 32х32 каждый). i2*32 - координата блока, умноженная на 2 из-за его ширины. С осью у тоже самое.
Фух, с пробежкой мы разобрались. Теперь нам надо сделать так, чтобы если игрок переходит на следующий чанк, массив подгружал в себя новые чанки, и записывал в файл крайние чанки. Тут то и заключается проблема. Я вообще не знаю, как бы это красиво обыграть. Знаю как некрасиво - взять наш Sector, сделать четверной перебор, чтобы сдвинуть все чанки, потом ещё перебор на загрузки новых чанков, а потом ещё перебор на выгрузку старых. Остановился я на определении, в какую сторону нужно производить сдвиг. Вот моя функция для перемещения игрока:
Function UpdateCamera()
dy=KeyDown(31)-KeyDown(17)
dx=KeyDown(32)-KeyDown(30)
chunk_x=(camera_x+R1/2)/512
chunk_y=(camera_y+R2/2)/512					
If (dx<>0 And dy=0) Or (dy<>0 And dx=0) Or (dy<>0 And dx<>0) gdx=dx:gdy=dy
If MilliSecs()-frame_timer>40 frame=frame+1:frame_timer=MilliSecs()
If frame>10 frame=0



next_chunk_x=(camera_x+dx*6*player_speed+R1/2)/512
next_chunk_y=(camera_y+dy*6*player_speed+R2/2)/512
If Not Collision()
If (dx=0 And dy<>0) Or (dx<>0 And dy=0)
camera_x=camera_x+dx*player_speed
camera_y=camera_y+dy*player_speed
Else
camera_x=camera_x+dx*diag_player_speed
camera_y=camera_y+dy*diag_player_speed
EndIf
EndIf

change_x=(camera_x+R1/2)/512-chunk_x
change_y=(camera_y+R2/2)/512-chunk_y

End Function
Поскольку название переменных у меня совпадает с их назначением, пояснять и думаю их не надо. Конечно, это выглядит так, будто я хочу чтоб вы мне написали готовые функции. Но это не так! Всё это я показал лишь для того, чтобы если вы захотели помочь мне, оперировали не просто словами, а теми переменными которые у меня используются.
З.Ы. особо интересует объяснения Nite'a. Как я понял, у него есть идея по реализации, но что-то я в ней не особо варю
Миниатюры
Нажмите на изображение для увеличения
Название: tb1.png
Просмотров: 875
Размер:	10.9 Кб
ID:	16698  
(Offline)
 
Ответить с цитированием