Armed-Assault.de Twitter
 
 
Themen-Optionen Ansicht
Alt 25.05.2012, 10:45   #21 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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
};
und

Code:
f = {
    _bool = true;
    _bool
};
Von fsm hab ich noch nichts gehört.

Geändert von xezon (25.05.2012 um 12:41 Uhr).
xezon ist offline  
Alt 25.05.2012, 14:13   #22 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

*deleted*

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.

Geändert von Xeno (08.12.2013 um 17:32 Uhr).
Xeno ist offline  
Alt 25.05.2012, 14:29   #23 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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.
xezon ist offline  
Alt 25.05.2012, 14:40   #24 (permalink)
His Awesomeness!
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von flickflack
 
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
Standard

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 ^^
flickflack ist offline  
Alt 25.05.2012, 15:00   #25 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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.
xezon ist offline  
Alt 25.05.2012, 15:07   #26 (permalink)
His Awesomeness!
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von flickflack
 
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
Standard

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 ^^
flickflack ist offline  
Alt 25.05.2012, 15:25   #27 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Wahrscheinlich gibt es solche Fälle wie du es schreibst. Der Sinn eines operators soll ja aber in der Regel das Lesen vereinfachen.

z.B [] für Arrayfelder oder -> für Zeiger.
xezon ist offline  
Alt 25.05.2012, 15:27   #28 (permalink)
His Awesomeness!
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von flickflack
 
Registriert seit: 25.07.2006
Ort: Regnum Borussiae
Beiträge: 9.282
Standard

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'
flickflack ist offline  
Alt 25.05.2012, 16:02   #29 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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?

Zitat von Psychobastard Beitrag anzeigen

Code:
breath_cond = {
    private  ["_bool"];
    _bool = if (alive _this && (vehicle _this == _this) && ((_this distance player <= 500) || (screenToWorld [0.5, 0.5] distance player >= 5))) then {true} else {false};
    _bool
};
xezon ist offline  
Alt 25.05.2012, 16:06   #30 (permalink)
10 Jahre hx3
5000 Beiträge
 
Benutzerbild von Xeno
 
Registriert seit: 03.01.2008
Alter: 84
Beiträge: 6.552
Standard

*deleted*

Xeno
__________________
In arma everything is made of refined explodium, armored with wet paper towels.

Geändert von Xeno (08.12.2013 um 17:33 Uhr).
Xeno ist offline  
Alt 25.05.2012, 16:31   #31 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Zitat von Xeno Beitrag anzeigen

*deleted*

Yep. So hab ich mir das vorgestellt.
PS: diesen Klammerquatsch um (vehicle _this==_this) kann man sich auch sparen.

Zitat von Xeno Beitrag anzeigen

Und anders als bei richtigen Programmiersprachen wird eine if Bedingung in sqf immer komplett ausgewertet auch wenn ein Teil der Bedingung schon falsch war.

Klasse Info. Thx!

Geändert von Xeno (03.01.2014 um 09:35 Uhr).
xezon ist offline  
Alt 25.05.2012, 16:53   #32 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Zitat von xezon Beitrag anzeigen

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" ?

Hab dazu in der reference was gefunden unter "local variables". Da stehts besser als bei "private".

http://community.bistudio.com/wiki/V...ocal_Variables
xezon ist offline  
Alt 25.05.2012, 16:59   #33 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

Zitat von Psychobastard Beitrag anzeigen

Ich hab mal alles in ein Script gepackt

Das is auch ne top info, dachte fast man müsse es in einzelne files packen. So in einer Datei ist es viel schöner. Werd mich da nachher mal dransetzen und schauen dass ich es zum Laufen kriege. Wenn nicht dann komm ich wieder.
xezon ist offline  
Alt 25.05.2012, 20:34   #34 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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;
};
xezon ist offline  
Alt 25.05.2012, 21:56   #35 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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
};
Oder ich machs gleich noch tierkompatibel. Mal sehen.
xezon ist offline  
Alt 26.05.2012, 03:16   #36 (permalink)
10 Jahre hx3
500 Beiträge1000 Beiträge2.500 Beiträge
 
Benutzerbild von xezon
 
Registriert seit: 31.03.2003
Beiträge: 2.533
Standard

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
};
xezon ist offline  
 


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ä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


Kontakt - HX3.de - Archiv - Nach oben

Angetrieben durch vBulletin, Entwicklung von Philipp Dörner & Tobias



SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119