gwX Forum
Würden Sie gerne auf diese Nachricht reagieren? Erstellen Sie einen Account in wenigen Klicks oder loggen Sie sich ein, um fortzufahren.

Clonk Script Hilfe

3 verfasser

Nach unten

Clonk Script Hilfe Empty Clonk Script Hilfe

Beitrag  kakerlake So 25 Jan 2009 - 17:15

Kann einmal jemand diese Script einwenig erklären?

ich möchte wissen:
-Wie und wo werden die Rotatiosnpunkte(bzw Skelett) festgelegt?
-Wie wird die Bewegung festgelegt?

Code:
//Locals:
//0:Walk
//1:Drehen
//2:Walk-Lock beim Springen
//3:Arm-Position
//4:Bein-Position




cdecl clonk_rendermenu(o,w,h)
{
 glpushmatrix;
 gltranslate(5,5,0);
 balken(10,h-10,255,255,255);
 var l;
 l:=(getdamage(o)*h-20)/500;
 glpushmatrix;
 gltranslate(0,l,0);
 balken(10,h-10-l,255,0,0);
 glpopmatrix;
 gltranslate(20,50,0);
 glcolor(255,255,255);
 textout("q = Werfen; e = Jump; r = Steuerung übernehmen");
 glpopmatrix; glpushmatrix;
 l:=contentscount(o);
 gltranslate(36+20*l,h-22,0);
 while(l>0)
 {
  l--;
  drawitem(intern(Contents(o,l),getid("menuitem")),20);
  gltranslate(-20,0,0);
 };
 glpopmatrix;
 gltranslate(w-31,31,0);
 drawitem(getid("geld"),31);
 l:=local(getplayer(o)).(0);
 if(l>9){gltranslate(-8,0,0)};
 if(l>99){gltranslate(-8,0,0)};
 if(l>999){gltranslate(-8,0,0)};
 if(l>9999){gltranslate(-8,0,0)};
 if(l>99999){gltranslate(-8,0,0)};
 glcolor(255,255,255);
 textout("%d",l);
}

cdecl clonk_intern(a)
{
 if(a=getid("geld")){return 25}; //Preis
 if(a=getid("menuitem")){return getid("clonk_title")}; //Titelbild
 if(a=getid("buymenu")){return 1}; //Crew-Flag
}

cdecl clonk_mousepos(o,rel)
{
 local(o).(1):=rel;
}

cdecl clonk_damage(o,delta,gesamt)
{
 if(gesamt>500){removeobject(o)};
}

cdecl clonk_load
{
 loadtexture("clonk_title");
 loadmodel("clonk_ganz");
 loadmodel("clonk_kopf");
 loadtexture("geld");
 loadtexture("clonk_title");
}

register clonk_kopf
{
 glcolor(211,154,123);
 glcalllist(getid("clonk_kopf_skin"));
 glcolor(75,46,24);
 glcalllist(getid("clonk_kopf_hair"));
 glcolor(209,206,206);
 glcalllist(getid("clonk_kopf_eyes"));
 glcolor(197,110,93);
 glcalllist(getid("clonk_kopf_mouth"));
 glcolor(44,44,44);
 glcalllist(getid("clonk_kopf_pupill"));
 glcolor(31,20,3);
 glcalllist(getid("clonk_kopf_eyebrows"));
}

cdecl clonk_render(o)
{
 glscale(200,200,-200);
 gltranslate(0,-110,0);

 glpushmatrix;
 gltranslate(0,180,9);
 glscale(2600,2600,2600);
 clonk_kopf;
 glpopmatrix;

 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_bauch"));
 var s; //Beinposition
 s:=Sin(local(o).(4),40);
 s:=s-10;
 var s2; //Arm-Schlenkern
 s2:=20-cos(local(o).(4),20);
 if(local(o).(3)>10){s2:=0};
 const sz=90;

 //Beine
 glpushmatrix;
 glrotate(s,1,0,0);
 glcalllist(getid("clonk_ganz_rechts_oben"));
 gltranslate(0,-sz,0);
 glrotate(s2,1,0,0);
 gltranslate(0,sz,0);
 glcalllist(getid("clonk_ganz_rechts_unten"));
 glpopmatrix;

 glpushmatrix;
 glrotate(-s,1,0,0);
 glcalllist(getid("clonk_ganz_links_oben"));
 gltranslate(0,-sz,0);
 glrotate(s2,1,0,0);
 gltranslate(0,sz,0);
 glcalllist(getid("clonk_ganz_links_unten"));
 glpopmatrix;

 //Arme
 var r;
 r:=gety(getspeed(o))/2;
 if(r>0){r:=90-r} else {r+=90};
 var r2;
 if(local(o).(3)){r2:=0} else {r:=90;r2:=sin(local(o).(4),40)};


 glpushmatrix;
 gltranslate(-60,90,0);
 glrotate(-(local(o).(3)+r2),1,0,0);
 glrotate(r,0,0,1);
 gltranslate(60,-90,0);
 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_rechts_oarm"));

 gltranslate(-118,89,0);
 glrotate(r2/2+15,0,1,0);
 gltranslate(118,-89,0);

 glcolor(211,154,123);
 glcalllist(getid("clonk_ganz_rechts_uarm"));
 glpopmatrix;

 glpushmatrix;
 gltranslate(60,90,0);
 glrotate(-(local(o).(3)-r2),1,0,0);
 glrotate(-r,0,0,1);
 gltranslate(-60,-90,0);
 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_links_oarm"));

 gltranslate(118,89,0);
 glrotate(r2/2-15,0,1,0);
 gltranslate(-118,-89,0);

 glcolor(211,154,123);
 glcalllist(getid("clonk_ganz_links_uarm"));
 glpopmatrix;

}

