25.05.2012, 10:45 | #21 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Ahja ich hab das game 3 Tage... ich werd mir mal reinziehen was du gezaubert hast. Kann mir jemand das mit dem "private" erklären? Warum muss eine variable in den "innermost scope" ?
Anders ausgedrückt was ist der Unterschied zwischen Code:
f = { private ["_bool"]; _bool = true; _bool }; Code:
f = { _bool = true; _bool }; Geändert von xezon (25.05.2012 um 12:41 Uhr). |
25.05.2012, 14:29 | #23 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Ah ich verstehe. Der _this pointer zeigt auf die Daten so wie sie im Speicher liegen (erstellt vom caller). Das ist so als wären die Parameter einer Funktion call-by-reference und nicht wie oft üblich call-by-value.
Dass das bool b = x==1; hier nicht gehen sollte hat mich auch überrascht nachdem es Psychobastard so anmerkte. In C++ ist es üblich so zu schreiben. Es ist kurz und macht Sinn. Stattdessen könnte man auch schreiben bool b = x==1 ? true : false; aber das ist unnötig, weil das Ergebnis einer Bedingung wird in der Regel auf boolean "geclampt". Wieso? Weil der Rückgabewert des operator== ein boolscher Wert ist. |
25.05.2012, 14:40 | #24 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Funzt vermutlich in den meisten typisierten Hochsprachen bei Methoden auch ganz sexy :
public static bool UschisTest(int var_1, int var_2){ return var_1 == var_2; } Ja, der Sammelbegriff dafür ist "Shortcode". Allerdings ist der Einsatz zwiespältig beliebt. Ich hatte schon lange keinen C++-Compiler mehr bei der Hand, aber auch da sollte der Compiler den Code optimieren. Es macht also ausführungstechnisch keinen Unterschied, lediglich die Call-Länge wird reduziert. Wenn man das aber übertreibt, hat ein Maintainer vllt ab und zu ein Problem und muss nachfragen..beim IF hörts ja nicht auf...ich sag nur Lambda-Expressions und Co. Zorro, für's Einklinken ^^ |
25.05.2012, 15:00 | #25 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Da ist nichts zwiespältiges bei.
Du schreibst ja auch int i = 5*5; * ist eine Funktion als operator* mit dem Rückgabetyp int. Aufgeschlüsselt wär das sowas wie int(5).mult(int(5)) Und genauso machst du das mit bool oder anderen Datentypen. bool b = int(5).equal(int(1)) Absolut logisch und nachvollziehbar. |
25.05.2012, 15:07 | #26 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Zwiespältig deshalb, weil es diversen Coding-Guidelines zuwiderläuft, denen ich bereits begegnet bin und Shortcode keine Vorteile bringt, in verwursteten Ausprägungen aber die Lesbarkeit des Sourcecodes unterlaufen kann. Bei diesen Einzeilern sicherlich noch nicht.
Und da die Compiler heute eh bestens optimieren, sind solche ausgefallenen Akrobatiken wenig sinnführend. Gegen Methodchaining, oder was soll das sein, habe ich nix gesagt ^^ |
25.05.2012, 15:27 | #28 (permalink) |
His Awesomeness!
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
|
Nukular
Ihr C++-Hacker seid da eh nerdiger...verbeugend gemeint. Ich hab die Pointer vor ein paar Jahren verlassen und das Einzige was mich noch daran erinnert ist ab und zu ein 'ref' |
25.05.2012, 16:02 | #29 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Hacken triffts genau , das hab ich die letzten 2 Jahre öfter gemacht.
Um mal wieder zum Thema zu kommen: wenn ich das mit dem private nun richtig verstanden habe müsste das private hier überflüssig sein. _bool wird ja in der function erstellt und is nirgendwo sonst referenziert. Oder?
|
25.05.2012, 16:31 | #31 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Yep. So hab ich mir das vorgestellt. PS: diesen Klammerquatsch um (vehicle _this==_this) kann man sich auch sparen. Klasse Info. Thx! Geändert von Xeno (03.01.2014 um 09:35 Uhr). |
25.05.2012, 16:53 | #32 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Hab dazu in der reference was gefunden unter "local variables". Da stehts besser als bei "private". http://community.bistudio.com/wiki/V...ocal_Variables |
25.05.2012, 20:34 | #34 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
So jetzt funktionierts top für singleplayer
Verbesserungen: - erstellt Atem nur innerhalb Distanz zu Spieler oder Kamera (wenn vorhanden) - erstellt Atem nur wenn Mensch außerhalb Fahrzeug - berücksichtigt Kopfrotation des Menschen (benötigt CBA) Danke für die Hilfe. Code:
breathViewDistance = 300; fnc_getCurrentCamera = { _camera = nearestObject[player, "camera"]; if(isNull _camera) then { player; } else { _camera; }; }; /* unit */ fnc_canBreath = { _isAlive = alive _this; _isOnFoot = vehicle _this == _this; _isClose = (call fnc_getCurrentCamera) distance _this <= breathViewDistance; _isAlive && _isOnFoot && _isClose }; /* [unit, intensity (0 to 1)] */ fnc_breathLogic = { private ["_unit", "_int"]; _unit = _this select 0; _int = _this select 1; _unit setVariable ["hasBreath", 1]; while {_unit call fnc_canBreath} do { sleep (2 + random 2); _source = "logic" createVehicleLocal (getpos _unit); _fog = "#particlesource" createVehicleLocal getpos _source; _fog setParticleParams [["\Ca\Data\ParticleEffects\Universal\Universal", 16, 12, 13,0], "", "Billboard", 0.5, 0.5, [0,0,0], [0, 0.2, -0.2], 1, 1.275, 1, 0.2, [0, 0.2,0], [[1,1,1, _int], [1,1,1, 0.01], [1,1,1, 0]], [1000], 1, 0.04, "", "", _source]; _fog setParticleRandom [2, [0, 0, 0], [0.25, 0.25, 0.25], 0, 0.5, [0, 0, 0, 0.1], 0, 0, 10]; _fog setDropInterval 0.001; _headDir = _unit call CBA_fnc_modelHeadDir; _radius = 0.1; _headX = sin(_headDir select 1)*_radius; _headY = 0.15-sin(abs(_headDir select 1))*_radius; _headZ = (_headDir select 2)/360-0.03; _source attachto [_unit, [_headX, _headY, _headZ], "neck"]; sleep 0.5; deleteVehicle _source; deleteVehicle _fog; }; _unit setVariable ["hasBreath", nil]; }; while {true} do { _camera = call fnc_getCurrentCamera; { _hasNoBreath = isNil {_x getVariable "hasBreath"}; _canBreath = _x call fnc_canBreath; if(_hasNoBreath && _canBreath) then { [_x, 0.03] spawn fnc_breathLogic; } } forEach nearestObjects[_camera, ["Man"], breathViewDistance]; sleep 5; }; |
25.05.2012, 21:56 | #35 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Hmm komischerweise werden Tiere auch angesprochen... scheinen wohl vom Typ "man" zu sein
Da meckert dann das script. Fix: Code:
/* unit */ fnc_canBreath = { _isAlive = alive _this; _isOnFoot = vehicle _this == _this; _isClose = (call fnc_getCurrentCamera) distance _this <= breathViewDistance; _neckArray = _this selectionPosition "neck"; _isHuman = _neckArray select 0 != 0 || _neckArray select 1 != 0 || _neckArray select 2 != 0; _isAlive && _isOnFoot && _isClose && _isHuman }; |
26.05.2012, 03:16 | #36 (permalink) |
Registriert seit: 31.03.2003
Beiträge: 2.533
|
Im CBA gibts nen skript error irgendwo im modelHeadDir callstack. Ich hab den Code mal übersichtshalber ausm CBA addon rauskopiert und in mein script eingefügt. Vielleicht schafft es ein experte zu fixen.
Der Error: Code:
Error in expression <fnc_simplifyAngle; }; fnc_vect2Polar { private ["_mag", "_dir", "_elev", "_vx> Error position: <{ private ["_mag", "_dir", "_elev", "_vx> Error Fehlendes ; File Profiles\...\scripts\breathmanager.sqf, line 31 Error in expression <lect 1))] call fnc_simplifyAngle; }; fnc_vect2Polar { private ["_mag", "_dir"> Error position: <fnc_vect2Polar { private ["_mag", "_dir"> Error Nicht definierte Variable in Ausdruck: fnc_vect2polar File Profiles\...\scripts\breathmanager.sqf, line 30 Error in expression <_priorNew = _priors select _cause; if (_priorNew > _priorCur) exitWith { _oldD> Error position: <_priorNew > _priorCur) exitWith { _oldD> Error Nicht definierte Variable in Ausdruck: _priornew Error in expression <_priorNew = _priors select _cause; if (_priorNew > _priorCur) exitWith { _oldD> Error position: <_priorNew > _priorCur) exitWith { _oldD> Error Nicht definierte Variable in Ausdruck: _priornew Error in expression <_priorNew = _priors select _cause; if (_priorNew > _priorCur) exitWith { _oldD> Error position: <_priorNew > _priorCur) exitWith { _oldD> Error Nicht definierte Variable in Ausdruck: _priornew Der code ausm CBA Code:
// Author: Vigilante, courtesy by -=ACE=- of Simcentric /* [angle] */ fnc_simplifyAngle = { private ["_angle"]; _angle = _this select 0; while {_angle < 0} do { // Angle is negative, so convert it to the equivalent positive angle. _angle = _angle + 360; }; // Make sure it is within the range [0,360]. if (_angle > 360) then { _angle = _angle mod 360; }; _angle; }; // Author: Vigilante, courtesy by -=ACE=- of Simcentric /* [vx, vy] */ fnc_vectDir = { [((_this select 0) atan2 (_this select 1))] call fnc_simplifyAngle; }; // Author: Vigilante, courtesy by -=ACE=- of Simcentric /* [vx, vy, vz] */ fnc_vect2Polar = /* !!!!!! DAS HIER IST LINE 30 !!!!!! */ { private["_mag", "_dir", "_elev", "_vx", "_vy", "_vz"]; _vx = _this select 0; _vy = _this select 1; _vz = _this select 2; _mag = _this call BIS_fnc_magnitude; _elev = asin (_vz / _mag); _dir = _this call fnc_vectDir; [_mag, _dir, _elev] }; // Author: Nou /* unit */ fnc_modelHeadDir = { private["_unit", "_pilotPos", "_neckPos", "_polar", "_pitch", "_abs", "_dif", "_world", "_return"]; _unit = _this; _return = []; if (_unit isKindOf "CAManBase" ) then { _pilotPos = (_unit selectionPosition "pilot"); _neckPos = (_unit selectionPosition "neck"); _polar = ([_neckPos, _pilotPos] call BIS_fnc_vectorFromXToY); _polar = _polar call fnc_vect2Polar; _pitch = (_polar select 2) - 23; // Subtract to compensate for mem point height dif _abs = _polar select 1; _dif = 0; _dif = if (_abs > 180) then {_abs - 360} else {_abs}; _world = (getDir _unit) + _dif mod 360; _return = [_world, _dif, _pitch]; }; _return }; |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Beta-Patch für OpA erschienen | det99 | Community | 1429 | 18.07.2014 17:51 |
Day & Weather Script | Moerderhoschi | Editing & Scripting | 13 | 02.12.2012 11:29 |
Ammobox Script problem | G36Firestorm | Editing & Scripting | 11 | 18.07.2011 16:04 |
marker über script erzeugen | hypercop | Editing & Scripting | 2 | 28.08.2010 23:40 |
Improved Bullet Cam Script | miromanu | Editing & Scripting | 3 | 21.08.2010 02:01 |