|
3D-программирование Вопросы, касающиеся программирования 3D мира |
06.10.2007, 11:59
|
#1
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Змейка
помогите пожалуйста сделать змейку на блиц!
Проблема в том, что змейка из FAQ оказалась мне не по зубам. Хотя "пусто" скопировать и применить ее в своем коде я смог (хоть и киво получилось) но по большей части змейка - великая тайна для меня пока.
Вообщем не знаю с чего даже начать. Теорию я конечно прочитал, но не могу сделать ее. Видимо слишком сложно.
|
(Offline)
|
|
06.10.2007, 16:26
|
#2
|
Бывалый
Регистрация: 22.08.2006
Сообщений: 700
Написано 146 полезных сообщений (для 267 пользователей)
|
Re: Змейка
ищи статью в Blitz Et Cetera (кажется 6 выпуск)
|
(Offline)
|
|
06.10.2007, 16:31
|
#3
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Змейка
ДУмаю, он и пытался сделать змейку по той статье.
|
(Offline)
|
|
06.10.2007, 16:46
|
#4
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
Сообщение от Данил
ДУмаю, он и пытался сделать змейку по той статье.
|
Ты правильно думаешь! Короче фактически мне нужно что бы 5 кубиков ехали за "головой" повторяя ее траекторию)
|
(Offline)
|
|
06.10.2007, 17:11
|
#5
|
|
Re: Змейка
позиция следуйшего обьетка = предыдущая позиция текущего обьекта
ну ето только если змейка клеточная
|
|
|
06.10.2007, 18:40
|
#6
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Змейка
сохраняй координаты головы... И постепенно эти координаты передавай другим кубикам.
То есть гола на 2,3 позиции. При следушем шаге эта позиция у кубика 1 . потом у кубика 2 и т.д...
|
(Offline)
|
|
06.10.2007, 18:46
|
#7
|
|
Re: Змейка
Данил
сохранять только координаты головы напряжно
|
|
|
06.10.2007, 21:21
|
#8
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
Сообщение от jimon
позиция следуйшего обьетка = предыдущая позиция текущего обьекта
ну ето только если змейка клеточная
|
Я знаю! Меня интересует как это сделать
|
(Offline)
|
|
06.10.2007, 21:22
|
#9
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
Сообщение от jimon
Данил
сохранять только координаты головы напряжно
|
Да, очень! А как это сделать?
|
(Offline)
|
|
06.10.2007, 21:24
|
#10
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
Сообщение от Данил
сохраняй координаты головы... И постепенно эти координаты передавай другим кубикам.
То есть гола на 2,3 позиции. При следушем шаге эта позиция у кубика 1 . потом у кубика 2 и т.д...
|
Я почитал теорию в FAQ и принцип работы понимаю, но тем не менее, не могу реализовать ее простейший пример! Не мог бы ты показать мне свои слова на живом примере, хотя бы из 3х кубиков?
|
(Offline)
|
|
06.10.2007, 21:41
|
#11
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
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 (20 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]
|
(Offline)
|
|
06.10.2007, 23:07
|
#12
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
Вот все хорошо в твоем коде, но я изменил:
Keyhit на KeyDown и получилось так, что змейка как-бы склеилась...(
|
(Offline)
|
|
06.10.2007, 23:10
|
#13
|
Знающий
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений (для 70 пользователей)
|
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
|
(Offline)
|
|
06.10.2007, 23:26
|
#14
|
Модератор
Регистрация: 11.07.2007
Сообщений: 2,910
Написано 686 полезных сообщений (для 1,694 пользователей)
|
Re: Змейка
Fant, незнаю, я тоже изменил - у меня нормально.
|
(Offline)
|
|
07.10.2007, 00:39
|
#15
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений (для 5 пользователей)
|
Re: Змейка
2 Cyan vbmenu_register("postmenu_59732", true);
Змейка отличная, но мне нужна динамичная. То есть что бы казалось, что она движется плавно, а в твое примере она - рывками
2Данил
Глупо, если я сам придумываю себе проблемы) я тебе честное слово даю, что когда я уменьшил скороть с 3 на 1 то хвост ее ездил не корректно! Мне бы хотелось видеть "просветы" между кубиками хвоста. А их увы нет(
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:33.
|