PDA

View Full Version : Positionsvergleich



quor
28-09-2012, 09:32
Hi,

ich möchte die Position eines Schiffes mit der einer Colonie vergleichen.

in CMyShip und CMyColonie finde ich dafür keinen Ansatz, der sich später in einer IF-Bedingung einbauen läßt.
Gibt es dort eine Möglichkeit dafür?

PS.:
So funktioniert es leider auch nicht:

Var Kolo1 As New CMyColony(12345);
Var Ship1 As CBaseShip(123456);
WriteLine('SectorID: ' + (CStr(Kolo1.SectorID)));
WriteLine('SectorID: ' + (CStr(Ship1.Sector.SectorID)));

Wie muss die vierte Zeile geschrieben werden?

Schonmal danke, Quor

Sirius
28-09-2012, 12:06
WriteLine(Ship1.Sector.Coordinates.X & "|" & Ship1.Sector.Coordinates.Y);

das sollte funktionieren, keine Ahnung ob das letztlich dein Problem löst

Allerdings würde ich das Ship auch als New CMyShip deklarieren, weiß nicht was du da bauen willst^^
Kann sein das es deshalb zu Problemen kommt

lg

Tom
28-09-2012, 13:04
Var Kolo1 As New CMyColony(1234);
Var Ship1 As New CMyShip(56789);

WriteLine('SectorID: ' + (CStr(Kolo1.SectorID)));
WriteLine('SectorID: ' + (CStr(Ship1.Sector.SectorID)));
Du kannst natürlich auch über die Koordinaten vergleichen kommt auf das selbe hinnaus. Außerdem brauchst du nicht zu prüfen üb das schiff im Orbit ist oder nicht.

WriteLine('Koords Kolo: ' & Kolo1.SRS.Item(0).MapPosition.ToString());
WriteLine('Koords Shiff: ' & Ship1.SRS.Item(0).MapPosition.ToString());


If (Kolo1.SRS.Item(0).MapPosition.ToString() = Ship1.SRS.Item(0).MapPosition.ToString())
{
WriteLine ('Test');
}


Gruß

quor
28-09-2012, 15:42
Danke für die schnellen Antworten :ugeek: !!

Leider löst das Script jetzt nen Bluescreen aus. Token "WriteLine". Es kann doch nicht sein, dass diese Funktion kaputt ist, oder?? :shock:

Var Kolo1 As New CMyColony(12345);
Var Ship1 As New CMyShip(123456);

WriteLine('Koords Kolo: ' & (CStr(Kolo1.SRS.Item(0).MapPosition));
WriteLine('Koords Shiff: ' & (CStr(Ship1.SRS.Item(0).MapPosition));

If (Kolo1.SRS.Item(0).MapPosition.ToString() = Ship1.SRS.Item(0).MapPosition.ToString())
{
WriteLine ('Test');
}
Else

Serafin
28-09-2012, 15:59
Wenn du die Koordinaten per Hand eingibst kannst du es auch wie folgt machen.

If* (Schiff.MapPosition.X* <>* xxx or* Schiff.MapPosition.Y* <>* yyy)
{
WriteLine ('Test');
}

Tom
28-09-2012, 20:20
If-Bedingung: If (Bedingung) {Wahr-Block} Else {Falsch-Block}

du musst mindestens die { } setzen oder das Else ganz weglassen

quor
28-09-2012, 22:14
Var Kolo1 As New CMyColony(12345);
Var Ship1 As New CMyShip(123456);

WriteLine('Koords Kolo: ' & (CStr(Kolo1.SRS.Item(0).MapPosition));
WriteLine('Koords Shiff: ' & (CStr(Ship1.SRS.Item(0).MapPosition));


Schon dieser Teil löst das Problem aus. Und leider auch wenn ich die andere Variante "ToString" benutze.

Var Kolo1 As New CMyColony(68406);
Var Ship1 As New CMyShip(549215);

WriteLine('Koords Kolo: ' & Kolo1.SRS.Item(0).MapPosition.ToString());
WriteLine('Koords Shiff: ' & Ship1.SRS.Item(0).MapPosition.ToString());

Tom
28-09-2012, 22:52
hmm vlt hast du noch wo anders nen fehler bei mir funktioniert es in beiden varianten
poste mal dein script und die fehlermeldung

Apollo
29-09-2012, 10:12
Ich geb auch mal meinen Senf dazu weil ich n ähnliches Script habe, vielleicht hilfts dir was...

Var PositionSoll As SMapPosition

If(i = 0){
PositionSoll = ship.MapPosition
}

If(ship.MapPosition <> PositionSoll){
ScriptContext.WriteAppLog("Position von " & ship.Name & " stimmt nicht! " & ship.MapPosition & " statt " & PositionSoll & "!")
}

Zwar ist das nicht mit WriteLine, sondern aus einer Erweiterung für das Webinterface, aber sollte im Prinzip genauso funktionieren.
Was mir jetzt grade noch auffällt: Du verwendest bei WriteLine 'Apostrophe'. Ich habe da überall "Anführungszeichen", kann sein dass beides funktioniert, aber wäre zumindest eine mögliche Fehlerquelle...

quor
29-09-2012, 18:08
Ich benutze den Baustein im größeren Rahmen, eines kleinen Projects, habe es mal in die scriptbib gestellt, da es doch recht groß ist: Kolonie_Verkehr_Portal (d3)
Ziel ist zunächst zu püfen, ob sich eines oder beide Schiffe im Orbit einer Kolonie befinden.

Später kommt ein Auswahl button zu dem Schiff und Zielbutton, so dass dann vorherfestgelegte Routen geflogen werden können.

Die fehlermeldung erscheint unten. Im eigentlichen Script ist der Token IF, sonst WriteLine. Welche Funktion hat eigentlich "Item(0)"
??

Das script lauft als solches nicht:



Var Kolo1 As New CMyColony(12345);
Var Ship1 As New CMyShip(123456);

WriteLine('Koords Kolo: ' & (CStr(Kolo1.SRS.Item(0).MapPosition));
WriteLine('Koords Shiff: ' & (CStr(Ship1.SRS.Item(0).MapPosition));


und eben auch so nicht



Var Kolo1 As New CMyColony(68406);
Var Ship1 As New CMyShip(549215);

WriteLine('Koords Kolo: ' & Kolo1.SRS.Item(0).MapPosition.ToString());
WriteLine('Koords Shiff: ' & Ship1.SRS.Item(0).MapPosition.ToString());

---
Das Script hat einen Laufzeitfehler verursacht. Zeile: 4, Spalte: 1, Token: 'WriteLine', Script: 'Script 7584'

[ArgumentOutOfRangeException: Der Index lag außerhalb des Bereichs. Er muss nicht negativ und kleiner als die Auflistung sein.
Parametername: index]
bei System.Collections.ArrayList.get_Item(Int32 index)
bei larne.scripting.Types.CCollectionBase.get_BaseItem (Int32 index) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptCollection.cs:Zeile 129.
bei stne.Scripting.Types.CShipList.get_Item(Int32 Index) in d:\source\proximo\dev1\projects\stne\game\Scriptin g\Objects.cs:Zeile 1658.

[TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
bei System.RuntimeMethodHandle._InvokeMethodFast(IRunt imeMethodInfo method, Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.RuntimePropertyInfo.GetValue(Obj ect obj, Object[] index)
bei larne.scripting.TScriptObjectMemberNative.GetValue Internal(TScriptContext Context, Object obj, Object[] Index) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 2665.
bei larne.scripting.TScriptObjectMemberNative.GetValue (TScriptContext Context, TCodeExpressionObjectMember CallExp, Object obj, Object[] Index) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 2656.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 376.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 346.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 346.
bei larne.scripting.Expressions.TCodeExpressionAddStri ng.Get(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 1546.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.GetParameters(TScriptContext Context, TScriptParameterInfo[] ParamInfo) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 312.
bei larne.scripting.Expressions.TCodeExpressionObjectM ember.Get(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptExpressions.cs:Zeile 374.
bei larne.scripting.Commands.TCodeCommandExpressionCal l.Process(TScriptContext Context) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\ScriptCommands.cs:Zeile 80.
bei larne.scripting.TScriptContext.ExecuteInternal() in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 1194.

[Exception: Das Script hat einen Laufzeitfehler verursacht. Zeile: 4, Spalte: 1, Token: 'WriteLine', Script: 'Script 7584']
bei larne.scripting.TScriptContext.ExecuteInternal() in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 1209.
bei larne.scripting.TScriptContext.Execute(Int32 StartLine) in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 1246.
bei larne.scripting.TScriptContext.Execute() in d:\source\proximo\dev1\projects\shared\larne.scrip ting\Script.cs:Zeile 1281.
bei stne.TScript.ExecuteInternal() in d:\source\proximo\dev1\projects\stne\game\Core\Tem p3.cs:Zeile 1088.
bei stne.TScript.ExecuteInQueue() in d:\source\proximo\dev1\projects\stne\game\Core\Tem p3.cs:Zeile 995.
bei stne.wf_ScriptEdit.act_Execute() in d:\source\proximo\dev1\projects\stne\game\WebForms \ScriptEdit.cs:Zeile 606.
bei stne.wf_ScriptEdit.ExecuteAction() in d:\source\proximo\dev1\projects\stne\game\WebForms \ScriptEdit.cs:Zeile 142.
bei stne.TstneBasePage.CallExecuteAction() in d:\source\proximo\dev1\projects\stne\game\Core\Web Controls.cs:Zeile 211.
bei stne.TstneGamePage.CallExecuteAction() in d:\source\proximo\dev1\projects\stne\game\Core\Web Controls.cs:Zeile 1029.
bei stne.wf_ScriptEdit.Run() in d:\source\proximo\dev1\projects\stne\game\WebForms \ScriptEdit.cs:Zeile 98.
bei stne.wf_Game.Page_Load(Object sender, EventArgs e) in d:\source\proximo\dev1\projects\stne\game\Game.asp x.cs:Zeile 142.
bei System.Web.UI.Control.LoadRecursive()
bei System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Assembly: larne.scripting.dll
Time: 29.09.2012 17:54:02
Server: DE3
User-ID: 32018
STNE-Version: 1.0.74.874
Compiled at: 28.09.2012 01:46:24
Compiled from: Proximo

Apollo
30-09-2012, 10:23
Auf die Gefahr hin, dich vollkommen zu verwirren...sowohl


Var Kolo1 As New CMyColony(12345);
Var Ship1 As New CMyShip(123456);

WriteLine('Koords Kolo: ' & (CStr(Kolo1.SRS.Item(0).MapPosition));
WriteLine('Koords Shiff: ' & (CStr(Ship1.SRS.Item(0).MapPosition));
als auch


Var Kolo1 As New CMyColony(68406);
Var Ship1 As New CMyShip(549215);

WriteLine('Koords Kolo: ' & Kolo1.SRS.Item(0).MapPosition.ToString());
WriteLine('Koords Shiff: ' & Ship1.SRS.Item(0).MapPosition.ToString());

funktionieren bei mir einwandfrei (nachdem ich die IDs durch eigene ersetzt hatte natürlich)...
An den Anführungszeichen liegts übrigens auch nicht, da geht tatsächlich beides ;)
Ich schätz mal dass Item(0) auf das "nullte" Item des SRS zugreift, also das Schiff/die Kolonie selbst.

Dragon Head
30-09-2012, 11:19
Das nullte Element ist das erste aus dem SRS und nicht das Schiff selber. Problematisch wird es wenn es keine anderen Schiffe im SRS gibt und deshalb eine Fehlermeldung erzeugt wird.
Woher kommt eigentlich diese Ausführung mit dem SRS? ;)

Dragon Head
30-09-2012, 11:48
Versuch es mal damit:


Var gleichePosition As Boolean = False;
Var Kolo1 As New CMyColony(12345);
Var Ship1 As New CMyShip(12345);

If((Kolo1.Coordinates.CompareTo(Ship1.MapPosition. Coords) = 0) and Ship1.MapPosition.InOrbit) {gleichePosition = True}

quor
30-09-2012, 14:25
Danke, Dragon Head.

Das bringt mich etwas weiter, denn vermutlich lag es tatsächlich daran, dass einfach kein SRS erzeugt wurde.

Leider klappt das CompareTo irgendwie nicht, da Coords auch den Orbit mit in die Ausgabe einbindet(@123|123) und Coordinates nicht.
Der Orbit ist aber auch garnicht relevant.

Aber ich versuch mal mit der CompareTo weiter zu kommen. Noch nicht so klar ist mir gleichePosition = True. Kann ich das bei einer Boolean Abfrage so einbauen??


If((Kolo1.Coordinates.CompareTo(Ship1.MapPosition. Coords) = 0) and Ship1.MapPosition.InOrbit)
{
gleichePosition = True row.Cells.Item(1).Add(Ship1.Name)
}
Else
{
row.Cells.Item(1).Add(" - ")
}

quor
30-09-2012, 14:46
So habe jetzt endlich ne Lösung für den Baustein :-). Danke an alle für die Hilfe.


Var Kolo1 As New CMyColony(68406);
Var Ship1 As New CMyShip(549215);

WriteLine('Koords Kolo: ' + Kolo1.SectorID.ToString());
WriteLine('Koords Kolo: ' + Kolo1.Coordinates.ToString());
WriteLine('Koords Ship1: ' + Ship1.MapPosition.ToString());
WriteLine('Koords Ship1: ' + Ship1.Sector.SectorID.ToString());

If(Kolo1.SectorID.ToString() = Ship1.Sector.SectorID.ToString())
{ WriteLine('Yes, Schiff und Kolo ='); }
Else
{ WriteLine('No, Schiff und Kolo ungleich'); }

Dragon Head
30-09-2012, 14:52
Ich glaube du verwechselst SMapPosition mit SPoint. Coords gibt letzteres zurück und berücksichtigt nicht den Orbit.

Ich versuche gerade zu verstehen was du erreichen möchtest ;)

Wie siehts hiermit aus: (ohne berücksichtigung vom Orbit)



If(Kolo1.Coordinates.CompareTo(Ship1.MapPosition.C oords)* =* 0)
{
row.Cells.Item(1).Add(Ship1.Name)
}
Else
{
row.Cells.Item(1).Add(" - ")
}

quor
30-09-2012, 22:16
Habe meine Schiffe nicht als NEW CMyShip deklariert, jetzt funzt.

Danke an Alle für die Tips.