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=4666)

Fant 06.10.2007 11:59

Змейка
 
помогите пожалуйста сделать змейку на блиц!
Проблема в том, что змейка из FAQ оказалась мне не по зубам. Хотя "пусто" скопировать и применить ее в своем коде я смог (хоть и киво получилось) но по большей части змейка - великая тайна для меня пока.

Вообщем не знаю с чего даже начать. Теорию я конечно прочитал, но не могу сделать ее. Видимо слишком сложно.

MiXaeL 06.10.2007 16:26

Re: Змейка
 
ищи статью в Blitz Et Cetera (кажется 6 выпуск)

Данил 06.10.2007 16:31

Re: Змейка
 
ДУмаю, он и пытался сделать змейку по той статье.

Fant 06.10.2007 16:46

Re: Змейка
 
Цитата:

Сообщение от Данил
ДУмаю, он и пытался сделать змейку по той статье.

Ты правильно думаешь! Короче фактически мне нужно что бы 5 кубиков ехали за "головой" повторяя ее траекторию)

jimon 06.10.2007 17:11

Re: Змейка
 
позиция следуйшего обьетка = предыдущая позиция текущего обьекта :-)
ну ето только если змейка клеточная

Данил 06.10.2007 18:40

Re: Змейка
 
сохраняй координаты головы... И постепенно эти координаты передавай другим кубикам.

То есть гола на 2,3 позиции. При следушем шаге эта позиция у кубика 1 . потом у кубика 2 и т.д...

jimon 06.10.2007 18:46

Re: Змейка
 
Данил
сохранять только координаты головы напряжно :)

Fant 06.10.2007 21:21

Re: Змейка
 
Цитата:

Сообщение от jimon
позиция следуйшего обьетка = предыдущая позиция текущего обьекта :-)
ну ето только если змейка клеточная

Я знаю! Меня интересует как это сделать

Fant 06.10.2007 21:22

Re: Змейка
 
Цитата:

Сообщение от jimon
Данил
сохранять только координаты головы напряжно :)

Да, очень! А как это сделать?

Fant 06.10.2007 21:24

Re: Змейка
 
Цитата:

Сообщение от Данил
сохраняй координаты головы... И постепенно эти координаты передавай другим кубикам.

То есть гола на 2,3 позиции. При следушем шаге эта позиция у кубика 1 . потом у кубика 2 и т.д...

Я почитал теорию в FAQ и принцип работы понимаю, но тем не менее, не могу реализовать ее простейший пример! Не мог бы ты показать мне свои слова на живом примере, хотя бы из 3х кубиков?

Данил 06.10.2007 21:41

Re: Змейка
 
Сейчас создам...

Сейчас создам...

..::Добавил::..

[blitz]
;Инициализация.
Graphics3D 640,480,32,2
Camera = CreateCamera ()
Light = CreateLight ()
SetBuffer BackBuffer()


PositionEntity Camera , 0 , 15 ,0
RotateEntity Camera , 60 , 0 , 0


Global x[10], y[10], Rotat, cube[10]

;Создаем кубики и делаем их начальное положение.
For i = 0 To 6
Cube[i] = CreateCube ()
PositionEntity Cube[i] , 0 , 0 , 3-(i*3)
Next


EntityColor Cube[0], 255,0,0

;---------------
While Not KeyDown (1)

;Меняем движение головы
If KeyHit (200) Then
a ()
MoveEntity cube[0], 0 , 0 , +3
End If

If KeyHit (208) Then
a ()
MoveEntity cube[0], 0 , 0 , -3 :
End If

If KeyHit (203) Then
a ()
MoveEntity cube[0], -3 , 0 , 0 :
End If

If KeyHit (205) Then
a ()
MoveEntity cube[0], +3 , 0 , 0 :
End If


UpdateWorld ()
RenderWorld ()
Flip ()
Wend

;а вот и самое главное
Function A ()
For i = 0 To 5
x[i] = EntityX (cube[i])
y[i] = EntityZ (cube[i])
Next

For i = 1 To 5
PositionEntity cube[i] , x[i-1] , 0 , y[i-1]
Next

End Function
[/blitz]

Fant 06.10.2007 23:07

Re: Змейка
 
