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

Dizels 22.09.2005 10:51

Вот код:
Код:

If EntityCollided( car,TWALL)
sp1=LoadSprite("img\1.bmp")
SpriteViewMode sp1,1
Else
EndIf

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

sp1=LoadSprite("img\1.bmp")(car)
то выдает ошибку, Expectid ENDIF а зачем он там я не понимаю, а уж темболее в какой части он учзусешв :rolleyes: :dontknow: :wallbash:
Кто может помочь?

Жека 22.09.2005 11:32

1. Каждый раз грузить/удалять спрайт накладно.
Загрузи его при старте уровня и спрячь из виду командой HideEntity sp1

2. Привязку непрвавильно пишешь, вот и получаешь ошибку.
Родительский объект должен быть одним из параметров команды LoadSprite, а у тебя он сам по себе...

Попробуй так сделать EntityParent sp1,car (посмотри в хелпе про эту команду, я мог че-нить перепутать)
Этим ты привяжешь спрайт к машине. Теперь ставишь его в нужное место относительно машины командой PositionEntity sp1,x,y,z

там, где проверка на столкновение, делаешь спрайт видимым

если (машина столкнулась со стенкой)
ShowEntity sp1
иначе
HideEntity sp1
конец_если

Dizels 22.09.2005 11:43

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

Dizels 22.09.2005 12:13

Пока Вы думаете над мои вопросом(изложен выше), я задам еще один :):SOS:
Вот код:
Код:

If KeyDown(208)
If speed>0 Then
  EntityParent sp2,car
  ShowEntity sp2
  SpriteViewMode sp2,1
  PositionEntity sp2,x,y,z
        Else
  HideEntity sp2
  EndIf
If speed<0  Then
  EntityParent sp3,car
  ShowEntity sp3
  SpriteViewMode sp3,1
  PositionEntity sp3,x,y,z
        Else
  HideEntity sp3
  EndIf
EndIf

Так вот вопрос, как сделать так чтобы ТОЛЬКО ПРИ нажатии на кнопку(208)спрайты загорались, а то получаеться, что спрайт(sp2) у меня горит как только скорость >0

P.S. Не забудьте о вопросах:
1. со стороной отображения спрайта
2. спрайт рядом с машинкой, подскажи как его подвинуть к ней вплотную

Жека 22.09.2005 12:13

Точно не скажу как сделать(нет блитца под рукой), но есть команда LinePick, которая позволяет получить координаты, так вот делаешь ЛайнПик влево, вправо и вперед. Если команда вернула НЕ НОЛЬ, то она (точнее смежные ей команды) вернет и координаты пересечения воображаемого луча с объектом. Выводи спрайт в этих координатах. Тогда и привязка не нужна к машинке...

Dizels 22.09.2005 12:22

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

Dizels 22.09.2005 12:44

До решения вопроса о нажатии на кнопку(208) я сам додумался :P (мечтал использовать этот смайл) :lol:
На всякий случай если кому-то интересно, вот ответ:
Код:

If KeyDown(208)
If speed>0 Then
  EntityParent sp2,car
  ShowEntity sp2
  SpriteViewMode sp2,1
  PositionEntity sp2,x,y,z
        Else
  HideEntity sp2
  EndIf
If speed<0  Then
  EntityParent sp3,car
  ShowEntity sp3
  SpriteViewMode sp3,1
  PositionEntity sp3,x,y,z
        Else
  HideEntity sp3
  EndIf
[B]Else
HideEntity sp2
HideEntity sp3[/B]
EndIf

Но остаються в силе вопросы:
1. со стороной отображения спрайта
2. спрайт рядом с машинкой, подскажи как его подвинуть к ней вплотную

Жека 22.09.2005 14:43

Вложений: 1
Я написал пример про спрайт на стенке, смотри, должно помочь.
расширение файла необходимо ПЕРЕИМЕНОВАТЬ в RAR!

Цитата:

EntityParent sp2,car
SpriteViewMode sp2,1
PositionEntity sp2,x,y,z

Насколько я понял, эти параметры никогда не меняются, а по сему зови эти функции ТОЛЬКО при создании спрайтов!

Diplomat 22.09.2005 17:37

Не поможет. :blink:
Вот нормальный код, найдите пару десятков отличий. А заодно замерьте во сколько раз повісилась производительность...:lol:
Код:

