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=3969)

Crystal 21.07.2007 03:40

Стрельба
 
Вопщем дело такое:
Чтобы зделать выстрелы почитал темку про FPS
ну вопщем так и зделал, стреляет. Но!
Мои патрны летят только горизонтально, а ведь они вылетают из объекта.

Подскажите как реализовать вылет одного объекта из другого под определённым углом, тоесть под тем углом на который повёрнут объект из которого будет вылетать другой.
Ещё точне: тоесть например есть у меня кубик я вращаю этот кубик во все стороны мышью, и мне нужно чтобы из этого кубика вылетал объект именно туда и под тем углом куда повёрнут этот кубик.

А второе я не знаю как зделать это то, как заставить патроны лететь в прицел, тоесть:

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

Вот такие пироги )

Помогите, разъясните. :SOS:
Желательно сразу кодом.
Заранее спасибо.

impersonalis 21.07.2007 04:33

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

например.. вообще - можно прилумать немало способов

Crystal 21.07.2007 18:44

Очень тебе благадарен!

Пытаюсь пока разобраться до конца с кодом и подстроить под игру )
Но пока получаются ужасные вещи =))

Зато я теперь знаю как можно будет сделать шлейф от двигателей корабля )

http://img411.imageshack.us/img411/9161/xblcz2.jpg

.....

Уже начинаю понимать что к чему ))

http://img265.imageshack.us/img265/91/xxbluh1.jpg

.....

Всё теперь адназначна разобрался!
Патроны летят под тем углом под которым находится корабль,
и бьют в прицел.

Ещё раз большущее спасибо!

http://img413.imageshack.us/img413/5629/xxxbllx3.jpg

Crystal 21.07.2007 20:16

Re: Стрельба
 
Чтото всётаки недопонял и теперь встал вопрос:
а как сместить точку создания выстрела?

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

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

Crystal 21.07.2007 20:29

Re: Стрельба
 
:pure_magic:всё сделал =)
добавил:

Код:

    MoveEntity obj\entity,100,100,100
в функцию s_construct.s

))

Fray 25.07.2007 15:00

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


moka 25.07.2007 15:15

Re: Стрельба
 
IMh1=MouseHit(1)
If IMh1
Стрелять
EndIf

Crystal 30.07.2007 14:06

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")

moka 30.07.2007 16:10

Re: Стрельба
 
Лучше убрать las1(), хоть и конечно удобнее - кода меньше, но плохо то что вызов функции, а функция в 1 строку. Поэтому лучше не функцию вызывать а сам звук.

Crystal 30.07.2007 17:09

Re: Стрельба
 
Цитата:

Сообщение от MoKa
Лучше убрать las1(), хоть и конечно удобнее - кода меньше, но плохо то что вызов функции, а функция в 1 строку. Поэтому лучше не функцию вызывать а сам звук.

Не могу не согласиться.
но просто я игру строю таким методом что всё в отдельных функциях
а эти функции расположены в файлах
а сами файлы уже вызываются ехешником

я ещё не известно что с las1() функцией тварить буду в будущем
так что оставлю так

moka 30.07.2007 17:27

Re: Стрельба
 
Ну если ещё и в будущем, тогда +1, за то что смотришь вперёд ;)
Но были тесты, и конечно это нужно мнооого раз функций вызивать, но всёже скорость если ещё и параметров побольше от вызова функций может падать. Но я думаю это никому не грозит, тольо если РТС с 2к юнитами, и все ещё друг друга перебирают и много всяких функций юзат, тогда да ;) там и сам блиц умрёт не от функций.

Crystal 30.07.2007 18:25

Re: Стрельба
 
Да. понимаю )
функции зло )

moka 30.07.2007 18:29

Re: Стрельба
 
Цитата:

функции зло )
Нет нет. Функции это круто, только вот функция для 1 строки =) Где нету никакой передачи, и возвращений, ну это просто брутально. Но если она будет больше и Очень часто использоваться тогда её существование оправдывается. ;)

johnk 31.07.2007 10:31

Re: Стрельба
 
Цитата:

Но если она будет больше и Очень часто использоваться тогда её существование оправдывается.
Не факт. Можно и без функций писать, так только вроде код не читабельнее будет.

Crystal 23.09.2007 17:15

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(18) - если нажата клавиша E удаляем юзера с оружием, камеру и выключаем функции управления юзером и полёта патрона

и ещё если If k1u#=1 крепим прицел к центру экрана


Исходняк можно скачать тут - http://ifolder.ru/3454174


Народ, что я упустил???? Почему не бьёт через прицел?


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

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