forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   3D-программирование (http://forum.boolean.name/forumdisplay.php?f=12)
-   -   НУ СРОЧНО НУЖНА ПОМОЩЬ! (http://forum.boolean.name/showthread.php?t=101)

KRIK 19.09.2005 04:55

ОБЪЯСНЯЮ ПОДРОБНО, ЧТО МНЕ НАДО!

I.Как сделать чтобы вот это работало не на клавеатуре, а намышке?

1.Двигая мышку в ВЕРХ, в НИЗ!!!!
Код:

If KeyDown(44) Then MoveEntity cam,0,-0.5,0
If KeyDown(45) Then MoveEntity cam,0,0.5,0

2.Крутя колёсико мышки в ВЕРХ ,в НИЗ!!!
Код:

If KeyDown (46) Then MoveEntity cam,0,0,-2
If KeyDown(47) Then MoveEntity cam,0,0,2

II. В данном примере у меня бегает robot неподялёку от кубиков(я заминил ими других героев - БОТОВ)
cone и cub на каторых написанны имена ,и эти имена всё время показываются, хоть мой герой убежит за километр,хоть зайду за припятствие(Стену), я буду видеть их имена, А Я ПРОШУ ЧТОБЫ КОГДА robot УБЕГАЛ ЗА ЧТО-НИБУДЬ И cone и cub НЕ БЫЛО ВИДНО, ИХ ИМЕНА(cone и cub) ИЗЧЕЗАЛИ, А КОГДА ИХ ВИДНО ИМЕНА ОПЯТЬ ПОЯВЛЯЛИЬ!

И если что лишнее в коде найдёте напешите!

Заранее СПАСИБА! :)


;================================================= ===
Код:

Graphics3D 1024,768,32,1
 
l = CreateLight()
RotateEntity l, 0, 45, 45
level=LoadMesh ("C:\IGRA\MAPS\TUR.3ds")
grunt=LoadTexture("C:\IGRA\samples\anim\makbot\Panels.jpg")
EntityTexture level,grunt
PositionEntity level,0,-7,0
ry# = -8
dy# = 0
If KeyDown(57) Then
If ry# = -8 Then dy# = 0
EndIf
ry# = ry# + dy#
dy# = dy# - 0.1
If ry# < -8 Then ry# = -8: dy# = 0
robot = LoadAnimMesh( "C:\MODELI\My models\ROBOT\robotic.3ds" )
LoadAnimSeq robot, ("C:\MODELI\My models\ROBOT\running.3ds" )
ScaleEntity robot, 0.4, 0.4, 0.4
 
cam = CreateCamera(robot)
 
CameraRange cam, 5,2000
CameraFogColor cam, 0,128,255
CameraFogRange cam, 1,1000
 
 
PositionEntity cam, 0, 60, 40
RotateEntity cam, 30, 180, 0
EntityType robot,1
EntityRadius robot, 0
EntityType level,2
 
Collisions 1, 2,2, 2
 
 
cub=CreateCube()
PositionEntity cub,10,5,10
cub3=CreateCube()
PositionEntity cub3,10,5,-10
ScaleEntity cub3 ,10, 10, 10
cone=CreateCube()
PositionEntity cone,5,5,10
golova=CreateSphere ()
PositionEntity golova ,10,10,30
 
 
rx# = 10
ry# = -8
rz# = 30
dy# = 0
ang = 90
Repeat
PositionEntity robot, rx#, ry#, rz#
RotateEntity robot, 0, ang + 90, 0
If KeyDown(57) Then
If ry# = -8 Then dy# = 3
EndIf
ry# = ry# + dy#
dy# = dy# - 0.1
If ry# < -8 Then ry# = -8: dy# = 0
If KeyDown(17)
If AnimSeq(robot) = 0 Then Animate robot, 1, 0.5, 1, 10
rx# = rx# + Cos(ang) * 0.5
rz# = rz# + Sin(ang) * 0.5
Else
If AnimSeq(robot)=1 Then Animate robot, 2, 1, 0, 10
EndIf
 
qy#=-50
ey#=60
;======================================================================= ==
If anglex> ey# Then anglex=ey#
If anglex< qy# Then anglex=qy#
RotateEntity cam, anglex, 180, 0
;==============================
ang = ang - MouseXSpeed()/1.5
anglex=-MouseYSpeed()/2
 
;======================================================================= ==
PointEntity cam,robot
If KeyDown(44) Then MoveEntity cam,0,-0.5,0
If KeyDown(45) Then MoveEntity cam,0,0.5,0
If KeyDown (46) Then MoveEntity cam,0,0,-2
If KeyDown(47) Then MoveEntity cam,0,0,2
anglex=MouseYSpeed()
If anglex Then MoveEntity cam,0,0.5,0
 
anglexx=-MouseYSpeed()
 
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
If KeyDown(16) Then ang = ang + 3
If KeyDown (1 Then ang = ang - 3
If KeyDown (15) Then anglex = anglex + 3
If KeyDown(1) Then Exit
If KeyDown (2) TurnEntity cam,2,0,0
If KeyDown (42) Then CameraZoom cam, 1.5
If Not KeyDown (42) Then CameraZoom cam,1
If KeyDown (54) Then CameraFogMode cam,1
If Not KeyDown (54) Then CameraFogMode cam,0
UpdateWorld
RenderWorld
;----------------------------------------------------------------------- ------------------------
CameraProject(cam,EntityX(cone),EntityY(cone),EntityZ(cone)) 
If EntityInView(cone,cam)=True
Text ProjectedX#(),ProjectedY#(),"Bordos":Color 0, 0, 128
End If
;====================================================
CameraProject(cam,EntityX(cub),EntityY(cub),EntityZ(cub))
If EntityInView(cub,cam) = True
Text ProjectedX#(),ProjectedY#(),"Wiliams":Color 0, 128, 0
EndIf
;=====================================================
 
Flip
Forever
RenderWorld
Flip
WaitKey


SubZer0 19.09.2005 07:05

на первый вопрос:

Код:

; устанавливаем графический режим
graphics3d 800,600,32,2
; выставляем задний буфер для записи
setbuffer BackBuffer()

; создаем камеру и позиционируем ее так, чтоб нам было видно шарик
camera=createcamera()
positionentity camera,0,0,-50

; создаем свет
rotateentity CreateLight(),0,20,45

; создаем шарик, чтоб нам было видно куда камера движется
createsphere()

; перемещаем курсор мыши в центр экрана (ВАЖНО) если без этой функции,
; то камера сначала делает рывок и мы можем не увидеть наш шарик
movemouse GraphicsWidth()/2,GraphicsHeight()/2

; главный цикл
repeat

; заносим в переменные значения скорости движения мыши по Х Y и Z(колесико)
; скорость замеряется методом, на сколько шарик провернулся с тех пор
; как запрашивалась последняя скорость (по сравнению с предидущей итерацией)
 spy=MouseYSpeed()
 spx=MousexSpeed()
 spz=MousezSpeed()

; перемещаем камеру на значения скоростей мыши (множители тут для наглядности)
 moveentity camera,-spx*0.2,spy*0.2,spz*2

; перемещаем курсор мыши в середину экрана, если мы этого делать не будем,
; то камера будет двигаться пока курсор мыши не упрется в границу экрана
; (если тебе нужна мышь в игре, то придумай специальную функцию, чтоб
; мышью по экрану можно было водить, но чтоб она не достигала краев экрана)
 movemouse GraphicsWidth()/2,GraphicsHeight()/2

; прорисовываем мир и меняем буфера
 renderworld
 flip

; закрываем цикл (зацикливаем цикл;) )
until KeyHit(1)

; конец программы
end


SubZer0 19.09.2005 07:44

второй вопрос:

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


я короче свой код написал, демонстрирует работу полностью, ты его потом под себя переделай как тебе надо...

Код:

; графический режим и буфер (как всегда)
graphics3d 800,600,32,2
setbuffer backbuffer()

; создаем камеру и помещаем ее в место откуда нам все видно
camera=createcamera()
positionentity camera,0,20,-50

; создаем свет
rotateentity createlight(),0,20,40

; создаем препятствие и делаем ему полигональний пик-режим
cube=createcube()
positionentity cube,0,0,20
scaleentity cube,5,10,5
entitypickmode cube,2

; создаем игрока и делаем ему тоже полигональный пик-режим
player= CreateCube()
entitycolor player,50,250,50
scaleentity player,3,3,3
entitypickmode player,2

; создаем зрителя (может быть и камера), для него пик-режим не устанавливаем
; этот режим нужен только для тех объектов на которые будем "смотреть"
; помещаем зрителя под камерой (для наглядности)
viewer = CreateSphere()
positionentity viewer,0,16,-45

; главный цикл
repeat

; самая главная функция (из-за нее все работает)
; функция смотрит по вектору (в трехмерных координатах) от "XYZ" с длиной "XYZ" и
; возвращает нам идентификатор первого попавшегося на этой линии объекта
; делаем начальные координаты в точке нашено зрителя EntityX(viewer)...
; а сам вектор направляем в игрока (простая геометрия) путем
; вычитания координат EntityX(player)-EntityX(viewer)...
Pickentity=linepick(EntityX(viewer),EntityY(viewer),EntityZ(viewer), EntityX(player)-EntityX(viewer),EntityY(player)-EntityY(viewer),EntityZ(player)-EntityZ(viewer))

; приравниваем координаты вывода текста к нулю
px#=0
py#=0
; если игрок находится в видимости камеры и
; он является первым на линии просмотра от viewer до player (ничего другого на пути нет,
; иначе в Pickentity будет другой объект, за который игрок спрятался и условие не сработает
; ТО
if EntityInView(player,camera) And Pickentity=player
; записываем в px и py координаты вывода имени персонажа на экран
 cameraproject(camera,EntityX(player),EntityY(player),EntityZ(player))
 px=ProjectedX()
 py=ProjectedY()
endif

; тут думаю понятно, по клавишам перемещаем игрока по полю
if KeyDown(200) Then TranslateEntity player,0,0,1
if KeyDown(208) Then TranslateEntity player,0,0,-1

if KeyDown(205) Then TranslateEntity player,1,0,0
if KeyDown(203) Then TranslateEntity player,-1,0,0


; прорисовываем мир
renderworld

; теперь смотрим если какаянибудь координата отлична от нуля,
; значит сработало условие (см. выше) значит объект находится в поле зрения камеры
; и в поле зрения зрителя, значит выводим его имя на экран
if px or py Then
 Color 255,0,0
 Text px,py,"Player"
 Color 255,255,255
endif

; меняем буфер обмена
flip

; закрываем цикл
until KeyHit(1)

; конец программы
end


SubZer0 19.09.2005 07:48

ну как?? помогло?? :) :) :rolleyes: :rolleyes:

KRIK 19.09.2005 12:16

Ну если чесно НУ ОЧЕНЬ СИЛЬНО ПОМОГЛО!!!!!!!!! :glag: :glag: :glag:


:)) :)) :))


Ну если чесно я чёто не понял как я запакованный файл прицеплю к соопщению? :dontknow:

SubZer0 19.09.2005 14:06

чето правда косяк какой-то... в других форумах можно прицеплять, а в этом нет.... разберемся... :)

спустя пару секунд

уже разобрался.... можно выливать... :) :)

KRIK 19.09.2005 14:53

КАК Я ТО НЕ ЗНАЮ??? :SOS:

ПОДСКАЖИКА НА ЧЁ НАЖАТЬ!!!

KRIK 19.09.2005 14:55

А ща скину погодь! :ok:

KRIK 19.09.2005 15:04

Вложений: 2
Сдесь находится файлы для :
Код:

robot = LoadAnimMesh( "C:\MODELI\My models\ROBOT\robotic.3ds" )
LoadAnimSeq robot, ("C:\MODELI\My models\ROBOT\running.3ds" )


KRIK 19.09.2005 15:06

Вложений: 2
Здесь для
Код:

grunt=LoadTexture("C:\IGRA\samples\anim\makbot\Panels.jpg")

KRIK 19.09.2005 15:07

Вложений: 2
И наконец здесь для
Код:

level=LoadMesh ("C:\IGRA\MAPS\TUR.3ds")

KRIK 19.09.2005 15:10

Ну вот я всё выложил, посмотри и чё там надо сделать как я писал изначально, напешии (КАК КОД ИЗМЕНИТЬТ!) Желательно весь код сразу напеши!

impersonalis 19.09.2005 16:40

конструкцию
Код:

movemouse GraphicsWidth()/2,GraphicsHeight()/2
следуект заменить на
Код:

movemouse GraphicsWidth()*.5,GraphicsHeight()*.5
уже обсуждалось почему

SubZer0 19.09.2005 17:14

Вложений: 2
изменил код, как и просили...

сам код:

Код:

Graphics3D 1024,768,32,1

l = CreateLight()
RotateEntity l, 0, 45, 45
level=LoadMesh ("MAPS\TUR.3ds")
grunt=LoadTexture("Panels.jpg")
EntityTexture level,grunt
PositionEntity level,0,-7,0
ry# = -8
dy# = 0
If KeyDown(57) Then
If ry# = -8 Then dy# = 0
EndIf
ry# = ry# + dy#
dy# = dy# - 0.1
If ry# < -8 Then ry# = -8: dy# = 0
robot = LoadAnimMesh( "ROBOT\robotic.3ds" )
LoadAnimSeq robot, ("ROBOT\running.3ds" )
ScaleEntity robot, 0.4, 0.4, 0.4


camobject=createsphere(4,robot)
entityalpha camobject,0
positionentity camobject,0,0,0

cam = CreateCamera(camobject)


CameraRange cam, 5,2000
CameraFogColor cam, 0,128,255
CameraFogRange cam, 1,1000
camerazoom cam,1
cZoom#=1

PositionEntity cam, 0, 60, 40
RotateEntity cam, 30, 180, 0
EntityType robot,1
EntityRadius robot, 0
EntityType level,2

Collisions 1, 2,2, 2


cub=CreateCube()
PositionEntity cub,10,5,10
cub3=CreateCube()
PositionEntity cub3,10,5,-10
ScaleEntity cub3 ,10, 10, 10
cone=CreateCube()
PositionEntity cone,5,5,10
;golova=CreateSphere ()
;PositionEntity golova ,10,10,30


entitypickmode cone,2
entitypickmode cub,2
entitypickmode cub3,2
entitypickmode robot,2

rx# = 10
ry# = -8
rz# = 30
dy# = 0
ang = 90
Repeat
PositionEntity robot, rx#, ry#, rz#
RotateEntity robot, 0, ang + 90, 0
If KeyDown(57) Then
If ry# = -8 Then dy# = 3
EndIf
ry# = ry# + dy#
dy# = dy# - 0.1
If ry# < -8 Then ry# = -8: dy# = 0
If KeyDown(17)
If AnimSeq(robot) = 0 Then Animate robot, 1, 0.5, 1, 10
rx# = rx# + Cos(ang) * 0.5
rz# = rz# + Sin(ang) * 0.5
Else
If AnimSeq(robot)=1 Then Animate robot, 2, 1, 0, 10
EndIf


angy#=MouseYSpeed()/2
moveEntity cam, 0, angy, 0


;==============================


ang = ang - MouseXSpeed()/1.5



;======================================================================= ==
PointEntity cam,robot
If KeyDown(44) Then MoveEntity cam,0,-0.5,0
If KeyDown(45) Then MoveEntity cam,0,0.5,0
If KeyDown (46) Then MoveEntity cam,0,0,-2
If KeyDown(47) Then MoveEntity cam,0,0,2

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

If KeyDown(203) Then ang = ang + 3
If KeyDown (205) Then ang = ang - 3
If KeyDown (208) Then anglex = anglex + 3
If KeyDown(1) Then Exit

cZoom=cZoom+MouseZSpeed()*0.5
camerazoom cam,cZoom


;If KeyDown (2) TurnEntity cam,2,0,0
;If KeyDown (42) Then CameraZoom cam, 1.5
;If Not KeyDown (42) Then CameraZoom cam,1
;If KeyDown (54) Then CameraFogMode cam,1
;If Not KeyDown (54) Then CameraFogMode cam,0


UpdateWorld
RenderWorld
;-----------------------------------------------------------------------------------------------
If EntityInView(cone,cam) And linepick(EntityX(cam,True),EntityY(cam,True),EntityZ(cam,True), EntityX(cone)-EntityX(cam,True),EntityY(cone)-EntityY(cam,True),EntityZ(cone)-EntityZ(cam,True))=cone
 cameraProject(cam,EntityX(cone),EntityY(cone),EntityZ(cone))
 Color 0, 0, 128 :Text ProjectedX#(),ProjectedY#(),"Bordos"
