Четверг, 28 Марта 2024, 20:42

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Basic » Blitz3d и вид от 3 лица (и камера как в 3d платформерах)
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 в иксе игрике и зете, как-то так это делал я, у меня исходник моей игрушки был, но я его посеял... sad


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
был не раз
Сейчас нет на сайте
Ну так что, никто мне ничем не поможет? cry
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 -- соответствующие клавиши
Вот как то так wink


Сообщение отредактировал Serk1n - Четверг, 19 Августа 2010, 13:17
SteelRatДата: Вторник, 24 Августа 2010, 12:13 | Сообщение # 8
был не раз
Сейчас нет на сайте
Прошу прощения, но это полный бред. Такое ощущение, что ты вообще не пытался разобраться в проблеме. Во первых, если делать turnentity cam, она будет вращаться вокруг себя. У меня, например, она привязана к pivot, и вращается именно он. Во-вторых мне нужно не жесткое движение вперед-назад-влево-вправо по ломаным линиям, а плавное. Включи игру GTA или Принц Персии и посмотри, как там. Мне нужно такое же движение и камера. Но в любом случае, спасибо за попытку помочь.

Сообщение отредактировал SteelRat - Вторник, 24 Августа 2010, 22:57
Форум игроделов » Программирование » Basic » Blitz3d и вид от 3 лица (и камера как в 3d платформерах)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг