|
Xors3D Графический движок с поддержкой DirectX9 |
20.02.2011, 17:56
|
#16
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Кстати, заметил особенность - xLinePick юзает не отрезок, а луч, хотя в параметрах и предлагается указать координаты двух концов.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.02.2011, 17:58
|
#17
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
Вообще-то отрезок и юзается. Точнее из него делается луч, а последний параметр задает его длину, если поставить 0 - высчитается автоматом.
|
(Offline)
|
|
20.02.2011, 18:04
|
#18
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Сообщение от Knightmare
Вообще-то отрезок и юзается. Точнее из него делается луч, а последний параметр задает его длину, если поставить 0 - высчитается автоматом.
|
Тю мля Я думал последний параметр - радиус линии в поперечнике, как у аналогичной команды в блитце. Теперь ясно, пойду править косяки
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.02.2011, 18:05
|
#19
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
В блитзе это тоже длина. Но в диапазоне [0; 1].
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
20.02.2011, 18:08
|
#20
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Да? 0_о Хм... А вроде работало как радиус Вот что значит на блитцмакс с ксорсом перешел
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 22:23
|
#21
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Что-то у меня закрадываются смутные сомнения, что xEntityPick страшно не дружит с тримешами...
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 22:32
|
#22
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
Чем он у тебя не дружит?
|
(Offline)
|
|
24.02.2011, 22:37
|
#23
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Чуть позже наверное пример выложу. Если не решу проблему. Извиняюсь за беспокойство
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 23:22
|
#24
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
' Импорт модуля
Import xorsteam.xors3d
SuperStrict
' Загрузка конфигурации
Global GWidth:Int = 640
Global GHeight:Int = 480
Global GDepth:Int = 32
Global GMode:Int = 1
Global ShadowMode:Int = 0
Global EffectMode:Int = 0
Global GlowMode:Int = 0
Global ContrastMode:Int = 0
Global VSyncMode:Int = 0
Local fileout:TStream = ReadFile("game.cfg")
If fileout Then
GWidth = ReadInt(fileout)
GHeight = ReadInt(fileout)
GDepth = ReadInt(fileout)
ShadowMode = ReadInt(fileout)
EffectMode = ReadInt(fileout)
GlowMode = ReadInt(fileout)
ContrastMode = ReadInt(fileout)
VSyncMode = ReadInt(fileout)
EndIf
' Инициализация 3D-режима
xAppTitle "Exilium"
xGraphics3D GWidth, GHeight, GDepth, 1, VSyncMode
SeedRnd MilliSecs()
xHidePointer()
' Антиалайзинг
xSetAntiAliasType(8)
xAntiAlias False
' Фильтрация
xSetTextureFiltering(TF_ANISOTROPICX8)
' Загрузка шрифта
Global arial:Int = xLoadFont("Arial", 12)
' Переменная отладки
Global debug_info:Byte
' Создание камеры
Global camera:Int = xCreateCamera()
xCameraRange camera, 0.1, 3000
xCameraEnableShadows(camera)
' Создание света и тени
xInitShadows(1024, 1024, 1024)
xSetShadowParams 5, 0.95, True, 300
xSetShadowsBlur(5)
Global light_up:Int = xCreateLight()
xRotateEntity light_up, 70, 45, 0
xLightEnableShadows light_up, 1
xLightShadowEpsilons light_up, 0.0001, 0.016
' Загрузка уровня
Global world_scale:Float = 0.35
'Global level:Int = xLoadMesh("data\maps\battle\1\level3.b3d")
'Local level_tex:Int = xLoadTexture("data\maps\battle\1\1.jpg")
'xEntityTexture level, level_tex
''xScaleMesh level, 1.3 * world_scale, 1.3 * world_scale, 1.3 * world_scale
''xPositionEntity level, 0, 640 * world_scale, 50 * world_scale
'xScaleMesh level, 13 * world_scale, 13 * world_scale, 13 * world_scale
'xPositionEntity level, 0, -250, 10
'xUpdateNormals level
'
'xEntityAddHullShape level, 0
'xEntityAlpha level, 0.3
'xEntityPickMode level, 2
Local c1:Int = xCreateCube()
xScaleMesh c1, 300, 5, 300
xPositionEntity c1, 0, -25, 0
'xEntityAddBoxShape c1, 0
'xEntityPickMode c1, 3
xEntityAddHullShape c1, 0
xEntityPickMode c1, 2
'testtt = xLoadAnimMesh("D:\Developing\realise_models2\HERO_EX1\test.b3d")
''testtt=xLoadAnimMesh("D:\Developing\realise_models2\HERO1\test6.b3d")
'xUpdateNormals testtt
'xAnimate(testtt,ANIMATION_LOOP,1.5)
'xScaleEntity testtt, 2, 2, 2
''xScaleEntity testtt, 15, 15, 15
'xEntityFX testtt,FX_FULLBRIGHT
' Загрузка персонажа
TBattleCharacter.CreateBattleCharacter("player", 1, 1, 999)
Global cube:Int = xCreateCube()
' Инициация mouse look
Global mxs:Float, mys:Float, dest_xang:Float, dest_yang:Float, xang:Float, yang:Float
Global camera_target:Int = xCreatePivot()
Global dist_target:Int = xCreatePivot(camera_target)
Global move_target:Int = xCreateCube()
' Главный цикл
While Not xKeyDown(1)
If VSyncMode Then Delay(16)
If xMouseHit(1) Then ShootSphere(camera)
If xKeyHit(88) Then debug_info = Not debug_info
' Обработка персонажей
UpdateCharacters()
' Обработка мира
xUpdateWorld
xRenderWorld(1.0, 1)
' Вывод отладочной информации
xPhysicsDebugRender debug_info
If debug_info Then
xText 10, 10, "FPS: " + xGetFPS()
EndIf
' drawing the scene
xFlip
Wend
'==============================================================
'
' Пользовательские типы
'
'==============================================================
' Тип персонажа
Type TBattleCharacter
Global list:TList = CreateList()
Global list_count:Int
Field model:Int, anim_mesh:Int
Field selected:Byte
Field name:String
Field level:Int, life:Int, life_max:Int
' Создание персонажа
Function CreateBattleCharacter:TBattleCharacter(variant:String, selected:Byte, level:Int, life:Int)
Select variant
Case "player"
Local bchar:TBattleCharacter = New TBattleCharacter
' Определение переменных
bchar.selected = selected
bchar.level = level
If bchar.level > 99
bchar.level = 99
ElseIf bchar.level < 1
bchar.level = 1
EndIf
' Определение постоянных
bchar.name = variant
' Определение параметров
bchar.life_max = 60 + bchar.level * 27
bchar.life = life
If bchar.life > bchar.life_max
bchar.life = bchar.life_max
ElseIf bchar.life < 1
bchar.life = 1
EndIf
' Загрузка моделей
bchar.model = xCreateCube()
xScaleMesh bchar.model, 14 * world_scale, 40 * world_scale, 14 * world_scale
' xEntityAddBoxShape bchar.model, 10
TBattleCharacter.list.AddLast(bchar)
TBattleCharacter.list_count:+1
End Select
End Function
' Обработка персонажа
Method Update()
If selected = 1 Then
MouseLook(model)
If xMouseHit(2) Then
xCameraPick(camera, xMouseX(), xMouseY())
xPositionEntity move_target, xPickedX(), xPickedY(), xPickedZ()
EndIf
' If xEntityDistance(move_target, model) > 10 Then
' xTranslateEntity model, (xEntityX(move_target, 1) - xEntityX(model, 1)) / 10, (xEntityY(move_target, 1) - xEntityY(model, 1)) / 10, (xEntityZ(move_target, 1) - xEntityZ(model, 1)) / 10
' EndIf
EndIf
End Method
End Type
End
'==============================================================
'
' Пользовательские функции
'
'==============================================================
' Обработка всех персонажей
Function UpdateCharacters()
For Local bchar:TBattleCharacter = EachIn TBattleCharacter.list
bchar.Update()
Next
End Function
' Mouse look
Function MouseLook(target:Int, height:Float = 10, distance:Float = 100, rotate:Float = 50)
Local collision_distance:Float = 5
If target <> 0 Then
If xKeyDown(17) Then xTranslateEntity target, 0, 0, 1
If xKeyDown(31) Then xTranslateEntity target, 0, 0, -1
If xKeyDown(30) Then xTranslateEntity target, -1, 0, 0
If xKeyDown(32) Then xTranslateEntity target, 1, 0, 0
mxs = xMouseX() - xGraphicsWidth() / 2
mys = xMouseY() - xGraphicsHeight() / 2
xMoveMouse xGraphicsWidth() / 2, xGraphicsHeight() / 2
mxs = mxs / (rotate / 12)
mys = mys / (rotate / 12)
If mxs>rotate Then mxs=rotate
If mxs < - rotate Then mxs = -rotate
If mys > rotate Then mys = rotate
If mys < - rotate Then mys = -rotate
dest_yang = dest_yang + mys
If dest_yang < - 85 Then dest_yang = -85
If dest_yang > 85 Then dest_yang = 85
yang = (yang + ((dest_yang - yang) - (dest_yang - yang) / 1.5) / 1.5)
dest_xang = dest_xang - mxs
If dest_xang > 179.9999 Then
dest_xang = dest_xang - 359.9999
xang = xang - 359.9999
EndIf
If dest_xang < - 179.9999 Then
dest_xang = 359.9999 + dest_xang
xang = 359.9999 + xang
EndIf
xang = (xang + ((dest_xang - xang) - (dest_xang - xang) / 1.5) / 1.5)
xPositionEntity camera_target, xEntityX(target, 1), xEntityY(target, 1), xEntityZ(target, 1)
xRotateEntity camera_target, 0, xang, 0
xPositionEntity dist_target, 0, Sin(yang) * distance, -Cos(yang) * distance
Local vis_line_x:Float = xEntityX(camera_target, 1)
Local vis_line_y:Float = xEntityY(camera_target, 1)
Local vis_line_z:Float = xEntityZ(camera_target, 1)
Local vis_line_dx:Float = xEntityX(dist_target, 1)
Local vis_line_dy:Float = xEntityY(dist_target, 1)
Local vis_line_dz:Float = xEntityZ(dist_target, 1)
If xLinePick(vis_line_x, vis_line_y, vis_line_z, vis_line_dx, vis_line_dy, vis_line_dz, distance) <> 0 Then
' xPositionEntity camera, xPickedX() - (xPickedX() - vis_line_x) / collision_distance, xPickedY() - (xPickedY() - vis_line_y) / collision_distance, xPickedZ() - (xPickedZ() - vis_line_z) / collision_distance
xPositionEntity camera, xPickedX(), xPickedY(), xPickedZ()
Else
' xPositionEntity camera, vis_line_x + (vis_line_dx - vis_line_x) / (collision_distance * (0.25 + yang / 1000)), vis_line_y + (vis_line_dy - vis_line_y) / (collision_distance * (0.25 + yang / 1000)), vis_line_z + (vis_line_dz - vis_line_z) / (collision_distance * (0.25 + yang / 1000))
' xPositionEntity camera, vis_line_x + (vis_line_dx - vis_line_x) / (collision_distance * 0.24), vis_line_y + (vis_line_dy - vis_line_y) / (collision_distance * 0.24), vis_line_z + (vis_line_dz - vis_line_z) / (collision_distance * 0.24)
xPositionEntity camera, vis_line_dx, vis_line_dy, vis_line_dz
EndIf
xPointEntity camera, camera_target
EndIf
End Function
' function to shoot sphere
Function ShootSphere(camera%)
Local sphere:Int = xCreateSphere()
xPositionEntity(sphere, xEntityX(camera, True), xEntityY(camera, True) - 5, xEntityZ(camera, True))
xEntityColor(sphere, 255, 0, 0)
xEntityAddSphereShape(sphere, 1.0, 1.0)
xTFormNormal 0.0, 0.0, 1.0, camera, 0
xEntityApplyCentralImpulse(sphere, xTFormedX() * 50, xTFormedY() * 50, xTFormedZ() * 50)
End Function
Вот пример. Я уже не из б3д меш гружу а просто создаю куб, юзаю на нем тримеш в том числе и для пика. В центре карты камера нормально упирается в "землю" не проваливаясь. При приближении к краям пик перестает работать, камера "проваливается" в куб
И да, такой же абсолютно код маус лока (за исключением измененной команды лайнпика в ксорсе) прекрасно работал в блитце, в той же моей демке avallon
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 23:26
|
#25
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
Какую-то адовую фигню творишь. Потом прогоню код.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 23:27
|
#26
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
Сообщение от Knightmare
Какую-то адовую фигню творишь. Потом прогоню код.
|
Я пока к бмаксу привыкаю, потому куча закомменченного
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
24.02.2011, 23:34
|
#27
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
Я чего-то нифига не понял в твоем примере. Что хоть должно быть? И что не так?
|
(Offline)
|
|
24.02.2011, 23:37
|
#28
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
WASD - передвижение. Камера вращается вокруг параллелепипеда, если повернуть ее вниз - она "упирается" в "пол". Но если двигать параллелепипед к краю - камера начнет проваливаться в "пол", будто коллижен-боди у "пола", по которому рассчитывается лайнпик, закончилось раньше, чем мы подошли к краю меша.
И это он на боксе так начинает проваливаться. Если загрузить простенький уровень - при подходе к удаленным от центра координат стенам начинается пляска камеры, будто лайнпик превращается из луча в прямую и пикает в обе стороны.
Если убрать пик - камера нормально вращается на любом отдалении параллелепипеда от центра координат. Так что если косяк у меня - то не во вращении камеры... наверное...
Да, еще, если отдалятся от центра, упершись камерой в "пол" - точка пика будто смещается, хотя если оторвать камеры от пола - камера нормально центрирована на параллелепипеде
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.02.2011, 16:00
|
#29
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3D + BlitzMax
Решение твоей проблемы:
If xLinePick(vis_line_x, vis_line_y, vis_line_z, vis_line_dx - vis_line_x, vis_line_dy - vis_line_y, vis_line_dz - vis_line_z, distance) <> 0 Then
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
25.02.2011, 16:13
|
#30
|
Дэвелопер
Регистрация: 24.07.2008
Сообщений: 1,544
Написано 1,095 полезных сообщений (для 2,706 пользователей)
|
Ответ: Xors3D + BlitzMax
У меня изначально код был:
Local vis_line_x:Float = xEntityX(camera_target, 1)
Local vis_line_y:Float = xEntityY(camera_target, 1)
Local vis_line_z:Float = xEntityZ(camera_target, 1)
Local vis_line_dx:Float = xEntityX(dist_target, 1)-vis_line_x
Local vis_line_dy:Float = xEntityY(dist_target, 1)-vis_line_y
Local vis_line_dz:Float = xEntityZ(dist_target, 1)-vis_line_z
Но прочитал в хелпе что dx- х координата, потому подумал что надо в глобальных координатах указывать, в отличие от блитца... И убрал...
В общем очень извиняюсь за тупость, огромное спасибо за выявление моего косяка
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:26.
|