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

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

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

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 08.09.2011, 10:14   #1
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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 за это полезное сообщение:
Colossus (08.09.2011), Medan (23.09.2011), Spy4433 (10.10.2011)
Старый 08.09.2011, 15:04   #2
Colossus
Разработчик
 
Аватар для Colossus
 
Регистрация: 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
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

Тупо код не очень информативно. Лучше всего сперва описать в письменном виде, какова логика и что ты реализуешь в коде, затем уже реализовывать.
(Offline)
 
Ответить с цитированием
Старый 08.09.2011, 15:58   #4
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

А не проще было из локальных координат камеры тформить вектор перемещения и xEntitySetLinearVelocity(camera,xtformedX(),xTForm edY()-9,xTformedZ()); а?
(Offline)
 
Ответить с цитированием
Старый 09.09.2011, 08:13   #5
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
Medan
Нуждающийся
 
Регистрация: 27.04.2011
Сообщений: 80
Написано одно полезное сообщение
Ответ: Как я делал перемещение физического игрока и все работает

Это не может работать. Как объект будет двигаться, если
Y получит 0 из функции xEntityYaw
(Offline)
 
Ответить с цитированием
Старый 23.09.2011, 19:39   #7
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

косинус нуля единица, что означает движение по оси Z вперед!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Medan (23.09.2011)
Старый 06.10.2011, 15:47   #8
H@NON
Дэвелопер
 
Регистрация: 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 за это полезное сообщение:
CRASHER (10.10.2011), LLI.T.A.L.K.E.R. (09.10.2011), St_AnGer (10.10.2011)
Старый 10.10.2011, 02:33   #9
CRASHER
Разработчик
 
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений
(для 36 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

Ну чтож ты?) Вроде делишся, а вот тип не дописал, и функции AngleDiff нет. С типом то я справился а как же функция?) Допиши пожалст))
(Offline)
 
Ответить с цитированием
Старый 10.10.2011, 02:41   #10
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

не стоит стопроцентно юзать мой код, он скорее на логику, как вариант реализации.
Функция вот :
Function AngleDiff#(angle1#,angle2#)
Return ((angle2 - angle1) Mod 360 + 540) Mod 360 - 180
End Function
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
CRASHER (10.10.2011)
Старый 10.10.2011, 02:51   #11
CRASHER
Разработчик
 
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений
(для 36 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

О,благодарю)) Слушай, я так понимаю ты просто набросал его или откудо то перекинул. Просто странно. Ты ссылаешся на тип HeroT через H. Хотя в функции ControlHero() нет хендла типа. Мне пришлось залить его туда, это верно, или же я чего то не понял?
(Offline)
 
Ответить с цитированием
Старый 10.10.2011, 03:09   #12
.Squid
Дэвелопер
 
Аватар для .Squid
 
Регистрация: 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
H@NON
Дэвелопер
 
Регистрация: 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
CRASHER
Разработчик
 
Регистрация: 08.03.2007
Сообщений: 530
Написано 31 полезных сообщений
(для 36 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

H@NON, расскажи пожалуйсто зачем нам xTurnEntity для helpPivot ?
(Offline)
 
Ответить с цитированием
Старый 10.10.2011, 15:27   #15
H@NON
Дэвелопер
 
Регистрация: 17.01.2007
Сообщений: 1,552
Написано 351 полезных сообщений
(для 774 пользователей)
Ответ: Как я делал перемещение физического игрока и все работает

Пивот нужен лишь чтобы положить его параллельно земли под игроком. А поворачиваем его, чтобы пивот смотрел туда же куда и игрок.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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