forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Blitz3D (http://forum.boolean.name/forumdisplay.php?f=45)
-   -   ограничение мышки по вертикали (http://forum.boolean.name/showthread.php?t=11629)

KingMaks 02.01.2010 00:29

ограничение мышки по вертикали
 
Вот зделал управление мышкой, всё работает.
Только вот немогу ограничить камеру, тоесть когда ведеш мышку вперёд
камера крутилась по оси х но не полный круг,а частично,
попытался зделать кое-какое ограничени но оно плохо работает:

Graphics3D 640,480
SetBuffer BackBuffer()

player = CreateSphere(8)
camera = CreateCamera(player)
PositionEntity camera,0,1.5,0

pol = CreateTerrain(32)
PositionEntity pol,0,-1,0

For x=1 To 10
cub = CreateCube()
PositionEntity cub,Rand(0,32),0,Rand(0,32)
EntityColor cub,Rand(0,255),Rand(0,255),Rand(0,255)
Next

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyDown(1)

x = MouseXSpeed()
y = MouseYSpeed()

xg = GraphicsWidth()/2
yg = GraphicsHeight()/2

If x<0 Then MoveMouse xg,yg
If x>0 Then MoveMouse xg,yg
If y<0 Then MoveMouse xg,yg
If y>0 Then MoveMouse xg,yg

limit = EntityPitch(camera,True)

TurnEntity player,0,-x,0
If limit > -25 And limit < 70 Then TurnEntity camera,y,0,0
; вот я пытался зделать ограничение
If KeyDown(200) Then MoveEntity player,0,0,0.1
If KeyDown(208) Then MoveEntity player,0,0,-0.1
If KeyDown(203) Then MoveEntity player,-0.1,0,0
If KeyDown(205) Then MoveEntity player,0.1,0,0

UpdateWorld
RenderWorld
Text 10,10,limit
Flip
Wend
End

moka 02.01.2010 01:00

Ответ: ограничение мышки по вертикали
 
Заведи переменную CamPitch, затем меняй её в зависимости от скорости движения мышки по Y.
Далее проверяй, если например тебе нужно ограничить по 70 градусов вниз и вверх то можно так:
If Abs(CamPitch)>70 CamPitch=70*Sgn(CamPitch)
После этого крутишь камеру:
RotateEntity camera,CamPitch,EntityYaw(camera,1),0,1

FireOwl 02.01.2010 01:06

Ответ: ограничение мышки по вертикали
 
Как только камера заходит за границы по условию она уже не может повернуться. Надо как-нибудь вроде:
Код:

If y>0 Then
    If limit<70 Then TurnEntity camera,y,0,0
Else
    If limit>-25 Then TurnEntity camera,y,0,0
EndIf


moka 02.01.2010 01:37

Ответ: ограничение мышки по вертикали
 
FireOwl, так это не делается. Тут вылезут баги, например при редком цикле (низкий фпс, если упс не фиксированный), при сильной скорости мышки, по вертикали, камера может проскачить от 70, до 90, и дальше, уже Yaw обернётся, на 180 градусов. А Pitch пойдёт от остатка на убывание.
Короче говоря, если вам не нужны баги, выносите градус по вертикали в отдельную переменную, и работайте с ней. Тем более хоть и о производительности в таких вещах задумываться - через-чур мелочёвка, но работать с переменной быстрее, чем выбирать, и получать Pitch от энтити.

KingMaks 02.01.2010 01:56

Ответ: ограничение мышки по вертикали
 
Цитата:

Сообщение от MoKa (Сообщение 131920)
Заведи переменную CamPitch, затем меняй её в зависимости от скорости движения мышки по Y.

можно подробнее описать ету строчку

Morganolla 02.01.2010 01:59

Ответ: ограничение мышки по вертикали
 
вот я переделал...
Код:

Graphics3D 640,480
SetBuffer BackBuffer()

player = CreateSphere()
camera = CreateCamera(player)
PositionEntity camera,0,1.5,0

pol = CreateTerrain(32)
PositionEntity pol,0,-1,0

For x=1 To 10
cub = CreateCube()
PositionEntity cub,Rand(0,32),0,Rand(0,32)
EntityColor cub,Rand(0,255),Rand(0,255),Rand(0,255)
Next

MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

While Not KeyDown(1)

x = MouseXSpeed()
y = MouseYSpeed()

xg = GraphicsWidth()/2
yg = GraphicsHeight()/2

If x<0 Then MoveMouse xg,yg
If x>0 Then MoveMouse xg,yg
If y<0 Then MoveMouse xg,yg
If y>0 Then MoveMouse xg,yg



TurnEntity player,0,-x,0
TurnEntity camera,y,0,0; вот я пытался зделать ограничение
limit = EntityPitch(camera,True)
If limit < -25 RotateEntity camera,-25,0,0
If limit >70 RotateEntity camera,70,0,0
If KeyDown(200) Then MoveEntity player,0,0,0.1
If KeyDown(208) Then MoveEntity player,0,0,-0.1
If KeyDown(203) Then MoveEntity player,-0.1,0,0
If KeyDown(205) Then MoveEntity player,0.1,0,0

UpdateWorld
RenderWorld
Text 10,10,limit
Flip
Wend
End


KingMaks 02.01.2010 02:08

Ответ: ограничение мышки по вертикали
 
все оказалось куда проще чем я думал

Morganolla 02.01.2010 02:09

Ответ: ограничение мышки по вертикали
 
ЗЫ Приятель, а шо у тебя с глазом?

KingMaks 02.01.2010 02:17

Ответ: ограничение мышки по вертикали
 
в фотошопе зделал :-D

moka 02.01.2010 20:00

Ответ: ограничение мышки по вертикали
 
Morganolla, снова лишние операции.
Код:

Global wW=640,wH=640

Graphics3D wW,wH,32,2
SetBuffer BackBuffer()

player = CreatePivot()
camera = CreateCamera(player)
PositionEntity camera,0,1.5,0

pol = CreateTerrain(1)
PositionEntity pol,0,-1,0
ScaleEntity pol,32,32,32

For x=1 To 10
        cub = CreateCube()
        PositionEntity cub,Rand(0,32),0,Rand(0,32)
        EntityColor cub,Rand(0,255),Rand(0,255),Rand(0,255)
Next

CamPitch=0
CamSensivity#=.3
CamSpeed#=.05

MoveMouse wW/2.0,wH/2.0

While Not KeyDown(1)
        IKdUp=KeyDown(200)
        IKdDown=KeyDown(208)
        IKdLeft=KeyDown(203)
        IKdRight=KeyDown(205)
       
        mX=MouseXSpeed()
        mY=MouseYSpeed()
        MoveMouse wW/2.0,wH/2.0
       
        TurnEntity player,0,-mX*CamSensivity,0
       
        CamPitch=CamPitch+mY*CamSensivity
        If Abs(CamPitch)>70 CamPitch=Sgn(CamPitch)*70
        RotateEntity camera,CamPitch,EntityYaw(camera),0
       
        MoveEntity player,(IKdRight-IKdLeft)*CamSpeed,0,(IKdUp-IKdDown)*CamSpeed
       
        UpdateWorld
        RenderWorld
        Text 10,10,CamPitch
        Flip 0
Wend
End

Вот теперь, логически правильно, а багов не вылезет.
ЗЫ, ограничивать вниз на 25 градусов, весьма бесюче, и заметь, что везде от этого отказываются.

KingMaks 02.01.2010 20:12

Ответ: ограничение мышки по вертикали
 
Цитата:

Сообщение от MoKa (Сообщение 131995)
ЗЫ, ограничивать вниз на 25 градусов, весьма бесюче, и заметь, что везде от этого отказываются.

так мне же не для игры ограничивать, я так учусь всякие мелочи делать.
И если уж на то пошло, то на сколько нужно ограничивать, если вопще нужно? ИМХО не может же игрок крутить шею на все 360 по оси Х :)

moka 02.01.2010 20:16

Ответ: ограничение мышки по вертикали
 
KingMaks, ну по горизонтали, в играх редко встречалось, когда в гемплее был элемент управления головой (лишь несколько военных симуляторов видел). Но там опять же, было даже не совсем головой крутили, а прицел оружия, ходил по экрану в небольшом радиусе вокруг центра экрана, далее заходя, уже крутилось тело.
В FPS играх, крутят сразу тело, а не голову :)
По вертикали - голова, по горизонтали - тело.
Ты можешь вообще смотреть очень низко, опустить голову почти на 90 градусов, не так ли? При этом есть ещё зрачки, они тоже могут двигаться независимо от шеи, и самого тела, опять же, обзор по горизонтали будет почти 180 градусов!
Короче говоря, не ограничивают вниз, потому что во многих ситуациях, где нужно стрелять во время того же прыжка, или смотреть с крыши вниз, и представь, тебя тупо ограничат - выбесит :lol:

KingMaks 02.01.2010 20:36

Ответ: ограничение мышки по вертикали
 
По оси Y не нужно ограничивать это понятно.
Ну а по оси Х полный круг грех делать, хоть какоето ограничение нужно,
я в какие игры не играл там ,вроде, по 90 градусов вверх и низ.

(как в контре когда на край дома стаёш, разворачиваешься на 180
и смотриш вниз, ног не видно,вопщем получаеться что ты париш в воздухе):-D

moka 02.01.2010 20:42

Ответ: ограничение мышки по вертикали
 
KingMaks, 90 многовато, 89 делай, а то там будет камера беситься..
А вот насчёт тела, сейчас много где делают очень прикольно, мне понравилось как в Dark Messiah, там своё тело видно. И сам бой там кстати приятный :).

BlackOut 02.01.2010 21:01

Ответ: ограничение мышки по вертикали
 
MoKa
Цитата:

...сейчас много где делают очень прикольно..
Не смог удержаться,! 2002 год.. Французская студия.. игра Arx Fatalis! Жанр-Шедевр!
а то что шас делают много прикольного, к сожалению не соглашусь. Да что то есть но и ерунды хватает =\


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

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