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

axel186 27.09.2005 19:55

Я думаю что на этот вопрос все знают ответ кроме меня :)
так что помогите мне !

Я делаю шутер, у меня есть аптечка, если я её взял то она должна исчезнуть и мне должны прибавится жизни (пока что всё идёт как надо). А вот вопрос :
Как сделать так чтоб через минуту аптечка опять появилась?

вот мой код :

Код:


Type apteka
 Field obj
End Type

...

a.apteka=new apteka
a\obj=loadmesh("apteka.3ds")
entitytype a\obj,aptekatype
positionentity x#,Y#,z#
return true

...

For s.apteka=Each apteka
TurnEntity s\obj,0,1,0
If EntityCollided(player,aptekatype) <>0
Life#=Life#+50
FreeEntity s\obj
delete s
End IF
Next


SubZer0 27.09.2005 20:36

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

Код:

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

camera=createcamera()
rotateentity camera,45,0,0
positionentity camera,0,50,-50

rotateentity CreateLight(),20,40,0


type ap

 field Xp#
 field Yp#
 field Zp#
 field Time%
 Field entity%

end type

; создаем несколько случайных аптечек
for i=1 To 3
 apt.ap=new ap
 apt\Xp=rnd(-40,40)
 apt\Yp=0
 apt\Zp=rnd(-40,40)
 apt\time=0
 apt\entity=createsphere()
 EntityColor apt\entity,255,100,100
 PositionEntity apt\entity,apt\Xp,apt\Yp,apt\Zp
 EntityType apt\entity,2
next

; создаем игрока
player=createcube()
entitytype player,1

; назначаем коллизии
collisions 1,2,1,1


repeat


 For apt.ap = Each ap
; проверяем, если таймер еще не в нуле, значит аптечки еще нет
; значит нужно уменьшить таймер на 1
 If apt\time>0 Then
  apt\time=apt\time-1
; если таймер после вычитания равен нулю, то пришло время аптечке появиться
  If apt\time=0 Then showentity apt\entity
 EndIf
       
; если игрок столкнулся именно с этой аптечкой, то...
 If EntityCollided(player,2)=apt\entity

; тут добавляешь здоровье
; или еще чего

; скрываем аптечку и пускаем таймер
  HideEntity apt\entity
  apt\time=200
 EndIf
 Next



 if KeyDown(203) Then TranslateEntity player,-0.5,0,0
 if KeyDown(205) Then TranslateEntity player,0.5,0,0
 if KeyDown(200) Then TranslateEntity player,0,0,0.5
 if KeyDown(208) Then TranslateEntity player,0,0,-0.5
 
 UpdateWorld
 RenderWorld
 
 Flip
until KeyHit(1)

end

тут действует такая фича, что к скрытым объектам коллизия не просчитывается. :)

impersonalis 27.09.2005 21:23

Добавлю: не просчитывается также pick и прочее, т.к. HIDE убирает entity из процедуры рендера.

alcosholik 27.09.2005 22:41

Цитата:

Originally posted by impersonalis@Sep 27 2005, 06:23 PM
HIDE убирает entity из процедуры рендера.
Это повсевместно используется в немалых проектах для того, чтобы не рендерить объекты, которые находятся в области видимости камеры, но не видны для игрока.
А чем меньше объектов рендерится в кадре, тем больше FPS.

axel186 28.09.2005 08:49

УРААА!!!!!
ВСЁ РАБОТАЕТ КАК НАДО!!! ВСЕМ СПАСИБО!!!! :ok:

kortesfil 18.10.2005 18:49

а хотябы демо версию своего шутера выложиш?)


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

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