Ein Forum, in dem sich neue Clonk Entwickler untereinander austauschen können.
 
StartseiteStartseite  PortalPortal  FAQFAQ  SuchenSuchen  AnmeldenAnmelden  MitgliederMitglieder  LoginLogin  

Austausch | 
 

 Menüs, oder: wie erstelle ich eine Bonezone Klasse?

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach unten 
AutorNachricht
Patta
Großadmiral
Großadmiral
avatar

Männlich Alter : 24
Anmeldedatum : 22.05.09

BeitragThema: Menüs, oder: wie erstelle ich eine Bonezone Klasse?   Di Jan 12, 2010 12:45 am

Vorkenntnisse:
man muss IDs finden können und Ideen haben, Kenntnisse in CreateObject wären auch von Vorteil

Schwierigkeitsgrad: *****

als erstes benötigt man Bonezone:
http://ccan.de/cgi-bin/ccan/ccan-view.pl?a=view&i=5278&3f=1

die Grundlegenen Sachen von "CreateMenu" und
"AddMenuItem":

CreateMenu (id idSymbol, object pMenuObject, object pCommandObject, int iExtra, string szCaption, int iExtraData, int iStyle, bool fPermanent, id idMenuID);

id idSymbol:
Objektdefinition, deren Bild als Symbol verwendet wird, eine ID muss angegeben werden. Beispiel: FLNT würde das Bild eines Flints erzeugen

object pMenuObject:
Objekt, in welchem das Menü geöffnet wird; kann bei lokalen Aufrufen Null sein, oder mit anderen Worten: das Objekt, bei welchem das Menü aufgerufen wird. Beispiel: GetCursor(0) sorgt dafür dass der im Moment ausgewählte Clonk des Spielers 1 das Menü bekommt.

object pCommandObject:
Erhält das Menükommando (siehe AddMenuItem); kann bei lokalen Aufrufen Null sein.

int iExtra:
Zusätzliche Information im Menü über das jeweils markierte Objekt. Die angegebenen C4MN_*-Konstanten sind seit 4.9.5.0 CE ebenfalls definiert und sollten statt der numerischen Werte verwendet werden: (siehe folgende Tabelle:)
Konstante Wert Effekt
C4MN_Extra_None 0 Nichts
C4MN_Extra_Components 1 Komponenten
C4MN_Extra_Value 2 Wert (in Gold)
C4MN_Extra_MagicValue 3 Wert als Magiewert.
C4MN_Extra_Info 4 Beschreibungstext sofort anzeigen
C4MN_Extra_ComponentsMagic 5 Komponenten und Magiewert
dies bestimmt, was beim Menü unten in der Ecke angezeigt wird (im Kaufmenü z.B. der Goldwert, also C4NM_Extra_Value oder 2)

string szCaption:
Bestimmt den angezeigten Menütext, wenn das Menü keine Einträge enthält -> Selbsterklärend

int iExtraData:
nur benötigt bei "iExtraData" 3, gibt den Vergleichswert an (die zweite Zahl, also z.B. 25/70 (die 70))

int iStyle:
Aussehen des Menüs. Bitte dieser Tabelle entnehmen:
Konstante Wert Aussehen
C4MN_Style_Normal 0 Normal
C4MN_Style_Context 1 Kontextmenü
C4MN_Style_Info 2 Infomenü
C4MN_Style_Dialog 3 Dialog

bool fPermanent:
Das Menü bleibt geöffnet, wenn eine Auswahl getroffen wird.

id IdMenuId:
[opt] Wenn angegeben, wird diese ID als Menü-ID gesetzt. Die aktuelle Menü-ID wird zum Beispiel von GetMenu zurückgegeben.


AddMenuItem (string szCaption, string szCommand, id idItem, object pMenuObject, int iCount, int iParameter, string szInfoCaption);

string szCaption:
Text des neuen Menüeintrags

