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

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

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Blitz3D > 3D-программирование

3D-программирование Вопросы, касающиеся программирования 3D мира

Ответ
 
Опции темы
Старый 30.08.2007, 17:37   #1
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Взрыв бомбочки

У меня в игре есть массив. В нем хранится вся инфа.
Массив 16 на 16
например пробиваемый кубик там значится как 2, бомба как 4.
Проходимые места это 0. Непроходимые и непробиваемые это 1

Игра - бомбермен. Так вот
111111 - как бы тут получается, что есть поле, окруженное
100001 - непробиваемыми объектами. Есть на поле так же бомба.
100001 - рядом с бомбой 2 пробиваемых кубика. Радиус у бомбы - 3
104221 - то есть если она сработает, то порбиваемые кубики превратятся в 0
100001
111111
То ест станет
111111 - тут взорвалась и исчезла бомба. Изчезли и взорвались кубики
100001
100001
100001
100001
111111
А мне нужно:
111111 - что бы бомба, после того как взорвалась убила только ближайший
100001 - кубик, а тот,Ю который за ней остался жить
100001
100001
100021
100001

Сложность в том, что взрыв делается следующим образом:
distX%=bomb\ArX-partitionable\Arx - По массиву вычисляется расстояние от объекта, который взорвется до бомбы

If Abs(distz)<bomb\radius - если получившаяся дистанция меньше радиуса взрыва

partitionable\life=0 - то грубо говоря убиваем кубик.

А мне нужно как-то проверить, что на данной линии один кубик уже убили, а тот, который за ним, не должен взорваться. Мне предложили метод, но почему-то не сработало:

For z=partitionable\Arz To bomb\ArX
If Playfield(partitionable\Arx,z)<>0 Nevzrivatj=True
Next

Я честное слово точно не знаю как это работает)
partitionable\Arx - массив кубика по х
bomb\arX - массив бомбы по оси х
Я думаю нет смысла показывать, так как для оси z то же самое

Короче я долго мучался и не знаю как это организовать, поэтому прошу помощи
(Offline)
 
Ответить с цитированием
Старый 30.08.2007, 18:14   #2
Horror
Бывалый
 
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений
(для 110 пользователей)
Re: Взрыв бомбочки

как я понял у тя карта это двумерный массив так?
типо ЭРРЭЙ(16,16)

а если взрыв происходит а позициии Х У

то можно организовать взрыв так

уничтожаем кубик в позиции х,у
и все вокруг это (x-1[+1],y-1[+1]) т.е. спокойно можно взаврвать
все соседние 9 клеток!

а если клетка уже взорвана пропускай эту клетку
(Offline)
 
Ответить с цитированием
Старый 30.08.2007, 18:30   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Взрыв бомбочки

Horror, дело в том что если умрёт один то дальше не будут умирать. Я ему предложил варриант: Перебирать Все кубики, далее вычислять попадают ли они на одну из осей, далее проверять на дистанцию взрыва, и только тогда проверять не загораживается ли кубик чем-либо от бомбы, если нет то удалять.
(Offline)
 
Ответить с цитированием
Старый 30.08.2007, 20:44   #4
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Взрыв бомбочки

Сообщение от MoKa
Horror, дело в том что если умрёт один то дальше не будут умирать. Я ему предложил варриант: Перебирать Все кубики, далее вычислять попадают ли они на одну из осей, далее проверять на дистанцию взрыва, и только тогда проверять не загораживается ли кубик чем-либо от бомбы, если нет то удалять.
Да, но данный вариант не работает

вот !
(Offline)
 
Ответить с цитированием
Старый 30.08.2007, 20:53   #5
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Взрыв бомбочки

Fant, сделай рабочий. Есть теория а есть алгоритм, это разные вещи, и от алгоритма зависит рабочесть а не от теории
(Offline)
 
Ответить с цитированием
Старый 31.08.2007, 01:13   #6
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Сообщение от MoKa
Fant, сделай рабочий. Есть теория а есть алгоритм, это разные вещи, и от алгоритма зависит рабочесть а не от теории
Однако, мы с тобой вместе птались это сделать, но у нас не получилось.
Если бы я смог тот алгоритм сам реализовать, я бы сюда не писал!

Кто знает как реализовать что я хочу сделать, посмотрите данную тему пожалуйста!

Сообщение от Horror
как я понял у тя карта это двумерный массив так?
типо ЭРРЭЙ(16,16)

а если взрыв происходит а позициии Х У

то можно организовать взрыв так

уничтожаем кубик в позиции х,у
и все вокруг это (x-1[+1],y-1[+1]) т.е. спокойно можно взаврвать
все соседние 9 клеток!

а если клетка уже взорвана пропускай эту клетку
не совсем понял идею! Можно поподробнее?
(Offline)
 
Ответить с цитированием
Старый 31.08.2007, 02:21   #7
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Взрыв бомбочки

