WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Simulationen > Designer Forum

Designer Forum Treffpunkt für Gedankenaustausch von Simmern, die selbst

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 29.12.2002, 03:59   #1
Atze
Veteran
 
Registriert seit: 06.08.2002
Alter: 38
Beiträge: 363


Standard C Gauge selber bauen

Hallo ihr lieben Gauge-Designer.

Ich hätte da ml eine Frage, diesbezüglich der C-Gauge programmierung. Ich habe gehört, das das Programmieren von Sim Icons das leichteste auf diesem Gebiet sein soll. Da ich einigermaßen gut C kann, würde ich mal gerne sehen, wie soetwas als Quellcode also N I C H T compiliert aussieht. Hätte da mal jemand ein Quellcodebeispiel für mich, das ich da irgendwie mal ein bisschen durchblicke???


mfg Atze
____________________________________
Der Weg vom Pils

Liebe geht durch den Magen, Pils durch die Blase

Atze ist offline   Mit Zitat antworten
Alt 29.12.2002, 19:00   #2
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Reden Hallo!

Also zuallererst einmal: Ich bin kein C Gauges Designer, ich mach meine Gauges mit XML. Diese sind viel schneller gebaut, und für den Freeware Bereich reichen sie allemal aus(von der Komplexität her).
Weil ein FMC mit XML zu realisieren ist nicht möglich. Aber das möchte ich auch garnicht!

Lade dir das SDK herunter, dort sind einige Bsp. drinnen. HIER

Und auf Flightsim.com findest du das Gauges Tuturial von Dai Griffits. Musst ein bisschen suchen. Aber es lohnt sich allemal, weil dort wirklich alles erklärt ist.

Und im "IdeHowTo" wird erklärt, wie man mit dem MS Visual Studio die Gauges "compiled". Zu finden auf Flightsim.com.


Ich jedenfalls bleibe nach einem kleinen Exkurs zu den C gauges doch bei "meinen" XML Gauges.
Bei XML kann ich dir weiterhelfen, bei C gauges frag leiber im Avsim Forum nach!


Viele Grüße
Harri

P.S.:Und damit du ungefähr weißt, mit was du es hier zu tun hast, hier ein kurzer Ausschnitt aus dem SDK Gauge! Das ist nur das eigentliche (Sub-)Gauge. Man braucht dann noch ein .c, wo alle Subgauges registriert werden, dann noch ein paar .h, und dann noch die Bilder. Alles zusammenmischen und dann hoffen, dass man nicht 55Errors bekommt.


// SDK.Attitude.c
// Copyright (c) 2000 Microsoft Corporation(auweh, das heißt nie was gutes). All rights reserved.(jaja, wer klaut euch den schon euren fehlerhaften Source Code...?)

// Set up gauge header
char attitude_gauge_name[] = GAUGE_NAME;
extern PELEMENT_HEADER attitude_list;
extern MOUSERECT attitude_mouse_rect[];

GAUGE_HEADER_FS700(GAUGE_W, attitude_gauge_name, &attitude_list, \
attitude_mouse_rect, 0, 0, 0, 0);


/////////////////////////////////////////////////////////////////////////////
FAILURE_RECORD attitude_fail[] =
{
{FAIL_GAUGE_ATTITUDE, FAIL_ACTION_NONE},
{FAIL_NONE, FAIL_ACTION_NONE}
};


/////////////////////////////////////////////////////////////////////////////
MAKE_SPRITE
(
attitude_sprite_outer,
BMP_ATTITUDE_SMALL_CARD2,
NULL,
attitude_fail,
IMAGE_USE_TRANSPARENCY|IMAGE_BILINEAR_COLOR,
0,
16, 13,
137,134,
1.05, 1.05,
MODULE_VAR_NONE, NULL, 0,
MODULE_VAR_NONE, NULL, 0,
ATTITUDE_INDICATOR_BANK_DEGREES, NULL, -1
)

PELEMENT_HEADER attitude_sprite_outer_list[] =
{
&attitude_sprite_outer.header,
NULL
};


/////////////////////////////////////////////////////////////////////////////
#define PITCH_LIMIT 43.0 // stop at 43 degrees

FLOAT64 FSAPI attitude_sprite_inner_cb( PELEMENT_SPRITE pelement )
{
FLOAT64 val = pelement->source_var_y.var_value.n;

if( val > PITCH_LIMIT )
val = PITCH_LIMIT;
else if( val < -PITCH_LIMIT )
val = -PITCH_LIMIT;

return val;
}

MAKE_SPRITE
(
attitude_sprite_inner,
BMP_ATTITUDE_SMALL_CARD1,
attitude_sprite_outer_list,
attitude_fail,
IMAGE_USE_TRANSPARENCY|IMAGE_BILINEAR_COLOR,
0,
55, 53,
137, 134,
0.55, 0.55,
MODULE_VAR_NONE, NULL, 0,
ATTITUDE_INDICATOR_PITCH_DEGREES, attitude_sprite_inner_cb, 2.0,
ATTITUDE_INDICATOR_BANK_DEGREES, NULL, -1
)

PELEMENT_HEADER attitude_sprite_inner_list[] =
{
&attitude_sprite_inner.header,
NULL
};


/////////////////////////////////////////////////////////////////////////////
MAKE_STATIC
(
attitude_background,
BMP_ATTITUDE_SMALL_BACKGROUND,
attitude_sprite_inner_list,
attitude_fail,
IMAGE_USE_TRANSPARENCY,
0,
0,0
)

PELEMENT_HEADER attitude_list = &attitude_background.header;


/////////////////////////////////////////////////////////////////////////////
MOUSE_BEGIN( attitude_mouse_rect, HELPID_GAUGE_ATTITUDE_INDICATOR, 0, 0 )
MOUSE_END


/////////////////////////////////////////////////////////////////////////////
#undef GAUGE_NAME
#undef GAUGEHDR_VAR_NAME
#undef GAUGE_W

harry3 ist offline   Mit Zitat antworten
Alt 29.12.2002, 19:12   #3
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard

Damit du einen Vergleich zwischen C und XML hast:
Hier das gleiche Gauge(ein analoger ADI) in XML Sprache;der einzige Unterschied in der Funktionsweise ist der, dass ein Flight Director vorhanden ist:
Dies ist das fertige XML-gauge, es wird keine Header Datei benötigt.

Viele Grüße
Harri

PHP-Code:
<Gauge Name="Attitude Indicator" Version="1.0">
   <
Image Name="Attitude_Background.bmp" ImageSizes="118,113,186,177"/>
   <
Element>
      <
Position X="0" Y="0"/>
      <
MaskImage Name="Attitude_Card_Outside_Mask.bmp" ImageSizes="118,113,186,177">
         <
Axis X="59" Y="59"/>
      </
MaskImage>
      <
Image Name="Attitude_Card_Outside.bmp" ImageSizes="116,116,186,186">
         <
Axis X="58" Y="58"/>
      </
Image>
      <
Rotate>
         <
Value>(A:Attitude indicator bank degrees,radians)</Value>
      </
Rotate>
   </
Element>
   <
Element>
      <
Position X="0" Y="0"/>
      <
MaskImage Name="Attitude_Card_Inside_Mask.bmp" ImageSizes="118,113,186,177">
         <
Axis X="59" Y="59"/>
      </
MaskImage>
      <
Image Name="Attitude_Card_Inside.bmp" ImageSizes="131,131,205,205">
         <
Axis X="65" Y="65"/>
      </
Image>
      <
Shift>
         <
Value Minimum="-25" Maximum="25">(A:Attitude indicator pitch degrees,degrees) /-/</Value>
         <
Scale Y="0.85"/>
      </
Shift>
      <
Rotate>
         <
Value>(A:Attitude indicator bank degrees,radians)</Value>
      </
Rotate>
   </
Element>
   <
Element>
      <
Visible>(A:Autopilot flight director activebool)</Visible>
      <
Position X="0" Y="0"/>
      <
MaskImage Name="Attitude_Card_Outside_Mask.bmp" ImageSizes="118,113,186,177">
         <
Axis X="59" Y="59"/>
      </
MaskImage>
      <
Image Name="Attitude_FD_Bar.bmp" ImageSizes="118,113,186,177">
         <
Axis X="59" Y="59"/>
      </
Image>
      <
Shift>
         <
Value Minimum="-25" Maximum="25">(A:Autopilot flight director pitchdegrees) (A:Attitude indicator pitch degrees,degrees) -</Value>
         <
Scale Y="0.85"/>
      </
Shift>
      <
Rotate>
         <
Value>(A:Attitude indicator bank degrees,radians) (A:Autopilot flight director bankradians) -</Value>
      </
Rotate>
   </
Element>
   <
Element>
      <
Image Name="Attitude_Arrow_Icon.bmp" ImageSizes="118,113,186,177"/>
   </
Element>
   <
Mouse>
      <
Tooltip ID="TOOLTIPTEXT_ATTITUDE_INDICATOR_BANK_PITCH"/>
   </
