Tempomat / problem z wyłączaniem skryptu

Edytor Arma3 - dyskusje i zapytania o tworzeniu misji, skryptów oraz programowaniu.

Moderator: Inkwizytor

ODPOWIEDZ
mariusz
Posty: 8
Rejestracja: 02 maja 2013, 15:31
ID Steam:

Tempomat / problem z wyłączaniem skryptu

Post autor: mariusz »

Witam. Na początku, jako że jestem na forum nowy, chciałbym przywitać wszystkich forumowiczów.

Moim celem jest stworzenie tempomatu , dzięki któremu dopasujemy prędkość pojazdu do prędkości piechoty z desantu pojazdu.
Przykład : piechota porusza się z podniesioną bronią przy osłonie pojazdu, żeby zachować formację samochód musi jechać ze stałą prędkością 5km/h.
W tym celu posłużyłem się skryptem limitującym prędkość przy pomocy algorytmu :

Kod: Zaznacz cały

//////////////////////////////////////////////////////////////////
// Function file for Armed Assault
// Created by: kylania
//////////////////////////////////////////////////////////////////

// Call this with the following line in the init field of the vehicle.
// this = object to slow.
// 60 = max speed for vehicle.
//
//  = [this, 60] execVM "speedlimit.sqs";

// Pull the object and speed from the execVM.
_vehicle = _this select 0;
_maxspeed = _this select 1;

// Figure current speed.
_curspeed = speed _vehicle;

// If we're going to fast...
if (_curspeed > _maxspeed) then {

// Grab the current velocity and direction of the vehicle.
_vel = velocity _vehicle;
_dir = direction _vehicle;

// Limit it's to bring it back down to the max amount.
_speed = _curspeed - _maxspeed;

// This is math I don't understand, grabbed it from the biki. :)
_vehicle setVelocity [(_vel select 0)-(sin _dir*_speed),(_vel select 1)- (cos _dir*_speed),(_vel select 2)];
	
}; // End of if

// Sleep tenth of a second, this might be too much processing.  I dunno, slower and the ride get jerkier though.
sleep 0.01;

// Call the script again.
_null = [_vehicle, _maxspeed] execVM "speedlimit.sqs";

Tempomat ma posiadać różne wartości limitu (5km/h dla marszu, 13km/h dla szybkiego chodu) i wyzerowanie limitera.

Funkcję realizuję przy pomocy addaction odwołujących się do .sqs z odpowiednimi wartościami funkcji, na przykład:

Kod: Zaznacz cały

_speed = [c1, 100] execVM "speedlimit.sqs";
Problem:
Skrypt przy zmianie wartości prędkości nakłada się jeden na drugi. Próbowałem z terminate i exit , ale mi nie wychodzi.
Szczerze mówiąc w skryptach jestem zielony i nie wiele potrafię zrobić.
Czego szukam:
Potrzebuje wiedzieć , w jaki sposób wyłączę wcześniejsze uruchomienia speedlimit, lub w jaki sposób nadać wartościom stałych w speedlimit.sqs wartości zmiennej , edytowanych przy pomocy sqs
Członek klanu [GTSP] w stopniu Porucznika
Awatar użytkownika
kondor
Posty: 1522
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Tempomat / problem z wyłączaniem skryptu

Post autor: kondor »

Skrypt zaprojektowany jest... dziwnie - ustawia prędkość jednokrotnie, uruchamia sam siebie. Być może powoduje ciągły przyrost zajmowanej pamięci.
Powinna być pętla, którą można zakończyć. Można użyć dwóch zmiennych globalnych lepiej lub set/getVariable na pojeździe, którymi można sterować bieżącą prędkość i czy wyjść ze skryptu
mariusz
Posty: 8
Rejestracja: 02 maja 2013, 15:31
ID Steam:

Re: Tempomat / problem z wyłączaniem skryptu

Post autor: mariusz »