cdecl clonk_init(o)
{
 local(o).(0):=0;
 local(o).(1):=0;
 local(o).(2):=0;
 local(o).(3):=90;
}

cdecl clonk_checkwalk(o)
{
 if(local(o).(2)) {return 0};
 setimpuls(o,0,8,0);
 dodirimpuls(o,local(o).(0));
}

cdecl clonk_tick(o,t)
{
 if(local(o).(2)){local(o).(4):=Sin(70+gety(getspeed(o)),70)} else
 {
  if(local(o).(0)=0){local(o).(4):=0} else {local(o).(4)+=local(o).(0)/7};
 };
 if(local(o).(1))
 {
  if(local(o).(2)) {return setrdir(o,0)};
  setrdir(o,local(o).(1));
  if(length(GetSpeed(o))=0)
  {doimpuls(o,0,3,0)};
 };
 if(local(o).(3)>0){local(o).(3)-=3};
 if(local(o).(3)<0){local(o).(3)++};
}

cdecl clonk_keydown(o,key)
{
 if(key=119)
 {
  local(o).(0):=100;
  clonk_checkwalk(o);
 };
 if(key=115)
 {
  local(o).(0):=-100;
  clonk_checkwalk(o);
 };
 if(key=97)
 {
  local(o).(1):=2;
 };
 if(key=100)
 {
  local(o).(1):=-2;
 };
 if(key=101) //Springen
 {
  if(local(o).(2)=0)
  {
  local(o).(2):=1;
  doimpuls(o,0,70,0);
  local(o).(3):=-30;
  };
 };
}

cdecl clonk_hit(o,o2)
{
 if(local(o).(0)) {clonk_checkwalk(o)};
 local(o).(2):=0;
 if(o2=0){return 0};
 //Einsammeln
 if(intern(o2,getdef(o))) //Collectible prüfen
 {
  intern2(o,getdef(o)+2,o2); //RejectCollect
 };
 if(intern(o2,getdef(o)+2)<>0)  //Schieben
 {
  if(getplayer(o2)){return 0};
  setr(o2,getr(o));
  //setimpuls(o,0,0,0);
  dodirimpuls(o2,40);
  doimpuls(o2,0,5,0);
  local(o).(3):=70;
 };
}

cdecl clonk_intern2(o,n,o2)
{
 if(n=getid("clonk")+2)  //RejectCollect
 {
  if(contentscount(o)<1) //Regel: nur 1s aufnehmen
  {
  enter(o2,o);
  local(o).(3):=20;
  intern2(o2,getdef(o),o);
  };
 };
}

cdecl clonk_keyup(o,key)
{
 if(key=113) //Werfen
 {
  if(contentscount(o)>0)
  {
  var a;
  a:=contents(o,0);
  exit(a);
  doimpuls(a,0,80,0);
  dodirimpuls(a,100);
  local(o).(3):=150;
  };
 };
 if(key=119 or key=115)
 {
  local(o).(0):=0;
 };
 if(key=97 or key=100)
 {
  local(o).(1):=0;
  setrdir(o,0);
 };
 if(key=114) //Steuerung übernehmen
 {
  var a;
  dodirimpuls(o,800);
  a:=getspeed(o);
  a:=TryMove(o,getx(a),gety(a),getz(a));
  dodirimpuls(o,-800);
  if(a<>0)
  {
  if(intern(a,getdef(o)+1)<>0) {pushcrew(o,a);intern2(a,getdef(o)+1,o)}; //Spielersteuerung und intern2-Aufruf
  };
 };
}
kakerlake
kakerlake

Anzahl der Beiträge : 380
Anmeldedatum : 11.01.09

Nach oben Nach unten

Clonk Script Hilfe Empty Re: Clonk Script Hilfe

Beitrag  !cORe!trike994 So 25 Jan 2009 - 17:54

also zu 1.:
die rotationsachse is immer in der mitte des objektes
also wenn ich mich nich irre ist der script für eine rotation
glrotate(objekt,winkel,x,y,z);
einer der letzten drei werte muss 1 sein und sagt die achse der drehung aus
!cORe!trike994
!cORe!trike994
Admin

Anzahl der Beiträge : 937
Anmeldedatum : 29.12.08
Alter : 30
Ort : Rostock/Pforzheim

https://gwxf.forumieren.com

Nach oben Nach unten

Clonk Script Hilfe Empty Re: Clonk Script Hilfe

Beitrag  Carli Mo 26 Jan 2009 - 18:37

nuja ganz so trivial ist das nicht.
Ich werd mal auskommentieren

Code:
//Locals:
//0:Walk
//1:Drehen
//2:Walk-Lock beim Springen
//3:Arm-Position
//4:Bein-Position


Zuerst das 2D-Outfit des Clonks
Code:

cdecl clonk_rendermenu(o,w,h)
{
 glpushmatrix;
Hier der Balken links in Farbe Rot mit weißem Hintergrund
Code:

 gltranslate(5,5,0);
 balken(10,h-10,255,255,255);
 var l;
 l:=(getdamage(o)*h-20)/500;
 glpushmatrix;
 gltranslate(0,l,0);
 balken(10,h-10-l,255,0,0);
 glpopmatrix;
 gltranslate(20,50,0);
 glcolor(255,255,255);
 textout("q = Werfen; e = Jump; r = Steuerung übernehmen");
 glpopmatrix; glpushmatrix;
jetzt links unten die Inventaranzeige
Code:

 l:=contentscount(o);
 gltranslate(36+20*l,h-22,0);
 while(l>0)
 {
  l--;
  drawitem(intern(Contents(o,l),getid("menuitem")),20);
  gltranslate(-20,0,0);
 };
 glpopmatrix;
 gltranslate(w-31,31,0);
Anzeige des Spielergeldes rechts oben
Code:

 drawitem(getid("geld"),31);
 l:=local(getplayer(o)).(0);
 if(l>9){gltranslate(-8,0,0)};
 if(l>99){gltranslate(-8,0,0)};
 if(l>999){gltranslate(-8,0,0)};
 if(l>9999){gltranslate(-8,0,0)};
 if(l>99999){gltranslate(-8,0,0)};
 glcolor(255,255,255);
 textout("%d",l);
}
Jetzt die Definition
Code:

cdecl clonk_intern(a)
{
 if(a=getid("geld")){return 25}; //Preis
 if(a=getid("menuitem")){return getid("clonk_title")}; //Titelbild
 if(a=getid("buymenu")){return 1}; //Crew-Flag
}
Bewegunng durch die Maus soll den Clonk drehen
Code:

cdecl clonk_mousepos(o,rel)
{
 local(o).(1):=rel;
}
Der Clonk soll sterben, wenn er zu stark beschädigt wird. (Leichengrafik fehlt noch)
Code:

cdecl clonk_damage(o,delta,gesamt)
{
 if(gesamt>500){removeobject(o)};
}
Jetzt noch die zu ladenden Texturen und Models
Code:

cdecl clonk_load
{
 loadtexture("clonk_title");
 loadmodel("clonk_ganz");
 loadmodel("clonk_kopf");
 loadtexture("geld");
 loadtexture("clonk_title");
}
Das Renderscript für den Kopf wird aus der Renderroutine heraus aufgerufen
Code:

register clonk_kopf
{
 glcolor(211,154,123);
 glcalllist(getid("clonk_kopf_skin"));
 glcolor(75,46,24);
 glcalllist(getid("clonk_kopf_hair"));
 glcolor(209,206,206);
 glcalllist(getid("clonk_kopf_eyes"));
 glcolor(197,110,93);
 glcalllist(getid("clonk_kopf_mouth"));
 glcolor(44,44,44);
 glcalllist(getid("clonk_kopf_pupill"));
 glcolor(31,20,3);
 glcalllist(getid("clonk_kopf_eyebrows"));
}
Und hier die Clonk-Grafik
Code:

cdecl clonk_render(o)
{
Das Model ist zu klein und muss noch verschoben werden
Code:

 glscale(200,200,-200);
 gltranslate(0,-110,0);
Dann wird der Kopf gezeichnet
Code:

 glpushmatrix;
 gltranslate(0,180,9);
 glscale(2600,2600,2600);
 clonk_kopf;
 glpopmatrix;
Oberkörper
Code:

 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_bauch"));
Jetzt wird mit s und s2 eine Bein- und Armposition berechnet. local(o).(4) ist die gelaufene Strecke des Clonks.
Code:

 var s; //Beinposition
 s:=Sin(local(o).(4),40);
 s:=s-10;
 var s2; //Arm-Schlenkern
 s2:=20-cos(local(o).(4),20);
 if(local(o).(3)>10){s2:=0};
 const sz=90;
Jetzt gehts ans Eingemachte:
Code:

 //Beine
 glpushmatrix;
Der Oberschenkel wird gedreht und gezeichnet
Code:

 glrotate(s,1,0,0);
 glcalllist(getid("clonk_ganz_rechts_oben"));
Anschließend der Unterschenkel vom Rotationsankerpunkt in den Koordinatenursprung verschoben, gedreht und zurückverschoben. Anschließend wird der Unterschenkel an der neuen Position gezeichnet.
Code:

 gltranslate(0,-sz,0);
 glrotate(s2,1,0,0);
 gltranslate(0,sz,0);
 glcalllist(getid("clonk_ganz_rechts_unten"));
 glpopmatrix;
Dasselbe für die andere Seite.
Code:

 glpushmatrix;
 glrotate(-s,1,0,0);
 glcalllist(getid("clonk_ganz_links_oben"));
 gltranslate(0,-sz,0);
 glrotate(s2,1,0,0);
 gltranslate(0,sz,0);
 glcalllist(getid("clonk_ganz_links_unten"));
 glpopmatrix;
Nun zu den Armen: r ist die Armausbreitung (Ausbreiten zum springen) und r2 die Armdrehung (für das Rumschlenkern)
Code:

 //Arme
 var r;
 r:=gety(getspeed(o))/2;
 if(r>0){r:=90-r} else {r+=90};
 var r2;
Sollte der Clonk nicht gerade
Code:

 if(local(o).(3)){r2:=0} else {r:=90;r2:=sin(local(o).(4),40)};

jetzt wieder ein in-den-mittelpunkt-schieben, drehen und zurück-schieben
Code:

 glpushmatrix;
 gltranslate(-60,90,0);
 glrotate(-(local(o).(3)+r2),1,0,0);
 glrotate(r,0,0,1);
 gltranslate(60,-90,0);
 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_rechts_oarm"));

 gltranslate(-118,89,0);
 glrotate(r2/2+15,0,1,0);
 gltranslate(118,-89,0);

 glcolor(211,154,123);
 glcalllist(getid("clonk_ganz_rechts_uarm"));
 glpopmatrix;

 glpushmatrix;
 gltranslate(60,90,0);
 glrotate(-(local(o).(3)-r2),1,0,0);
 glrotate(-r,0,0,1);
 gltranslate(-60,-90,0);
 glcolor(0,0,255);
 glcalllist(getid("clonk_ganz_links_oarm"));

 gltranslate(118,89,0);
 glrotate(r2/2-15,0,1,0);
 gltranslate(-118,-89,0);

 glcolor(211,154,123);
 glcalllist(getid("clonk_ganz_links_uarm"));
 glpopmatrix;

}
Jetzt die Initialisierung der Lokalvariablen:
Code:

cdecl clonk_init(o)
{
 local(o).(0):=0;
 local(o).(1):=0;
 local(o).(2):=0;
 local(o).(3):=90;
}
Beim Aufprall soll der Clonk jetzt weiter"hopsen". Gemeint ist die Laufberegung, die aus kleinen, flachen Sprüngen besteht.
Code:

cdecl clonk_checkwalk(o)
{
 if(local(o).(2)) {return 0};
 setimpuls(o,0,8,0);
 dodirimpuls(o,local(o).(0));
}
Das Script, das jedes Frame ausgeführt wird: local(o).(4) ist die gelaufene ClonkZentimeter-Zahl, die beim Laufen erhöht wird, um ein Bein- und Armschlenkern zu verursachen.
Code:

