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

Fant 18.06.2007 12:40

Скорость
 
Проблема такая

Если увеличиваю кол-во объектов ИИ (врагов) у них добавляется скорость

Код:

For en1.enemy1 = Each enemy1
en1\speed#=.1

If en1\timer#<=10 Then en1\speed#=.1 Else en1\speed#=0

Это кусок кода из функции, которая в главном цикле

Больше en1\speed# нигде особо не фигурирует...я даже не представлляю в чем там трабла?

jimon 18.06.2007 12:59

Re: Скорость
 
где то фигня с таймером, давай всю функцию

Fant 18.06.2007 13:02

Re: Скорость
 
Код:

Function fnUpdateEnemy1()

For en1.enemy1 = Each enemy1

en1\speed#=.1

Local en1_ygol = Int (EntityYaw (en1\obj))

en1\retval = fnWhatVperedi(en1\obj,Int(EntityYaw (en1\obj)))

If (en1_ygol=0) Then
 If (fnWhatVperedi(en1\obj,0)>0) Then en1\Understand_f=1 Else en1\Understand_f=0
 If (fnWhatVperedi(en1\obj,180)>0) Then en1\Understand_b=1 Else en1\Understand_b=0
 If (fnWhatVperedi(en1\obj,90)>0) Then en1\Understand_l=1 Else en1\Understand_l=0
 If (fnWhatVperedi(en1\obj,-90)>0) Then en1\Understand_r=1 Else en1\Understand_r=0
EndIf

If (Abs(en1_ygol)=180) Then
 If (fnWhatVperedi(en1\obj,180)>0) Then en1\Understand_f=1 Else en1\Understand_f=0
 If (fnWhatVperedi(en1\obj,0)>0) Then en1\Understand_b=1 Else en1\Understand_b=0
 If (fnWhatVperedi(en1\obj,-90)>0) Then en1\Understand_l=1 Else en1\Understand_l=0
 If (fnWhatVperedi(en1\obj,90)>0) Then en1\Understand_r=1 Else en1\Understand_r=0
EndIf

If (en1_ygol=90) Then
 If (fnWhatVperedi(en1\obj,90)>0) Then en1\Understand_f=1 Else en1\Understand_f=0
 If (fnWhatVperedi(en1\obj,-90)>0) Then en1\Understand_b=1 Else en1\Understand_b=0
 If (fnWhatVperedi(en1\obj,180)>0) Then en1\Understand_l=1 Else en1\Understand_l=0
 If (fnWhatVperedi(en1\obj,0)>0) Then en1\Understand_r=1 Else en1\Understand_r=0
EndIf

If (en1_ygol=-90) Then
 If (fnWhatVperedi(en1\obj,-90)>0) Then en1\Understand_f=1 Else en1\Understand_f=0
 If (fnWhatVperedi(en1\obj,90)>0) Then en1\Understand_b=1 Else en1\Understand_b=0
 If (fnWhatVperedi(en1\obj,0)>0) Then en1\Understand_l=1 Else en1\Understand_l=0
 If (fnWhatVperedi(en1\obj,180)>0) Then en1\Understand_r=1 Else en1\Understand_r=0
EndIf


Local en1_x = Int((EntityX (en1\obj)/10))
Local en1_z = Int((EntityZ (en1\obj)/10))
         

If (playfield(en1\En1Arx,en1\En1Arz)=5) Then playfield(en1\En1Arx,en1\En1Arz) = 0

playfield(en1_x,en1_z) = 5

en1\En1Arx = en1_x
en1\En1Arz = en1_z

en1\timer#=en1\timer#+en1\speed#
;Необработанный кусок ИИ

 

If en1\timer#<=10 Then en1\speed#=.1 Else en1\speed#=0


If en1\timer#>=10 And  en1\understand_f=0 Then en1\timer#=0

If en1\timer#>=10 And  en1\understand_f=1

        If en1\understand_b=0

.f_dir
 F_dir=Rand(1,4)
Select F_dir

        Case 1
        If en1\ugol=0 Then en1\ugol=180 Else Goto f_dir
        Case 2
        If en1\ugol=180 Then en1\ugol=0 Else Goto f_dir
        Case 3
        If en1\ugol=90 Then en1\ugol=-90 Else Goto f_dir
        Case 4
        If en1\ugol=-90 Then en1\ugol=90 Else Goto f_dir
End Select
       
End If

        If en1\understand_b=1 And en1\understand_f=1

.LR_dir
 LR_dir=Rand(1,6)
Select LR_dir

        Case 1
        If en1\ugol=0 Then en1\ugol=90 Else Goto lr_dir
        Case 2
        If en1\ugol=0 Then en1\ugol=-90 Else Goto lr_dir
        Case 3
        If en1\ugol=180 Then en1\ugol=-90 Else Goto lr_dir
        Case 4
        If en1\ugol=180 Then en1\ugol=90 Else Goto lr_dir
        Case 5
        If en1\ugol=90 Then en1\ugol=180 Else Goto lr_dir
        Case 6
        If en1\ugol=-90 Then en1\ugol=0 Else Goto lr_dir
End Select
       
End If

If en1\understand_b=1 And en1\understand_f=1 And en1\understand_l=1 And en1\understand_r=1 Then en1\ugol=0


End If

MoveEntity en1\obj,0,0,en1\speed#
RotateEntity en1\obj,0,en1\ugol,0


Next

End Function

Напомните мне пожалуйста команду, когда текст пишется над объектом (и следует за ним) вылетело из головы эта команда... - вспомнил. ненужно

Хотел бы этой командой показать (вывести) скорость для КАЖДОГО ои объекта в типе. Там нужны примудрости? как мне показать, что это объект номер такой-то и скорость его такая-то...?

IGR 18.06.2007 13:16

Re: Скорость
 
кстати я тоже встречал такую проблему, но незнаю как ее решить !!
и у меня в коде таймера, насколько я помню, вообще небыло !!

Fant 18.06.2007 13:25

Re: Скорость
 
Цитата:

Сообщение от IGR
кстати я тоже встречал такую проблему, но незнаю как ее решить !!

спасибо за надежду!)

HolyDel 18.06.2007 14:58

Re: Скорость
 
Project-ом его, Project-ом/
Function textentity(ent,text$="bugaga")
cameraproject cam,entityx(ent,1),entityy(ent,1),entityz(ent,1)
text projectedx(),projectedy()-30,text,1,0
end function
да, cam - ето хэндл на камеру. он должен быть глобальным.

Fant 18.06.2007 17:12

Re: Скорость
 
Цитата:

Сообщение от HolyDel
Project-ом его, Project-ом/
Function textentity(ent,text$="bugaga")
cameraproject cam,entityx(ent,1),entityy(ent,1),entityz(ent,1)
text projectedx(),projectedy()-30,text,1,0
end function
да, cam - ето хэндл на камеру. он должен быть глобальным.

Спасибо за комощь по прожеки, а по глобальному вопросу? Хоть что-нитьб? А то они правда очен быстро "ходят"

Fant 19.06.2007 01:19

Re: Скорость
 
мне HolyDel посоветовал для решении проблемы избавиться от твиннинга - но тогда я не смогу контролировать FPS и..и много будет еще потерь!

Тогда мне было предложено юзать дельатайминг!

Подскажите пожалуйста кто знает что это такое и, если можно, какой-нибудь с ним семпл, что бы можно было по нему понять как это работает!

А может есть еще какие-нибудь варианты для решения моей порблемки со скоростью?

jimon 19.06.2007 01:21

Re: Скорость
 
дельта тайминг ето вот что :

dt# = FPS_Stable# / FPS_Current#; fps_stable = 60 для примера
...
move# = speed# * dt#
...
:)
при етом получается что перемещение не зависит от фпс

HolyDel 19.06.2007 01:28

Re: Скорость
 
ну попробуй вынести обновление_врагов1 за цикл, может поможет.

Fant 19.06.2007 09:59

Re: Скорость
 
Цитата:

Сообщение от HolyDel
ну попробуй вынести обновление_врагов1 за цикл, может поможет.

Как за цикл?)

А обновлять-то как?

Fant 19.06.2007 15:35

Re: Скорость
 
Пробовал варианты...что-то не получилось

dt# = FPS_Stable# / FPS_Current#; fps_stable = 60 для примера
...
move# = speed# * dt#

расскажите об этом по подробнее...или еще о чем-нить!

Нужно как-то ... снизить скорость ИИ

HolyDel 19.06.2007 20:48

Re: Скорость
 
за
k=1 to ticks
next
цикл

