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

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

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

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

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

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

Вообщем не знаю с чего даже начать. Теорию я конечно прочитал, но не могу сделать ее. Видимо слишком сложно.
(Offline)
 
Ответить с цитированием
Старый 06.10.2007, 16:26   #2
MiXaeL
Бывалый
 
Аватар для MiXaeL
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Змейка

Сообщение от Данил
ДУмаю, он и пытался сделать змейку по той статье.
Ты правильно думаешь! Короче фактически мне нужно что бы 5 кубиков ехали за "головой" повторяя ее траекторию)
(Offline)
 
Ответить с цитированием
Старый 06.10.2007, 17:11   #5
jimon
 
Сообщений: n/a
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
jimon
 
Сообщений: n/a
Re: Змейка

Данил
сохранять только координаты головы напряжно
 
Ответить с цитированием
Старый 06.10.2007, 21:21   #8
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Змейка

Сообщение от jimon
позиция следуйшего обьетка = предыдущая позиция текущего обьекта
ну ето только если змейка клеточная
Я знаю! Меня интересует как это сделать
(Offline)
 
Ответить с цитированием
Старый 06.10.2007, 21:22   #9
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Змейка

Сообщение от jimon
Данил
сохранять только координаты головы напряжно
Да, очень! А как это сделать?
(Offline)
 
Ответить с цитированием
Старый 06.10.2007, 21:24   #10
Fant
Бывалый
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Змейка

Вот все хорошо в твоем коде, но я изменил:
Keyhit на KeyDown и получилось так, что змейка как-бы склеилась...(
(Offline)
 
Ответить с цитированием
Старый 06.10.2007, 23:10   #13
Platon
Знающий
 
Регистрация: 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
Fant
Бывалый
 
Регистрация: 05.09.2005
Сообщений: 623
Написано 4 полезных сообщений
(для 5 пользователей)
Re: Змейка

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


Опции темы

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с игрой змейка sidiakin Основной форум 4 03.01.2010 20:16
Игра Nibbles (змейка) Tronix Болтовня 0 30.09.2009 21:39
Туториал "Змейка" SubZer0 FAQ 15 17.06.2007 02:15
помогите ИГРА ЗМЕЙКА zmey789 C++ 2 08.04.2007 15:54
Тетрис,калькулятор, змейка. kortesfil 2D-программирование 8 11.01.2007 04:52


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


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