вот
Data 1,1,1,1,1,1
Data 1,0,2,0,0,1
Data 1,0,0,0,0,1
Data 1,2,4,0,2,1
Data 1,0,2,0,0,1
Data 1,1,1,1,1,1

Const xworldsize=6
Const yworldsize=6

Dim MAP(xworldsize,yworldsize)


Function EPI(x,y)
MAP(x,y)=0
Local R=1;<========Raidus
Local C

C=0
For i=x+1 To xworldsize
If C=R Exit
If MAP(i,y)<>0 And MAP(i,y)<>1
MAP(i,y)=0
DebugLog "del "+i+";"+y
Exit
EndIf
C=C+1
Next
C=0
For i=x-1 To 1 Step -1
If C=R Exit
If MAP(i,y)<>0 And MAP(i,y)<>1
MAP(i,y)=0
DebugLog "del "+i+";"+y
Exit
EndIf
C=C+1
Next
C=0
For i=y+1 To yworldsize
If C=R Exit
If MAP(x,i)<>0 And MAP(x,i)<>1
MAP(x,i)=0
DebugLog "del "+x+";"+i
Exit
EndIf
C=C+1
Next
C=0
For i=y-1 To 1 Step -1
If C=R Exit
If MAP(x,i)<>0 And MAP(x,i)<>1
MAP(x,i)=0
DebugLog "del "+x+";"+i
Exit
EndIf
C=C+1
Next
End Function

Function drawmap()
Cls:Locate 0,0
For iy=1 To yworldsize
s$=""
For ix=1 To xworldsize
s=s+MAP(ix,iy)
Next
Print s
Next
Print "["+MilliSecs()+"] press any key For Next draw"
WaitKey()
End Function

;=load
For iy=1 To yworldsize
For ix=1 To xworldsize
Read MAP(ix,iy)
Next
Next
;=
Graphics 800,600,32
SetFont LoadFont("arial",20)
FlushKeys()
drawmap()
;=bomb
For iy=1 To yworldsize
For ix=1 To xworldsize
If MAP(ix,iy)=4
EPI(ix,iy)
EndIf
Next
Next
drawmap()

__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 31.08.2007, 10:32   #8
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Взрыв бомбочки

Сообщение от impersonalis
вот
Спасибо! Это то, что нужно!

А проще или понятнее этот код представить можно? Или напихать его комментами?

А то я читаю и у меня только прееменные мигают перед глазами. Я конечно надеюсь, что за много времени яя может и пойму смысл вышенаписанного, но более иной стиль (оформление кода) или комментарии существенно облегчат мне задачу
(Offline)
 
Ответить с цитированием
Старый 31.08.2007, 15:06   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Re: Взрыв бомбочки

;описываем карту
Data 1,1,1,1,1,1
Data 1,0,2,0,0,1
Data 1,0,0,0,0,1
Data 1,2,4,0,2,1
Data 1,0,2,0,0,1
Data 1,1,1,1,1,1

;размеры по абсциссе и ординате
Const xworldsize=6
Const yworldsize=6

;массив карты
Dim MAP(xworldsize,yworldsize)

;функция взрыва
Function EPI(x,y)
MAP(x,y)=0
Local R=1;<========Raidus
Local C;путь взрывной волны

C=0
;-> двигаемся
For i=x+1 To xworldsize
If C=R Exit;радиус пройден
If MAP(i,y)<>0 And MAP(i,y)<>1
MAP(i,y)=0;взрываем точку
DebugLog "del "+i+";"+y
Exit;волна исчерпала себя
EndIf
C=C+1;увеличиваем пройденное
Next
C=0
;<-двигаемя
For i=x-1 To 1 Step -1
If C=R Exit
If MAP(i,y)<>0 And MAP(i,y)<>1
MAP(i,y)=0
DebugLog "del "+i+";"+y
Exit
EndIf
C=C+1
Next
C=0
;\/ двигаемся
For i=y+1 To yworldsize
If C=R Exit
If MAP(x,i)<>0 And MAP(x,i)<>1
MAP(x,i)=0
DebugLog "del "+x+";"+i
Exit
EndIf
C=C+1
Next
C=0
;/\ двигаемся
For i=y-1 To 1 Step -1
If C=R Exit
If MAP(x,i)<>0 And MAP(x,i)<>1
MAP(x,i)=0
DebugLog "del "+x+";"+i
Exit
EndIf
C=C+1
Next
End Function

Function drawmap()
Cls:Locate 0,0
For iy=1 To yworldsize
s$=""
For ix=1 To xworldsize
s=s+MAP(ix,iy)
Next
Print s
Next
Print "["+MilliSecs()+"] press any key For Next draw"
WaitKey()
End Function

;=load
For iy=1 To yworldsize
For ix=1 To xworldsize
Read MAP(ix,iy)
Next
Next
;=
Graphics 800,600,32
SetFont LoadFont("arial",20)
FlushKeys()
drawmap()
;=bomb
For iy=1 To yworldsize
For ix=1 To xworldsize
If MAP(ix,iy)=4
EPI(ix,iy)
EndIf
Next
Next
drawmap()
даж не знаю - чего там комментить =/
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 31.08.2007, 23:51   #10
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Взрыв бомбочки

Сообщение от impersonalis
даж не знаю - чего там комментить =/
ну, я как начну это реализовывать думаю появятся вопросы! А за комментарии Спс!
(Offline)
 
Ответить с цитированием
Старый 03.09.2007, 22:50   #11
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Взрыв бомбочки

Вообщем не получается. Вот функция моя. Не знаю почему не получается. Пытался воспроизвести идею Imper'а

bomb.bombs = First bombs
If bomb<>Null Then fnUpdateBomb(X,Z) - в цикле
-------------------------------------
 
Function fnUpdateBomb(x,z)
For bomb.bombs = Each bombs
Local Rad=16
Local ExplWay
ExplWay=0
If bomb<>Null Then 
bomb\lifetime = bomb\lifetime+1
bomb\ArX = Int(((EntityX (bomb\obj)+5)/10))
bomb\ArZ= Int(((EntityZ (bomb\obj)+5)/10))
 
x=bomb\ArX
z=bomb\Arz
If (bomb\lifetime=60 ) 
 
 
;-> äâèãàåìñÿ
For i=bomb\ArX+1 To 16
If ExplWay=Rad Exit;ðàäèóñ ïðîéäåí
If playfield(X,Z)<>0 And Playfield(X,Z)<>1
playfield(X,Z)=0;âçðûâàåì òî÷êó
Exit;âîëíà èñ÷åðïàëà ñåáÿ
EndIf
ExplWay=ExplWay+1;óâåëè÷èâàåì ïðîéäåííîå
Next
ExplWay=0
;<-äâèãàåìÿ
For i=bomb\ArX-1 To 1 Step -1
If ExplWay=Rad Exit
If playfield(X,Z)<>0 And playfield(X,Z)<>1
playfield(X,Z)=0
Exit
EndIf
ExplWay=ExplWay+1
Next
ExplWay=0
 
;\/ äâèãàåìñÿ
For i=bomb\ArZ+1 To 16
If ExplWay=Rad Exit
If playfield(X,Z)<>0 And playfield(X,Z)<>1
playfield(X,Z)=0
Exit
EndIf
ExplWay=ExplWay+1
Next
ExplWay=0
;/\ äâèãàåìñÿ
For i=bomb\ArZ-1 To 1 Step -1
If ExplWay=Rad Exit
If playfield(X,Z)<>0 And playfield(X,Z)<>1
playfield(X,Z)=0
Exit
EndIf
ExplWay=ExplWay+1
Next 
Next 
end function
Может я что-то с массивом напутал? Вообще у меня в начале массив:

Const ArrayPlayfieldX=16
Const ArrayPlayfieldZ=16

Dim Playfield(ArrayPlayfieldX,ArrayPlayfieldZ)

Сейчас почему-то вообще...ничего не работает, но и ошибки никакой нет.
(Offline)
 
Ответить с цитированием
Старый 04.09.2007, 15:35   #12
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Re: Взрыв бомбочки

Ну да тут только в массиве отчищаються квады, а удалять кубики исходя отчищен ли массив это уже тебе проверять. Просто как я понял impersonalis предпологал что у тебя зависимость такая: Массив > Объекты, а у тебя наоборот, поэтому тебе нужно ещё и объекты отчищать.
(Offline)
 
Ответить с цитированием
Старый 04.09.2007, 15:40   #13
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Взрыв бомбочки

Сообщение от MoKa
Ну да тут только в массиве отчищаються квады, а удалять кубики исходя отчищен ли массив это уже тебе проверять. Просто как я понял impersonalis предпологал что у тебя зависимость такая: Массив > Объекты, а у тебя наоборот, поэтому тебе нужно ещё и объекты отчищать.
Все удаляется. Я проверял. Если убрать все нагромождения, то все ок (но и удаляются ВСЕ кубики ряда, а не по одному)

Function fnUpdateRndCube()
For partitionable.partitionableCube=Each partitionableCube
partitionable\Arx = Int(((EntityX (partitionable\obj)+5)/10))
partitionable\Arz= Int(((EntityZ (partitionable\obj)+5)/10))
If playfield (partitionable\Arx,partitionable\ArZ)=0 *******************************
FreeEntity partitionable\obj
Delete partitionable
End If 
Next
End Function
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Взрыв (Вооомм) Petrofan 3D-программирование 8 11.01.2010 15:11
Ядерный взрыв Mark Castle 3D-программирование 24 03.03.2009 01:05
Ядерный взрыв HolyDel 3D-программирование 18 25.06.2007 12:30
Взрыв SubZer0 Полезные функции 2 04.09.2005 22:38


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


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