cdecl clonk_tick(o,t)
{
 if(local(o).(2)){local(o).(4):=Sin(70+gety(getspeed(o)),70)} else
 {
  if(local(o).(0)=0){local(o).(4):=0} else {local(o).(4)+=local(o).(0)/7};
 };
Außerdem muss die Drehung um die Achse durch Maus oder Tastatur jedes Frame aktualisiert werden.
Code:

 if(local(o).(1))
 {
  if(local(o).(2)) {return setrdir(o,0)};
  setrdir(o,local(o).(1));
  if(length(GetSpeed(o))=0)
  {doimpuls(o,0,3,0)};
 };
 if(local(o).(3)>0){local(o).(3)-=3};
 if(local(o).(3)<0){local(o).(3)++};
}
nschließend noch die Auswertunng der Tastendrücke
Code:

cdecl clonk_keydown(o,key)
{
 if(key=119)
 {
  local(o).(0):=100;
  clonk_checkwalk(o);
 };
 if(key=115)
 {
  local(o).(0):=-100;
  clonk_checkwalk(o);
 };
 if(key=97)
 {
  local(o).(1):=2;
 };
 if(key=100)
 {
  local(o).(1):=-2;
 };
 if(key=101) //Springen
 {
  if(local(o).(2)=0)
  {
  local(o).(2):=1;
  doimpuls(o,0,70,0);
  local(o).(3):=-30;
  };
 };
}
.. und das Hit-Script
Code:

cdecl clonk_hit(o,o2)
{
 if(local(o).(0)) {clonk_checkwalk(o)};
 local(o).(2):=0;
 if(o2=0){return 0};
 //Einsammeln
 if(intern(o2,getdef(o))) //Collectible prüfen
 {
  intern2(o,getdef(o)+2,o2); //RejectCollect
 };
 if(intern(o2,getdef(o)+2)<>0)  //Schieben
 {
  if(getplayer(o2)){return 0};
  setr(o2,getr(o));
  //setimpuls(o,0,0,0);
  dodirimpuls(o2,40);
  doimpuls(o2,0,5,0);
  local(o).(3):=70;
 };
}

cdecl clonk_intern2(o,n,o2)
{
 if(n=getid("clonk")+2)  //RejectCollect
 {
  if(contentscount(o)<1) //Regel: nur 1s aufnehmen
  {
  enter(o2,o);
  local(o).(3):=20;
  intern2(o2,getdef(o),o);
  };
 };
}
... weitere Key-Events
Code:

cdecl clonk_keyup(o,key)
{
 if(key=113) //Werfen
 {
  if(contentscount(o)>0)
  {
  var a;
  a:=contents(o,0);
  exit(a);
  doimpuls(a,0,80,0);
  dodirimpuls(a,100);
  local(o).(3):=150;
  };
 };
 if(key=119 or key=115)
 {
  local(o).(0):=0;
 };
 if(key=97 or key=100)
 {
  local(o).(1):=0;
  setrdir(o,0);
 };
 if(key=114) //Steuerung übernehmen
 {
  var a;
  dodirimpuls(o,800);
  a:=getspeed(o);
  a:=TryMove(o,getx(a),gety(a),getz(a));
  dodirimpuls(o,-800);
  if(a<>0)
  {
  if(intern(a,getdef(o)+1)<>0) {pushcrew(o,a);intern2(a,getdef(o)+1,o)}; //Spielersteuerung und intern2-Aufruf
  };
 };
}

noch ein Hinweis: Shadowprimus arbeitet derzeit am Clonkmodel und entfernt aller paar wochen mal das ein- oder andere Gelenkartefakt. Ihr könnt aber trotzdem versuchen, neue Clonks zu scripten.
Wichtig: Der ClonkScript ist der eigentliche Kern des Spielaufbaus. Deshalb ändert sich das Script auch ständig und Änderungen müssten mit mir abgesprochen werden.

Carli
Admin

Anzahl der Beiträge : 1001
Anmeldedatum : 02.01.09

Nach oben Nach unten

Clonk Script Hilfe Empty Re: Clonk Script Hilfe

Beitrag  kakerlake Mo 26 Jan 2009 - 19:55

ok danke vielmals an euch beide, hat geholfen ! Wink
kakerlake
kakerlake

Anzahl der Beiträge : 380
Anmeldedatum : 11.01.09

Nach oben Nach unten

Clonk Script Hilfe Empty Re: Clonk Script Hilfe

Beitrag  Gesponserte Inhalte


Gesponserte Inhalte


Nach oben Nach unten

Nach oben

- Ähnliche Themen

 
Befugnisse in diesem Forum
Sie können in diesem Forum nicht antworten