Graphics3D 1024,768,32,1
SetBuffer BackBuffer()

;ystanovka kolliziy
Const robotType = 1
Const levelType = 2
Const boxType = 3
Const cameraType = 4
Collisions robotType,levelType,2, 3
Collisions robotType,boxType,2, 2
Collisions cameraType,levelType,2, 3
Collisions cameraType,boxType,2, 2

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

;Sun
l = CreateLight(1)
RotateEntity l, 90, 0,0

;Level
level=CreatePlane ()
EntityColor level,0,0,200
PositionEntity level,0,-10,0
EntityType level,levelType

;Robo
robot = CreateCube ()
EntityColor robot,0,200,0
ScaleEntity robot,5,5,5
EntityRadius robot, 6
EntityType robot,robotType

;Camera
cam = CreateCamera(robot)
EntityRadius cam,5
EntityType cam,cameraType
CameraRange cam,0.01,2000;<<NEVER USE SUCH VALUES OR Z-Buffer WILL DIE! USE SOMETHING LIKE (0.1,1000)-MAXIMUM!
CameraFogColor cam, 0,128,255
CameraFogRange cam, 1,1000
CameraClsColor cam,0,128,255;<<FOG COLOR WITHOUT BACKGROUND COLOR HAS NO REASON IN RESULT...

PositionEntity cam, 0, 5, 10

;bol'shoy kubik
cub1=CreateCube()
ScaleEntity cub1 ,1, 10, 100
PositionEntity cub1,25,5,-30
EntityType cub1,boxType
cub2=CopyEntity (cub1)
PositionEntity cub2,-25,5,-30
EntityType cub2,boxType

;iskry ot mashiny
spr1 = LoadSprite ("spr1.bmp")
SpriteViewMode spr1,2
RotateEntity spr1,0,180,90
ScaleSprite spr1,5,5
EntityFX spr1,17

FPSTimer=CreateTimer(60)

;------------------------------------------
;<<MAIN LOOP
While Not KeyHit(1)

;povorot kamery na robota
        PointEntity cam,robot
       
;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 MoveEntity robot,1,0,0
        If KeyDown (205) Then MoveEntity robot,-1,0,0
;gravitaciya
        TranslateEntity robot,0,-1,0
       
;esli zadevaem steny, to risyem iskry
        For coll=1 To CountCollisions(Robot)
 If GetEntityType(CollisionEntity(Robot,coll))=boxType Then
        px# = CollisionX(Robot,coll)
        py# = CollisionY(Robot,coll)
        pz# = CollisionZ(Robot,coll)
        PositionEntity spr1,px#,py#,pz#
        nx# = CollisionNX(Robot,coll)
        ny# = CollisionNY(Robot,coll)
        nz# = CollisionNZ(Robot,coll)
        AlignToVector spr1,nx#,ny#,nz#,3
        MoveEntity Spr1,0,0,0.1
        EntityAlpha spr1,1;<<Hide/ShowEntity cmds is slowly- don't use it in loop
 Exit
 Else
        EntityAlpha spr1,1
 EndIf
        Next
       
        UpdateWorld
        RenderWorld
        Flip(0)
        WaitTimer(FPSTimer)
Wend
End

P.S. Кстати, что делает эта тема в разделе "2Д-программирование" ? :rolleyes:

impersonalis 22.09.2005 19:14

Столкновения мешей со спрайтами можно посмотреть в FAQ - создаём свой FPS : Выстрелы (или аналогичную статью на blitzetc)

Жека 23.09.2005 11:01

Diplomat, спасибо за код (я не знал про GetEntityType, за нее и благодарю).
Насчет раздела мне тоже интересно.

Diplomat 23.09.2005 11:46

Нема за що... :ok:

Dizels 24.09.2005 22:32

А может все таки поясните, а то я чего то не понял!
А тему суда поместил, потомучто спрайт - 2-D изображение.

jimon 24.09.2005 22:37

потомучто оно так и есть :) ето 2д чтука в 3д пространстве, тоесть плоскость в обьеме

Жека 26.09.2005 06:58

Цитата:

А тему суда поместил, потомучто спрайт - 2-D изображение.
Я думал, что все, что делается от лица Graphics3D - это по части 3д программирования независимо от содержания...


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

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