GetVariable "dodaje" prędkości dla pojazdu. Taka funkcja będzie działała jednorazowo. Bardziej będzie się nadawała na dopalacz niż regulację prędkości.

Najlepiej było by zaimplementować skrypt w pętle do momentu wyłączenia tempomatu przez gracza. Ale , jak już mówiłem, nie wiem jak to zrobić.

edit: próbuję dodać while do, ale mi to po prostu nie idzie...
Gdy próbuję dodać pętle skrypt się sypie i nie reaguje. Czy ja to chociaż dobrze robię ?

Kod: Zaznacz cały

//////////////////////////////////////////////////////////////////
// Function file for Armed Assault
// Created by: kylania
//////////////////////////////////////////////////////////////////

// Call this with the following line in the init field of the vehicle.
// this = object to slow.
// 60 = max speed for vehicle.
//
// null = [this, 60] execVM "speedlimit.sqf";

// Pull the object and speed from the execVM.
_vehicle = _this select 0;
_maxspeed = _this select 1;

// Figure current speed.
_curspeed = speed _vehicle;

// If we're going to fast...
if (_curspeed > _maxspeed) then {
do
{

// Grab the current velocity and direction of the vehicle.
_vel = velocity _vehicle;
_dir = direction _vehicle;

// Limit it's to bring it back down to the max amount.
_speed = _curspeed - _maxspeed;

// This is math I don't understand, grabbed it from the biki. :)
_vehicle setVelocity [(_vel select 0)-(sin _dir*_speed),(_vel select 1)- (cos _dir*_speed),(_vel select 2)];
	
} while( obj1 )
 }; // End of if

// Sleep tenth of a second, this might be too much processing.  I dunno, slower and the ride get jerkier though.
sleep 0.1;

// Call the script again.
_null = [_vehicle, _maxspeed] execVM "speedlimit.sqf";
Członek klanu [GTSP] w stopniu Porucznika
Awatar użytkownika
kondor
Posty: 1522
Rejestracja: 13 marca 2007, 11:50
ID Steam: Przemek_kondor
Kontakt:

Re: Tempomat / problem z wyłączaniem skryptu

Post autor: kondor »

mariusz pisze:GetVariable "dodaje" prędkości dla pojazdu. Taka funkcja będzie działała jednorazowo. Bardziej będzie się nadawała na dopalacz niż regulację prędkości.
Miałem na myśli, żeby użyć get/setVariable do przechowania aktualnej wartości prędkości oraz przerwania pętli między dwoma (lub więcej) skryptami tak, żebyś mógł nadpisać prędkość w nowo wywołanym skrypcie i ewentualnie przerwać skrypt, gdy okaże się, że chcesz wyłączyć tempomat.
mariusz pisze: Najlepiej było by zaimplementować skrypt w pętle do momentu wyłączenia tempomatu przez gracza.
Przecież to napisałem właśnie
Ale , jak już mówiłem, nie wiem jak to zrobić.
1. Użyj while-do zamiast do-while (jest czytelniejsze)
2. if (_curspeed > _maxspeed) powinien być wewnątrz pętli
3. przed pętlą wstaw:

Kod: Zaznacz cały

_vehicle setVariable ["tempomat", _maxspeed, false];
co będzie ustawiać nową resetować starą wartość w innym skrypcie
4. w warunku while wstaw isNil albo isNull nie pamiętam:

Kod: Zaznacz cały

while (isNil (_vehicle getVariable "tempomat")) do
4. zamień wystąpienia _maxspeed (oprócz pierwszego) na (_vehicle getVariable "tempomat")
5. żeby całkowicie wyłączyć tempomat trzeba jakoś wywołać

Kod: Zaznacz cały

_vehicle setVariable ["tempomat", nil]
6. obyło się bez drugiego set/getVariable, ale tym sposobem jest uruchomionych kilka skryptów równolegle
ODPOWIEDZ

Wróć do „Edycja - tworzenie misji, skrypty oraz programowanie”