forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   Гусеница (http://forum.boolean.name/showthread.php?t=2412)

Fant 15.01.2007 13:36

Гусеница
 
У меня тут вопрос назрел! Хочу сделать гусеницу. Я ее даже сделал, но есть одно НО...она появляется из начальной точки, а хотелось бы что бы при старте программы, все элементы уже были на ходу. (то есть что бы она сразу появилась, а не постепенно, как в коде)

Код:

Graphics3D 640,480,16,2

Const UPS=60

Dim cube (12)

cam=CreateCamera()
PositionEntity cam ,10,5,-25

cube(0)=CreateCube()
HideEntity cube(0)


For  i = 1 To 12

cube(i) = CopyEntity(cube(0))


RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,0,0
SetAnimKey cube(i),0

RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,10,0
SetAnimKey cube(i),60

RotateEntity cube(i),0,0,0
PositionEntity cube(i),20,10,0
SetAnimKey cube(i),120

RotateEntity cube(i),0,0,0
PositionEntity cube(i),20,0,0
SetAnimKey cube(i),180

RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,0,0
SetAnimKey cube(i),240


Next

For i=1 To 12
AddAnimSeq cube(i),240
Next


For i=1 To 12
Animate cube(i),1,1,0, 0+i*24
Next

l=CreateLight()

period=1000/UPS
time=MilliSecs()-period

Repeat
        Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        tween#=Float(elapsed Mod period)/Float(period)
       
        For k=1 To ticks
                time=time+period

For i=1 To 12
Animate cube(i),1,1,1-AnimSeq(cube(I))
Next


                If KeyHit(1) End
                UpdateWorld       
        Next
       
        RenderWorld tween
        Flip

Forever


Fant 16.01.2007 15:20

Re: Гусеница
 
Если есть еще какой-нить будь примерно похожий на мой способ реализовать так гусеницу я только за)

Неужели никто не знает как это сделать?

Vyacheslav 16.01.2007 16:16

Re: Гусеница
 
Я пробовал сделать. По идее, это вполне возможно, но немного трудно в голове эту гусень представить =) а более того - реализовать. В Блице с key-ами туговато, не то что в nebula... Может можно как-то по-другому решить эту проблему - через готовые анимации или еще... что именно в результате требуется? Это будет игра и хочется невероятной продуктивности, или?

Diplomat 16.01.2007 16:18

Re: Гусеница
 
Полуофф:
Не восприми как навязывание мнения, но создание гусеницы [в смысле танковых траков?] из отдельных мешей- это неоптимальное решение в условно-стандартной ситуации. Иначе говоря, если вышеприведенный алгоритм с кубиками не является стилистически или техниески необходимым решением, то движущаяся гусеница с намного более высокой производительностью и, вероятно, реалистичностью, создается путем применения анимированной посредством PositionTexture текстуры траков на модели гусениц. А повторение гусеницей формы рельефа осуществляется путём управления сегментами гусеницы с помощью костей.

Fant 16.01.2007 16:20

Re: Гусеница
 
не понял я смысла слова "продуктивности"
Я знаю как НУЖНО делать гусеницу (подсказывали мне) но я хочу сденлать именно кубиками, которые крутятся вокруг оси! Посмотрю как-нить пример "небула" ?) У кого-нить еще есть варианты по этому поводу?

Fant 16.01.2007 16:22

Re: Гусеница
 
Цитата:

Сообщение от Diplomat
Полуофф:
Не восприми как навязывание мнения, но создание гусеницы [в смысле танковых траков?] из отдельных мешей- это неоптимальное решение в условно-стандартной ситуации. Иначе говоря, если вышеприведенный алгоритм с кубиками не является стилистически или техниески необходимым решением, то движущаяся гусеница с намного более высокой производительностью и, вероятно, реалистичностью, создается путем применения анимированной посредством PositionTexture текстуры траков на модели гусениц. А повторение гусеницей формы рельефа осуществляется путём управления сегментами гусеницы с помощью костей.

Такую теорию я уже слышал однажды. Не спорю - это лучший вариант, но хотелось бы именно таким извратом!
У вас случайно нет идеи как там можно....извратнуться?

Vyacheslav 16.01.2007 16:39

Re: Гусеница
 
Насчет nebula - не буду писать весь пример, потому как c exe-шником нужно париться, на это я столько времени не найду, а вот кратко, как в nebula это делается, могу сказать - это выглядит примерно так:

set start_time [/sys/servers/channel.getchannel1f "time"]

new n3dnode gus1
sel gus1
new nipol move
sel move
.setreptype "loop"
.connect txyz
.addkey3f 0 0 0 0
.addkey3f $start_time 0 0 0
.addkey3f [expr $start_time+0.5] 10 0 0
и т.д., т.е. создать необходимый список ключей с координатами
sel ..
sel ..

Я уже на nebula около 1Мб кода написал - в аркадных проектах (и в этом случае) - это отличное решение. Проблема в том, что нужно еще экзешник создавать, делать возможным использование D3D и OpenGL - хотя, разве это проблема ? - это в кое-каком роде расширенные возможности.

Fant 16.01.2007 16:47

Re: Гусеница
 
да у меня исходник небулы есть, но думаю, что это неоправданно сложный вариант реализации

Vyacheslav 16.01.2007 16:51

Re: Гусеница
 
Мне кажется, не сложнее чем в Blitz'е. Просто в nebula нужно сначала понастраивать кучу прог и т.д. - от С-студии до удобного текстового редактора. Зато потом как все легко идет! Можно в С-коде создать класс nGusenicanode, который будет иметь одинаковый свойства или через linknode - мне, например, это кажется проще, хотя, наверное, одновременно умертвляю образ "проще Блица не бывает нигде", к которому все привыкли :-)

Fant 16.01.2007 18:46

Re: Гусеница
 
Вообщем говоря более понятным языком. Как мне реализовать ЭТУ гусеницу?

Vyacheslav 16.01.2007 19:34

Re: Гусеница
 
Да, над этой задачей нужно посидеть, логически подумать. В цикле проигрывать уже не нужно - это раз. Задержку можно перед циклом поставить, подождать, чтобы немного проиграло :) , или что-то типа этого, только оптимизировать:

Код:


Graphics3D 640,480,16,2
Const UPS=60
Dim cube (12)
cam=CreateCamera()
PositionEntity cam ,10,5,-25
 
cube(1)=CreateCube()
PositionEntity cube(1),0,0,0
SetAnimKey cube(1),0
PositionEntity cube(1),0,10,0
SetAnimKey cube(1),60
PositionEntity cube(1),20,10,0
SetAnimKey cube(1),120
PositionEntity cube(1),20,0,0
SetAnimKey cube(1),180
PositionEntity cube(1),0,0,0
SetAnimKey cube(1),240
 
cube(2)=CreateCube()
PositionEntity cube(2),0,10,0
SetAnimKey cube(2),0
PositionEntity cube(2),20,10,0
SetAnimKey cube(2),60
PositionEntity cube(2),20,0,0
SetAnimKey cube(2),120
PositionEntity cube(2),0,0,0
SetAnimKey cube(2),180
PositionEntity cube(2),0,10,0
SetAnimKey cube(2),240
 
cube(3)=CreateCube()
PositionEntity cube(3),20,10,0
SetAnimKey cube(3),0
PositionEntity cube(3),20,0,0
SetAnimKey cube(3),60
PositionEntity cube(3),0,0,0
SetAnimKey cube(3),120
PositionEntity cube(3),0,10,0
SetAnimKey cube(3),180
PositionEntity cube(3),20,10,0
SetAnimKey cube(3),240
 
cube(4)=CreateCube()
PositionEntity cube(4),20,0,0
SetAnimKey cube(4),0
PositionEntity cube(4),0,0,0
SetAnimKey cube(4),60
PositionEntity cube(4),0,10,0
SetAnimKey cube(4),120
PositionEntity cube(4),20,10,0
SetAnimKey cube(4),180
PositionEntity cube(4),20,0,0
SetAnimKey cube(4),240
 
AddAnimSeq cube(1),240
AddAnimSeq cube(2),240
AddAnimSeq cube(3),240
AddAnimSeq cube(4),240
 
Animate cube(1)
Animate cube(2)
Animate cube(3)
Animate cube(4)
 
l=CreateLight()
period=1000/UPS
time=MilliSecs()-period
 
Repeat
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
 
For k=1 To ticks
time=time+period
 
If KeyHit(1) End
UpdateWorld
Next
 
RenderWorld tween
Flip
Forever


HolyDel 17.01.2007 01:38

Re: Гусеница
 
хотите извращаться, пожалуйста. мну ничего лутчего чем придумал г-н Diplomat неизвестно. вот ваш пример:
Код:

Graphics3D 640,480,16,2

Const UPS=60

Dim cube (12)

cam=CreateCamera()
PositionEntity cam ,10,5,-25

cube(0)=CreateCube()
HideEntity cube(0)


For  i = 1 To 12

cube(i) = CopyEntity(cube(0))


RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,0,0
SetAnimKey cube(i),0

RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,10,0
SetAnimKey cube(i),60

RotateEntity cube(i),0,0,0
PositionEntity cube(i),20,10,0
SetAnimKey cube(i),120

RotateEntity cube(i),0,0,0
PositionEntity cube(i),20,0,0
SetAnimKey cube(i),180

RotateEntity cube(i),0,0,0
PositionEntity cube(i),0,0,0
SetAnimKey cube(i),240


Next

For i=1 To 12
AddAnimSeq cube(i),240
Next


For i=1 To 12
Animate cube(i),1,1,0, 0+i*24
Next

For i=1 To 500
        UpdateWorld
Next
l=CreateLight()

period=1000/UPS
time=MilliSecs()-period

Repeat
        Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        tween#=Float(elapsed Mod period)/Float(period)
       
        For k=1 To ticks
                time=time+period

For i=1 To 12
Animate cube(i),1,1,1-AnimSeq(cube(I))
Next


                If KeyHit(1) End
                UpdateWorld       
        Next
       
        RenderWorld tween
        Flip

Forever

сражу скажу чо я изменил, просто поставил
Код:

For i=1 To 500
        UpdateWorld
Next

перед главным циклом. хто придумает более извращенный вариант?

Fant 17.01.2007 07:23

Re: Гусеница
 
2Vyacheslav ваш вариант интересный, хотя придется для каждого куба прописывать...
2HolyDel Так тоже можно сделать

НО

Есть две проблемки. Причем одна проблемка маленькая, а другая большая.

Первое - это как остановить эту анимацию, а потом продолжить желателно с того же места

А второе, что по моему мнению не реально сделать, так это сместить кубики. Ведь что делать если юзер захочет "поехать", то получается нужно смещать эту гусеницу, а тут она стоит на месте и не двигается (

Vyacheslav 17.01.2007 11:21

Re: Гусеница
 
2HolyDel: Интресеный вариант! Я только до обычной delay на тот момент додумался :) .

2Fant: Нужно определиться с тем, что нужно, а что будет лишним, потому как таким образом не получиться добавить ей управления и анимацию довольно сложно остановить, потому как придется дописывать новые кадры или прописывать анимацию заново. Немного поприкалывались с Блица, а теперь давайте попробуем сделать, кто функциональнее, а? Т.е. Fant напишите тех. задание, что нужно: ирушку типа гусеницы, какое управление и т.д.(?) И давайте померяемся силами - у кого она наиболее будет хорошо работать с наименьшим количеством строк кода, как? :super:

Diplomat 17.01.2007 12:35

Re: Гусеница
 
2 Vyacheslav :
Дальнейший флуд, являющийся по совместительству оффтопом- будет удаляться.
Если Вас интересует популяризация иных средств разработки- ставьте вопрос о создании соответствующего раздела перед администрацией.
Для доказательства своих тезисов о превосходстве по производительности и удобству, создавайте в Болтовне или Форумных Конкурсах соответствующую тему с содержанием вроде следующего:
"Вот мой тест производительности движка [встваить нужное название], использующего синтаксис языка программирования [встваить нужное название]. Всего N строк. На моей машине [подставить данные аппарата] выдает I FPS. Тест делает [описать работу] и использует [прикрепить к теме используемые ресурсы, ЕХЕ и исходники].
Пожалуйста, протестите у себя и, если возможно, постройте на используемом вами движке, в частности на Blitz3D, аналогичный тест для сравнения производительности.
Спасибо!"
А флудить- нинада. ;)

Fant 17.01.2007 20:43

Re: Гусеница
 
2Vyacheslav - вообщем будет объект. Танк. Он будет ездить. Он будет не ездить. То есть нужно анимировать гусеницу когда танк в пути и когда он стоит на месте. Получается что гусеница должа быть как-то привязана танку. вот!

К сожалению я бы померялся силами, но мои идеи насчет этого бессильны...как я уже только не пытался сделать!!!((

2Diplomat - мощно задвинул. Внушает!

Horror 17.01.2007 23:43

Re: Гусеница
 
а почему бо не сдлать анимированную текстуру на гусеицы танка
гдето видел найду скину

Fant 17.01.2007 23:46

Re: Гусеница
 
2Horror я хочу именно так. Про анимированную текстуру слышал. Это самый лучший вариант.

HolyDel 18.01.2007 01:06

Re: Гусеница
 
теорема:
анимированная текстура - не самый лучший.
доказательство:
каждый кадр анимированной тексы надо хранить где?, правильно, в идеопамяти размеры которой небольшие по сравнению с размером оперативной памяти. поетому лучший вариант - описанный г-ном Diplomat`ом.

Fant 18.01.2007 01:10

Re: Гусеница
 
2HolyDel: я не ищу луший вариант. Я пытаюсь реализовать мой.

Diplomat 18.01.2007 11:34

Re: Гусеница
 
Как единственный аналогичный требуемому решению и вариант могу посоветовать анимировать траки в Мах-е, а потом в Блице "нарезать" анимацию покадрово ЁкстрактАнимСек-ом и понаходить каждый трак в качестве чайлда.

2 HolyDel : Ну надо, так надо. Чо мы как эти самые. Значит такая фича. Значит необходимость есть. Явно же человек что-то планирует.

SBJoker 18.01.2007 15:13

Re: Гусеница
 
Цитата:

Сообщение от HolyDel
теорема:
анимированная текстура - не самый лучший.
доказательство:
каждый кадр анимированной тексы надо хранить где?, правильно, в идеопамяти размеры которой небольшие по сравнению с размером оперативной памяти. поетому лучший вариант - описанный г-ном Diplomat`ом.

хех, нехотел тебя разочаровывать, но ты невтеме.

Текстурка анимируется программно путём сдвига её по 1ой координате (скролл текстуры) - это очень даже сверх экономно - поверь мне.

Причём в случае гусеницы нужна текстурка одного звена, т.е. текстура тайловая и занимает в памяти столько же сколько её 32х битное представление в виде BMP -файла.

Fant 18.01.2007 16:53

Re: Гусеница
 
я не админ, но мне кажется тут начинается спор. У меня есть вопрос. Как средствами блиц сделать гусеницу. Это все. Есть ли варианты как это сделать? Подскажите пожалуйста!?

Diplomat 18.01.2007 16:58

Re: Гусеница
 
2 SBJoker : Вероятно под "анимацией текстуры" HolyDel подразумевал схоластическое Блицевское определение: стриплайн из последовательно меняющихся кадров. Т.е., по сути вы c ним говорите о пользе для нархоза одних и тех же вещей.
Чтоб избежать багов контекстного анализа следует использовать более развернутые определения обьектов, явлений и процессов обьективной действительности.
"Ой, шо я гоню?!"(с)
:-[


2 Fant : Если анимации кубиков не подходят, и формулы, описывающие траекторию, неудовлетворяют требованиям- используй вейпоинты. Массив пивотов, траки по ним по очереди "пробегают". Циклично. По принципу
[blitz]For n=0 to NTracks
PointEntity Track(n),WP(i)
MoveEntity Track(n),0,0,v
If EntityDistance(Track(n),WP(i))<v Then i=i+1
If i>NWPoints Then I=0
Next[/blitz]
Всё хозяйство припарентено к танку.
Более оригинальный метод придумать трудно. :)

Fant 18.01.2007 18:29

Re: Гусеница
 
2Diplomat спасибо за совет! Ларчик просто открывался. Я ПРОСТО припэретил анимацию к танку. и все!!!

jimon 18.01.2007 19:06

Re: Гусеница
 
Fant
ето я говорил тебе еще вчера

Diplomat 18.01.2007 20:20

Re: Гусеница
 
...а я еще сегодня... :"(

Fant 18.01.2007 23:00

Re: Гусеница
 
А у меня эта идея еще позавчера возникла, но только сегодня я понял. как ее применить:''((

HolyDel 19.01.2007 02:42

Re: Гусеница
 
2SBJoker: анимация текстуры и ее скролл -несколько разные вещи, имхо.

Fant 19.01.2007 10:18

Re: Гусеница
 
2HolyDel Кстати, эту ветку еще долго можно не закрывать! Я сделал уродливый танк. Привязал гусеницу, но никак не могу сделать так что бы она не крутилась, когда танк не едет (смысле сначала она не крутится, потом танк едет - она крутится. Потом уже она крутится все время...странно.)

SBJoker 19.01.2007 10:44

Re: Гусеница
 
Цитата:

Сообщение от HolyDel
2SBJoker: анимация текстуры и ее скролл -несколько разные вещи, имхо.

Про анимацию ты первым заговорил, причём недогнал и привёл жуткий пример на основе анимированных имаджей. О чём речь вообще нешла.

Во вторых:
animation

сущ.
1) анимация (мультипликация)
2) воодушевление; живость; вдохновение, оживление


В текущем разговоре это слово использовалось во втором значении, а именно "оживить", заставить двигаться текстуру,т.е. анимировать. А не использовать предварительно анимированую последовательность картинок.

HolyDel 20.01.2007 02:50

Re: Гусеница
 
2SBJoker. Ok.

2Fant если кроме танка ничего больше анимированного в сцене нету, то легче всего изменять параметр UpdateWorld.
т.е. должно быть примерно так UpdateWorld(spd*f), где spd - скорость танка, а f - фактор, который подбирается экспериментально.

Fant 20.01.2007 23:10

Re: Гусеница
 
Короче фишка такая. Я не могу удалить пробелом все элементы. То есть я понимаю из-за чего ошибка, но не знаю как ее можно обойти. Пробел - удаление.

Подкажите что можно сделать?

Код:

Graphics3D 640,480,16,2


Const UPS=60

Const Max=10; - number of trackS

Type tank1
Field xPosition#
Field yPosition#
Field zPosition#
Field obj
End Type

Dim cube (Max);track
Dim cube2(Max);track

Global speed#=0
Global ok=0
Global ok1=True
kdown=KeyDown(200)


;Cam & light
camera=CreateCamera()
CameraClsColor camera,0,0,255
PositionEntity camera,0,10,0
CameraRange camera,1,20
RotateEntity camera ,90,0,0

l=CreateLight()
RotateEntity l,45,0,0

;ground=CreateCube()
;PositionEntity ground,0,-1,0
;ScaleMesh  ground,15,1,15
;EntityColor ground,128,128,192

;tankModel=CreateCube()

t1.tank1=New tank1
;Create details of tank
tank1=CreateCube()
ScaleMesh tank1,1,.1,.5
PositionEntity  tank1,0,0,0

tower=CreateSphere(4, tank1)
ScaleMesh tower,.3,.3,.3
PositionMesh tower,0,.2,0

wheel1=CreateCube( tank1)
ScaleMesh wheel1,.5,.05,.05
PositionMesh wheel1,0,0,.6

wheel2=CreateCube(tank1)
ScaleMesh wheel2,.5,.05,.05
PositionMesh wheel2,0,0,-.6

cannon=CreateCylinder(6,tower)
ScaleMesh cannon,.1,.5,.1
RotateMesh cannon,0,0,100
PositionMesh cannon,.6,.4,0


;Original cube. It makes tracks
cube(0)=CreateCube()
ScaleEntity cube(0),.025,.025,.025
HideEntity cube(0)

;animated track
For  i = 1 To Max

cube(i) = CopyEntity(cube(0))
cube2(i) = CopyEntity(cube(0))

EntityParent cube(i), tank1
EntityParent cube2(i), tank1

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,-.25,.6
SetAnimKey cube(i),0

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,.25,.6
SetAnimKey cube(i),60

RotateEntity cube(i),0,0,0
PositionEntity cube(i),1,.25,.6
SetAnimKey cube(i),120

RotateEntity cube(i),0,0,0
PositionEntity cube(i),1,-.25,.6
SetAnimKey cube(i),180

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,-.25,.6
SetAnimKey cube(i),240


RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,-.25,-.6
SetAnimKey cube2(i),0

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,.25,-.6
SetAnimKey cube2(i),60

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),1,.25,-.6
SetAnimKey cube2(i),120

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),1,-.25,-.6
SetAnimKey cube2(i),180

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,0,-.6
SetAnimKey cube2(i),240

Next


For i=1 To Max
AddAnimSeq cube(i),240
AddAnimSeq cube2(i),240
Next

For i=1 To Max
Animate cube(i),1,1,0, i*24
Animate cube2(i),1,1,0, i*24
Next
i=0
While i<240

UpdateWorld
i=i+1
Wend



;Color set
black_br=CreateBrush(0,0,0)
PaintMesh  tank1,black_br
white_br=CreateBrush(255,255,255)
PaintMesh tower,white_br
grey_br=CreateBrush(119,136,122)
PaintMesh cannon,grey_br
orange_br=CreateBrush(226,118,29)
PaintMesh wheel1,orange_br
PaintMesh wheel2,orange_br
rose_br=CreateBrush(214,58,218)
PaintMesh tower,rose_br

;addMeshes (details of tank)
AddMesh tower, tank1
AddMesh  wheel1, tank1
AddMesh  wheel2, tank1
AddMesh  cannon, tank1

FreeEntity tower
FreeEntity wheel1
FreeEntity wheel2
FreeEntity cannon


period=1000/UPS
time=MilliSecs()-period

Repeat
        Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        tween#=Float(elapsed Mod period)/Float(period)
       
        For k=1 To ticks
                time=time+period


If KeyHit(57)
FreeEntity cube(0)
For i=1 To max
HideEntity cube(i)
HideEntity  cube2(i)
Next


FreeEntity tank1

End If


If  Not KeyDown(200)
 
For i=1 To Max
Local p#=AnimTime#(cube(i))
SetAnimTime cube(i),p#
p#=AnimTime#(cube2(i))
SetAnimTime cube2(i),p#
Next
EndIf



If KeyHit(200) Then
 p#=AnimTime#(cube(1))
For i=1 To Max
Animate cube(i),1,1,0, i*24
Animate cube2(i),1,1,0, i*24
Next
i=0
WaitKey
While i<240+p#
UpdateWorld
i=i+1
Wend

EndIf



For t1.tank1=Each tank1
If KeyDown(203) Then TurnEntity  tank1,0,3,0
If KeyDown(205) Then TurnEntity  tank1,0,-3,0
If KeyDown(200) Then MoveEntity  tank1,.1,0,0
If KeyDown(208) Then MoveEntity  tank1,-.1,0,0       
Next
       


                If KeyHit(1) End
                UpdateWorld       
        Next
       
        RenderWorld tween
        Flip

Forever


HolyDel 21.01.2007 01:13

Re: Гусеница
 
лучше - бы весь код в студию.
а так сильно имхо:
Код:

if keydown(57)
for t.tank1=each tank1
freeentity t\obj ; удаляем модель
delete t
next
endif


Fant 21.01.2007 14:30

Re: Гусеница
 
2HolyDel но вообще-то код, который я выложил и есть - весь

И так не работает) посмотри в чем там ошибка! Вернее ясно в чем она, вопрос как ее избежать!?

HolyDel 22.01.2007 02:28

Re: Гусеница
 
Fant, а что вообще надо? просто удалить танк?
выйди за цикл и удали его. или проверяй на удаленность, если удален танк то никакие операции не должны над ним производиться.
вот рабочий пример:
Код:

Graphics3D 640,480,16,2


Const UPS=30

Const Max=10; - number of trackS

Type tank1
Field xPosition#
Field yPosition#
Field zPosition#
Field obj
End Type

Dim cube (Max);track
Dim cube2(Max);track

Global speed#=0
Global ok=0
Global ok1=True
kdown=KeyDown(200)


;Cam & light
camera=CreateCamera()
CameraClsColor camera,0,0,255
PositionEntity camera,0,10,0
CameraRange camera,1,20
RotateEntity camera ,90,0,0

l=CreateLight()
RotateEntity l,45,0,0

;ground=CreateCube()
;PositionEntity ground,0,-1,0
;ScaleMesh  ground,15,1,15
;EntityColor ground,128,128,192

;tankModel=CreateCube()

t1.tank1=New tank1
;Create details of tank
tank1=CreateCube()
ScaleMesh tank1,1,.1,.5
PositionEntity  tank1,0,0,0

tower=CreateSphere(4, tank1)
ScaleMesh tower,.3,.3,.3
PositionMesh tower,0,.2,0

wheel1=CreateCube( tank1)
ScaleMesh wheel1,.5,.05,.05
PositionMesh wheel1,0,0,.6

wheel2=CreateCube(tank1)
ScaleMesh wheel2,.5,.05,.05
PositionMesh wheel2,0,0,-.6

cannon=CreateCylinder(6,tower)
ScaleMesh cannon,.1,.5,.1
RotateMesh cannon,0,0,100
PositionMesh cannon,.6,.4,0


;Original cube. It makes tracks
cube(0)=CreateCube()
ScaleEntity cube(0),.025,.025,.025
HideEntity cube(0)

;animated track
For  i = 1 To Max

cube(i) = CopyEntity(cube(0))
cube2(i) = CopyEntity(cube(0))

EntityParent cube(i), tank1
EntityParent cube2(i), tank1

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,-.25,.6
SetAnimKey cube(i),0

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,.25,.6
SetAnimKey cube(i),60

RotateEntity cube(i),0,0,0
PositionEntity cube(i),1,.25,.6
SetAnimKey cube(i),120

RotateEntity cube(i),0,0,0
PositionEntity cube(i),1,-.25,.6
SetAnimKey cube(i),180

RotateEntity cube(i),0,0,0
PositionEntity cube(i),-1,-.25,.6
SetAnimKey cube(i),240


RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,-.25,-.6
SetAnimKey cube2(i),0

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,.25,-.6
SetAnimKey cube2(i),60

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),1,.25,-.6
SetAnimKey cube2(i),120

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),1,-.25,-.6
SetAnimKey cube2(i),180

RotateEntity cube2(i),0,0,0
PositionEntity cube2(i),-1,0,-.6
SetAnimKey cube2(i),240

Next


For i=1 To Max
AddAnimSeq cube(i),240
AddAnimSeq cube2(i),240
Next

For i=1 To Max
Animate cube(i),1,1,0, i*24
Animate cube2(i),1,1,0, i*24
Next
i=0
While i<240

UpdateWorld
i=i+1
Wend



;Color set
black_br=CreateBrush(0,0,0)
PaintMesh  tank1,black_br
white_br=CreateBrush(255,255,255)
PaintMesh tower,white_br
grey_br=CreateBrush(119,136,122)
PaintMesh cannon,grey_br
orange_br=CreateBrush(226,118,29)
PaintMesh wheel1,orange_br
PaintMesh wheel2,orange_br
rose_br=CreateBrush(214,58,218)
PaintMesh tower,rose_br

;addMeshes (details of tank)
AddMesh tower, tank1
AddMesh  wheel1, tank1
AddMesh  wheel2, tank1
AddMesh  cannon, tank1

FreeEntity tower
FreeEntity wheel1
FreeEntity wheel2
FreeEntity cannon


period=1000/UPS
time=MilliSecs()-period
is_tank=1
Repeat
        Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        tween#=Float(elapsed Mod period)/Float(period)
       
        For k=1 To ticks
                time=time+period


If KeyHit(57)
FreeEntity cube(0)
For i=1 To max
HideEntity cube(i)
HideEntity  cube2(i)
Next
FreeEntity tank1
is_tank=0
End If

If is_tank
       

If  Not KeyDown(200)
 
For i=1 To Max
Local p#=AnimTime#(cube(i))
SetAnimTime cube(i),p#
p#=AnimTime#(cube2(i))
SetAnimTime cube2(i),p#
Next
EndIf



If KeyHit(200) Then
 p#=AnimTime#(cube(1))
For i=1 To Max
Animate cube(i),1,1,0, i*24
Animate cube2(i),1,1,0, i*24
Next
i=0
WaitKey
While i<240+p#
UpdateWorld
i=i+1
Wend

EndIf



For t1.tank1=Each tank1
If KeyDown(203) Then TurnEntity  tank1,0,3,0
If KeyDown(205) Then TurnEntity  tank1,0,-3,0
If KeyDown(200) Then MoveEntity  tank1,.1,0,0
If KeyDown(208) Then MoveEntity  tank1,-.1,0,0       
Next
       

EndIf

                If KeyHit(1) End
                UpdateWorld       
        Next
       
        RenderWorld tween
        Flip

Forever

P.S. Извиняй что не заметил что код весь.

Fant 22.01.2007 16:59

Re: Гусеница
 
2HolyDel спасибо! Теперь я понял как все удалить!

Fant 25.01.2007 21:22

Re: Гусеница
 
Снова траблы. Я хочу гусеницу представить не через dim(массив), а через type (тип)

Вот я вынес из кода одну гусеницу, и не понимаю...не могу найти ошибку и даже понять как это сотворить?

track2 - сделана через массив и работает (если закомментить все, что касается track)

вот код
Код:

Graphics3D 640,480,16,2

Const UPS=60

Const max=10


Dim track2(Max);track

Type track
Field obj[10]
End Type

cam=CreateCamera()

RotateEntity cam,90,0,0
PositionEntity cam,0,3,0

l=CreateLight()

track(0)=CreateCube()
ScaleEntity track(0),.025,.025,.025
HideEntity track(0)

;animated track
For  i = 1 To Max
t.track=New track

t\obj = CopyEntity(track(0))

track2(i) = CopyEntity(track(0))


For t.track=Each track
RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,-.25,.6
SetAnimKey t\obj,0

RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,.25,.6
SetAnimKey t\obj,60

RotateEntity t\obj,0,0,0
PositionEntity t\obj,1,.25,.6
SetAnimKey t\obj,120

RotateEntity t\obj,0,0,0
PositionEntity t\obj,1,-.25,.6
SetAnimKey t\obj,180

RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,-.25,.6
SetAnimKey t\obj,240


RotateEntity track2(i),0,0,0
PositionEntity track2(i),-1,-.25,-.6
SetAnimKey track2(i),0

RotateEntity track2(i),0,0,0
PositionEntity track2(i),-1,.25,-.6
SetAnimKey track2(i),60

RotateEntity track2(i),0,0,0
PositionEntity track2(i),1,.25,-.6
SetAnimKey track2(i),120

RotateEntity track2(i),0,0,0
PositionEntity track2(i),1,-.25,-.6
SetAnimKey track2(i),180

RotateEntity track2(i),0,0,0
PositionEntity track2(i),-1,-.25,-.6
SetAnimKey track2(i),240
Next
;animation set
For i=1 To Max
For t.track=Each track
AddAnimSeq t\obj,240

AddAnimSeq track2(i),240


Animate t\obj,1,1,0, i*24
Animate track2(i),1,1,0, i*24
Next
Next

i=0
While i<240

UpdateWorld
i=i+1
Wend


period=1000/UPS
time=MilliSecs()-period

Repeat
        Repeat
                elapsed=MilliSecs()-time
        Until elapsed
        ticks=elapsed/period
        tween#=Float(elapsed Mod period)/Float(period)
       
        For k=1 To ticks
                time=time+period       
                If KeyHit(1) End
                UpdateWorld       
        Next


If  Not KeyDown(200) Or  KeyDown(208)
        For i=1 To Max
        For t.track=Each track
If t\obj<>0 Then
        Local p#=AnimTime#(track(i))
        SetAnimTime track(i),p#
EndIf
If track2(i)<>0 Then
        p#=AnimTime#(track2(i))
        SetAnimTime track2(i),p#
EndIf
        Next
        Next
                EndIf


If KeyHit(208) Then
 p#=AnimTime#(track(1))
        For i=1 To Max
        For t.track=Each track
Animate t\obj,1,-1,0, i*24
Animate track2(i),1,-1,0, i*24
        Next
        Next
i=0
WaitKey
While i<240+p#
UpdateWorld
i=i+1
Wend
        EndIf

If KeyHit(200) Then
 p#=AnimTime#(track(1))
        For i=1 To Max
                For t.track=Each track
Animate t\obj,1,1,0, i*24
        Next
Animate track2(i),1,1,0, i*24
        Next

       
i=0
WaitKey
While i<240+p#
UpdateWorld
i=i+1
Wend
        EndIf
               


       


        RenderWorld tween
        Flip

Forever
Next


Fant 27.01.2007 11:43

Re: Гусеница
 
Форум благополучно спит?;)

Я пытался сделать так, как нужно, но просто я не до конца понял, как это реализовать!

Diplomat 27.01.2007 17:38

Re: Гусеница
 
Сравни две строки:
Field obj[10]
и любую из последующих, например:
t\obj = CopyEntity(track(0))
"Ти всё-таки дапусирь маренький асибка!"(с)

Иначе говоря, всё, что ниже камента "animated track"- неправильно.
Теперь думай.
;)

Fant 28.01.2007 12:34

Re: Гусеница
 
Цитата:

Сообщение от Diplomat
Сравни две строки:
Field obj[10]
и любую из последующих, например:
t\obj = CopyEntity(track(0))
"Ти всё-таки дапусирь маренький асибка!"(с)

Иначе говоря, всё, что ниже камента "animated track"- неправильно.
Теперь думай.
;)

Попробую подумать, но то, что там ошибка я, конечно и сам догадался. Догадался весьма легко: программка не запускалась.

Diplomat 28.01.2007 13:22

Re: Гусеница
 
Сразу видно, что вначале у тебя в поле типа одномерный массив obj[10], а потом- почему-то простая переменная obj.
Естественно, такой кандибобер не будет работать.
И первый цикл, кстати, делает не 10 траков для одной гусеницы, а пытается клепать 10 гусениц с одним траком каждая.
Всё. Знаю, конечно, что поначалу вьехать очень трудно, но больше подсказывать не буду. Иначе трудно будет определить, понял ты, или списал. А это надо понять самому.
Думай.

Fant 28.01.2007 20:10

Re: Гусеница
 
[code]
Type track
Field obj[10]
End Type
t.track=New track
For t.track=Each track
t\obj[10]=CreateCube()
ScaleEntity t\obj[10],.025,.025,.025
PositionEntity t\obj[10],.1*.2,0,0
Next
[\code]

Я так создаю 10 кубиков или 1 кубик? - оказывается что 1
А как мне через positionEntity это проверить? так i*20

Мне нужно создать 10 кубиков через тип а потом из анимировать. Я иду правильным путем? - ну та это никак не могу сообразить((((((

Diplomat 28.01.2007 21:05

Re: Гусеница
 
Конечно, ты создаешь один кубик. А как иначе?
Вот смотри, если отвлечься от типов вообще, и рассматривать поля типов как простые переменные и массивы (коими они и являются), то всё становится намного проще:
1. Ты создал массив на 11 элементов: Field obj[10].
2. Ты присвоил 10-му элементу массива хендл свежесозданного куба: t\obj[10]=CreateCube()
3. Ну и всё. Других 10 кубов ты нигде не создаешь. Т.е. цикла по элементам массива в твоем коде нет как нет.
А без цикла ты не заполнишь 10 элементов массива. Ферштейн?
[blitz]For n=0 to 10
t\obj[n]=CreateCube()
Next[/blitz]
Или грубо говоря
[blitz]t\obj[0]=CreateCube()
t\obj[1]=CreateCube()
t\obj[2]=CreateCube()
;...
t\obj[8]=CreateCube()
t\obj[9]=CreateCube()
t\obj[10]=CreateCube()[/blitz]
Вот.

Цитата:

Мне нужно создать 10 кубиков через тип а потом из анимировать. Я иду правильным путем?
Если не вдаваться в жЫзненный и популярный среди юзверей вопрос "а зачем тебе вообще создавать 10 кубиков через тип и анимировать их вручную?!!", то можно предположить, что идешь ты правильным путем, но идешь не понимая его сути.
Это не беда, я, к примеру, когда был юн и учил БЕЙСИК-МСХ, тоже не сразу понял, что такое ветвления, экспотенциальная форма числа привела меня в замешательство, массивы- в ступор (чем, чйорт подйери, они отличаются от обычных переменных?!! :)), сабрутины показались редкостно ужасным изобретением, а из всех операторов цикла я выбрал оператор безусловного перехода, который тогда именовался еще раздельно: "Go To"...
:-)
Так что давай, учись.

Fant 28.01.2007 21:15

Re: Гусеница
 
ТОка хотел написать! Я все сделал, кроме в скобках...[n]
Код:

Graphics3D 640,480,16,2
Type track
Field obj
End Type
;Ñîçäàåì îðèãèíàëüíû êóá
OriginalTrack=CreateCube()
ScaleEntity OriginalTrack,.025,.025,.025
HideEntity OriginalTrack
 
For a=0 To 9;äåëàåì 10 êóáèêîâ, êîòîðûå íóæíî ðàññòàâèòü ïî-÷åëîâå÷åñêè
t.track=New track
t\obj=CopyEntity (originalTrack)
 
RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,-.25,.6
SetAnimKey t\obj,0
RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,.25,.6
SetAnimKey t\obj,60
RotateEntity t\obj,0,0,0
PositionEntity t\obj,1,.25,.6
SetAnimKey t\obj,120
RotateEntity t\obj,0,0,0
PositionEntity t\obj,1,-.25,.6
SetAnimKey t\obj,180
RotateEntity t\obj,0,0,0
PositionEntity t\obj,-1,-.25,.6
SetAnimKey t\obj,240
AddAnimSeq t\obj,240
Animate t\obj,1,1,0, i*24
Next
 
Const UPS=60
cam=CreateCamera()
RotateEntity cam,0,0,0
PositionEntity cam,0,0,-1
l=CreateLight()
period=1000/UPS
time=MilliSecs()-period
Repeat
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
 
For k=1 To ticks
time=time+period
If KeyHit(1) End
UpdateWorld
Next
 
RenderWorld tween
Flip
Forever

Ну только расположить не могу (впрочем как и раньше). Они у меня все в одной точке начинаются! Понимаешь?

А теперь покажу, если сделать по-твоему. мне кажется оба варианта эквиваленты, но как же их расположить в форме прямоугольника! Вот в этом и загвоздка!

Код:

Graphics3D 640,480,16,2
Type track
Field obj[10]
End Type
;Ñîçäàåì îðèãèíàëüíû êóá
OriginalTrack=CreateCube()
ScaleEntity OriginalTrack,.025,.025,.025
HideEntity OriginalTrack
 
For a=0 To 9;äåëàåì 10 êóáèêîâ, êîòîðûå íóæíî ðàññòàâèòü ïî-÷åëîâå÷åñêè
t.track=New track
t\obj[a]=CopyEntity (originalTrack)
 
RotateEntity t\obj[a],0,0,0
PositionEntity t\obj[a],-1,-.25,.6
SetAnimKey t\obj[a],0
RotateEntity t\obj[a],0,0,0
PositionEntity t\obj[a],-1,.25,.6
SetAnimKey t\obj[a],60
RotateEntity t\obj[a],0,0,0
PositionEntity t\obj[a],1,.25,.6
SetAnimKey t\obj[a],120
RotateEntity t\obj[a],0,0,0
PositionEntity t\obj[a],1,-.25,.6
SetAnimKey t\obj[a],180
RotateEntity t\obj[a],0,0,0
PositionEntity t\obj[a],-1,-.25,.6
SetAnimKey t\obj[a],240
AddAnimSeq t\obj[a],240
Animate t\obj[a],1,1,0, i*24
Next
 
Const UPS=60
cam=CreateCamera()
RotateEntity cam,0,0,0
PositionEntity cam,0,0,-1
l=CreateLight()
period=1000/UPS
time=MilliSecs()-period
Repeat
Repeat
elapsed=MilliSecs()-time
Until elapsed
ticks=elapsed/period
tween#=Float(elapsed Mod period)/Float(period)
 
For k=1 To ticks
time=time+period
If KeyHit(1) End
UpdateWorld
Next
 
RenderWorld tween
Flip
Forever


Fant 28.01.2007 22:38

Re: Гусеница
 
Я со всем тут разобрался. Поэтому вопрос снимается.

jimon 28.01.2007 23:13

Re: Гусеница
 

Слава Алаху ! :lol:

Fant 28.01.2007 23:49

Re: Гусеница
 
Но у меня появился вопрос:

В цикле:

Код:

If  (Not KeyDown(200)) And (Not KeyDown(208))
 For a=0 To 9
  For t.track=Each track
  If t\obj1[a]<>0 Then
Local p#=AnimTime#(t\obj1[a])
SetAnimTime t\obj1[a],p#
End If
 Next
  Next
  End If

ВОт так я придумал остановить анимацию, но хороший ли это вариант? А именно, меня смущает это:
For a=0 To 9
For t.track=Each track
Разве это не одно и то же?

Diplomat 29.01.2007 11:49

Re: Гусеница
 
Сейчас я начну ругаться. Матом. Громко, долго и обреченно.
Снимать вопрос было явно рано, ибо ни в чём ты не разобрался и ничего не понял. Абсолютно ничего.
Взгляни на такой вот кусочек своего кода "по Дипломатовскому варианту":
Код:

For a=0 To 9
t.track=New track
t\obj[a]=CopyEntity (originalTrack)
;...
Next

А теперь, пожалуйста, распиши на бумажке алгоритмически, что эта хрень делает?!
Она зачем-то создает 10 обьектов типа "Т" и в один из элементов массива "Обж" для каждого обьекта записывает по хендлу куба!
...яфшоке...
Строку "t.track=New track" вынеси к чертовой бабушке из этого цикла, просто перетащи ёё вверх!
Тогда у тебя будет всего один обьект типа, но с нормально заполненным массивом.
И тогда ветвление "If t\obj1[a]<>0 Then" тебе не нужно будет.
И тогда ну никак не должно тебе прийти в голову отождествлять "For t.track=Each track" и "For a=0 To 9"- потому что первое- это цикл по обьектам типа, а второе- это цикл по элементам массива, принадлежащему одному из обьектов.
Кстати, не должен быть и не может быть цикл по элементам массива находиться снаружи цикла по обьектам типа, которым эти самые массивы принадлежат.

Резюме: Забыть о типах нафиг, как о страшном сне. Снести Блиц, поставить КуБасик, купить к нему хороший самоучитель и учиццо основам основ! Долго и упорно... Ну, или найти на форуме советчика, менее припадошного, чем я...

SBJoker 29.01.2007 19:38

Re: Гусеница
 
2Дипломат: зачот! я первым понял что это бесполезно :)

Fant 31.01.2007 15:05

Re: Гусеница
 
Цитата:

Сообщение от SBJoker
2Дипломат: зачот! я первым понял что это бесполезно :)

Не хотелось вас расстраивать, но все, что я хотел я сделал. Все работает!


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

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