string szCommand:
Kommando, das bei Auswahl des Menüeintrags ausgeführt werden soll. Kann entweder ein Funktionsname oder ein Statement sein. Wenn ein Funktionsname angegeben wird, dann wird die Funktion in dem Objekt aufgerufen, welches bei CreateMenu als pCommandObject übergeben wurde. Also der Befehl der aufgerufen wird (bei dem Objekt bei dem das Menü erstellt wurde) wenn der Menüeintrag gewählt wird.

id idItem:
Die ID wird als Bild für den Menüeintrag verwendet. ZAP1 z.b. würde einen Menüeintrag erstellen mit einem Bild eines Zaps.

object pMenuObject:
Objekt, dessen Menü der Eintrag hinzugefügt werden soll. Kann bei lokalen Aufrufen 0 sein. Wenn also 0 wird es in der funktion eingefügt in der das Menü erstellt wurde wird er diesem menü hinzugefügt.

int iCount:
Zahl, die neben dem Eintrag angezeigz ewird, beim Kaufmenü z.b. die Anzahl wie oft man das Objekt noch kaufen kann.

int iParameter:
Wird als 2. Parameter an die in szCommand angegebene Funktion übergeben (wer sich damit nicht auskennt sollte es lassen, ich will hier auch nciht nähe rdarauf eingehen)

string szInfoCaption:
Beschreibungstext des neuen Menüeintrags -> "Beispiel: Dies ist ein Menüeintrag" wie bei allen strings muss der Text in "" geschrieben werden.


das war der erste Teil, der zweite erklärt euch anhand eines Beispiels genaueres, das Ziel wird es sein eine Klasse zu erstellen (für BoneZone) die am Start eine Shotgun besitzt und eine Mine, und wenn man über 100 Gold besitzt beim Respawn, bekommt die Klasse noch ein Jetpack, welches sofort angelegt wird.

als erstes öffne die script.c
und scroll herunter, bis zu folgendem Eintrag:

Code:

  CreateMenu(CXIN, pCrew, 0, C4MN_Extra_None, "Klassenwahl", 0, C4MN_Style_Context);
  if(GetWealth(iPlr) < 100)
  {
    AddMenuItem("Fallschirmspringer","SelectClass1",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel.");
    AddMenuItem("Assault","SelectClass2",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung.");
    AddMenuItem("Scharfschütze","SelectClass3",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar.");
  }
  else//Pro-Klassen >:D
  {
    AddMenuItem("{{ABMB}}Fallschirmspringer","SelectClass4",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel. Kann mit der Pisole ab und zu Airstikes ordern.");
    AddMenuItem("{{HARM}}Assault","SelectClass5",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung. Durch die zusätzliche Panzerung nun noch ausdauernder.");
    AddMenuItem("{{SBBA}}Scharfschütze","SelectClass6",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar. Kann sich jetzt Schutzwälle mit Sandsäcken bauen.");
  }
}

ich erklär es euch nochmal genauer:
Code:

  CreateMenu(CXIN, pCrew, 0, C4MN_Extra_None, "Klassenwahl", 0, C4MN_Style_Context);
  if(GetWealth(iPlr) < 100)
  {
    AddMenuItem("Fallschirmspringer","SelectClass1",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel.");
    AddMenuItem("Assault","SelectClass2",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung.");
    AddMenuItem("Scharfschütze","SelectClass3",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar.");
  }
als erstes wird das Menü erzeugt (CreateMenu) mit dem Symbol "CXIN", pCrew ist eine Variable die vorher im script festgelegt wurde als der Clonk des Spielers der respawnt. die 0 sagt an dass pCommandObject halt 0 ist und somit kein besonderes Menükommando angegeben wurde. IntIExtraData (der nächste Parameter) ist auf none und somit gibt es keine besonderen Werte die unten in der Ecke angezeigt werden. "Klassenwahl" ist der Text des Menüs. Da iExtraData nicht 3 ist, wird der nächste Parameter nicht benötigt (somit-> 0). Der letzte Parameter zeigt an, dass das Menü den Style eines Kontextmenüs besitzt. Die restlichen 2 Parameter sind optional, und wurden für dieses Menü nicht benötigt.

Danach werden die MenüItems hinzugefügt, also die Einträge.
als erstes der Texteintrag (z.B. Fallschirmspringer), danach die Funktion die aufgerufen wird (SelectClassX), das Menüsymbol (MP7R (die MP)) die anderen parameter könnt ihr oben nachsehen. Der letzte ist der Beschreibungstext.

kopiert nun also eine der "AddMenuItem" Zeilen und ändert sie passend:
für unsere Beispielklasse also z.B.
Code:
AddMenuItem("Mafiosi","SelectClass4a",PGWP,pCrew,0,ObjectNumber(pCrew),"Haut mächtig rein.");
1. Name der Klasse ("Mafiosi")
2. die Funktion die aufgerufen wird, einfach immer weiter durchnummerieren. Ich habe ein "a" dahintergesetzt weil weiter unten beim Original schon "Selectclass4" genutzt wird für den Fallschirmspringer falls man mehr als 100 Gold hat. Es ginge natürlich auch "SelectClassPatta1" oder "blablablupp"
3. Icon, hier die Shotgun, gebt einfach die passende ID ein die ihr als bild wollt.
4.5.6. einfach so lassen
7. Beschreibungstext der Klasse

nun können wir ingame testen.
Die Klasse ist da.


aber man hat noch immer die Ausrüstung des Fallschirmspringers.


Dies werden wir nun ändern. Wenn wir uns unser script von vorhin nochmal angucken, sehen wir dass wir als Funktion, die beim Wählen des Menüpunktes aufgerufen wird "Selectclass4a" gewählt haben.
wenn ihr weitere Klassen erstellen wollt muss natürlich jedes mal eine andere Funktion aufgerufen werden.

suchen wir nun die original Funktionen die nach wählen eines Menüpunkts aufgerufen werden. (Also z.B. "SelectClass1")

Code:

func SelectClass1(id unused, int iObj)
{
  var pObj = Object(iObj);
  pObj->CreateContents(MP7R);
  pObj->CreateContents(PIWP);
  DoStartAmmo(pObj);
 
  if(pObj->Contained())
    RemoveObject(pObj->Contained(),1);
 
  var  helper = CreateObject(JHLP,0,0,GetOwner(pObj));
  pObj->Enter(helper);
  helper->Set(false,50,true);
}
darunter gibt es das noch für SelectClass 2 usw. nach dem letzten SelectClass (6 standardmässig) fügen wir die Funktion
Code:
 func SelectClass4a(id unused, int iObj)
{
}
ein
in diese Funktion schreiben wir nun hinein, was passieren soll wenn der Menüeintrag gewählt wurde.
Wir wollen eine Shotgun für den Clonk und eine Mine, also:
Code:

func SelectClass4a(id unused, int iObj)
{
  var pObj = Object(iObj);
  pObj->CreateContents(PGWP);
  pObj->CreateContents(MINE);
  pObj->CreateContents(PIWP);
  DoStartAmmo(pObj);

  if(pObj->Contained())
    pObj->Contained()->~Spawn();
}
pObj->CreateContents(PGWP);
dies erstellt eine Shotgun beim Clonk, der vorher als Variable "pObj" festgelegt wurde.
Das selbe wird mit der Mine (ID: MINE) gemacht und auch mit der Sturmpistole die jede Klasse standardmässig hat (ID: PIWP).
DoStartAmmo(pObj);
die If-Abfrage bewirkt dass der Clonk gespawnt wird.
dies ist eine Funktion die der Autor von BoneZone selber geschrieben hat, sie bewirkt dass alle Waffen des Clonks am start geladen sind. gehen wir nun ingame, sehen wir dass wir sowohl die Klasse wählen können als auch die Gegenstände bekommen:


haben wir aber über 100 Gold taucht die Klasse nicht mehr auf im Menü. Dies liegt daran dass wenn der Spieler über 100 Gold hat ein alternatives Menü für die besseren Verisonen der Klassen erscheint.

suchen wir also wieder die Stelle mit dem menü, nehmen aber diesmal das Menü nach dem else.
Code:
 else//Pro-Klassen >:D
  {
    AddMenuItem("{{ABMB}}Fallschirmspringer","SelectClass4",MP7R,pCrew,0,ObjectNumber(pCrew),"Springt direkt ins Kampfgetümmel. Kann mit der Pisole ab und zu Airstikes ordern.");
    AddMenuItem("{{HARM}}Assault","SelectClass5",SGWP,pCrew,0,ObjectNumber(pCrew),"Wie ein Felsen in der Brandung. Durch die zusätzliche Panzerung nun noch ausdauernder.");
    AddMenuItem("{{SBBA}}Scharfschütze","SelectClass6",SNIP,pCrew,0,ObjectNumber(pCrew),"Auf Distanz unschlagbar. Kann sich jetzt Schutzwälle mit Sandsäcken bauen.");
  }
wir kopieren wieder eine der AddMenuItem zeilen und fügen sie unter den anderen ein.
Code:

    AddMenuItem("{{JTPK}}Mafiosi","SelectClass4b",PGWP,pCrew,0,ObjectNumber(pCrew),"Kommt mit Mine, Shotgun und Jetpack, macht den Skeletten ein Angebot dass sie nicht ablehnen können.");
"{{JTPK}}Mafiosi"
der Name der Klasse, das {{JTPK}} erzeugt das Symbol des Jetpacks vor dem Namen, wieder dementsprechend ersetzen.
"SelectClass4b"
aufgerufene Funktion, siehe oben. Der rest ist genauso wie vorhin nur die Beschreibung ist geändert.
der Mafiosi ist jetzt im Menü, auch dann noch wenn man mehr als 100 Gold hat. Wir müssen nur wieder die FUnktion einfügen die aufgerufen wird wenn man den mafiosi wählt und 100 oder mehr Gold hat. Wir nehemn die selbe Funktion wie vorhin, nur ändern wir das "SelectClass4a" in "SelectClass4b" um und fügen dem inhalt der Funktion eine Zeile hinzu:
Code:

func SelectClass4b(id unused, int iObj)
{
  var pObj = Object(iObj);
  pObj->CreateContents(PGWP);
  pObj->CreateContents(MINE);
  pObj->CreateContents(PIWP);
  pObj->CreateContents(JTPK)->Activate(pObj);
  DoStartAmmo(pObj);

  if(pObj->Contained())
    pObj->Contained()->~Spawn();
}
pObj->CreateContents(JTPK)->Activate(pObj);
dies gibt dem Clonk ein Jetpack und aktiviert es.
das war es auch "schon".

Viel Spass mit meinem ersten Tutorial, ich hoffe ich konnte euch die Menüs schonmal etwas näher bringen, und ich hoffe auch ihr habt Spass beim designen neuer Klassen..

wer nochmal diesen scriptteil bei meiner BoneZone Version sehen will:

Spoiler:
 
Nach oben Nach unten
Benutzerprofil anzeigen http://sites.google.com/site/clonkprojekte/star-wars
Patta
Großadmiral
Großadmiral
avatar

Männlich Alter : 24
Anmeldedatum : 22.05.09

BeitragThema: Re: Menüs, oder: wie erstelle ich eine Bonezone Klasse?   Di Jan 12, 2010 8:57 pm

so, es ist fertig, ich hoffe auf ein paar Kritiken. aber fragt mich jetzt bitte nicht zu allen möglichen Sachen aus meinem Script. manches mag sehr einfach sein, aber diese tut zu schreibenwar vielleicht anstrengend Wink
Nach oben Nach unten
Benutzerprofil anzeigen http://sites.google.com/site/clonkprojekte/star-wars
 
Menüs, oder: wie erstelle ich eine Bonezone Klasse?
Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach oben 
Seite 1 von 1

Befugnisse in diesem ForumSie können in diesem Forum nicht antworten
CNDG :: Anfänger :: Tutorials-
Gehe zu: