|
3D-программирование Вопросы, касающиеся программирования 3D мира |
19.09.2005, 04:55
|
#1
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
ОБЪЯСНЯЮ ПОДРОБНО, ЧТО МНЕ НАДО!
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
|
(Offline)
|
|
19.09.2005, 07:05
|
#2
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
на первый вопрос:
; устанавливаем графический режим
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
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
19.09.2005, 07:44
|
#3
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
второй вопрос:
я с твоим кодом чето толком не разобрался... ты лучше запакуй код в маленький архив со всеми текстурами и моделями и прицепи к сообщению, можно до 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
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
19.09.2005, 07:48
|
#4
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
19.09.2005, 12:16
|
#5
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
|
(Offline)
|
|
19.09.2005, 14:06
|
#6
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
чето правда косяк какой-то... в других форумах можно прицеплять, а в этом нет.... разберемся...
спустя пару секунд
уже разобрался.... можно выливать...
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
19.09.2005, 14:53
|
#7
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
КАК Я ТО НЕ ЗНАЮ???
ПОДСКАЖИКА НА ЧЁ НАЖАТЬ
|
(Offline)
|
|
19.09.2005, 14:55
|
#8
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
А ща скину погодь!
|
(Offline)
|
|
19.09.2005, 15:04
|
#9
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
Сдесь находится файлы для :
robot = LoadAnimMesh( "C:\MODELI\My models\ROBOT\robotic.3ds" )
LoadAnimSeq robot, ("C:\MODELI\My models\ROBOT\running.3ds" )
|
(Offline)
|
|
19.09.2005, 15:06
|
#10
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
Здесь для
grunt=LoadTexture("C:\IGRA\samples\anim\makbot\Panels.jpg")
|
(Offline)
|
|
19.09.2005, 15:07
|
#11
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
И наконец здесь для
level=LoadMesh ("C:\IGRA\MAPS\TUR.3ds")
|
(Offline)
|
|
19.09.2005, 15:10
|
#12
|
Бывалый
Регистрация: 19.09.2005
Сообщений: 649
Написано 3 полезных сообщений (для 3 пользователей)
|
Ну вот я всё выложил, посмотри и чё там надо сделать как я писал изначально, напешии (КАК КОД ИЗМЕНИТЬТ!) Желательно весь код сразу напеши!
|
(Offline)
|
|
19.09.2005, 16:40
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
конструкцию
movemouse GraphicsWidth()/2,GraphicsHeight()/2
следуект заменить на
movemouse GraphicsWidth()*.5,GraphicsHeight()*.5
уже обсуждалось почему
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
19.09.2005, 17:14
|
#14
|
Администратор
Регистрация: 03.09.2005
Сообщений: 2,408
Написано 301 полезных сообщений (для 996 пользователей)
|
изменил код, как и просили...
сам код:
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
а тут можешь скачать рабочую версию.... там только с Зумом поиграться надо, чтоб настроить
__________________
Как минимум я помог многим (с)
|
(Offline)
|
|
19.09.2005, 20:30
|
#15
|
|
xxxKRIKxxx
Просьба запаковывать ВСЕ выкладываемые файлы в ОДИН архив.
|
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:47.
|