Mouse>
</
Gauge
harry3 ist offline   Mit Zitat antworten
Alt 29.12.2002, 23:58   #4
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Die wichtigsten Quellen sind schon von Harri angegeben. Wenn du C beherrschst ist das Gauge-Programmieren nicht weiter schwer(persönliche Meinung, aber ich mach' das schon ein bischen länger). Es ist halt persönlicher Geschmack ob man nun XML oder C wählt. Alles, was keine aufwendigen Kalkulationen bedarf, ist in XML u.U. schneller zu haben als in C, es hängt ein bischen von der Erfahrung und angesammeltem Code ab was einfacher ist.
Arne Bartels
(C-Gauge Fan, der auch mal XML-Gauges macht)
bartels ist offline   Mit Zitat antworten
Alt 30.12.2002, 12:55   #5
Atze
Veteran
 
Registriert seit: 06.08.2002
Alter: 38
Beiträge: 363


Standard

Hey, danke für eure Antworten.

Also das Grundprinzip habe ich jetzt verstanden. Ich möchte mal so ein Höhenansage realisieren. z.B. don't sink , too low flap oder einfach nur 100 feet Geht das auf die gleiche Weise mit dem Einbinden der Sounds wie mit den Bildern???


Danke im Vorraus für eure Antworten


mfg Atze
____________________________________
Der Weg vom Pils

Liebe geht durch den Magen, Pils durch die Blase

Atze ist offline   Mit Zitat antworten
Alt 30.12.2002, 14:31   #6
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard Hallo!

Also, wie schon gesagt, ich bin ein XML-Mensch , aber manche Fragen kann ich dir von C auch erklären.
Sounds sind eigentlich nur in C realisierbar. XML kann man da (fast)vergessen.
Sounds kannst du mit der fssound.dll in dein Gauge einbinden.
Die FsSound.dll ist im Gauge-Tut. von Dai Griffiths inkludiert. Es ist die "Developer Version", die du brauchst.

Wenn du C beherrscht, wird auch dies kein allzugroßes Problem für dich darstellen.

Viele Grüße
Harri

P.S.: @Atze: Deine Signatur ist nicht gerade toll, wenn man Gauges und so bauen will, und dann da steht, "Was schlecht ist kann ich noch schlechter". Ein bisschen positiv denken ist manchmal sehr vortilhaft

Ein kleiner Ausschnitt aus einem Gauge, der Bereich den ich beigefügt habe, ist für den Sound zuständig.



// --------------------------------------------------------------------------
// MOUSE CALLBACKS
// --------------------------------------------------------------------------
BOOL FSAPI mouse_left_cb(PPIXPOINT relative_point, FLAGS32 mouse_flags) {
// play a sound buffer exaclty once
// There are different play macros for file and resource sounds. The
// reason behind this is, that sound buffers can get lost (e.g. when the
// application looses input focus) and in such a case, the FSSound module
// returns false from it's Play() function. To restore a lost sound buffer,
// one can simply reregister it with the apropriate register function
// (RegisterFile() or RegisterRes()). This is exactly what the play macros
// do behind the scene and that's the reason for the two different macros.
MFSSoundResPlay(left_sound, FALSE);
return FALSE;
}

BOOL FSAPI mouse_right_cb(PPIXPOINT relative_point, FLAGS32 mouse_flags) {
// play a sound buffer from a sound file
MFSSoundFilePlay(right_sound, FALSE);
return FALSE;
}



// --------------------------------------------------------------------------
// DRAWING ELEMENT CALLBACKS
// --------------------------------------------------------------------------
// icon callbacks
FLOAT64 FSAPI left_cb(PELEMENT_ICON pelement) {
// you can check whether a sound buffer is currently playing
return MFSSoundIsPlaying(left_sound);
}

FLOAT64 FSAPI right_cb(PELEMENT_ICON pelement) {
// the button shows "on" while the sound buffer is playing
return MFSSoundIsPlaying(right_sound);
}



// --------------------------------------------------------------------------
// MAIN GAUGE CALLBACK
// --------------------------------------------------------------------------
void FSAPI over_cb(PGAUGEHDR pgauge, int service_id, UINT32 extra_data) {
switch(service_id) {
case PANEL_SERVICE_POST_INSTALL:
// sounds need to be registered before they can be played
MFSSoundFileRegister(right_sound);
// for sound resources, the handle of the module must be specified
MFSSoundResRegister(left_sound, (HMODULE)extra_data);

// the sound controlled by the left button should only be played
// on the left seaker
MFSSoundSetPan(left_sound, -10000);
// same for the sound controlled by the right button
MFSSoundSetPan(right_sound, 10000);
break;

case PANEL_SERVICE_PRE_KILL:
// never forget to unregister the sounds
MFSSoundUnregister(left_sound);
MFSSoundUnregister(right_sound);
break;
}
}


harry3 ist offline   Mit Zitat antworten
Alt 30.12.2002, 16:18   #7
Atze
Veteran
 
Registriert seit: 06.08.2002
Alter: 38
Beiträge: 363


Standard

ok, thx

Wie funktioniert eigentlich diese Listungsdatei mu das alles zusammen zu bekommen??? Und muss die Datei denne irgendwie in C compiliert werden??? Geht denne auch C++???

@ Harry3 Bitte beachte meine Neue Signatur Ist nicht böse gemeint


mfg Atze
____________________________________
Der Weg vom Pils

Liebe geht durch den Magen, Pils durch die Blase

Atze ist offline   Mit Zitat antworten
Alt 30.12.2002, 18:09   #8
bartels
Jr. Member
 
Registriert seit: 01.10.2002
Alter: 57
Beiträge: 90


Standard

Am besten ackert man sich mal mindestens einmal durch die SDK samples und tutorials, dann wird schon vieles klarer.
Es ist durchaus erlaubt die .c Dateien als .cpp Dateien zu speichern und zu kompilieren (sd2gau13 Dateien sind dann Pflicht!) das heist dann aber nur dass in einer .cpp Datei C Code kompiliert wird, es wird also kein echtes C++ benutzt mit Klassen, Vererbung und dergleichen. Anderereseits ist es auch recht einfach Teile des Codes z.B. den Soundzugriff in eine Klasse auszulagern und per extern "C" Aufrufsyntax in dem Gauge zu nutzen, da ist einiges möglich. Im Übrigen ist die C-Gaugesyntax nahezu völlig statisch und benötigt u. U. überhaupt keine Implementation von Funktionen, so dass hier von C oder C++ fast gar keine Rede ist.
Für die Sound-Einbindung gibt es mehrere Ansätze, neben der FSSound.dll gibt es z.B. noch RFGutils wo man dann keine DLL mitnehmen muss, dafür gibt es aber nur ein russisches readme (kein Problem die Beispiele reichen aus).

Sounds können also eingebunden werden, sind aber eigentlich nicht vorgesehen für C-Gauges und verlanges deshalb ein bischen Nicht-Standard Code. Erstmal einige "normale" Gauges zum "Aufwärmen" sind deshalb empfehlendswert.
Arne Bartels
bartels ist offline   Mit Zitat antworten
Alt 30.12.2002, 20:13   #9
Atze
Veteran
 
Registriert seit: 06.08.2002
Alter: 38
Beiträge: 363


Standard

Vielen Dank für eure zahlreiche Beteiligung

Ich habe die beiden Beispiele also .c und .xml mav verglichen. Ich habe gesehen, das bei den C Gauges die Sprache insgesamt andees ist als im XML Format. Gibt es da irgendwie eine Tabelle, welcher Befehl was macht??? Und kann mann den Quelltext der Gauges, die von Microsoft mitgeliefert worden sind auch irgendwie einsehen???

Danke für eure Antworten im vorraus



mfg Atze
____________________________________
Der Weg vom Pils

Liebe geht durch den Magen, Pils durch die Blase

Atze ist offline   Mit Zitat antworten
Alt 31.12.2002, 01:07   #10
harry3
Inventar
 
Registriert seit: 11.06.2001
Alter: 38
Beiträge: 2.397


harry3 eine Nachricht über ICQ schicken
Standard Hallo!

So, und schon haben wir den letzten Tag des Jahres. Ich muss noch ein bisschen aufbleiben, dann ewig lang schlafen, damit ich dann heute/morgen nachts nicht müde bin. Einer muss sich ja ums Feuerwerk bis in die Nacht hinein kümmern. Und interessant wirds sowieso erst danach

In Sachen XML kann ich dir sagen, dass es da ein Word Dokument von Microsoft gibt, in dem alle Variablen aufgelistet sind. Zu finden ist dieses im Panel und Gauges SDK.(link siehe oben!).

Auch ein Must-have, übrigens von Arne Bartels(siehe oben!ein wahrer Großmeister bei allem was mit Gauges zu tun hat!!!), ist das XMLGAU01, zu finden auf Avsim. Dort werden ein paar Grundlagen durchgemacht, aber vor allem die logischen Operationen(UND,ODER,...), und die if{} else etc... Funktionen, die dort aufgelistet sind, machen diesen Download für mich zu einem Must Have.

Zu C kann dir sicher Arne Bartels was sagen!


Viele Grüße
Harri
harry3 ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

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

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist an.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:24 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag