Blitz3d и вид от 3 лица
| |
SteelRat | Дата: Среда, 11 Августа 2010, 02:56 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте, уважаемые игроделы. Я пытаюсь сделать игру с видом от третьего лица, но не сзади, а как в современных платформерах, типа Рэймен, GTA, Принц Персии и т.п. , т.е. персонаж плавно двигается во всех направлениях. Причем при нажатии "вниз" он бежит "на нас" (на камеру), при нажатии "вверх" - от нас. При этом камеру можно свободно вращать вокруг героя. Вот что у меня получилось: Code
;0,40 : idle ;40,46 : run ;46,54 : attack ;54,58 : paina ;58,62 : painb ;62,66 : painc ;66,72 : jump ;72,84 : flip
Graphics3D 640,480,16,1 SetBuffer BackBuffer()
Const TYPE_PLAYER=1, TYPE_TERRAIN=10 Collisions TYPE_PLAYER,TYPE_TERRAIN,2,2
;environment cube cube=CreateCube() FitMesh cube,-250,0,-250,500,500,500 FlipMesh cube tex=LoadTexture( "chorme-2.bmp" ) ScaleTexture tex,1.0/3,1.0/3 EntityTexture cube,tex EntityAlpha cube,.4 EntityFX cube,1 EntityType cube,TYPE_TERRAIN
;floor mirror ;m=CreateMirror()
;simple light light=CreateLight() TurnEntity light,45,45,0
;cool dragon model! tex=LoadTexture( "model\dragon.bmp" ) dragon=LoadMD2( "model\dragon.md2" ) EntityTexture dragon,tex PositionEntity dragon,0,25,0 EntityType dragon,TYPE_PLAYER EntityRadius dragon,35 ResetEntity dragon Global ppy#=0 ;вспомог.перем. для гравитации
player_piv = CreatePivot(); test_sp = CreateCube(player_piv) ScaleEntity test_sp,3,3,3
;camera camera=CreateCamera(player_piv) ;cam_xr#=30:cam_yr#=0:cam_zr#=0:cam_z#=-100 MoveEntity camera,0,30,-150
PositionEntity dragon,0,20,0 TurnEntity dragon,0,150,0
AnimateMD2 dragon,1,.05,40,46
Const key_down=80,key_left=75,key_right=77,key_up=72
; Create blue sphere (the spot) spot=CreateCube() ScaleMesh spot,4,4,4 EntityColor spot,0,0,255 PositionEntity spot,EntityX(dragon),EntityY(dragon),EntityZ(dragon)
;HideEntity spot ;hideentity test_sp
;Главный цикл игры! While Not KeyHit(1)
PositionEntity player_piv,EntityX(dragon),EntityY(dragon),EntityZ(dragon) If KeyDown(203) TurnEntity player_piv,0,-2,0 Else If KeyDown(205) TurnEntity player_piv,0,2,0 EndIf If KeyDown(200) ;up-down cam_xr=cam_xr+2 If cam_xr>90 cam_xr=90 Else If KeyDown(208) cam_xr=cam_xr-2 If cam_xr<5 cam_xr=5 EndIf If KeyDown(26) cam_zr=cam_zr+2 Else If KeyDown(27) cam_zr=cam_zr-2 EndIf If KeyDown(30) cam_z=cam_z+1:If cam_z>-10 cam_z=-10 Else If KeyDown(44) cam_z=cam_z-1:If cam_z<-180 cam_z=-180 EndIf ;#Region Spot Setup RotateEntity spot,0,EntityYaw(player_piv),0 ; If w,a,s,d pressed then move spot If KeyDown(17)=True And EntityZ(spot)<EntityZ(player_piv,1)+50 Then MoveEntity spot,0,0,+5 ; w - up Else If EntityZ(spot) > EntityZ(player_piv,1)+2 Then ;return spot back MoveEntity spot,0,0,-1 EndIf If KeyDown(30)=True And EntityX(spot)>EntityX(player_piv,1)-50 Then MoveEntity spot,-5,0,0 ; a - left Else If EntityX(spot) < EntityX(player_piv,1)-2 Then MoveEntity spot,1,0,0 EndIf If KeyDown(31)=True And EntityZ(spot)>EntityZ(player_piv,1)-50 Then MoveEntity spot,0,0,-5 ; s - down Else If EntityZ(spot) < EntityZ(player_piv,1)-2 Then MoveEntity spot,0,0,1 EndIf If KeyDown(32)=True And EntityX(spot)<EntityX(player_piv,1)+50 Then MoveEntity spot,5,0,0 ; d - right Else If EntityX(spot) > EntityX(player_piv,1)+2 Then MoveEntity spot,-1,0,0 EndIf ;#End Region RotateEntity dragon,0,180+DeltaYaw#(spot,dragon),0 ;дракон бежит на камеру If KeyDown(31) MoveEntity dragon,0,0,2 ;TurnEntity dragon,0,EntityYaw(player_piv),0 ;дракон бежит от камеры Else If KeyDown(17) MoveEntity dragon,0,0,2 Else If KeyDown(30) MoveEntity dragon,0,0,2 Else If KeyDown (32) MoveEntity dragon,0,0,2 EndIf ;#Region Jump ty#=EntityY(dragon) y_vel#=(ty-ppy) ppy=ty If KeyHit(57) ;jump? If EntityCollided(dragon,TYPE_TERRAIN) Then y_vel=15 Else y_vel=y_vel-.5 EndIf TranslateEntity dragon,0,y_vel,0 ;#End Region UpdateWorld RenderWorld Text 5,5,"Dragon Yaw Angle: "+EntityYaw(dragon) Text 5,15,"Delta Yaw Angle: "+DeltaYaw#(spot,dragon) Text 5,25,"Pivot Yaw Angle: "+EntityYaw(player_piv) Flip Wend
End Использована модель дракона из примера samples\dragon. Мы управляем синим кубиком, а дракон следует за ним (это для плавного движения и поворотов, т.е., чтобы персонаж не бегал по ломаной линии), а белым кубиком обозначен pivot, к которому привязана камера. Теперь 2 вопроса: 1) глюки: когда поворачиваешь камеру, во-первых дракон поворачивается вместе с камерой, во-вторых при повороте камеры на 90 или того хуже, на 180 градусов , он бежит по кривой линии, а синий кубик улетает прочь. 2) я вообще не уверен, что всё это правильно реализовал; может быть есть более лёгкий и эффективный способ. Пожалуйста, найдите ошибки в моём коде. Если у кого-то есть примеры, скиньте плиз. Заранее спасибо, тем, кто дочитал до конца и чем-либо помог мне.
|
|
| |
ЗелёныйГоблин | Дата: Среда, 11 Августа 2010, 08:24 | Сообщение # 2 |
In-Games
Сейчас нет на сайте
| Яб помог но блин у меня блиц был глючный с текстурами неработал, пришлось снести шас его нет.А по тексту сложно понять в чём проблема скоро поставлю норм бюлиц тогда псомотрим
Bakuman Death Note The Future Diary Базовые знания- это умение создать хоть что-то на экране, находящееся в движении по чему-то, и соприкасающееся с чем-то. (Основы ЯП)©Умный игродел
|
|
| |
Niro | Дата: Среда, 11 Августа 2010, 08:48 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| SteelRat, все легко, прикрепление камеры к мышке, притом чувствительность мышки равна 0.3 - 0.5(смотря как тебе нужно), с самой же камеры Ротейт убирай, а ставь только позицию от камеры к игроку 2 в иксе игрике и зете, как-то так это делал я, у меня исходник моей игрушки был, но я его посеял...
|
|
| |
SteelRat | Дата: Среда, 11 Августа 2010, 12:25 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| Quote с самой же камеры Ротейт убирай ? Это как? Т.е. с pivot убрать вращение и прикрепить камеру прямо к мышке? Нельзя ли поподробнее? Да, кстати, вот др. вариант кода, более удачный, но всё равно с теми же глюками: Code ;0,40 : idle ;40,46 : run ;46,54 : attack ;54,58 : paina ;58,62 : painb ;62,66 : painc ;66,72 : jump ;72,84 : flip
Global info1$="Dragon Demo" Global info2$="Use arrows keys to pan, A/Z to zoom" Global info3$="MD2 Dragon model courtesy of Polycount"
Include "../start.bb"
Const TYPE_PLAYER=1, TYPE_TERRAIN=10 Collisions TYPE_PLAYER,TYPE_TERRAIN,2,2
;environment cube cube=CreateCube() FitMesh cube,-250,0,-250,500,500,500 FlipMesh cube tex=LoadTexture( "chorme-2.bmp" ) ScaleTexture tex,1.0/3,1.0/3 EntityTexture cube,tex EntityAlpha cube,.4 EntityFX cube,1 EntityType cube,TYPE_TERRAIN
;floor mirror ;m=CreateMirror()
;simple light light=CreateLight() TurnEntity light,45,45,0
;cool dragon model! tex=LoadTexture( "model\dragon.bmp" ) dragon=LoadMD2( "model\dragon.md2" ) EntityTexture dragon,tex PositionEntity dragon,0,25,0 EntityType dragon,TYPE_PLAYER EntityRadius dragon,35 ResetEntity dragon Global ppy#=0 ;вспомог.перем. для гравитации
player_piv = CreatePivot(); ;test_sp = CreateCube(player_piv) ;ScaleEntity test_sp,3,3,3
;camera camera=CreateCamera(player_piv) ;cam_xr#=30:cam_yr#=0:cam_zr#=0:cam_z#=-100 MoveEntity camera,0,30,-150
TurnEntity dragon,0,150,0
AnimateMD2 dragon,1,.05,40,46
Const key_down=80,key_left=75,key_right=77,key_up=72
; Create blue sphere (the spot) spot=CreateCube() ScaleMesh spot,4,4,4 EntityColor spot,0,0,255 PositionEntity spot,EntityX(dragon),EntityY(dragon),EntityZ(dragon) ;EntityParent spot,player_piv
;HideEntity spot
;Главный цикл игры! While Not KeyHit(1)
PositionEntity player_piv,EntityX(dragon),EntityY(dragon),EntityZ(dragon) If KeyDown(203) TurnEntity player_piv,0,-2,0 Else If KeyDown(205) TurnEntity player_piv,0,2,0 EndIf If KeyDown(200) ;up-down cam_xr=cam_xr+2 If cam_xr>90 cam_xr=90 Else If KeyDown(208) cam_xr=cam_xr-2 If cam_xr<5 cam_xr=5 EndIf If KeyDown(26) cam_zr=cam_zr+2 Else If KeyDown(27) cam_zr=cam_zr-2 EndIf If KeyDown(30) cam_z=cam_z+1:If cam_z>-10 cam_z=-10 Else If KeyDown(44) cam_z=cam_z-1:If cam_z<-180 cam_z=-180 EndIf ;#Region Spot Setup ;TFormPoint 0,0,0,player_piv,0 ;transform pivot coords to world ; If w,a,s,d pressed then move spot If KeyDown(17)=True And EntityZ(spot)< EntityZ(player_piv,1)+50 Then MoveEntity spot,0,0,+5 ; w - up Else If EntityZ(spot) > EntityZ(player_piv,1)+2 Then ;return spot back MoveEntity spot,0,0,-1 EndIf If KeyDown(30)=True And EntityX(spot)>EntityX(player_piv,1)-50 Then MoveEntity spot,-5,0,0 ; a - left Else If EntityX(spot) < EntityX(player_piv,1)-2 Then MoveEntity spot,1,0,0 EndIf If KeyDown(31)=True And EntityZ(spot)>EntityZ(player_piv,1)-50 Then MoveEntity spot,0,0,-5 ; s - down Else If EntityZ(spot) < EntityZ(player_piv,1)-2 Then MoveEntity spot,0,0,1 EndIf If KeyDown(32)=True And EntityX(spot)<EntityX(player_piv,1)+50 Then MoveEntity spot,5,0,0 ; d - right Else If EntityX(spot) > EntityX(player_piv,1)+2 Then MoveEntity spot,-1,0,0 EndIf ;#End Region RotateEntity dragon,0,180+DeltaYaw#(spot,dragon)+EntityYaw(player_piv),0 ;дракон бежит на камеру If KeyDown(31) MoveEntity dragon,0,0,2 ;дракон бежит от камеры Else If KeyDown(17) MoveEntity dragon,0,0,2 Else If KeyDown(30) MoveEntity dragon,0,0,2 Else If KeyDown (32) MoveEntity dragon,0,0,2 EndIf ;#Region Jump ty#=EntityY(dragon) y_vel#=(ty-ppy) ppy=ty If KeyHit(57) ;jump? If EntityCollided(dragon,TYPE_TERRAIN) Then y_vel=15 Else y_vel=y_vel-.5 EndIf TranslateEntity dragon,0,y_vel,0 ;#End Region UpdateWorld RenderWorld Text 5,5,"Dragon Yaw Angle: "+EntityYaw(dragon) Flip Wend
End
|
|
| |
Niro | Дата: Среда, 11 Августа 2010, 12:47 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| SteelRat, говорю что нужно исходник найти, сам уже почти полгода в блиц не заседал, помню именно теорию, найду скину. Вот этот код очень похож.
|
|
| |
SteelRat | Дата: Четверг, 19 Августа 2010, 13:03 | Сообщение # 6 |
был не раз
Сейчас нет на сайте
| Ну так что, никто мне ничем не поможет?
|
|
| |
Serk1n | Дата: Четверг, 19 Августа 2010, 13:14 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Привязываешь камеру к персонажу: cam = createcamera(player) // player -- персонаж затем ставишь камеру как душе угодно ... потом в цикле прописываешь, например if keydown(1) positionentity player,0,0,1 // для движения вперед if keydown(2) positionentity player,0,0,-1 // для движения назад if keydown(3) turnentity cam,0,1,0 // для поворота камеры if keydown(4) turnentity cam,0,-1,0 // для поворота камеры в др сторону, т.к. камера привязана к персу, она будет вращатся вокруг него где 1,2,3,4 -- соответствующие клавиши Вот как то так
Сообщение отредактировал Serk1n - Четверг, 19 Августа 2010, 13:17 |
|
| |
SteelRat | Дата: Вторник, 24 Августа 2010, 12:13 | Сообщение # 8 |
был не раз
Сейчас нет на сайте
| Прошу прощения, но это полный бред. Такое ощущение, что ты вообще не пытался разобраться в проблеме. Во первых, если делать turnentity cam, она будет вращаться вокруг себя. У меня, например, она привязана к pivot, и вращается именно он. Во-вторых мне нужно не жесткое движение вперед-назад-влево-вправо по ломаным линиям, а плавное. Включи игру GTA или Принц Персии и посмотри, как там. Мне нужно такое же движение и камера. Но в любом случае, спасибо за попытку помочь.
Сообщение отредактировал SteelRat - Вторник, 24 Августа 2010, 22:57 |
|
| |
|