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

Austausch | 
 

 Eine Nahkampfwaffe machen

Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach unten 
AutorNachricht
MagicWipf
Brigadegeneral
Brigadegeneral
avatar

Männlich Alter : 20
Ort : Irgendwo im Nirgendwo
Anmeldedatum : 14.02.11

BeitragThema: Eine Nahkampfwaffe machen   Fr Mai 20, 2011 8:43 pm

Eine Nahkampfwaffe machen:
Schwierigkeitsgrad:
*****

Vorraussetzungen:
-Was ist ein Script?
-Wenige weitere Grundkenntnisse

In diesem Kurztutorial will ich erklären wie ihr eine Waffe für einen Ritter selbst machen könnt. Ich werde das alles am Beispiel einer Bratpfanne machen. Ihr könnt eurer Kreativität freien Lauf lassen.
Wir fangen an, in dem wir einfach ein neues Objekt erstellen. Wie das geht müssten eigentlich alle wissen, für die die es nicht wissen:


Zuerst brauchen wir natürlich eine Grafik. Das ist kein Grafiktutorial, darum bleibt das auftreiben der Grafik jedem selbst überlassen. Diese Grafik habe ich genommen:

Die DefCore.txt müsste standartmäßig so aussehen:
Code:

[DefCore]
id=_NEW
Name=New Object
Version=4,9,5
Category=18960
MaxUserSelect=10
Width=6
Height=6
Offset=-3,-3
Value=10
Mass=10
Components=_NEW=1;
Picture=6,0,64,64
Vertices=1
VertexY=1
VertexFriction=20
Rebuy=1
Collectible=1

Wir setzen die Werte für unsere Grafik ein. Ich benutze hierzu den Vertexmanager. Den bekommt man hier. Er ist einfach zu bedienen und ermöglicht uns unsere Grafik in die DefCore einzubringen.
Jetzt müssen wir noch einige Werte verändern. Am Schluss sieht das so aus:
Code:

[DefCore]
id=PFAN
Version=4,9,8
Name=Bratpfanne
Category=C4D_Object|C4D_SelectMaterial|C4D_SelectKnowledge|C4D_SelectHomebase
MaxUserSelect=10
Width=10
Height=9
Offset=-5,-5
Vertices=2
VertexX=-4,3
VertexY=3,-3
VertexFriction=50,50
Picture=10,0,64,64
Value=35
Mass=25
Components=METL=3;
Rebuy=1
Collectible=1
Rotate=1
Was wurde verändert?
- ID geändert in PFAN (Beliebige ID, sie darf nur noch nicht bestehen)
- Version = Engineversion mit der das Objekt erstellt wurde. Dürfte einfach unverändert bleiben.
- Name geändert
- Die Category angepasst
- Grafik-Werte aus dem Vertexmanager eingefügt
- Value = Wert des Objektes
- Mass = Gewicht des Objektes
- Components = Bestandteile des Objektes, wichtig bei der Herstellung!!! Meine Pfanne ist aus 3 Metall Smile
- Rotate = Drehbarkeit

So. Als nächstes ist der Script an der Reihe. Den können wir eigentlich erstmal aus dem Schwert oder der Axt kopieren und dann anpassen. Ich werde dennoch die einzelnen Funktionen beschreiben. Der Script sieht also so aus wenn wir ihn vom Schwert kopiert haben:
Code:

/*--- Schwert ---*/

#strict  //*--Einfach schöner als strict :) ---*//

/* Ist eine Handwaffe */
public func IsFightWeapon()
{
  return(1);
}

/* Kampfaktion */
public func GetFightAction()
{
  return("SwordFight");
}

/* Schlagaktion */
public func GetStrikeAction()
{
  if (Random(2))
    return("SwordThrust");
  else
    return("SwordStrike");
}

/* Kampfgeschwindigkeit */
public func GetStrikeTime()
{
  return(2);
}

/* Kampfschaden */
public func GetStrikeDamage()
{
  return(8);
}

/* Schlag */
public func StrikeSound()
{
  Sound("SwordHit*");
}

/* Aufschlag */
protected func Hit()
{
  Sound("SwordHit*");
  return(1);
}

/* Kann geschmiedet werden */
public func IsAnvilProduct() { return(1); }


/* Aufwertungszauberkombo: Mit Schwert wird der Clonk zum Ritter */
public func GetRevaluationCombo(object pClonk) { return(KNIG); }

Eigentlich erklärt sich der Script von selbst, aber heir nochmal eine erklärung zum Script:
- public func isFightWeapon() { return(1); } sagt dem Objeckt das es eine Handwaffe ist wie ein Schwert oder eine Axt. Die Funktion muss nicht verändert werden.
- public func GetFightAction() { return("SwordFight"); } sagt, wie der Clonk aussieht, wenn er sich mit der Waffe mit einem anderen Clonk kabbelt. Hier stehen standartmäßig zur Verfügung: SwordFight und AxeFight. Welche wir nehmen kommt auf die Waffe an. Vielleicht mache ich auch noch ein Tutorial zum erstellen siner eigenen Kampfaktionen.
- func GetStrikeAction() gibt die Aktion eines Schlages an. Hier werden wir nur eine Angeben. Wir schreiben also:
Code:

public func GetStrikeAction()
{
return("DeineAktion");
}
Für "DeineAktion" lassen sich wieder verschiedene Aktionen einfügen: SwordStrike, SwordThrust, AxeStrike und AxeThrust. Probiert einfach, was am besten passt.
- GetStrikeTime() gibt die Kampfgeschwindigkeit zurück. Die eines Schwertes ist 2.
- GetStrikeDemage() gibt den Schaden, den die Waffe verursacht, zurück.
- StrikeSound() gibt den Abgespielten Sound an. Ich verwende "Clonk" weil das zu einer Pfanne so schön passt Very Happy
- Hit() wird beim herrunterfallen des Objektes aufgerufen. Auch hier kommt ein Sound rein.

Dann haben wir noch zwei Funktionen, die eine sagt, dass das Objekt geschmiedet werden kann. Die andere sagt, zu was ein Clonk wird, wenn er mit diesem Gegenstand "Aufwertung" benutzt. Den zweiten Wert könnt ihr auch löschen, wenn ihr ihn nicht braucht.

So. Jetzt brauchen wir noch ein #appendto für den Ritterclonk damit er unsere Waffe auch verwenden kann. Dazu erstellen wir einfach ein neues Objekt und schieben es in unsere Waffe. Wir nennen es "#appendto KNIG.c4d". In die DefCore schreiben wir folgendes:
Code:

[DefCore]
id=KNAP
Name=RitterappendTo
Version=4,9,5
Category=1
In den Script schreiben wir jetzt folgendes:
Code:
/*-- RitterAppendTo --*/

#strict 2  //*--Einfach schöner als strict :) ---*//


#appendto KNIG


//! Welche Objekte kann dieser Clonk einsetzen?
public func CanUse(def)
{
  // Schwert
  if (def == SWOR) return(1);
  // Axt
  if (def == AXE1) return(1); 
  // Bogen
  if (def == BOW1) return(1); 
  // Schild
  if (def == SHIE) return(1); 
  // Speer
  if (def == SPER) return(1); 
  // Lanze
  if (def == LANC) return(1); 
  // Rüstung
  if (def == ARMR) return(1); 
  // Schwarze Rüstung
  if (def == BRMR) return(1); 
  // Unbekannt
  return(0);
}
- Mit #appendto KNIG sagen wir, dass der Script ein Anhang an den Ritter ist. Die andere Funktion ist frei kopiert aus dem Ritterscript. Sie sagt, welche Waffen der Ritter nutzen darf. Da schreiben wir jetzt unsere Waffe in dieser Forma dazu:
Code:
  if (def == PFAN) return(1); 
Um die anderen Funtionen nicht extra schreiben zu müssen und um ERRORS zu vermeiden ersetzen wir nun noch alle anderen Werte mit return(_inherited);

Das ganze sieht dann so aus:
Code:
/*-- RitterAppendTo --*/

#strict

#appendto KNIG


//! Welche Objekte kann dieser Clonk einsetzen?
public func CanUse(def)
{
 if (def == PFAN) return(1);
return(_inherited);
}


Ganz einfach Wink
Jetzt ist unsere Waffe bereit für ihren ersten Probegang. Und?
Bei mir funktioniert es -.- "Clonk"

Viel Spaß mit euren eigenen Waffen, bei Fragen Kommentieren!
Es ist mein erstes Tutorial, also bitte: Verbesserungsvorschläge Smile
mfg, MagicWipf


Zuletzt von MagicWipf am Fr Mai 20, 2011 10:36 pm bearbeitet; insgesamt 3-mal bearbeitet
Nach oben Nach unten
Benutzerprofil anzeigen
Limeox
Admiral
Admiral
avatar

Männlich Anmeldedatum : 25.04.10

BeitragThema: Re: Eine Nahkampfwaffe machen   Fr Mai 20, 2011 10:11 pm

Ganz gut, gibt erstmal ein +.

Allerdings gibts da natürlich ein bisschen zu bemängeln - und da du sowieso nach Verbesserungsvorschlägen fragst...^^
Es heißt Components (engl. für Bestandteile), nicht Competents.
Tote DefCore-Einträge (ConstructTo=NONE, entweder sinnfrei oder die ID existiert wirklich) verwirren.
Version! Keiner beachtet diesen Eintrag... warum eigentlich? :/
Scripts in #strict 2 sind schneller und schöner.
#appendtos gehören in System.c4gs. Sonst lädt die Engine sie als eigenständige Definition, was oft dumme Errors ausspuckt. In diesem Fall nicht, trotzdem ist es schöner (und performanter, wenn man GetDefinition() spamt xD).
Überladene Funktionen kopiert man nicht einfach, sondern nutzt inherited()/_inherited(), um die Originalfunktion nicht zu überschreiben. zB würde ein #appendto, das ebenfalls CanUse() überlädt und dazwischenschiebt, keine Wirkung zeigen.

Habe fertig. Smile

Edit: Die Pfanne kostet btw 3 Metall (24 Clunker), ist aber nur 20 Clunker wert - ein Verlustgeschäft. Razz
Nach oben Nach unten
Benutzerprofil anzeigen
MagicWipf
Brigadegeneral
Brigadegeneral
avatar

Männlich Alter : 20
Ort : Irgendwo im Nirgendwo
Anmeldedatum : 14.02.11

BeitragThema: Re: Eine Nahkampfwaffe machen   Fr Mai 20, 2011 10:30 pm

Vielen dank Limeox Very Happy
Ich hab (hoffentlich) alles verbessert. Nur wie du schon gesagt hast hielt ich das mi dem System Ordner nicht unbedingt für nötig ._.
EDIT: Hat denn das Tut auch wem geholfen ._.?
Nach oben Nach unten
Benutzerprofil anzeigen
Darkwolf
Clonk
Clonk


Anmeldedatum : 19.11.10

BeitragThema: Re: Eine Nahkampfwaffe machen   So Mai 22, 2011 11:06 am

Schönes Tut Very Happy hab allesdings noch n Schreibfehler entdeckt und zwar
"GetStrikeDemage()" anstatt Damage Very Happy
Nach oben Nach unten
Benutzerprofil anzeigen
snowtiger11
General
General
avatar

Männlich Alter : 20
Ort : Im Königreich Mankel
Anmeldedatum : 17.04.09

BeitragThema: Re: Eine Nahkampfwaffe machen   So Mai 29, 2011 7:08 pm

Limeox schrieb:
Die Pfanne kostet btw 3 Metall (24 Clunker), ist aber nur 20 Clunker wert - ein Verlustgeschäft. Razz

Und die T-Flint?O:
Flint+Schwefel=T-Flint
5 + (öh?) 3= 4
Nach oben Nach unten
Benutzerprofil anzeigen
ClonkGeist
Brigadegeneral
Brigadegeneral


Männlich Anmeldedatum : 23.01.10

BeitragThema: Re: Eine Nahkampfwaffe machen   Mo Mai 30, 2011 3:26 pm

Ein gutes Tutorial, in dem einiges erklärt wird, nur hatte ich erwartet, dass es für den normalen Clonk ist => bitte etwas früher erwähnen, sonst verwirrt das nur. Zudem gibt es da auch noch einige Fehler und so:
- "public func IsFightWeapon()"
- "GetStrikeDamage()"
- "#strict //*--Einfach schöner als strict Smile ---*//" verwirrt zumindest, #strict ist einfach schöner als #strict?
- "return(_inherited);" geht das eigentlich? Soweit ich weiß benötigt man dort die Klammern, da _inherited keine Konstante ist.

und weitere Rechtschreibfehler. Dann kann man noch evtl. erwähnen, was das für Grafikwerte sind, ist irgendwie komisch, dass vorher immer der vollständige Name genannt und gehighlightet wird, außer dort.
Nach oben Nach unten
Benutzerprofil anzeigen
Pitri
Feldmarschall
Feldmarschall
avatar

Männlich Alter : 24
Ort : Karlsruhe
Anmeldedatum : 02.03.09

BeitragThema: Re: Eine Nahkampfwaffe machen   Mo Jun 06, 2011 8:25 pm

ClonkGeist schrieb:
- "return(_inherited);" geht das eigentlich? Soweit ich weiß benötigt man dort die Klammern, da _inherited keine Konstante ist.

Da hast du recht, _inherited() ist eine Funktion. In den Klammern werden die Parameter der Funktion übergeben. Sollten zumindest. (Afaik werden die Parameter übernommen, wenn man _inherited(...); schreibt)
Nach oben Nach unten
Benutzerprofil anzeigen http://www.clonk-fanpage.lima-city.de
Gesponserte Inhalte




BeitragThema: Re: Eine Nahkampfwaffe machen   

Nach oben Nach unten
 
Eine Nahkampfwaffe machen
Vorheriges Thema anzeigen Nächstes Thema anzeigen Nach oben 
Seite 1 von 1
 Ähnliche Themen
-
» Von einer Serie eine Rpg machen
» Beitrag nur für eine Person sichtbar machen
» Ideen für eine Geburtstagsfeier
» Freundschaftsanfrage
» Ich will ein neues Pferd!

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