ЛысыЙ_Чук-Иванчук 19.06.2007 22:06

Re: Скорость
 
CreateTimer(25) тебе в помощь!
25 фпс для любой игры пойдет!!!

Fant 19.06.2007 22:24

Re: Скорость
 
Цитата:

Сообщение от HolyDel
за
k=1 to ticks
next
цикл

Ничего не понял?) это к чему?

Fant 19.06.2007 23:04

Re: Скорость
 
Цитата:

Сообщение от vlad
CreateTimer(25) тебе в помощь!
25 фпс для любой игры пойдет!!!

Так не вышло. Поставил 50 вражеских объектов, так они летали...хотя это, по моему мнению лучше, чем твиннинг

HolyDel 20.06.2007 01:16

Re: Скорость
 
Цитата:

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

Fant 20.06.2007 15:00

Re: Скорость
 
Цитата:

Сообщение от HolyDel
ето к тому что у тебя ета функция вызывается несколько раз, внутри етого цикла, поетому они и движутся быстрее.

Я убра все это и оставил в коде только таймер, как мне и советовали. не помогло

Fant 21.06.2007 11:36

Re: Скорость
 
Кто-нибудь! ПОЖАЛУЙСТА! подскажите мне с этой траблой! Уже который день мучаюсь!!!

ЛысыЙ_Чук-Иванчук 21.06.2007 20:03

Re: Скорость
 
Перепеши ИИ!
Помогает всегда ;)

Fant 22.06.2007 00:13

Re: Скорость
 
Цитата:

Сообщение от vlad
Перепеши ИИ!
Помогает всегда ;)

Зачем? у меня нет проблем с ИИ. У меня проблема со скоростью ИИ. При этом мне не ясно зачем его переписывать!?

H@NON 22.06.2007 15:01

Re: Скорость
 
Цитата:

Сообщение от Fant
Зачем? у меня нет проблем с ИИ. У меня проблема со скоростью ИИ. При этом мне не ясно зачем его переписывать!?

Разве скорость не относится к ИИ? (риторич. вопрос)
Переписывать ниче не надо , просто глянь что ты обрабатываешь в цикле. Попробуй не изменять скорость, а ,допустим, поставить везде значение 1. Или ,как вариант, можно проверить каждую строчку кода и тем самым изловить сей непонятный феномен.

Fant 23.06.2007 00:08

Re: Скорость
 
Цитата:

Сообщение от H@NON
Разве скорость не относится к ИИ? (риторич. вопрос)
Переписывать ниче не надо , просто глянь что ты обрабатываешь в цикле. Попробуй не изменять скорость, а ,допустим, поставить везде значение 1. Или ,как вариант, можно проверить каждую строчку кода и тем самым изловить сей непонятный феномен.

Сделал скорость константой. Все-равно если врагов много они двигаются быстрее! Вообще загадка!

Fant 23.06.2007 00:15

Re: Скорость
 
Причем я никак не могу понять даже ИЗ_за ЧЕГО это!? вроде все ясно, и тем не менее не знаю где можно было напортачить!

alcoSHoLiK 23.06.2007 00:25

Re: Скорость
 
Цитата:

Сообщение от Fant
Сделал скорость константой. Все-равно если врагов много они двигаются быстрее! Вообще загадка!

Так как телепаты в отпуске, для нас это еще большая загадка.

Fant 23.06.2007 00:49

Re: Скорость
 
Цитата:

Сообщение от alcoSHoLiK
Так как телепаты в отпуске, для нас это еще большая загадка.

Намек понял)

Однако код я представлял! Нужен весь исходник?

блин! Просмоатриваю код. Вижу:
If en1\timer#<=10 Then en1\speed#=.1 Else en1\speed#=0

MoveEntity en1\obj,0,0,en1\speed#

---
Все, больше в цикле о скорости ни слова! И надо же! Где-то тупая бага!

Diplomat 23.06.2007 01:33

Re: Скорость
 
Вероятно, ты обновляешь каждого врага не один раз за проход цикла, а пропорционально их количеству. Проверь еще раз структуру своих вложенных циклов.
...
Собственно, эти проблеммы возникают исключительно от нечеткого понимания того, как должна выглядеть завершенная программа (каждый ёё самостоятельный блок) и что она должна делать. Алгоритмика как живая абстракция рулит, абстрактные неигровые задачи и КуВасик- тоже.

jimon 23.06.2007 01:36

Re: Скорость
 
ну гипотетически ... чем больше юнитов тем чаще en1\timer становится <=10 ... копай в ету сторону

ps. или то что сказал Diplomat

HolyDel 23.06.2007 01:49

Re: Скорость
 
Цитата:

Вероятно, ты обновляешь каждого врага не один раз за проход цикла, а пропорционально их количеству. Проверь еще раз структуру своих вложенных циклов.
ага, надо проверить скока раз запускается ф-ия обновления врагов1 за один рендер.
Цитата:

ну гипотетически ... чем больше юнитов тем чаще en1\timer становится <=10 ... копай в ету сторону
неа, дебажили, ету скорость выводил, она полюбому всегда 0.1

Fant 23.06.2007 10:53

Re: Скорость
 
Цитата:

Сообщение от Diplomat
Вероятно, ты обновляешь каждого врага не один раз за проход цикла, а пропорционально их количеству. Проверь еще раз структуру своих вложенных циклов.
...
Собственно, эти проблеммы возникают исключительно от нечеткого понимания того, как должна выглядеть завершенная программа (каждый ёё самостоятельный блок) и что она должна делать. Алгоритмика как живая абстракция рулит, абстрактные неигровые задачи и КуВасик- тоже.

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

А насчет сколько раз обновляю - то ответ - 1. Эта функция - функция обновления - стоит 1 раз в главном цикле

Fant 23.06.2007 10:55

Re: Скорость
 
Цитата:

Сообщение от jimon
ну гипотетически ... чем больше юнитов тем чаще en1\timer становится <=10 ... копай в ету сторону

ps. или то что сказал Diplomat

Так это же для КАЖДОГО юнита...пусть он хоть 0 постоянно для 1 юнита равен. Тогда он стоит. А для друго юнита он же по-любому не 0 ... короче не понял я к чему ты...

Fant 23.06.2007 11:03

Re: Скорость
 
Цитата:

Сообщение от HolyDel
ага, надо проверить скока раз запускается ф-ия обновления врагов1 за один рендер.

неа, дебажили, ету скорость выводил, она полюбому всегда 0.1

И как я это проверю? У меня написано белым по синему, что в главном цикле (его трудн спутать с чем-либо другим) стоит:

Global frametimer=CreateTimer(30)

Repeat
WaitTimer(frameTimer)
Cls
For en1.enemy1=Each enemy1
If (en1\obj<>0) Then fnUpdateEnemy1()
Next

UpdateWorld()
RenderWorld()
Flip(0)
Forever

ну то есть 1 (один) раз!

alcoSHoLiK 23.06.2007 11:31

Re: Скорость
 
Тю, так у тебя вложенный цикл.
Код:

For en1.enemy1=Each enemy1
If (en1\obj<>0) Then fnUpdateEnemy1()
Next

А внутри fnUpdateEnemy1() такой же цикл.

Fant 23.06.2007 12:29

Re: Скорость
 
Цитата:

Сообщение от alcoSHoLiK
Тю, так у тебя вложенный цикл.
Код:

For en1.enemy1=Each enemy1
If (en1\obj<>0) Then fnUpdateEnemy1()
Next

А внутри fnUpdateEnemy1() такой же цикл.

Ты немножко не прав. В функции обновления у меня другой цикл. Цикл
For

Next

Гы) написал спылу ответ! Убрал for ... next, оставив fnUpdateEnemy1() в цикле и все заработало))

HolyDel 23.06.2007 12:53

Re: Скорость
 
Цитата:

И как я это проверю?
я проверял.

Цитата:

Убрал for ... next, оставив fnUpdateEnemy1() в цикле и все заработало))
слава богу, а то ужо надоело говорить что ето у тебя ф-ия вызывается несколько раз за один проход главного цикла.

Fant 23.06.2007 13:39

Re: Скорость
 
Цитата:

Сообщение от HolyDel
я проверял.


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

Странно! Я почему-то думал, что это for next у меня для другого!

Тогда как мне проверить:
Если есть ии на поле, то включать fnUpdateEnemy

Я думал, что тогда я это и проверял...

HolyDel 24.06.2007 01:21

Re: Скорость
 
так:
ttenemys1=0
for en1.enemy1=each enemy1
ttenemys1=ttenemys1+1
next
if ttenemys>0 then updateen1()


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

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