|
Xors3D Графический движок с поддержкой DirectX9 |
08.09.2011, 10:14
|
#1
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Как я делал перемещение физического игрока и все работает
xEntityAddCapsuleShape(camera,20,5,5) ;//тут примерные значения с ними у вас может и не работать
xEntitySetFriction(camera,0) ;
xEntitySetAngularFactor(camera,0,1.0,0) ;
xEntityDisableSleeping(camera);
while(не выход из цикла)/тут сами понимаете как надо
{
...
//чтобы ходить юзаешь не moveEntity
int spx = xMouseXSpeed();
int spy = xMouseYSpeed();
xMouseMove(xGraphicsWidth()/2, xGraphicsHeight()/2);
xTurnEntity(camera, spy,-spx,0);
xRotateEntity(camera, xEntityPitch(camera), xEntityYaw(camera),0);
xEntitySetLinearVelocity(camera,0,0,0);//перемещение
xEntitySetAngularVelocity(camera,0,0,0);//вращение
float y = xEntityYaw(camera, true);
//нажатие вперед
xEntitySetLinearVelocity(camera,-10*sin(y*3.14/180),0,10*cos(y*3.14/180));
//нажатие вниз
xEntitySetLinearVelocity(camera,10*sin(y*3.14/180),0,-10*cos(y*3.14/180));
//нажатие влево
float velx = xEntityGetLinearVelocityX(camera);//нужно если мы идем вперед или назад
float velz=xEntiyGetLinearVelocityZ(camera);//нужно если мы идем вперед или назад
xEntitySetLinearVelocity(camera,velx+(-10*cos(y*3.14/180)),0,velz+(-10*sin(y*3.14/180)));
//нажатие вправо
float velx = xEntityGetLinearVelocityX(camera);//нужно если мы идем вперед или назад
float velz=xEntiyGetLinearVelocityZ(camera);//нужно если мы идем вперед или назад
xEntitySetLinearVelocity(camera,velx+(10*cos(y*3.14/180)),0,velz+(10*sin(y*3.14/180)));
//гравитация
float velx = xEntityGetLinearVelocityX(camera);//нужно если мы идем вперед или назад
float velz=xEntiyGetLinearVelocityZ(camera);//нужно если мы идем вперед или назад
xEntitySetLinearVelocity(camera,velx,-9,velz);
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо pozitiffcat за это полезное сообщение:
|
|
08.09.2011, 15:04
|
#2
|
Разработчик
Регистрация: 12.10.2008
Адрес: Самара
Сообщений: 437
Написано 55 полезных сообщений (для 92 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
распиши все в функции для удобства )
__________________
Пекарня: Intel Core i3 - 3240(3.40Ghz), ram 8 gb, video Gigabyte Nvidia GeForce GTX 650 1gb
Лэптоп : Intel Core i3 - 2365(1.40Ghz), ram 4gb, video Int Intel HD3000(512mb)
Мой набор: 3ds Max 9 + Xors3d(Blitz3d) + Photoshop
|
(Offline)
|
|
08.09.2011, 15:41
|
#3
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
Тупо код не очень информативно. Лучше всего сперва описать в письменном виде, какова логика и что ты реализуешь в коде, затем уже реализовывать.
|
(Offline)
|
|
08.09.2011, 15:58
|
#4
|
Мастер
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений (для 1,836 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
А не проще было из локальных координат камеры тформить вектор перемещения и xEntitySetLinearVelocity(camera,xtformedX(),xTForm edY()-9,xTformedZ()); а?
|
(Offline)
|
|
09.09.2011, 08:13
|
#5
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
хз привых по старинке, в каком то движке на Delphi лет 5 назад писал, перемещение вычислял синусом и косинусом
А так код будет понятен для тех кто боле менее шарит в ксорсе, если нет, то этот код ему незачем вообще пусть доростет.
xEntitySetLinearVelocity(camera,10*sin(y*3.14/180),0,-10*cos(y*3.14/180));
это вычисление "скорости" физического объекта для x и z осей относительно угла поворота y
|
(Offline)
|
|
23.09.2011, 19:36
|
#6
|
Нуждающийся
Регистрация: 27.04.2011
Сообщений: 80
Написано одно полезное сообщение
|
Ответ: Как я делал перемещение физического игрока и все работает
Это не может работать. Как объект будет двигаться, если
Y получит 0 из функции xEntityYaw
|
(Offline)
|
|
23.09.2011, 19:39
|
#7
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
косинус нуля единица, что означает движение по оси Z вперед!
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
06.10.2011, 15:47
|
#8
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
многие почему-то не могут сделать нормального перемещения для игрока. Специально для них привожу код.
Function AddHero(x#,y#,z#,yaw#=0)
H.HeroT = New HeroT
H\model = xCreateCube()
xScaleMesh H\model, 1, 2, 0.5
H\mass = 50
H\radius = 1.0
H\height = 2
;создаем физическую оболочку в виде капсулы
xEntityAddCapsuleShape(H\model, H\mass, H\radius, H\height)
;делаем слегка трение модельке
xEntitySetFriction(H\model,0.5)
;запрещаем поворачиваться модельке кроме оси Y
xEntitySetAngularFactor(H\model, 0, 1.0, 0)
;убираем инерцию поворота, чтобы моделька подчинялась только нашему контролю
xEntitySetDamping(H\model, 0, 1)
xPositionEntity H\model, x, y, z
xRotateEntity H\model, 0, yaw, 0
;Вспомогательный пивот для расчетов. Мне так удобнее
helpPivot = xCreateCube(H\model)
xScaleMesh helpPivot, 2, 0.1, 2
End Function
Function ControlHero()
Local smoothYaw# = 0.5 ;смягчающий коэффициент поворота
Local moveForce# = 1000 ;усилие для движения
Local maxJump# = 50 ;максимальная скорость прыжка
Local maxSpeed# = 20 ;макс скорость перемещения
Local moveX#, moveZ#, jump#
Local collCnt, collNum
Local InGround = False ;указывает на земле ли моделька
Local nx#,ny#,nz#, collEnt, nCount
Local dYaw#
collCnt = xEntityCountContacts(H\model)
;Если коллизия произошла
If collCnt > 0 Then
For collNum = 0 To collCnt-1
;Если коллизия произошла с ногами
If xEntityGetContactY(H\model, collNum) < xEntityY(H\model,1) - H\height*0.5 Then
;моделька на земле
InGround = True
;расчет вектора наклона земли под моделькой
collEnt = xEntityGetContact(H\model, collNum)
nx = nx + xEntityGetContactNX#(collEnt, collNum)
ny = ny + xEntityGetContactNY#(collEnt, collNum)
nz = nz + xEntityGetContactNZ#(collEnt, collNum)
nCount = nCount + 1
EndIf
Next
nx = nx / nCount
ny = ny / nCount
nz = nz / nCount
EndIf
;поворот модельки мышкой
H\Yaw = H\Yaw-mxs*smoothYaw
xRotateEntity H\model, 0, H\Yaw, 0
If InGround Then
;вырубаем гравитацию. Так меньше глюков
xEntitySetGravity(H\model, 0, 0, 0)
;Если двигаемся по диагонали то уменьшить равномерно силы
If (kdRight - kdLeft)<>0 And (kdUp - kdDown)<>0 Then maxSpeed = maxSpeed * 0.75
;сила перемещения модельки
moveX = (kdRight - kdLeft) * (maxSpeed - Abs(xEntityGetLinearVelocityX(H\model, False))) * moveForce
moveZ = (kdUp - kdDown) * (maxSpeed - Abs(xEntityGetLinearVelocityZ(H\model, False))) * moveForce
;поворачиваем пивот параллельно земли под моделькой
xAlignToVector helpPivot, nx, ny, nz, 2
dYaw = AngleDiff(xEntityYaw(helpPivot,1), xEntityYaw(H\model,1))
xTurnEntity helpPivot, 0, dYaw, 0
If Abs(xEntityPitch(helpPivot,1)) > 45 Then
xRotateEntity helpPivot, 45*Sgn(xEntityPitch(helpPivot,1)), xEntityYaw(helpPivot,1), xEntityRoll(helpPivot,1), True
xEntitySetGravity(H\model, 0, -20, 0)
EndIf
If Abs(xEntityRoll(helpPivot,1)) > 45 Then
xRotateEntity helpPivot, xEntityPitch(helpPivot,1), xEntityYaw(helpPivot,1), 45*Sgn(xEntityRoll(helpPivot,1))
xEntitySetGravity(H\model, 0, -20, 0)
EndIf
xTformVector moveX, 0, moveZ, helpPivot, 0
;применяем силы перемещения на модельку
xEntityApplyCentralForce(H\model, xTFormedX(), 0, xTFormedZ(), True)
;если хотим прыгать - прыгаем
If khSpace Then xEntitySetLinearVelocity(H\model, xEntityGetLinearVelocityX(H\model), maxJump, xEntityGetLinearVelocityZ(H\model))
;торможение модельки если не хотим идти
If moveX = 0 Then xEntityApplyCentralForce(H\model, -xEntityGetLinearVelocityX(H\model, False)*moveForce, 0, 0, False)
If moveZ = 0 Then xEntityApplyCentralForce(H\model, 0, 0, -xEntityGetLinearVelocityZ(H\model, False)*moveForce, False)
Else
;снова включаем гравитацию модельке
xEntitySetGravity(H\model, 0, -100, 0)
;это чтобы слегка контролировать движение в воздухе для казуальности
moveX = (kdRight - kdLeft) * (maxSpeed - Abs(xEntityGetLinearVelocityX(H\model, False))) * moveForce * 0.1
moveZ = (kdUp - kdDown) * (maxSpeed - Abs(xEntityGetLinearVelocityZ(H\model, False))) * moveForce * 0.1
xEntityApplyCentralForce(H\model, moveX, 0, moveZ, False)
EndIf
End Function
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо H@NON за это полезное сообщение:
|
|
10.10.2011, 02:33
|
#9
|
Разработчик
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений (для 36 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
Ну чтож ты?) Вроде делишся, а вот тип не дописал, и функции AngleDiff нет. С типом то я справился а как же функция?) Допиши пожалст))
|
(Offline)
|
|
10.10.2011, 02:41
|
#10
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
не стоит стопроцентно юзать мой код, он скорее на логику, как вариант реализации.
Функция вот :
Function AngleDiff#(angle1#,angle2#)
Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180
End Function
|
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.10.2011, 02:51
|
#11
|
Разработчик
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений (для 36 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
О,благодарю)) Слушай, я так понимаю ты просто набросал его или откудо то перекинул. Просто странно. Ты ссылаешся на тип HeroT через H. Хотя в функции ControlHero() нет хендла типа. Мне пришлось залить его туда, это верно, или же я чего то не понял?
|
(Offline)
|
|
10.10.2011, 03:09
|
#12
|
Дэвелопер
Регистрация: 06.04.2009
Адрес: Запорожье
Сообщений: 1,500
Написано 1,011 полезных сообщений (для 4,642 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
Сообщение от H@NON
Function AngleDiff#(angle1#,angle2#)
Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180
End Function
|
WTF?
__________________
|
(Offline)
|
|
10.10.2011, 12:06
|
#13
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
Сообщение от CRASHER
О,благодарю)) Слушай, я так понимаю ты просто набросал его или откудо то перекинул. Просто странно. Ты ссылаешся на тип HeroT через H. Хотя в функции ControlHero() нет хендла типа. Мне пришлось залить его туда, это верно, или же я чего то не понял?
|
Тупо сделал глобальной переменную H.HeroT.
Function AngleDiff#(angle1#,angle2#)
Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180
End Function
|
так нада) чтоб никто не догадалсо )
|
(Offline)
|
|
10.10.2011, 14:41
|
#14
|
Разработчик
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений (для 36 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
H@NON, расскажи пожалуйсто зачем нам xTurnEntity для helpPivot ?
|
(Offline)
|
|
10.10.2011, 15:27
|
#15
|
Дэвелопер
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений (для 774 пользователей)
|
Ответ: Как я делал перемещение физического игрока и все работает
Пивот нужен лишь чтобы положить его параллельно земли под игроком. А поворачиваем его, чтобы пивот смотрел туда же куда и игрок.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:06.
|