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

Fant 07.03.2007 18:30

Передвижение игрока
 
Вообщем хочу посоветоавться как лучше всего перемещать игрока.

Вот такое игровое поле будет:
Код:


Type Camera
Field Obj
End Type
Type Land
Field Obj
End Type

Const UPS=30
Graphics3D 640,480,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()
HidePointer ()
MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

font_Main=LoadFont("arial",16)
SetFont font_Main

fnCreateTerrain()
fncreateCam1.camera()
l=CreateLight()
RotateEntity l,90,0,0
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
 Cls
 Delay 5
 
fnCamera_Look(camera)
fnCamera_Free_Fly(camera)
 
If KeyHit(1)
 FreeFont font_main

 ClearWorld()
 Delay 300
 End
End If
  UpdateWorld
 Next
 RenderWorld tween

 Flip
Forever
Function fnCreateCam1.camera()
Local cam1.camera
cam1 = New Camera
cam1\obj=CreateCamera()
PositionEntity cam1\obj,0,2,0
RotateEntity cam1\obj,20,-45,0
CameraRange cam1\obj,.1,35
CameraClsColor cam1\obj ,255,255,255
CameraFogMode cam1\obj,1
CameraFogRange cam1\obj,1,100
CameraFogColor cam1\obj,255,255,255
Return cam1
End Function
Function fnCamera_Look(cam,speedx#=2,speedy#=2,dang=-89,upang=89)
For cam1.camera=Each camera
 mxs=MouseXSpeed()
 mys=MouseYSpeed()
 xrot#=EntityPitch(cam1\obj)
 yrot#=EntityYaw(cam1\obj)
 If(xrot#<upang)And(mys>0)Then xrot#=xrot#+speedx#*mys/10 
 If(xrot#>upang)And(mys>0)Then xrot#=upang
 If(xrot#>dang)And(mys<0)Then xrot#=xrot#+speedx#*mys/10
 If(xrot#<dang)And(mys<0)Then xrot#=dang 
 yrot=yrot-speedy#*mxs/10
 MoveMouse GraphicsWidth()/2,GraphicsHeight()/2
 RotateEntity cam1\obj,xrot,yrot,0
Next
End Function
Function fnCamera_Free_Fly(Obj,mf#=.5,mb#=.5,ml#=.5,mr#=.5)
For cam1.camera=Each camera
 If MouseDown(1) Then MoveEntity cam1\obj,  0 ,0, mf#;W
 If MouseDown(2) Then MoveEntity cam1\obj,  0 ,0,-mb#;S
 If KeyDown(30) Then MoveEntity Obj,-ml#,0,  0 ;A
 If KeyDown(32) Then MoveEntity Obj, mr#,0,  0 ;D

 Next
End Function
Function fnDeleteCam()
For cam1.camera = Each camera
 FreeEntity cam1\obj
Delete cam1
  Next
End Function
Function fnCreateTerrain(size=32,zoom#=.35,minVal#=0,maxVal#=1)
grass_tex=CreateTexture( 128,128 )
 SetBuffer TextureBuffer(grass_tex)
  ClsColor 255,255,255
  Cls
For a=0 To 128
For b=0 To 128
    Color Rand(0,16),Rand(64,128),Rand(0,4)
    Plot a,b
Next
Next
SetBuffer BackBuffer()
Local ter.land
ter=New land
ter\obj=CreateTerrain (size)
SeedRnd 100
For x=0 To size
    For z=0 To size
          height#=Rnd (minVal,maxVal)
          ModifyTerrain ter\obj,x,z,height   
    Next 
Next
EntityTexture ter\obj,grass_tex
ScaleEntity ter\obj,1,zoom,1
FreeTexture grass_tex
Return ter\obj
End Function

как видно из семпла, то нетрудно догадаться, что ландшаф не прямой. У меня есть хороший пример как перемещать игрока и не один, но у меня тут возникли вопросы

1. Так как ландшафт не прямой, хотелось бы что бы объект, который пеемещается по тему, "точно как в жизни", пападал в ямки и выходил из нее. Ест ьу меня пример. называется driver. - Но как лучше (проще) всего сделать такое перемещение? Ведь у еня не будет ни заносов...ни чего бы то не было более сложного.

2. Наверное придется в игре ИИ писать. Я бы хотел заранее, что бы игрок после перемещения. (например от переместился в точку с координатой по X=134.4) ставал в точку x=134.(то есть округлять координаты). Мне такой пример писали. ам все сделанно по массивам. А есть еще варианты?

3. Может что бы не заморачиваться сделать передвжение только вперед, назад, влево, вправо (без возможности крутиться на все 360 градусов)

Вообщем так или иначе я не знаю как лучше всего всеэто сделать и поэтому...
Поэтому спрашиваю!

ЛысыЙ_Чук-Иванчук 07.03.2007 21:14

Re: Передвижение игрока
 
Из примера непонятно какого имено характера тебе нужен игрок(обычный чел, ну там машина(стиральная:))
If обычный игрок(ну как в контре) то зачем тебе его ровнять по ладшафту:)
ElseIf Если какойнибуть робот, мне кажется лутше физику использовать;)
Else Если как в примере самолетики, ну тут я помочь ничем немогу:)=)
endIF

Fant 07.03.2007 21:17

Re: Передвижение игрока
 
Цитата:

Сообщение от vlad
Из примера непонятно какого имено характера тебе нужен игрок(обычный чел, ну там машина(стиральная:))
If обычный игрок(ну как в контре) то зачем тебе его ровнять по ладшафту:)
ElseIf Если какойнибуть робот, мне кажется лутше физику использовать;)
Else Если как в примере самолетики, ну тут я помочь ничем немогу:)=)
endIF

у меня игрок - квадратик

Его нужно равнять по ландшафту)

axel186 07.03.2007 22:04

Re: Передвижение игрока
 
PhysX РУЛИТ! Ну или что-то другое попробуй, сам замучаешся да ещё и не точно будет выходить... а тут, физический движок и всё =)

ЛысыЙ_Чук-Иванчук 07.03.2007 22:39

Re: Передвижение игрока
 
Можно просто ровнять по вектору, но я бы использовал физ двиг...

Fant 08.03.2007 01:10

Re: Передвижение игрока
 
Нет, нет! Ребята! Зачем мне физ. двиг что бы "приклеить" квадратик к ладншафту? Мне же ненужна суперфизика

Nahim 08.03.2007 09:07

Re: Передвижение игрока
 
Fant, а чем тебя не устраивает AlignToVector?
С помощью CollisionNX, CollisionNY, CollisionNZ находишь координаты нормали коллизии и выравниваешь объект:

Код:

For k=1 To CountCollisions(obj)
AlignToVector obj,CollisionNX(obj,k),CollisionNY(obj,k),CollisionNZ(obj,k),2,0.1
Next


ЛысыЙ_Чук-Иванчук 08.03.2007 09:27

Re: Передвижение игрока
 
AlignToVector-Поможет тебе выровнять его, но если ты хочеш чтобы в ямочки проваливался- то только физДвиг
ЗЫ\ А почему ты его нехочеш использовать, веть там нет ничего сложного:)

Fant 08.03.2007 10:31

Цитата:

Сообщение от Nahim
Fant, а чем тебя не устраивает AlignToVector?
С помощью CollisionNX, CollisionNY, CollisionNZ находишь координаты нормали коллизии и выравниваешь объект:

Код:

For k=1 To CountCollisions(obj)
AlignToVector obj,CollisionNX(obj,k),CollisionNY(obj,k),CollisionNZ(obj,k),2,0.1
Next


Спасибо! Я попробую с помощью этой команды!

Цитата:

Сообщение от vlad
AlignToVector-Поможет тебе выровнять его, но если ты хочеш чтобы в ямочки проваливался- то только физДвиг
ЗЫ\ А почему ты его нехочеш использовать, веть там нет ничего сложного:)

Потому, что физический движек несколько сложен, а для простого "прилипания" объекта к ландшафту - это слишком!

AlingTovector попробую поюзать!

Fant 08.03.2007 18:25

Re: Передвижение игрока
 
Всем спасибо за обсуждения и поддержку! Я разобрался!

tormoz 08.03.2007 18:33

Re: Передвижение игрока
 
Получай высоту террайна в точке нахождения игрока и ставь его туда.

Fant 08.03.2007 19:33

Re: Передвижение игрока
 
Я сделал по примеру driver, но у меня почему-то эти "колесики" держат объект над землей...я не опнимаю, в чем дело? Есть предложения?

Nahim 08.03.2007 20:00

Re: Передвижение игрока
 
А какой у тебя объект? Может не стоит использовать "колёсики", если они тебе не нужны... Выравнивай непосредственно свой объект.

Fant 08.03.2007 20:03

Re: Передвижение игрока
 
Цитата:

Сообщение от Nahim
А какой у тебя объект? Может не стоит использовать "колёсики", если они тебе не нужны... Выравнивай непосредственно свой объект.

Квадратик у меня. Он должен "прилипать к ландшафту"

Но как его выравнивать-то?

moka 08.03.2007 20:17

Re: Передвижение игрока
 
Немного над ландшафтом? Там коллизии? Может не точно указан Радиус элипсоида? Попробуй EntityRadius на колёсики.

Fant 08.03.2007 20:20

Re: Передвижение игрока
 
Цитата:

Сообщение от MoKa
Немного над ландшафтом? Там коллизии? Может не точно указан Радиус элипсоида? Попробуй EntityRadius на колёсики.

Ближе к реальности. Я пробовал изменять радиус моего кубика и он становился ниже, но в результате - переворачивался, в то время как колесики были над землей. Изменение Радиуса колесиков ни к чему неведет. Вообще.

moka 08.03.2007 20:26

Re: Передвижение игрока
 
НО истина в них, да помница, когда я мучал этот сэмпл, было что-то такое, но помню нашёл в чём тема.

Fant 08.03.2007 20:28

Re: Передвижение игрока
 
Цитата:

Сообщение от MoKa
НО истина в них, да помница, когда я мучал этот сэмпл, было что-то такое, но помню нашёл в чём тема.

Думаешь дело только в них???

Просто какой бы я им радиус не ставил, все-равно нчего не меняется...я даже не знаю что пробовать!!

Nahim 08.03.2007 20:46

Re: Передвижение игрока
 
Вложений: 2
Fant, попробуй мой пример, без "колёсиков", но вроде работает...
Хотя может я не совсем понял какого именно "прилипания" ты хочешь добиться.

ЛысыЙ_Чук-Иванчук 08.03.2007 20:49

Зачем тебе аж 4колизи?
Делай столкновение самому кубику(радиус подогнать нетрудно), далее после контакта: Узнаеш нормаль контакта:)
CollisionNX
CollisionNy
CollisionNz
и по ним выравнивай, получеш то что хотел!

Вот тебе поможет
If EntityCollided(Холодильник,Марсеанская база по производству спирта:) )
cx#=CollisionX( Холодильник,1 )
cy#=CollisionY( Холодильник,1 )
cz#=CollisionZ( Холодильник,1 )
nx#=CollisionNX( Холодильник,1 )
ny#=CollisionNY( Холодильник,1 )
nz#=CollisionNZ( Холодильник,1 )
PositionEntity Холодильник,cx,cy,cz
AlignToVector Холодильник,nx,ny,nz, 3 (последний пораметр это скорость напровления, если 0 то мнгновенно)
Endif

Fant 08.03.2007 21:13

Re: Передвижение игрока
 
Всем еще раз спасибо!
Примерчик оказался мне полезным!
2vlad - возьму твой код на заметку) но уж лчше тогда без колес)

Nahim 08.03.2007 21:14

Re: Передвижение игрока
 
Цитата:

последний пораметр это скорость напровления, если 0 то мнгновенно
Нет, если 1 - то мгновенно

Fant 08.03.2007 22:17

Re: Передвижение игрока
 
Увы
Игрок как летал, так и летает, если использовать пример Hanima

vlad твой пример почти тоже самое, что и пример

Fant 08.03.2007 22:24

Re: Передвижение игрока
 
Я в шоке. И отчаянии.

Я испробовал кучу вариантов, но, как оказалось, дело не сдвинулось с мертвой точки.

Заюзал я примеры, данные мне, и вот что я имею на сейчас:
Первое. Игрок не может сдвинуться (странно, а в примере кубик через горы прыгал)
Второе. Игрок опять висит в воздухе (это просто наказание)

Радует, что хоть не переворачивается, как в случае с примером driver

Так что если кто-то знает как обуздать эту штуку, помогите пожалуйста!

1,2 + курсор мыши - навигация по карте
курсор - упраление юнитом

функция - fnUpdateTank1() - обновление танка. Именно там эти косяки...(

ЛысыЙ_Чук-Иванчук 08.03.2007 22:50

Re: Передвижение игрока
 
Просто убери из моего примера PositionEntity
И гденить в цикле
Translsteentity Холодильник,0,-0.01,0

Fant 09.03.2007 00:27

Цитата:

Сообщение от vlad
Просто убери из моего примера PositionEntity
И гденить в цикле
Translsteentity Холодильник,0,-0.01,0

твой код просто не работает. Вообще.

Если кто-то знает как это сделать, напишите пожалуйста! Почему-то у меня никак не получается...по примеру сделал. Все работает (запускается без ошибок), но только игрок слишком высоко...и не двигается

Nahim 09.03.2007 13:53

Re: Передвижение игрока
 
Цитата:

игрок слишком высоко
Попробуй уменьшить радиус коллизии:
Код:

EntityRadius tank1\obj,0.2
Цитата:

...и не двигается
Гравитация слишком сильная. Уменьши гравитацию или увеличь скорость движения танка. Например, так:
Код:

TranslateEntity tank1\obj,0,-0.1,0

Fant 09.03.2007 21:29

Re: Передвижение игрока
 
Ну все) я с этим закончил и у меня наконец-то получилось!
Всем еще раз спасибо за помощь и обсуждение!


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

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