End If
;====================================================
If EntityInView(cub,cam) And linepick(EntityX(cam,True),EntityY(cam,True),EntityZ(cam,True), EntityX(cub)-EntityX(cam,True),EntityY(cub)-EntityY(cam,True),EntityZ(cub)-EntityZ(cam,True))=cub
 CameraProject(cam,EntityX(cub),EntityY(cub),EntityZ(cub))
 Color 0, 128, 0:Text ProjectedX#(),ProjectedY#(),"Wiliams"
EndIf
;=====================================================

Flip
Forever

end

а тут можешь скачать рабочую версию.... там только с Зумом поиграться надо, чтоб настроить

alcosholik 19.09.2005 20:30

xxxKRIKxxx
Просьба запаковывать ВСЕ выкладываемые файлы в ОДИН архив.

KRIK 20.09.2005 13:58

alcoSHoLiK Ну зачем, просто качай ссылку которую выложил

SubZer0 ТАМ ВСЕ ФАЙЛЫ :super:

И кстати БОЛЬШОЕ СПАСИБО SubZer0 :)) !!!

KRIK 20.09.2005 14:37

Да :glag: я наверно вас уже достал, но у меня есть ещё несколько вопросов:

1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???

2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???

3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???

:SOS: :SOS: :SOS:

SubZer0 20.09.2005 15:00

Цитата:

Originally posted by xxxKRIKxxx@Sep 20 2005, 12:37 PM
Да :glag: я наверно вас уже достал, но у меня есть ещё несколько вопросов:

1.Почему когда я отважу дальше камеру ( НА КОЛЁСИКО ) всё становится вытенутым, каким-то кривым???Можно ли от этого избавиться???

2.Можно ли сделать так, чтобы когда мой герой убегал к примеру на 10 (метров образна говоря) от кубиков их имена(кубиков) изчезали???

3.И можно ли сделать так, чтобы имена кубиков были написанны на чёрном(тёмном) прозрачном фоне(по размеру с сомо имя)???

:SOS: :SOS: :SOS:

Нет, еще нет, и не сможешь, мы тут для этого и форум замутили... B)

на счет первого:

помоему (насколько я помню) это все называется перспективным просмотром, оно и в нормальном состоянии кубик смотрится не как кубик а как паралелограмм, что и придает трехмерность изображению, что если взять кубик и отнести его маленько влево, то мы увидим правый бок, а если маленько вправо то левый...

лично я советую Зумом только приближать чтото, типа в бинокль смотришь, а на счет отдаления, тут лучше позицию самой камеры менять, а иначе все получается как через увеличительное стекло...

на счет второго: есть теорема пифагора (покажу на моем старом примере)
Код:

graphics3d 800,600,32,2
setbuffer backbuffer()

camera=createcamera()
positionentity camera,0,20,-50

rotateentity createlight(),0,20,40

cube=createcube()
positionentity cube,0,0,20
scaleentity cube,5,10,5
entitypickmode cube,2

player= CreateCube()
entitycolor player,50,250,50
scaleentity player,3,3,3
entitypickmode player,2

viewer = CreateSphere()
positionentity viewer,0,16,-45

repeat

Pickentity=linepick(EntityX(viewer),EntityY(viewer),EntityZ(viewer), EntityX(player)-EntityX(viewer),EntityY(player)-EntityY(viewer),EntityZ(player)-EntityZ(viewer))

px#=0
py#=0
if EntityInView(player,camera) And Pickentity=player
cameraproject(camera,EntityX(player),EntityY(player),EntityZ(player))
px=ProjectedX()
py=ProjectedY()
endif

if KeyDown(200) Then TranslateEntity player,0,0,1
if KeyDown(208) Then TranslateEntity player,0,0,-1

if KeyDown(205) Then TranslateEntity player,1,0,0
if KeyDown(203) Then TranslateEntity player,-1,0,0


renderworld

; вычисляем расстояние по теореме пифагора
xd=abs(EntityX(player)-EntityX(viewer))
yd=abs(EntityY(player)-EntityY(viewer))
zd=abs(EntityZ(player)-EntityZ(viewer))
r=Sqr(xd*xd+yd*yd+zd*zd)

; проверяем, если оно меньше 200 то показываем имя
if r<200
 if px or py Then
 Color 255,0,0
 Text px,py,"Player"
 Color 255,255,255
 endif
endif

flip

until KeyHit(1)

end


на счет третьего:

чесно сказать никогда не пробовал, но первое что пришло в голову, юзать свой графический шрифт, или просто просчитывать и рисовать сначала квадратик (прямоугольник) фона а потом на нем текст..

;) ;) ;)

Жека 20.09.2005 15:04

1. побочные эффекты масштабирования, наверное...
Исправить не знаю как.

2. проверяй расстояние от героя (или камеры) до кубиков. Если оно стало БОЛЬШЕ 10 (или любого другого НУЖНОГО значения), то НЕ выводи имена.
То же самое, но по-другому: выводи имена ТОЛЬКО если кубики БЛИЖЕ заданной дистанции.

3. Можно использовать библиотеку для рисования полупрозрачных рисунков + шрифт-картинку... (2д вариант)
Или сделать картинки с именами объектов и натянуть их на спрайты, и сделать спрайты полупрозрачными, + масштабировать спрайты в зависимости от длины имени, + сделать их "детьми" для соответствующих кубиков (3д вариант).

Второй вариант проще сделать. Или нет? Сам-то я пока не делал такое, но должно работать.
2 должен быть быстрее, потому что 3д...

Жека 20.09.2005 15:10

Насчет первого SubZer0 правильно сказал, я-то думал там что-то сверхестественное творится.

Рисовать прямоугольник, а сверху текст - самое простое.
Но:
1. как сделать прямоугольник полупрозрачным?
2. команда Text медленно выполняется! Надо иметь это ввиду...

KRIK 20.09.2005 15:31

А ха точно самое главное-то забыл написать. :wallbash:

4.Я тут думал как сделать умную камеру, чтоб камера не опускалась ниже уровня и сквозь стены не прохадила(при тотм если учесть что тур не ровный , а где-то есть впадины, а где-то и высоты) ,но так толком и не чё ни сделал.Я возможно знаю, что вы скажете смотри пример CASTLE вроде он так назывался, но я вас предупреждаю я там ни чё ни понел:wallbash: :wallbash: :wallbash: . :SOS: :SOS:

5.И практически таже проблема с героем(как он прыгает от уровня -7 до уровня 3 по высоте,так и прыгает) как сделадь чтоб он прыгал на +7 по высоте несмотря на то где он находится(В НИЗУ ИЛИ В ВЕРХУ)!!! :wallbash: :SOS: :SOS: :SOS:

Жека 20.09.2005 15:48

Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.

Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.

ПС: извиняюсь, что ни строчки кода не даю. Суть я передал как смог, кто хочет кодом помочь - помогите (сделать все это довольно просто, но новички (без обид) могут и не въехать).

..::SERGO::.. 20.09.2005 16:39

Наверно ща напишу бред :dontknow: но все таки :glag: (просто хотелось высказатьза за пару дней)
Ето чтобы текс уберался :rolleyes:
:o'' if entitydistance(pl,NPC) > 10 then ClearAllActions :o''
или что-то в етом духе :))

Жека 20.09.2005 17:08

так ты что, два дня молчал что ли? :)

Типа псевдокода, но ты выбрал первый вариант. Я же НАСТОЯТЕЛЬНО советую делать по второму, т.е. именно если МЕНЬШЕ

if (entitydistance(hero,NPC)<MAX_RANGE)
;берем проекцию объекта на камеру
;выводим текст в полученных координатах
;это 2д

;для 3д
;showentity sprite_name_npc или
;entityvisible sprite_name_npc
;масштабируем спрайт в зависимости от расстояния до камеры (чтобы он
;не получился слишком маленьким либо слишком большим)
endif

KRIK 20.09.2005 18:11

Цитата:

Чтобы камера, герой и прочие объекты не проходили через другие объекты, нужно назначить для них коллизии.
Если с героем все относительно просто, то с камерой посложнее: может получиться так, что камера "зацепится" за какое-то препятствие, и игрок отдалится от нее (или приблизится). Поэтому необходимо следить за расстоянием от героя до камеры, и если оно не равно какому-то эталонному, то сделать его таковым.
Неровности: высоту камеры над уровнем земли проверяешь, используя команду LinePick. С ее помощью ты получишь координату Y (x,z) "над" камерой, т.е. высоту холма (впадины). Затем проверяешь расстояние от найденной высоты до камеры, если больше эталонного, то уменьшаешь (двигаешь камеру вниз), меньше - увеличиваешь.

Прыгать надо не от координаты, а от поверхности земли, тогда прыжок будет одинаковый по высоте.


Жека! или КТО-НИБУДЬ! Напешите элементарный примерчик ПОЖАЙЛУСТА,а то я примерно знаю чё делать, а чё точно не имею понятия, ну на примере лучше я въезжаю,а не на словах!

Жека 20.09.2005 20:19

Вложений: 1
Вобщем, я написал пример, часть взял из того, что выложил SubZer0.
Придется тебе его переделать под свои нужды, у меня времени нет, проще и быстрее было сделать то, что я сделал...
Комментарии я проставил. Не очень подробные, но все же.
Если что не понятно, спрашивай.


Фичи:
-робот не проходит сквозь большой кубик
-робот не проходит сквозь землю
-камера не проходит сквозь землю
-камера не проходит через большой кубик
-имена кубиков пишутся, если расстояние от них до робота меньше 100
-имена кубиков пишутся, если есть прямая видимость между ними и роботом (добавил преграду для видимости - большой куб, земля как преграда была до меня)

SubZer0 20.09.2005 20:42

Цитата:

Originally posted by SERGO@Sep 20 2005, 02:39 PM
Наверно ща напишу бред :dontknow: но все таки :glag: (просто хотелось высказатьза за пару дней)
Ето чтобы текс уберался :rolleyes:
:o'' if entitydistance(pl,NPC) > 10 then ClearAllActions :o''
или что-то в етом духе :))

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

Жека 20.09.2005 21:57

SubZer0, все ты правильно написал, осталось только запихнуть теорему в функцию и назвать ее EntityDistance ;)
Но твой вариант более общий, так как позволяет считать в любой из плоскостей, в 3д или по отдельной оси.
Ведь бывают случаи, когда надо посчитать расстояние только в плоскости XOZ, для этого из твоего кода убираем yd и все!
А "ентитидистанс" не упростить....

jimon 20.09.2005 22:28

хочу заметить что entitydistance тормозит иногда :o''

Diplomat 20.09.2005 22:31

Однако ж практика показывает, что "встроенный" ЁнтитиДистанс работает на порядок (!) быстрее, чем расчет из кода через теорему Пифагора. Так что при необходимости расчитать дистанцию между двумя обьектами по проекциям на плоскости, логично использовать дополнительный пивот, размещаемый по законам проекции одного обьекта на одной плоскости со вторым...

KRIK 21.09.2005 04:29

Жека! ну всё практически, как я и хотел(ну чучуть надо настроить)!!! :bravo:
А на счёт SubZer0 (zoom) я тоже прикол в игре придумал!!! :bravo:

НУ ВООБЩЕМ НАЧАЛО ИГРЫ УЖЕ ЕСТЬ! :)) :super:

KRIK 21.09.2005 13:46

ДА, я так и знал , что это не последний вопрос по этому коду:

Как в коде ЖЕКИ сделать вместо
Код:

If KeyDown(44) Then TranslateEntity cam,0,-0.5,0
If KeyDown(45) Then TranslateEntity cam,0,0.5,0
If KeyDown (46) Then MoveEntity cam,0,0,-1
If KeyDown(47) Then MoveEntity cam,0,0,1

чтоб это всё мышкой управлялось.

Не знаю раньше получалось, а ща пустить под мышку не могу :SOS:

KRIK 21.09.2005 15:18

НУ чё никто не знает?

SubZer0 21.09.2005 15:53

ты про это?

Код:

angy#=MouseYSpeed()*0.5
moveEntity cam, 0, angy, 0

angz#=MouseZSpeed()
moveentity cam,0,0,angz

MoveMouse GraphicsWidth()*0,5, GraphicsHeight()*0,5

;)

KRIK 22.09.2005 14:50

Там про это говорят, что заданно много параметров (Too many parameters вроде так) и ещё когда мышкой из стороны в сторону двигаешь,КАМЕРА удаляется от оъекта :( .


Цитата:

angy#=MouseYSpeed()*0.5
moveEntity cam, 0, angy, 0

angz#=MouseZSpeed()
moveentity cam,0,0,angz
MoveMouse GraphicsWidth()*0,5, GraphicsHeight()*0,5


KRIK 22.09.2005 14:53

Ну кто - что предложит???

KRIK 22.09.2005 14:55

Цитата:

и ещё когда мышкой из стороны в сторону двигаешь,КАМЕРА удаляется от оъекта .


СМЫСЛЕ если MoveMouse GraphicsWidth()*0,5, GraphicsHeight()*0,5 заменить на MoveMouse GraphicsWidth()/2, GraphicsHeight()/2

SubZer0 22.09.2005 15:08

сильно много параметров потому, что там запятые стоят... (эт я уже в броузере поставил... косяк)

Код:

angy#=MouseYSpeed()*0.5
moveEntity cam, 0, angy, 0

angz#=MouseZSpeed()
moveentity cam,0,0,angz
MoveMouse GraphicsWidth()*0.5, GraphicsHeight()*0.5

:)

Жека 22.09.2005 15:12

Блин, зырь внимательнее:

Цитата:

MoveMouse GraphicsWidth()*0,5, GraphicsHeight()*0,5
SubZer0 допустил опечатку, вместо точек написал запятые в числа 0(запятая)5, а надо 0(точка)5. А ты сразу делить...

Напрягай мозги !(это не оскорбление).
Ко всему готовому быстро привыкаешь, а пользы от этого потом станет не ноль, а еще меньше!

Жека 22.09.2005 15:13

Ответ появился пока я писал...

KRIK 22.09.2005 15:29

Да прикинь и я забыл про это и тоже писал запятыми и до того как мне написали этот пример неправельный :lol: .Ну не чё буду внимательней! :))

KRIK 22.09.2005 15:37

Стоп! :blink: А чё сделать то чтоб камера вверх не двигалась при движении мышки???(Вверх ну примерно с каждым движением на 0.3)???

Жека 22.09.2005 16:38

xxxKRIKxxx! Я предлагаю тебе самому во всем разобраться.
Т.е. ты пробуешь сделать и так и сяк, если не выходит то_что_хочешь, пиши в форум, а то некрасиво получается, когда каждую "мелочь" спрашиваешь, до решения которой и сам мог дойти...

KRIK 26.09.2005 04:51

Не понимаю почему камера постепенно двигается вверх при этом коде :'((
Хотел c начала это заменять и TurnEntity и RotateEntity но т.к. в моём коде есть
PointEntity это не пройдёт.Да довольно тупой вопрос покажется для кого-то,но я новичок в Blitz3D.


Чем можно заменить или как исправить этот код чтоб ВСЁТАКИ камера не двигалась вверх(не забывайти что есть PointEntity камеры на робота)???Если вы не чё ни понимаете,то возьмити и на примере сами попробуйте вставить этот код и резко поводить мышкой,вы увидите как камера постепенно двигается вверх. :SOS:

Код:

angy#=MouseYSpeed()*0.5
moveEntity cam, 0, angy, 0


Жека 26.09.2005 06:48

Цитата:

angy#=MouseYSpeed()*0.5
moveEntity cam, 0, angy, 0

Так тут ты сам двигаешь ее по оси Y....
У SubZero было moveentity cam,0,0,angz - то есть он двигал по Z.
Но так как камера стоит не горизонтально из-зи ПоинтЕнтити, то она вверх-вних двигалась.

Чтобы проще было работать с камерой, сделай для нее свою систему координат - Pivot

camPiv = createpivot()
cam = createcamera(camPiv)

Теперь у тебя камера будет двигаться относительно camPiv.
Вместо передвижения камеры теперь передвигай camPiv, а саму камеру только поворачивай:

d_yaw# = entityyaw(camPiv,player) ;точно не помню название команды, вобщем она должна возвращать угол между игроком и камерой по оси Y
turnentity camPiv,0,d_yaw#,0
pointentity cam,player

Так ты повернешь canPiv мордой к игроку ТОЛЬКО по оси Y, это надо чтобы потом двигать его по Z (вобщем, в ГОРИЗОНТАЛЬНОЙ плоскости), а камера будет смотреть на игрока как раньше (должна ;) )

Если теперь тебе надо двигать камеру, то двигай camPiv
angy#=MouseYSpeed()*0.5
1. moveEntity camPiv, 0, angy, 0 - вверх / вниз
2. moveEntity camPiv, 0, 0, angy - ближе / дальше по отношению к игроку

Раз тебе не надо вверх, то используй 2.

Жека 26.09.2005 06:52

ПС: если надо двигать ТОЛЬКО по Y, то можно и без Пивота, но вместо moveentity писать translateentity

KRIK 30.09.2005 12:47

Код:

; Load3DSound Example
; -------------------

Graphics3D 640,480
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,1,-10

light=CreateLight()
RotateEntity light,90,0,0

plane=CreatePlane()
ground_tex=LoadTexture("res/KRIHAT.bmp")
EntityTexture plane,ground_tex

cube=CreateCube()
cube_tex=LoadTexture("res/KRIHAT.jpg")
EntityTexture cube,cube_tex
PositionEntity cube,0,1,0

microphone=CreateListener(camera); Create listener, make it child of camera
sound=Load3DSound("C:\Games\CS1.6 ver 1.1.2.4\cstrike\sound\ambience\opera.wav"); Load 3D sound

While Not KeyDown(1)

If KeyDown(205)=True Then TurnEntity camera,0,-1,0
If KeyDown(203)=True Then TurnEntity camera,0,1,0
If KeyDown(208)=True Then MoveEntity camera,0,0,-0.05
If KeyDown(200)=True Then MoveEntity camera,0,0,5

; If left mouse button hit then emit sound from cube
If MouseHit(1) = True Then EmitSound(sound,cube)

RenderWorld

Text 0,0,"Use cursor keys to move about"
Text 0,20,"Press left mouse button to make a sound be emitted from the cube"

Flip

Wend

End


Проблема в том, что я вставляю мелодию OPERA.wav она повторяестя, вставлю же другую мелодию она 1 раз проигрывается и всё :dontknow:

Чё сделать, чтобы и другие мелодии опять повторялись? :SOS:

Жека 30.09.2005 13:09

Написал не очень понятно...

1. Можно поставить "метку зацикливания" в музыкальном редакторе, я не знаю как...
2. Повторное нажатие левой кнопки мыши ;)
3. Если хочешь 1 раз нажать, и чтобы звук повторялся после этого постоянно, то после строчки
sound=Load3DSound("C:\Games\CS1.6 ver 1.1.2.4\cstrike\sound\ambience\opera.wav")
добавь такую строку:
LoopSound sound

Подробнее читай тут (4 пост вроде):Перевод хелпа - Sound/Music

KRIK 30.09.2005 14:14

Ага ясненько посмотрю!

Жека вот ты ещё говорил на TransleteEntity заменить, я пробовал, камера двигается как и надо, но при перемещении вверх и вниз сильно дрыгается (начинает дрыгаться) мож к TransleteEntity ещё чё надо добавить чтоб не дрыгалась камера?

Жека 30.09.2005 18:57

Может дерганье из-за того, что слишком быстро ты ее двигаешь? Попробуй взять значение поменьше для Translate'a...

KRIK 01.10.2005 13:19

Не, хоть я и беру значение меньше камера всеравно дёргается, но меньше и чаще. А если сделать ещё меньше то вооще мышкой считай не вертит :bad: :wallbash:

KRIK 01.10.2005 19:30

B) НУ, КТО - ЧТО ПОСОВЕТУЕТ ???

SubZer0 01.10.2005 19:35

прицепи плиз последнюю версию кода... :)

может там гденить так, что условия друг против друга работают :)

KRIK 02.10.2005 10:31

Вложений: 2
Вто последняя версия кода!

KRIK 02.10.2005 10:41

Блин я чувствительность мышки на компе уменьшил и стало гораздо лучше,но самая маласть ещё осталась (если скорость по у ставить 0.5)

KRIK 02.10.2005 11:57

Да кстати, Blitz поддерживает звук более, чем из 2 колонок?

SubZer0 02.10.2005 18:11

Цитата:

Originally posted by xxxKRIKxxx@Oct 2 2005, 09:57 AM
Да кстати, Blitz поддерживает звук более, чем из 2 колонок?
на сколько я знаю - нет, это если только внешнюю либу юзать.

SubZer0 02.10.2005 18:12

Цитата:

Originally posted by xxxKRIKxxx@Oct 2 2005, 08:31 AM
Вто последняя версия кода!
сделай плиз аттач со всеми ресурсами, чтоб потестить можно было. :)

на первый взгляд вроде ничего глючить недолжно.

KRIK 02.10.2005 18:15

Ну если не знаете или не можете ответить на этот вопрос, ответте на этот

1.Что надо сделать в этом примере чтобы камера смотрела не на сам POINT ENTITY , а чуть выше его ( на 4 выше ) ?

2.В этом примере мой герой бежит назад (просто так настроина камера, MoveEntity,0,0,-1 и вам кажется, что он бежит вперёд),ЧТО надо сделать, чтобы герой бежал вперёд (ну то, что надо изменить moveentity на 0,0,1 и камеру поставить в противоположном направлении,можете не писать) не задом а передом???

KRIK 02.10.2005 18:19

Цитата:

Ну если не знаете или не можете ответить на этот вопрос ...
ССОРИ, пока писал ответ написали

А текстуры и всё-всё что там есть, это я до этого уже выкладывал точнее на какой странице чуть позже скажу.

KRIK 02.10.2005 18:22

Все ресурсы качайте с самой первой страницы этой темы! :glag:

SubZer0 02.10.2005 19:55

хз, у меня камера нормально крутится, вроде без сбоев...

