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

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

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

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

Ответ
 
Опции темы
Старый 09.11.2010, 23:10   #1
Слейпнир
AnyKey`щик
 
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений
(для 0 пользователей)
Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

Всех приветствую! Я новичек... жуть как хочется освоить этот язык...

Что имеется: *земля и небо(в виде куба-вид изнутри)
*персонаж - простая сфера(пока не разобрался с пачем на 3дмакс 2009)
*сферой можно упрвлять "WSAD"
*Камера на небольшом расстянии смотрит на сферу, при этом можно передвигая мышь крутится вокруг неё, но тут возникла проблема...передвинув мышь сферу начинает мотать из стороны в сторону, можно с земли на небо улететь ), ограничения на вращение нет(просто не знаю как поставить)


Вопросы:
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?

2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры" ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...

Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?

Очень прошу, помогите оптимизировать код...

полный код:

Graphics3D 800,600,32,1; 
SetBuffer BackBuffer()
lit=CreateLight(2); 
RotateEntity lit,90,0,0


AmbientLight 200,200,200


Include "CONST.bb"; 
Include "COLLISIONS.bb"
Include "GLOBAL.bb"

Text 320,0,"Click to reset mouse",True 

Text 0,0,"Mouse X:"+MouseX() 
Text 0,10,"Mouse Y:"+MouseY() 

If MouseDown(1) Or MouseDown(2) Then MoveMouse 320,240 

Text MouseX(),MouseY(),"X",True,True 



Flip 


;mouse.bb
 
;ShowPointer()     
;Global mouse_pic=LoadImage( "Picture.bmp" )     

;While Not KeyHit(1)=1     

;UpdateWorld()     
;RenderWorld() 
;Cls    
;DrawImage mouse_pic, MouseX(),MouseY()     
;Flip      

;Wend 




;------------------------------------------------------------- 
Setup(); 
period=1000/FPS; 
time=MilliSecs()-period; 
;MAIN LOOP ;  -----------------------------------------  
While Not KeyHit(1)=1;                                       
Include "FPS.bb"; 


Repeat
		elapsed=MilliSecs()-time
	Until elapsed
	ticks=elapsed/period
	;tween#=Float(elapsed Mod period)/Float(period)
	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld

Update_Game()                                                                    
UpdateWorld()                                                                      
    Next
RenderWorld ; tween


Text 0,0,"user  x="+EntityX(user,1); 
Text 0,15,"user  y="+EntityY(user,1)
Text 0,30,"user  z="+EntityZ(user,1)
Text 0,45,"centr y="+EntityY(centr,1)
Text 0,90,"Треугольников рендерится: "+TrisRendered()
Text 0,105,"fps: "+Framecounter_framerate

Flip
Wend
;--------------------------------------------------------------  
;ClearWorld(); 



Function Setup()  
                font=LoadFont("Arial Cyr",16,True,False,True) 
                SetFont font
                Color 255,0,0
                create_ground()
                sky=MakeSkyBox("textures\nebo\")
                ScaleEntity sky,20,20,20
                create_user()
End Function


Function create_ground()





                        terrain=CreatePlane()
                        tertex=LoadTexture("textures\zemlya\grass.jpg")
                        ScaleTexture tertex,10,10
                        EntityTexture terrain,tertex
                        ; FreeTexture tertex
                        EntityType terrain,TERRT
                        EntityPickMode terrain,2
End Function




Function MakeSkyBox( file$ )
                            m=CreateMesh() 
                            b=LoadBrush( file$+"front.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
                            AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"right.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
                            AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"back.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
                            AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"left.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
                            AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b

                            b=LoadBrush( file$+"up.jpg",49 )
                            s=CreateSurface( m,b )
                            AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
                            AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
                            AddTriangle s,0,1,2:AddTriangle s,0,2,3
                            FreeBrush b
                            ScaleMesh m,100,100,100
                            FlipMesh m
                            EntityFX m,9
                            EntityOrder m,10
                            Return m
End Function



Function create_user(x#=-0,y#=4,z#=0)
                                     user=CreateSphere()
                                     EntityRadius user,3,3

                                     EntityType user,USERT
                                     centr=CreatePivot (user)

                                     MoveEntity  centr,0,4,-10 
  
                                     camera=CreateCamera(centr)

                                     CameraRange camera,0.10,10000
                                     ;CameraRange camera,0.01,10000; 

                                     microphone=CreateListener(camera,.2,1,.2); звуки
                                     PositionEntity user,x#,y#,z#
End Function

Function update_user()
                      If KeyHit(46) us=us+1
                      If us=2 us=0
                      If us=1 And kcam=0
                      MoveEntity centr,0,-0.15,0
                      If EntityY (centr,1)=<EntityY(user,1) Then kcam=1:ncam=1:V1#=0.05:EntityRadius user,2,3
                    EndIf

                      If us=0 And kcam=1 
                      PositionEntity user,EntityX(user),EntityY(user)+1.8,EntityZ(user),1
                      EntityRadius user,3,3
                      PositionEntity centr,EntityX(user),EntityY(user)-1.8,EntityZ(user),1
                      kcam=0
                    EndIf

                      If kcam=0 And ncam=1
                      MoveEntity centr,0,0.15,0
                      If EntityY (centr,1)=>EntityY(user,1)+2.5 Then ncam=0:V1#=0.2
                    EndIf

                      pick_ent=LinePick(EntityX(user),EntityY(user),EntityZ(user),0,-3.6,0)
                      If pick_ent 
                      jump_bool=False 
                      Else
                      jump_bool=True
                    EndIf 

  If KeyHit(57) And jump_bool=False And ncam=0 Then jmp#=0.7:j#=EntityY(user,1)
  If EntityY (user,1)=>j#+8 Then jmp#=0
  MoveEntity user,0,jmp#-G#,0 

  If KeyDown(42)=1
    V2#=V1#+V1#*0.5
  Else 
    V2#=V1#
  EndIf

  If KeyDown(30)=1 MoveEntity user,-V2#,0,0
  If KeyDown(32)=1 MoveEntity user,V2#,0,0
  If KeyDown(17)=1 MoveEntity user,0,0,+V2#
  If KeyDown(31)=1 MoveEntity user,0,0,-V2#

;-----------------------------

TurnEntity user,MouseYSpeed()*0.3,0,0

TurnEntity user,0,-MouseXSpeed()*0.5,0
;-----===================-----

  If KeyDown(30)=1  Then MoveEntity user,-V#,0,0
  If KeyDown(32)=1  Then MoveEntity user,V#,0,0
  If KeyDown(17)=1  Then MoveEntity user,0,0,+V# 
  If KeyDown(31)=1  Then MoveEntity user,0,0,-V#
  MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
  If Abs(EntityPitch#(camera))>u# RotateEntity camera,u#*Sgn(EntityPitch#(camera)),0,0 ;

  Return 

End Function

Function Update_Game()
         update_user;
                          
End Function
;CONST.bb

Const G#=0.4;
Const u#=70;п
Const USERT=1;
Const TERRT=2;
Const FPS=50
;GLOBAL.bb

Global centr; 
Global camera
Global user; 
Global V1#=0.2;
Global j#; 
Global  jmp#; 
Global kcam; 
Global ncam; 
Global us;
;COLLISIONS.bb
Collisions USERT,TERRT,2,3
(Offline)
 
Ответить с цитированием
Старый 09.11.2010, 23:26   #2
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

Вобщим был на многих ресурсах, много кусков кода насобирал, сам половину не понимаю... возможно проблема решится простым удалением частей кода ?
Проблема решится написанием своего кода

2) Как сделать чтобы курсор мыши был всегда видимым в процессе игры...(покачто условно "игры" ), и при нажатии правой кнопки мыши исчезал нормально, при отпускании появляся (showpointer и hidepointer будет так работать ?) ? Сам курсор мыши пока вообще не удалось вывести на экран...
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())

Сообщение от Слейпнир Посмотреть сообщение
1) Как организовать вращение камеры вокруг объекта(сферы) по осям (X,Y, "Z"-не уверен что нужна) при зажатой правой кнопки мыши, без мотания её из стороны в сторону, с ограничениями верх-низ и последующим плавным возвращением за спину сферы?
Проще простого: привязываешь камеру к объекту и перемещаешь её
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ARA (09.11.2010)
Старый 09.11.2010, 23:34   #3
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

Какие знакомые куски кода.
http://forum.boolean.name/showthread.php?t=15
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
Артем Валерьевич (10.11.2010), baton4ik (09.11.2010), Reks888 (10.11.2010)
Старый 09.11.2010, 23:44   #4
Слейпнир
AnyKey`щик
 
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

Сообщение от baton4ik Посмотреть сообщение
Загружаешь какртинку для курсора и рисуешь в цикле в координаты мыши. Если зажата пкм, то не рисуешь.
If Not MouseHit(2) DrawImage(pointer,MouseX(),MouseY())
Вствлял это

ShowPointer()     
Global mouse_pic=LoadImage( "Picture.bmp" )     
While Not KeyHit(1)=1     
UpdateWorld()     
RenderWorld() 
Cls    
DrawImage mouse_pic, MouseX(),MouseY()     
Flip      
Wend
практически во все части кода, пытался убрать строки While Not KeyHit(1)=1 и Wend, UpdateWorld() и RenderWorld()...пытался в конце кода Wend поставить...пробовал просто вот так:
Global mouse_pic=LoadImage( "Picture.bmp" ) 
DrawImage mouse_pic, MouseX(),MouseY()
Из моих методов тыка иногда мышь появлялась на черном экране, нормально двигалась, после нажатия Esc появляась игра(ну там земля-небо-сфера...)

Сообщение от baton4ik Посмотреть сообщение
Проще простого: привязываешь камеру к объекту и перемещаешь её
Где-то в коде камера привязана к объекту(не уверен), но при движении мышкой почемуто двигается сфера... не могу найти где убрать это ее движение и летание, надо ведь чтоб просто объект стоял на месте при вращении
(Offline)
 
Ответить с цитированием
Старый 09.11.2010, 23:48   #5
Слейпнир
AnyKey`щик
 
Регистрация: 09.11.2010
Сообщений: 3
Написано 0 полезных сообщений
(для 0 пользователей)
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

может выложить сие чудо ?
(Offline)
 
Ответить с цитированием
Старый 10.11.2010, 00:02   #6
baton4ik
Дэвелопер
 
Аватар для baton4ik
 
Регистрация: 21.11.2009
Адрес: Киев
Сообщений: 1,699
Написано 657 полезных сообщений
(для 1,962 пользователей)
Ответ: Полноценное вращение камеры вокруг объекта(персонажа), курсор мыши

Чувак, ну дам я тебе код, ты ничего не поймёшь. Удаляй это мимо корзины и учи всё с самого начала. Если б ты учил, то знал бы, что рисовать надо между рендером и флипом.
------------------
Беглым просмотром кода привязку не нашёл. Привязывай в цикле с PointEntity и потом перемещай камеру.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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