Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

Полёт пули(GLScene)   Найти похожие ветки 

 
_sHaDe_ ©   (2005-04-18 18:52) [0]

Помогите plz с такой проблемой. Допустим у меня на сцене актёр с пушкой , из неё по щелчку мышкой вылетает динамически созданная сфера. Круто объяснил...
Вот как делаю
If click = true then begin
  Sphere:=TGLSphere(GLScene1.Objects.AddNewChild(TGLSphere));
  Sphere.Position:=DummyCube2.Position;
  GetOrCreateInertia(Sphere).TranslationSpeed.SetVector(?,?,?); // как расчитать эти координаты
  click:=false;
  end;
Теперь вроде проблема понятна.


 
DeadMeat ©   (2005-04-18 20:51) [1]

На твоем месте, я бы сделал чуток по другому (в принципе я так и делал)...
Я бы создал сферу не от TGLScene а от этой самой пушки..
Т.е. допустим пушка - это DummyCube2..
Тада делаем:
Sphere:=TGLSphere(DummyCube2.AddNewChild(TGLSphere));

Теперь наша сфера повернута так, как у нас повернута пушка...
Осталось просчитать относительный поворот.. Но это уже зависит от твоей пушки.. Короче проверяй..

Дальше..
Я бы не пользовался Behaviours-ами... Я бы считал где нить в каденсере.. Т.е. двигал бы пули..
for i:=0 to DummyCube2.Children.Count-1 do
with DummyCube2.Children[i] do // можно еще with TGLSphere (DummyCube2.Children[i]) do... Но это зависит от задачи.
begin
end;

А вообще.. Я уже приводил несколько раз свой пример на стрельбу...
Посмотри на http://code.rpro.ru
Конкурс paratrooper

---
...Death Is Only The Begining...


 
XProger ©   (2005-04-18 21:22) [2]

Игру "Снежки" пишешь? ;)
Ато скорость реальных снарядов сравнима со скоростью звука... т.е. ничего ты не увидишь...


 
Alek Aaz   (2005-04-19 03:33) [3]

>Я бы создал сферу не от TGLScene а от этой самой пушки..
А я бы не стал. Скажем едет танк и стреляет на ходу. Если танк после выстрела "подпрыгнет" скажем на кочке, то "подпрыгнет" и снаряд(не дай боже нырнет в какой ровчик). Что есть гон.
Проще вычислить направление, куда пушка направлена.


 
XProger ©   (2005-04-19 13:11) [4]

Alek Aaz, где ты видел танки "выпуливающие" снаряд со скоростью "беременного шмеля"? ;)


 
DeadMeat ©   (2005-04-19 13:14) [5]

Alek Aaz
Бесспорно ты прав.. Об этом я зыбыл.. Я ведь там какие то приколы делал для этого... Щас уже всего и не помню.


 
_sHaDe_ ©   (2005-04-19 16:09) [6]

DeadMeat ©
>Теперь наша сфера повернута так, как у нас повернута пушка...
>Осталось просчитать относительный поворот.. Но это уже зависит >от твоей пушки.. Короче проверяй..

Спасибо щас попробую.
>XProger ©
Неа всего лишь демо со стрельбой.


 
DeadMeat ©   (2005-04-19 16:25) [7]

В свете последнего замечания, лучше чуток изменить.
Добавлять в отдельный даммикуб (все таки... да да... сморосил.. признаю.) и присваивать уже этому снаряду координаты пушки... и ее направления.. Вот что важно.. именно ее направление. Потом уже учитывая его, менять свое.. Ну там подкрутить немного. И уже управлять отдельными снарядами.. Как, я уже писал.


 
_sHaDe_ ©   (2005-04-19 19:42) [8]

DeadMeat
Всё сделал ещё раз всем спасибо


 
_sHaDe_ ©   (2005-04-19 21:14) [9]

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

// наполняю думмикуб при загрузке формы сферами
For i:=0 to 100 do begin
Sphere:=TGLSphere(Pul.AddNewChild(TGLSphere));
end;
// вот это пишу в каденсере
if Button=mbLeft then begin
     for i:=0 to Pul.Count-1 do
      with TGLSphere (Pul.Children[i]) do
     Move(deltatime*100);
    end;
//а это в mousedown в GLSceneViewer
Pul.Position:=DummyCube2.Position;
 Pul.Direction:=DummyCube2.Direction;
 Pul.Up:=DummyCube2.Up;
 Pul.RollAngle:=DummyCube2.RollAngle;

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


 
Домовенок   (2005-04-19 22:04) [10]

> _sHaDe_ (19.04.05 21:14) [9]

> // наполняю думмикуб при загрузке формы сферами
> For i:=0 to 100 do begin
> Sphere:=TGLSphere(Pul.AddNewChild(TGLSphere));
> end;


Нафига создавать столько снарядов при запуске программы!? Создавай сферу в момент стрельбы! Уничтожай снаряд (сферу) после того как он достиг свой цели (столкнулся с целью). А то ты сам себе запарок только нагородишь.


 
Bret   (2005-04-19 23:12) [11]

А как проверить созданную таким образом сферу на столкновения


 
Bret   (2005-04-19 23:13) [12]

А как проверить созданную таким образом сферу на столкновения


 
Домовенок   (2005-04-19 23:36) [13]

> Bret   (19.04.05 23:12) [11]

Так же как и сферу созданную любым другим способом. Перебирать все имеющиеся сферы, можно только в определенной пустышке (DummyCube), и проверять коллизию с необходимым объектом. Да, и не забывать при создании сферы назначать её менеджер столкновений.


 
DeadMeat ©   (2005-04-20 12:01) [14]

Пойдем по порядку:


// наполняю думмикуб при загрузке формы сферами
For i:=0 to 100 do begin
Sphere:=TGLSphere(Pul.AddNewChild(TGLSphere));
end;

Как уже заметили это не обязательно делать так.. Но и не критично.
Однако для удобства лучше все таки создавать перед стрельбой.. Но не в OnMouseDown. Лучше там держать минимум кода. Заведи три переменные (глобальные) типа Boolean: PressedL,PressedR,PressedM (соответственно кнопки мыши: левая, правая, средняя). В OnMouseDown и OnMouseUp давай им нужные значения.
Далее в каденсере (или еще где такого рода) проверяй уже их на нажатие клавиш.. Можно отдельный поток запустить, чтобы этот не тормозить.
Когда (к примеру) PressedL равен True создавай ОДНУ сферу...


// вот это пишу в каденсере
if Button=mbLeft then begin
    for i:=0 to Pul.Count-1 do
     with TGLSphere (Pul.Children[i]) do
    Move(deltatime*100);
   end;

Таким образом (правда если это в каденсере, то откуда у тебя там Button и mbLeft.. разве что если ты уже сделал как я писал выше) ты двигаешь ВСЕ сферы этого Pul.. А раз ты их создал ВСЕ сразу, то и двигаешь тоже ВСЕ сразу без разбора.. А раз у них у всех одинаковые координаты то и вылетает какбы одна сфера.. Хотя вылетают ВСЕ..


//а это в mousedown в GLSceneViewer
Pul.Position:=DummyCube2.Position;
Pul.Direction:=DummyCube2.Direction;
Pul.Up:=DummyCube2.Up;
Pul.RollAngle:=DummyCube2.RollAngle;

Ну тут ты наступил на те грабли, про которые уже писали.. Первый раз я не совсем павильно тебе посоветовал, но потом исправился.. Однако все таки ошибку эту ты допустил..
Ты выставляешь ОБЩИЙ даммикуб (или че там у тебя вместо PUL) каждый раз на новые координаты и на новый Direction.. Учитывая что он является родителем ВСЕХ твоих сфер, то и соответственно меняются их направление и координаты каждый раз при выстреле...


 
_sHaDe_ ©   (2005-04-20 15:44) [15]

Нафига создавать столько снарядов при запуске программы!? Создавай сферу в момент стрельбы! Уничтожай снаряд (сферу) после того как он достиг свой цели (столкнулся с целью). А то ты сам себе запарок только нагородишь.
Я создавал в каденсере. Если проверять через IsKeyDown нажатие левой кнопки мыши то выстраивалась цыпочка следующих друг за другом сфер(ну эт понял почему). Причём движение происходило только если мышь нажата.
А если проверять через TMouseButton то просто выстраивалась бесконечная цыпочка.
А раз ты их создал ВСЕ сразу, то и двигаешь тоже ВСЕ сразу без разбора.. А раз у них у всех одинаковые координаты то и вылетает
какбы одна сфера.. Хотя вылетают ВСЕ..

Короче как понял надо в OnMouseDown так же как в каденсере перебирать Children думмикуба  
with TGLSphere (Pul.Children[i]) do
 Position:=DummyCube2.Position;
  Direction:=DummyCube2.Direction;
 Up:=DummyCube2.Up;
RollAngle:=DummyCube2.RollAngle;
end;

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


 
Bret   (2005-04-20 20:04) [16]

Как сделать огонь при выстреле. Заранее спасибо


 
Домовенок   (2005-04-20 23:07) [17]

> Bret (20.04.05 20:04) [16]

> Как сделать огонь при выстреле.

GLFireFXManager - демок постовляемых с GLScene предостаточно что бы понять как оно работает.

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

Я делал так, при создании объекта в его TagFloat записывал текущее время Cadencer.CurrentTime, после чего в событии Cadencer"a проверял все созданные объекты на их время жизни таким образом:

...
var
 Life: Double;
 i: Integer;
begin  
 for i := 0 to DummyCube1.Count-1 do begin
   // Вычисляем время жизни объекта...
   Life := Cadencer.CurrentTime-TGLSphere(DummyCube1.Children[i]).TagFloat;
   if Life > 5 then begin
     // << здесь удаляем объект
     Break; // << обязательный момент (прерываем цикл)
   end;
 end;
end;


ЗЫ: Эту фишку, кстати, высмотрел, где-то в примерах GLScene. Внимательнее бы все разглядывали демки и куча вопросов отпадали бы сами собой.


 
_sHaDe_ ©   (2005-04-21 13:34) [18]

Домовенок
Спасибо щас попробую.
Ещё вопрос(понимаю что задолбал). У меня сфера летит ровно до тех пор пока я не нажму ещё раз на мышь, тогда создаётся новая сфера, а эта останавливается.
Это в onmousedown

Lclick:=true;
If Lclick=true then
 Sphere:=TGLSphere(Pul.AddNewChild(TGLSphere));
with sphere do begin
 Position:=DummyCube2.Position;
  Direction:=DummyCube2.Direction;
  Up:=DummyCube2.Up;
  RollAngle:=DummyCube2.RollAngle;
end;

Это в каденсере
if Lclick=true then begin
     for i:=0 to Pul.Count-1 do
with TGLSphere(Pul.Children[i]) do begin
       Sphere.Move(deltatime*20);
     end;
    end;


 
Домовенок ©   (2005-04-21 14:29) [19]

> У меня сфера летит ровно до тех пор пока я не нажму ещё раз на мышь, тогда создаётся новая сфера, а эта останавливается.

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


if Lclick=true then begin //<< возможно твоя проблема здесь    
 for i:=0 to Pul.Count-1 do
   with TGLSphere(Pul.Children[i]) do begin
     Sphere.Move(deltatime*20); // << так не правильно
     TGLSphere(Pul.Children[i]).Move(20*deltatime); // << правильно
   end;
end;


Надеюсь теперь  тебе понятно в чем была твоя ошибка? Ты двигал всегда только одну сферу, и то только ту которая созданная не динамически.


 
DeadMeat ©   (2005-04-21 14:31) [20]


if Lclick=true then begin
    for i:=0 to Pul.Count-1 do
with TGLSphere(Pul.Children[i]) do begin
      Sphere.Move(deltatime*20);
    end;
   end;

Вот то, что жирным выделено.. Это оно чего такое? Откуда?


 
DeadMeat ©   (2005-04-21 14:31) [21]


if Lclick=true then begin
    for i:=0 to Pul.Count-1 do
with TGLSphere(Pul.Children[i]) do begin
      Sphere.Move(deltatime*20);
    end;
   end;

Вот то, что жирным выделено.. Это оно чего такое? Откуда?


 
Домовенок ©   (2005-04-21 14:34) [22]

Упс... Еще нашел косяк...
Вот так вот вообще надо:

for i:=0 to Pul.Count-1 do TGLSphere(Pul.Children[i]).Move(20*deltatime);


А то ты вроде и обращаешься в цикле к каждой сфере, но двигаешь всегда одну и туже (см. свой код выше).


 
DeadMeat ©   (2005-04-21 14:36) [23]

Ахаха..
Тока хотел подметить.


 
_sHaDe_ ©   (2005-04-21 16:56) [24]

Вот то, что жирным выделено.. Это оно чего такое? Откуда?
Ой ну эт я вчера нагородил... поздно было, мозг уже спал, а пальцы всё стучали... А вообще это Sphere : TGLSphere;
Короче всё работает вот код
Это в каденсере
for i:=0 to Pul.Count-1 do
   TGLSphere(Pul.Children[i]).Move(deltatime*50);
// эт как Домовенок ©
for u := 0 to Pul.Count-1 do begin
   Life := GLCadencer1.CurrentTime-TGLSphere(Pul.Children[u]).TagFloat;
 if Life > 2 then begin
  TGLSphere(Pul.Children[u]).Free;
  Break;
 end;
 end;

А это в OnMouseDown
If Button=mbLeft then begin
Sphere:=TGLSphere(Pul.AddNewChild(TGLSphere));
  with sphere do begin
  TagFloat:=GLCadencer1.CurrentTime;
   Position:=DummyCube2.Position;
    Direction:=DummyCube2.Direction;
   Up:=DummyCube2.Up;
  RollAngle:=DummyCube2.RollAngle;
 end;
end;

Вот теперь кажись действительно всё. Пули умирают через 2 секунды.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.041 c
14-1121420388
KSergey
2005-07-15 13:39
2005.08.07
Не отображаются создаваемые папки под произвольным пользователем


3-1120108350
anarhi
2005-06-30 09:12
2005.08.07
Oracle и DAC


14-1121228924
Soft
2005-07-13 08:28
2005.08.07
Что произойдет с базой данных Firebird, если мы осуществляем


14-1121326706
Виталий123
2005-07-14 11:38
2005.08.07
Написание драйверов


8-1112171261
mike_o
2005-03-30 12:27
2005.08.07
Конвертер графики





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский