Schwierigkeit:
***Vorwissen: ActMap, DefCore, einige Befehle,Variablen, if und den == Operator
Man braucht doch einige Befehle und auch die ActMap findet Verwendung
Ok, dann fangen wir mal an eine schöne Kanone zu machen. Alle sollten die Kanone kennen die unter Objects.c4d steht. Man kann zielen und Zeug abschießen. Wer sich den Skript anguckt denkt sich: "Uff, WTF?"
Das will ich nun ändern. Ich erwarte das ihr mitdenkt deshalb erst immer ein Teil und im nachhinein die Erklärung, dann merkt ihr es euch besser(hoff ich mal)
Wir erstellen also die Kanone und brauchen erstmal eine Grafik:
So, die hätten wir. Unter Vorwissen steht DefCore und dafür gibt es ein Tut schon hier, daher nehm ich euch mal die Arbeit ab:
DefCore - Code:
-
[DefCore]
id=KUKA
Name=Kanone
Version=4,9,5
Category=C4D_Structure
MaxUserSelect=3
Width=60
Height=70
Offset=-30,-40
Picture=0,0,60,70
Vertices=2
VertexX=1,1
VertexY=30,-16
VertexFriction=100,100
Value=85
Mass=1000
Components=METL=3;
Grab=2
Kurz zusammengefasst: Gebäude, kann angefasst werden, hat einen Wert von 85, und besteht aus 3 Metall.
ActMap sollte man auch schon können aber fasse es natürlich kurz zusammen:
ActMap - Code:
-
[Action]
Name=Aim
Procedure=NONE
Directions=2
FlipDir=1
Length=5
Facet=0,0,60,70
NextAction=Hold
Aktion heißt Aim, kann auch horizontal gespiegelt dargestellt werden, Länge von 5 Bildern, Größe eines Bildes:0,0,60,70 und die Aktion soll beibehalten werden.
So, jetzt haben wir Grafik, DefCore und ActMap, da fehlt ja noch der Skript, und zu dem kommen wir jetzt.
Script - Code:
-
#strict 2
func Initialize()
{
SetAction("Aim");
//Etwas Startmunition reicht fürs erste
CreateContents(KUWI,this,20);
return 1;
}
So Initialize bedeutet schonmal sobald das Objekt erstellt wird, die Aktion setzen wir auf "Aim", dass ist die aus der ActMap und geben der Kanone mal Anfangsmunition. 20 mal ein KUWI in
thises/diesem Objekt. Soweit sollte alles klar sein, jetzt wird gleich noch einfacher:
- Code:
-
//Richtung anpassen
protected func ControlLeft()
{
SetDir(DIR_Left);
}
protected func ControlRight()
{
SetDir(DIR_Right);
}
Muss ich das wirklich erklären? Drückt man recht, sieht die Kanone auch nach rechts und umgekehrt. Mit bisschen Englisch-Kenntnissen ganz simpel. Machen wir weiter, und kommen zum nachladen:
- Code:
-
//Munition nachladen
protected func ControlThrow(pClonk)
{
//Wenn wir Invenarinhalt finden
var pBullet=FindContents(KUWI,pClonk);
//packen wir es rein
Enter(this,pBullet);
}
pClonk ist der ausführende Clonk, pBullet ist eine Variable, die den Inhalt des ausführenden Clonks nach KUWI absucht. Und wenn jetzt ControlThrow gedrückt wird, dann wird etwas von irgendwas anderem betreten(Enter). Und zwar betritt etwas
thises Objekt und zwar pBullet. Und das ist ja unserer KUWI-Inhalt des Clonks. Kurzgefasst: Der Kuwi-Inhalt des Clonks wandert in die Kanone.
An dieser Stelle: Sorry, Leute ich bin ein Mensch ders gern bequem hat^^ Aus dem Grund habe ich mir einen neuen Befehl erstellt und zwar:
BulletBillShot(int iXPosition, int iYPosition,int iXDir, int iYDir);Das heißt in diesem Skript steht euch ab sofort dieser Befehl zur Verfügung. Erste 2 Parameter sind die Austrittsposition und die letzen 2 sind die Geschwindigkeit. Das besondere an der Position: Sie muss immer Positiv angegeben werden, denn sie passt sich automatisch der Richtung an! Praktisch, nicht? Kann also 30 Pixel nach Links oder Rechts sein, je nach Richtung der Kanone.
Desweiteren übernimmt die Funktion das überprüfen nach Munition, und entfernen dieser, wenn abgeschossen wird. Vieles auf einmal, so hat man später eine bessere Übersicht, ihr seht später noch wieso
Falls Wunsch besteht, kann ich auf die Funktion ja noch näher drauf eingehen.
Damit ihr den Befehl nutzen könnt, kopiert das hier in euer Skript:
- Spoiler:
//Eigene Funktion um Kugelwillis zu schießen
protected func BulletBillShot(int iXPosition, int iYPosition,int iXDir, int iYDir)
{
var pMunition=FindContents(KUWI,this);
//Wenn keine Munition mehr, nix machen
if(!pMunition)
Message("Keine Munition mehr",this);
//Sonst knallen wir alles ab >
else
{
var pBullet=CreateObject(KUWI,iXPosition *(GetDir()*2-1), iYPosition);
//Geschwindigkeiten setzen
pBullet->SetXDir(iXDir * (GetDir()*2-1));
pBullet->SetYDir(iYDir);
RemoveObject(pMunition);
}
}
Ok, nach diesem gemeinem Teil kehren wir zurück zum Ursprünglichen. Wir wollen ja eine Kanone zum Schießen bewegen. Diesmal beziegen wir wieder die ActMap mit ein, je nach Bild soll ja die Munition(ihr wisst eh was es ist, jetzt da ihr meine eigene Funktion gesehen habt^^) Aber bevor wir zum schießen kommen, zuerst noch die Zielfunktion(en):
- Code:
-
//Kanone hoch und Runter bewegen
protected func ControlUp()
{
SetPhase(GetPhase() 1,this);
}
protected func ControlDown()
{
SetPhase(GetPhase()-1,this);
}
So, was passiert denn schönes? pClonk ist wieder der Graben-drückende
Clonk. Und nun kommt GetPhase() - doch was heißt das? GetPhase ist eher selten im
Gebrauch. Der Befehlt gibt zurück welches Bild im Moment gezeichnet
wurde, besser gesagt, welche Lenght(siehe Actmap) im Moment die Kanone
hat. Was zurückgegeben wird, ist eine Zahl. Wir haben jetzt ControlUp(oben) und Down(unten)jeweil mit 1 und -1. Drücken wir nach oben, rutscht das Bild der Kanone 1 weiter. In der Graphics.png also das zweite Bild. Bei ControlDown geht es dann wieder -1 zurück. Simpel, oder?
Damit ändern wir die Grafik der Kanone und können exakt nachfragen, welches Bild sie grade hat. Abhängig davon machen wir die Schussfunktion. Richtig, d.h. nun, worauf alle gewartet haben; Die Funktion zum schießen!
- Code:
-
//Feuer Frei!
protected func ControlDig(pClonk)
{
if(GetPhase(this)==0)
BulletBillShot(30,4,70,-5);
if(GetPhase(this)==1)
BulletBillShot(30,-4,80,-10);
if(GetPhase(this)==2)
BulletBillShot(27,-10,80,-20);
if(GetPhase(this)==3)
BulletBillShot(20,-20,88,-35);
if(GetPhase(this)==4)
BulletBillShot(18,-28,95,-55);
if(GetPhase(this)==5)
BulletBillShot(16,-30,80,-65);
}
GetPhase() kennt ihr ja. == stellt einen Vergleich da. Das heißt :
- Code:
-
if(GetPhase(this)==0)
bedeutet, dass wenn das Bild der Animation von thisem Objekt gleich 0 ist - entspricht dem ersten, Clonk zählt von 0 beginnend - dann Schießen wir einen KUWI - mithilfe unserer neuen, seltst erstellten Funktion - von der Position 30,4 ab und geben ihm eine Geschwindigkeit von 70 seitlich und -5 nach oben.
Das wiederholen wir für alle Bilder also bis Bild nummero 5 (entspricht dme 6.) , Austrittsposition und Geschw. sind ja dementsprechend anders.
Und wenn wir das haben, wäre das alles. Ein fertiges Skript wird hier nicht angeboten, sonst skrollt ihr ja nur runter und kopiert
Soweit zu Bowserkoopas erstem Tutorial