чтоб сделать чтоб камера смотрела не на робота, нужно создать объект на который бы она смотрела, а еще лучше пивот (см код)
Код:

;tipy dlya kolliziy
Const robotType = 1
Const levelType = 2
Const boxType = 3
Const cameraType = 4



Graphics3D 1024,768,32,1

;shrift pokrupnee
font = LoadFont ("arial cyr",20)
SetFont font

l = CreateLight()
RotateEntity l, 0, 45, 45

level=LoadMesh ("MAPS\TUR.3ds")
grunt=LoadTexture("Panels.jpg")
EntityTexture level,grunt
FreeTexture grunt

PositionEntity level,0,-7,0
;typ dlya kollizii
EntityType level,levelType

robot = LoadAnimMesh( "ROBOT\robotic.3ds" )
LoadAnimSeq robot, ("ROBOT\running.3ds" )

ScaleEntity robot,0.5,0.5,0.5
;radius dlya kollizii
EntityRadius robot, 5
;typ dlya kollizii
EntityType robot,robotType


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
rcam=createpivot(robot)
positionentity rcam,0,60,0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

cam = CreateCamera(rcam)
;radius dlya kollizii
EntityRadius cam,5
;typ dlya kollizii
EntityType cam,cameraType

CameraRange cam,0.01,2000
CameraFogColor cam, 0,128,255 *
CameraFogRange cam, 1,1000 *


PositionEntity cam, 0, 15, 120
;RotateEntity cam, 0, 5, 11



cub=CreateCube()
PositionEntity cub,30,5,10

cone=CreateCube()
PositionEntity cone,5,5,10


;bol'shoy kubik
cub3=CreateCube()
ScaleEntity cub3 ,10, 10, 10
PositionEntity cub3,20,5,-30
;typ dlya kollizii
EntityType cub3,boxType


;ystanovka pickov, eto dlya proverki pryamoy vidimosti
EntityPickMode cub,3
EntityPickMode cone,3
EntityPickMode cub3,2
EntityPickMode level,2

;ystanovka kolliziy
Collisions robotType,levelType,2, 3
Collisions robotType,boxType,2, 2

Collisions cameraType,levelType,2, 3
Collisions cameraType,boxType,2, 2




Repeat

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;povorot kamery na robota
PointEntity cam,rcam


angy#=MouseYSpeed()*0.002
TranslateEntity cam ,0,angy, 0
angx#=-MouseXSpeed()*0.5
TurnEntity robot,0,angx,0
angz#=MouseZSpeed()
MoveEntity cam,0,0,angz
MoveMouse GraphicsWidth()*0.5, GraphicsHeight()*0.5


;dvigaem kamery
If KeyDown(44) Then TranslateEntity cam,0,-0.5,0
If KeyDown(45) Then TranslateEntity cam,0,0.5,0
If KeyDown (46) Then MoveEntity cam,0,0,-1
If KeyDown(47) Then MoveEntity cam,0,0,1

;dvigaem robota
If KeyDown(208) Then MoveEntity robot,0,0,1
If KeyDown (200) Then MoveEntity robot,0,0,-1
If KeyDown (203) Then TurnEntity robot,0,1,0
If KeyDown (205) Then TurnEntity robot,0,-1,0



If KeyDown(17)
MoveEntity robot,0,0,-1

If KeyDown(17) If AnimSeq(robot)=0 Then Animate robot, 1, 0.5, 1, 10

Else
If AnimSeq(robot)=1 Then Animate robot, 2, 1, 0, 10
EndIf



If KeyDown(1) Then Exit


UpdateWorld
RenderWorld

;-----------------------------------------------------------------------------------------------
If EntityInView(cone,cam) And LinePick(EntityX(cam,True),EntityY(cam,True),EntityZ(cam,True),EntityX(cone)-EntityX(cam,True),EntityY(cone)-EntityY(cam,True),EntityZ(cone)-EntityZ(cam,True))=cone
;esli blize 100, to pishem imya
        If (EntityDistance (robot,cone)<100)
 *CameraProject(cam,EntityX(cone),EntityY(cone),EntityZ(cone))
 *Color 0, 0, 128 :Text ProjectedX#(),ProjectedY#(),"Bordos",1
        EndIf
       
End If *
;====================================================
If EntityInView(cub,cam) And LinePick(EntityX(cam,True),EntityY(cam,True),EntityZ(cam,True),EntityX(cub)-EntityX(cam,True),EntityY(cub)-EntityY(cam,True),EntityZ(cub)-EntityZ(cam,True))=cub
;esli blize 100, to pishem imya
        If (EntityDistance (robot,cub)<100)
 *CameraProject(cam,EntityX(cub),EntityY(cub),EntityZ(cub))
 *Color 0, 208, 0:Text ProjectedX#(),ProjectedY#(),"Wiliams",1
        EndIf
       
EndIf *
;===================================================== *

;gravitaciya
TranslateEntity robot,0,-1,0

Flip
Forever

End

на счет вперед-назад юзай команду RotateMesh и поворачивай на 180 градусов (скорее всего по оси Y)... (RotateMesh поворачивает информацию о расположении точек и плоскостей объекта, на угол положения самого объекта это не повлияет)

KRIK 03.10.2005 16:31

За всё написанное СПАСИБО, но EntityMesh тоже не помогло. Значит в редакторе 3Д переделовать прейдётся?

impersonalis 03.10.2005 16:44

Цитата:

Originally posted by xxxKRIKxxx@Oct 3 2005, 02:31 PM
За всё написанное СПАСИБО, но EntityMesh тоже не помогло. Значит в редакторе 3Д переделовать прейдётся?
RotateMesh !


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

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