Вот все хорошо в твоем коде, но я изменил:
Keyhit на KeyDown и получилось так, что змейка как-бы склеилась...(

Platon 06.10.2007 23:10

Re: Змейка
 
Змею лучше делать списком, вот попробуй
Код:

Type Segment
        Field Mesh
End Type

Function SnakeGrowUp(Reference)
        ;Берем последний элемент - конец хвоста
        Local Segment.Segment = Last Segment
        ;Если последний элемент существует
        If (Segment <> Null) Then
                ;Берем его координаты
                Local PosX = EntityX(Segment\Mesh)
                Local PosZ = EntityZ(Segment\Mesh)
                ;Создаем новый сегмент
                Segment = New Segment
                Segment\Mesh = CopyEntity(Reference)
                ;Ставим его в позицию последнего сегмента
                PositionEntity(Segment\Mesh, PosX, 0, PosZ)
        EndIf
End Function

Function SnakeGrowDown()
        ;Берем последний элемент - конец хвоста
        Local Segment.Segment = Last Segment
        ;Если последний элемент существует и это не голова
        If (Segment <> Null) And (Segment <> First Segment) Then
                ;Удаляем меш сегмента
                FreeEntity(Segment\Mesh)
                ;Удаляем сегмент
                Delete Segment
        EndIf
End Function

Function SnakeUpdate(OffsetX#, OffsetZ#)
        Local PrevPosX# = 0
        Local PrevPosZ# = 0
        ;берем первый элемент списка - голова
        Local Segment.Segment = First Segment
        ;берем координаты головы и вычисляем следующую ее позицию (новые координаты)
        Local NextPosX# = EntityX(Segment\Mesh) + OffsetX
        Local NextPosZ# = EntityZ(Segment\Mesh) + OffsetZ
        ;Перебираем весь список чтобы последовательно обновить всю змею
        For Segment = Each Segment
                ;Запоминаем позицию текущего элемента
                PrevPosX = EntityX(Segment\Mesh)
                PrevPosZ = EntityZ(Segment\Mesh)
                ;позиционируем текущий элемент (новыми координатами)
                PositionEntity(Segment\Mesh, NextPosX, 0, NextPosZ)
                ;Новые координаты становятся предыдущими
                NextPosX = PrevPosX
                NextPosZ = PrevPosZ
        Next
End Function

Function SnakeCreate(PosX, PosZ, Segments, Reference)
        Local Segment.Segment
        ;Создаем список элементов - сегменты змеи
        ;с 0 начинаем потому что голова должна быть обязательно
        For i = 0 To Segments
                Segment = New Segment
                Segment\Mesh = CopyEntity(Reference)
                ;Позиционируем (только по X, Z потому что движение в одной плоскости)
                PositionEntity(Segment\Mesh, PosX, 0, PosZ)
        Next
        ;обновляем змею
        SnakeUpdate(0, 0)
End Function

;#############################

;Размер клетки поля
Const CellSizeX# = 1
Const CellSizeZ# = 1

Graphics3D(800, 600, 0, 2)

;Текстура земли
Ground_Tex = CreateTexture(32, 32, 9)
SetBuffer(TextureBuffer(Ground_Tex))
Color(100, 100, 100)
Rect(0, 0, 32, 32)
Color(50, 255, 50)
Line(0, 16, 32, 16)
Line(16, 0, 16, 32)
SetBuffer(BackBuffer())
ScaleTexture(Ground_Tex, CellSizeX, CellSizeZ)

;Земля
Ground_Mesh = CreatePlane()
EntityTexture(Ground_Mesh, Ground_Tex)

;Сегмент - образец
Reference = CreateCube()
ScaleEntity(Reference, CellSizeX * 0.5, 1, CellSizeZ * 0.5)
EntityColor(Reference, 255, 50, 50)
HideEntity(Reference)

;Создаем змею с 4-мя сегментами
SnakeCreate(0, 0, 4, Reference)

;Устанавливаем камеру
Camera = CreateCamera()
PositionEntity(Camera, 0, 25, 0)
RotateEntity(Camera, 90, 0, 0)

;Направление движения змеи
DirX = 0
DirZ = 1

Repeat
       
        ;Обновляем змею каждые 300 миллисекунд
        If ((MilliSecs() - StepPeriod) > 300) Then
               
                ;Сдвигаем змею на размер клетки в соответствии с направлением движения
                SnakeUpdate(DirX * CellSizeX, DirZ * CellSizeZ)
               
                StepPeriod = MilliSecs()
        EndIf
       
        RenderWorld()
        Flip()
Until KeyDown(1)
End


Данил 06.10.2007 23:26

Re: Змейка
 
Fant, незнаю, я тоже изменил - у меня нормально.

Fant 07.10.2007 00:39

Re: Змейка
 
2Cyan vbmenu_register("postmenu_59732", true);
Змейка отличная, но мне нужна динамичная. То есть что бы казалось, что она движется плавно, а в твое примере она - рывками
2Данил
Глупо, если я сам придумываю себе проблемы) я тебе честное слово даю, что когда я уменьшил скороть с 3 на 1 то хвост ее ездил не корректно! Мне бы хотелось видеть "просветы" между кубиками хвоста. А их увы нет(


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

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