|
3D-программирование Вопросы, касающиеся программирования 3D мира |
21.07.2007, 03:40
|
#1
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Стрельба
Вопщем дело такое:
Чтобы зделать выстрелы почитал темку про FPS
ну вопщем так и зделал, стреляет. Но!
Мои патрны летят только горизонтально, а ведь они вылетают из объекта.
Подскажите как реализовать вылет одного объекта из другого под определённым углом, тоесть под тем углом на который повёрнут объект из которого будет вылетать другой.
Ещё точне: тоесть например есть у меня кубик я вращаю этот кубик во все стороны мышью, и мне нужно чтобы из этого кубика вылетал объект именно туда и под тем углом куда повёрнут этот кубик.
А второе я не знаю как зделать это то, как заставить патроны лететь в прицел, тоесть:
у меня к моему объекту зади привязана камера аля вид от третьего лица, и из этого объекта летят пули, они летят из него прямо, а мне нужно чтобы они летели в прицел, а сам прицел находится над этим объектом.
Вот такие пироги )
Помогите, разъясните.
Желательно сразу кодом.
Заранее спасибо.
|
(Offline)
|
|
21.07.2007, 04:33
|
#2
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Стрельба
Graphics3D 800,600,32
Type s
Field entity
Field upt
End Type
Function s_construct.s(ctrl,ctrl2)
obj.s=New s
obj\entity=CreateSphere(8,ctrl)
EntityParent obj\entity,0
PointEntity obj\entity,ctrl2
obj\upt=-1
Return obj
End Function
Function s_update()
For o.s=Each s
If o\upt=-1
o\upt=MilliSecs()
EndIf
dt=MilliSecs()-o\upt
o\upt=MilliSecs()
MoveEntity o\entity,0,0,dt*0.1
If EntityDistance(o\entity,a)>100
FreeEntity o\entity
Delete o
EndIf
Next
End Function
Global a=CreateCube()
EntityAlpha a,0.5
b=CreateCube(a)
ScaleEntity b,0.25,.25,.25
EntityColor b,100,0,0
MoveEntity b,0,0,3
camera=CreateCamera()
MoveEntity camera,0,0,-15
light=CreateLight()
Color 255,255,0
SetBuffer BackBuffer()
time=MilliSecs()
While Not KeyHit(1)
dtm=MilliSecs()-time
time=MilliSecs()
v#=dtm*0.01
TurnEntity a,v,v,v
If MilliSecs()-tcr>300
s_construct(a,b)
tcr=MilliSecs()
EndIf
s_update()
RenderWorld()
;=
CameraProject camera,EntityX(a),EntityY(a),EntityZ(a)
x1=ProjectedX()
y1=ProjectedY()
CameraProject camera,EntityX(b,True),EntityY(b,True),EntityZ(b,True)
x2=ProjectedX()
y2=ProjectedY()
Line x1,y1,x2,y2
;=
Flip
Wend
End
например.. вообще - можно прилумать немало способов
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
21.07.2007, 20:16
|
#4
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
Чтото всётаки недопонял и теперь встал вопрос:
а как сместить точку создания выстрела?
мне так и надо чтобы птрон вылетал из корабля, но надо чтобы из определённой части, из орудия.
надо сместить место создания патрона
вроди сместить объект ничего сложного нету, но именно в таком коде у меня не получается.
|
(Offline)
|
|
21.07.2007, 20:29
|
#5
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
всё сделал =)
добавил:
MoveEntity obj\entity,100,100,100
в функцию s_construct.s
))
|
(Offline)
|
|
25.07.2007, 15:00
|
#6
|
AnyKey`щик
Регистрация: 11.03.2007
Сообщений: 5
Написано 0 полезных сообщений (для 0 пользователей)
|
Re: Стрельба
Не подскажете а как сделать так чтоб выстрел происходил при нажатие мыше в этом коде:
Graphics3D 800,600,32
Type s
Field entity
Field upt
End Type
Function s_construct.s(ctrl,ctrl2)
obj.s=New s
obj\entity=CreateSphere(8,ctrl)
EntityParent obj\entity,0
PointEntity obj\entity,ctrl2
obj\upt=-1
Return obj
End Function
Function s_update()
For o.s=Each s
If o\upt=-1
o\upt=MilliSecs()
EndIf
dt=MilliSecs()-o\upt
o\upt=MilliSecs()
MoveEntity o\entity,0,0,dt*0.1
If EntityDistance(o\entity,a)>100
FreeEntity o\entity
Delete o
EndIf
Next
End Function
Global a=CreateCube()
EntityAlpha a,0.5
b=CreateCube(a)
ScaleEntity b,0.25,.25,.25
EntityColor b,100,0,0
MoveEntity b,0,0,3
camera=CreateCamera()
MoveEntity camera,0,0,-15
light=CreateLight()
Color 255,255,0
SetBuffer BackBuffer()
time=MilliSecs()
While Not KeyHit(1)
dtm=MilliSecs()-time
time=MilliSecs()
v#=dtm*0.01
TurnEntity a,v,v,v
If MilliSecs()-tcr>300
s_construct(a,b)
tcr=MilliSecs()
EndIf
s_update()
RenderWorld()
;=
CameraProject camera,EntityX(a),EntityY(a),EntityZ(a)
x1=ProjectedX()
y1=ProjectedY()
CameraProject camera,EntityX(b,True),EntityY(b,True),EntityZ(b,True)
x2=ProjectedX()
y2=ProjectedY()
Line x1,y1,x2,y2
;=
Flip
Wend
End
|
(Offline)
|
|
25.07.2007, 15:15
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Стрельба
IMh1=MouseHit(1)
If IMh1
Стрелять
EndIf
|
(Offline)
|
|
30.07.2007, 14:06
|
#8
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
Ну вот у меня как
If MouseHit(1) Then
s_construct(ggkor,prc)
s_constructt(ggkor,prc)
las1()
End If
Вопщем так везде делается )
тут у меня вызывается 2 функции создания выстрелов
(потому что 2 орудия)
а функция las1 проигрывает звук выстрела
Function las1()
PlaySound laser1
End Function
а сам звук выстрела в глобале
Global laser1=LoadSound("Data\sound\laser.wav")
|
(Offline)
|
|
30.07.2007, 16:10
|
#9
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Стрельба
Лучше убрать las1(), хоть и конечно удобнее - кода меньше, но плохо то что вызов функции, а функция в 1 строку. Поэтому лучше не функцию вызывать а сам звук.
|
(Offline)
|
|
30.07.2007, 17:09
|
#10
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
Сообщение от MoKa
Лучше убрать las1(), хоть и конечно удобнее - кода меньше, но плохо то что вызов функции, а функция в 1 строку. Поэтому лучше не функцию вызывать а сам звук.
|
Не могу не согласиться.
но просто я игру строю таким методом что всё в отдельных функциях
а эти функции расположены в файлах
а сами файлы уже вызываются ехешником
я ещё не известно что с las1() функцией тварить буду в будущем
так что оставлю так
|
(Offline)
|
|
30.07.2007, 17:27
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Стрельба
Ну если ещё и в будущем, тогда +1, за то что смотришь вперёд
Но были тесты, и конечно это нужно мнооого раз функций вызивать, но всёже скорость если ещё и параметров побольше от вызова функций может падать. Но я думаю это никому не грозит, тольо если РТС с 2к юнитами, и все ещё друг друга перебирают и много всяких функций юзат, тогда да там и сам блиц умрёт не от функций.
|
(Offline)
|
|
30.07.2007, 18:25
|
#12
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
Да. понимаю )
функции зло )
|
(Offline)
|
|
30.07.2007, 18:29
|
#13
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Re: Стрельба
Нет нет. Функции это круто, только вот функция для 1 строки =) Где нету никакой передачи, и возвращений, ну это просто брутально. Но если она будет больше и Очень часто использоваться тогда её существование оправдывается.
|
(Offline)
|
|
31.07.2007, 10:31
|
#14
|
Легенда
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений (для 568 пользователей)
|
Re: Стрельба
Но если она будет больше и Очень часто использоваться тогда её существование оправдывается.
|
Не факт. Можно и без функций писать, так только вроде код не читабельнее будет.
|
(Offline)
|
|
23.09.2007, 17:15
|
#15
|
Терабайт исходников
Регистрация: 05.07.2007
Сообщений: 5,196
Написано 1,721 полезных сообщений (для 5,374 пользователей)
|
Re: Стрельба
Итак. Систему стрельбы от имперсоналиса использую на своём корабле. Всё прекрасно летает стреляет. Решил заняться юзером, и вот дошло дело до стрельбы юзера. Решил использовать ту же систему. Стрелять то стреляет, но не хочет бить через прицел почемуто. Посмотрите код, что где нетак? Почему патрон не летит через прицел?
;--------------------------------------------------------------------------------------- WORLD:
Graphics3D 1024, 768, 32
SetBuffer BackBuffer()
HidePointer
Global mXSp#
Global mYSp#
Global k1
Global k1u#=0
Global camerauser
Global pushka
Global prck1
Global sostpushka#=0
Global earth
Type s
Field entity
Field upt
End Type
Function k1()
k1 = CreateSphere(30)
ScaleEntity k1,50,50,50
PositionEntity k1,0,180,0
RotateEntity k1, 0, 180, 0
camerauser = CreateCamera(k1)
PositionEntity camerauser,0,0,0
RotateEntity camerauser, 0, 0, 0
CameraRange camerauser,0.01,100000000
End Function
Function pushka()
pushka = CreateCube(camerauser)
ScaleEntity pushka,0.02,0.15,0.03
RotateEntity pushka ,90,6,0
PositionEntity pushka,0.2,-0.2,0.3
pushkatex=LoadTexture("Data\object\weapons\colt\colt5.bmp")
ScaleTexture pushkatex,150,150
EntityTexture pushka,pushkatex
prck1=LoadImage("Data\textures\prc.bmp")
MidHandle prck1
MaskImage prck1,255,255,255
End Function
Global l = CreateLight()
TurnEntity l,30,20,0
Pl= CreatePlane()
earth=LoadTexture("Data\textures\15820652.jpg")
ScaleTexture earth,150,150
EntityTexture Pl,earth
sky=MakeSkyBox("Data\textures\sky")
ScaleEntity sky,1000000,1000000,1000000
Function MakeSkyBox( file$ )
m=CreateMesh()
;front face
b=LoadBrush( file$+"_FR.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,-1,0,0:AddVertex s,+1,+1,-1,1,0
AddVertex s,+1,-1,-1,1,1:AddVertex s,-1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;right face
b=LoadBrush( file$+"_LF.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,-1,0,0:AddVertex s,+1,+1,+1,1,0
AddVertex s,+1,-1,+1,1,1:AddVertex s,+1,-1,-1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;back face
b=LoadBrush( file$+"_BK.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,+1,+1,+1,0,0:AddVertex s,-1,+1,+1,1,0
AddVertex s,-1,-1,+1,1,1:AddVertex s,+1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;left face
b=LoadBrush( file$+"_RT.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,0:AddVertex s,-1,+1,-1,1,0
AddVertex s,-1,-1,-1,1,1:AddVertex s,-1,-1,+1,0,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
;top face
b=LoadBrush( file$+"_UP.bmp",49 )
s=CreateSurface( m,b )
AddVertex s,-1,+1,+1,0,1:AddVertex s,+1,+1,+1,0,0
AddVertex s,+1,+1,-1,1,0:AddVertex s,-1,+1,-1,1,1
AddTriangle s,0,1,2:AddTriangle s,0,2,3
FreeBrush b
ScaleMesh m,100,100,100
FlipMesh m
EntityFX m,9
EntityOrder m,10
Return m
End Function
Function k1u()
XYkrenk1#=0.5
TSpeed#=0.05
mXSp=MouseXSpeed()
mYSp=MouseYSpeed()
TurnEntity camerauser,mYSp*TSpeed#,0,0
TurnEntity k1,0,-mXSp*TSpeed#,0
userbeg#=8
userbeg2#=4
u#=70
If MouseHit(1) Then
s_construct(pushka,prck1)
End If
If KeyDown(30) Then
MoveEntity k1,-userbeg2#,0,0
End If
If KeyDown(32) Then
MoveEntity k1,+userbeg2#,0,0
End If
If KeyDown(17) Then
MoveEntity k1,0,0,+userbeg#
End If
If KeyDown(31) Then
MoveEntity k1,0,0,-userbeg2#
End If
If KeyDown(30) Or KeyDown(32) Or KeyDown(17) Or KeyDown(31) Then
sostpushka#=2
Else
sostpushka#=1
End If
MoveMouse GraphicsWidth()*0.5,GraphicsHeight()*0.5
If Abs(EntityPitch#(camerauser))>u# RotateEntity camerauser,u#*Sgn(EntityPitch#(camerauser)),0,0
If sostpushka#=1 Then
TurnEntity pushka,Sin(MilliSecs()*.0)*0.01,Sin((MilliSecs()+9) *.05)*0.03,Sin((MilliSecs()+500)*.1)*0.005
End If
If sostpushka#=2 Then
TurnEntity pushka,Sin(MilliSecs()*.0)*0.01,Sin((MilliSecs()+9) *.5)*0.3,Sin((MilliSecs()+500)*.1)*0.03
End If
End Function
Function s_construct.s(pushka,prck1)
obj.s=New s
obj\entity=CreateSphere(10,pushka)
EntityColor obj\entity,100,0,0
EntityParent obj\entity,0
MoveEntity obj\entity,0,0,0
RotateEntity obj\entity,180,0,0
ScaleEntity obj\entity,3.5,2.5,2.5
obj\upt=-1
Return obj
End Function
Function s_update()
For o.s=Each s
If o\upt=-1
o\upt=MilliSecs()
EndIf
dt=MilliSecs()-o\upt
o\upt=MilliSecs()
MoveEntity o\entity,0,2,dt*1
If EntityDistance(o\entity,pushka)>50000
FreeEntity o\entity
Delete o
EndIf
Next
End Function
While Not KeyDown(1)
If KeyHit(16) Then
k1()
pushka()
k1u#=1
End If
If k1u#=1 Then
k1u()
s_update()
End If
If KeyHit(18) Then
k1u#=0
FreeEntity pushka
FreeEntity camerauser
FreeEntity k1
End If
UpdateWorld
RenderWorld
If k1u#=1 Then
DrawImage prck1,GraphicsWidth()/2,GraphicsHeight()/2
End If
Flip
Wend
End
Далее разъясню что здесь есть что:
mXSp# и mYSp# - переменные для управления юзера и его камерой.
k1 - юзер
camerauser - сами думаю поняли
pushka - тоже объяснять нечего
prck1 - прицел
sostpushka#=0 - состояние оружия тобиш покачивание, интенсивность покачивания зависит от того стоит персонаж или бежит.
earth - текстура земли
Pl - земля
k1u# - переменная отвечающая за загрузку и удаление функций
Type s - патрон
Function k1() - создание юзера и его камеры
Function pushka() - создание оружия и прицела
Function k1u() - управление юзером
Function s_construct.s(pushka,prck1) - создание патрона
Function s_update() - движение и удаление патрона
If KeyHit(16) - если нажата клавиша Q создаём юзера и оружие и меняем переменную k1u# с 0 на 1
If k1u#=1 - если переменная равна одному включаем управление юзера и функцию полёта патрона
If KeyHit(1 - если нажата клавиша E удаляем юзера с оружием, камеру и выключаем функции управления юзером и полёта патрона
и ещё если If k1u#=1 крепим прицел к центру экрана
Исходняк можно скачать тут - http://ifolder.ru/3454174
Народ, что я упустил???? Почему не бьёт через прицел?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 01:00.
|