Move Code mit 3rd Person Perspektive!:
WICHTIG: Alle Bmaps Models Sounds etc. müsst ihr selbst machen! Wenn ihr das nicht könnt ladet euch die Models etc. von Downloadseiten!
bmap blood_map = <blood.pcx>;
var dist[3];
var force2[3];
define geschwindigkeit_skill,skill1;
define stamina,skill2;
define leben,skill3;
define waffe_haben,skill4;
define geld,skill5;
define ausdauer,skill6;
define 1erfahrung,skill7;
define limit,skill8;
define angriffsbereit,flag1;
define geschwindigkeit_skill_springen,skill9;
define geschwindigkeit,skill10;
define bewegungsart,skill11;
define leben_goblin,skill12;
define leben_monster,skill13;
define schleichen,skill14;
define animation,skill15;
define erlaube_fall,flag2;
define erlaube_springen,flag3;
define fall,flag4;
define speed,4;
var friction;
var falltime;
var leben_stop;
var sprungbegrenzung;
var gehen;
var strafen;
var springen;
var str_geh;
var rennen;
var stop3;
var zaubern;
var stop;
var feuern;
var reden;
var auswahl;
var sword1;
var sword2;
var angriff_w;
var stoppe_erste_erfahrung;
var sound_warte;
var camera_1;
var camera_2;
var chase_camera_dist[3] = 0,0,0;
var chase_camera_ang[3];
var kriechbegrenzung=1;
var camera_dist[3] = 100, 0,-60;
var cam_near_pos[3];
var view_angle[3]=0, 0, 0;
var person_3rd=0;
var cam_far_pos[3];
var cam_near_pos[3];
entity* goblin1;
entity* enemy;
entity* monster1;
sound tap=<tap.wav>;
sound sword_snd = <sword.wav>;
string morph=<t.mdl>;
string normal_player=<player.mdl>;
on_d = null;
panel blood
{
layer=10;
pos_x=0;
pos_y=0;
bmap = blood_map;
flags = d3d, refresh;
}
function fade_particle()
{
my.alpha -= 5 * time;
if (my.alpha < 0) {my.lifespan = 0;}
}
function particle_sparks()
{
temp.x = random(2) - 1;
temp.y = random(2) - 1;
temp.z = random(1) - 1.5;
vec_add (my.vel_x, temp);
my.alpha = 30 + random(50);
my.bmap = spark_map;
my.size = 1;
my.flare = on;
my.bright = on;
my.move = on;
my.lifespan = 20;
my.function = fade_particle;
}
function particle_blood()
{
temp.x = random(2) - 1;
temp.y = random(2) - 1;
temp.z = random(1) - 1.5;
vec_add (my.vel_x, temp);
my.alpha = 70 + random(30);
my.red=255;
my.size = 0.5;
my.flare = on;
my.bright = on;
my.move = on;
my.lifespan = 20;
my.function = fade_particle;
}
function angriff_1
{
if(my.waffe_haben==1)&&(mouse_middle==1)
{
ent_morph(my,morph);
my.angriffsbereit=off;
waitt(8);
my.waffe_haben=0;
}
}
function angriff_2
{
if(mouse_middle==1)
{
ent_morph(my,normal_player);
my.angriffsbereit=on;
waitt(8);
my.waffe_haben=1;
}
}
function move_event()
{
vec_set(temp,my.x);
temp.z -= 1000; // berechne eine Position 1000 Quants unter dem Player
// setze einen Trace-Modus, der die Player-Huelle benutzt und Map oder Level Oberflaechen erkennt
trace_mode = ignore_me+ignore_sprites+ignore_models+use_box;
result = trace(my.x,temp); // subtrahiere die vertikale Entfernung zum Boden
if(result > 15)||(result==null) // in der Luft?
{
falltime+=1;
}
else // auf und nahe dem Boden
{
if(falltime>100)
{
player.leben-=falltime;
}
}
}
action move_me
{
my.fat = off;
my.narrow = on;
player=my;
my.enable_block=on;
my.waffe_haben=1;
my.geld=500;
my.angriffsbereit=off;
my.limit = 100;
my.leben = 500;
my.geschwindigkeit = 0;
my.ausdauer = 100;
my.stamina = 100;
my.1erfahrung = 0;
///////// panel
if(my.geschwindigkeit_skill==0) { my.geschwindigkeit_skill=7.5; }
if(my.geschwindigkeit_skill_springen==0) { my.geschwindigkeit_skill_springen=10; }
if(my.erlaube_fall==off) { my.erlaube_fall=on; }
if(my.erlaube_springen==off) { my.erlaube_springen=on; }
my.shadow=on;
while(my.leben>0)
{
my.lightrange=900;
my.red=128;
my.blue=128;
my.green=128;
my.skill14 = time*force2.pan + max(1-time*0.7,0)*my.skill14; // Drehgeschwindigkeit
my.pan += time * my.skill14; // drehe den Player
/////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////
//Fallen
vec_set(temp,my.x);
temp.z -= 1000; // berechne eine Position 4000 Quants unter dem Player
// setze einen Trace-Modus, der die Player-Huelle benutzt und Map oder Level Oberflaechen erkennt
trace_mode = ignore_me+ignore_sprites+ignore_models+use_box;
result = trace(my.x,temp); // subtrahiere die vertikale Entfernung zum Boden
if(result > 3)||(result==null) // in der Luft?
{
force2.x = 0; // keine schiebende Kraft
force2.y = 0;
force2.z -=time; // Schwerkraft
friction = 1; // Luftreibung
if(my.erlaube_fall==on) { my.fall=on; } else { my.fall=off;}
}
else // auf und nahe dem Boden
{
falltime=0;
leben_stop=0;
sprungbegrenzung=0;
force2.x = 5 * key_force.y; // Vorwärtskraft
force2.y = 0;
force2.z = -result; // Boden-Elastizität
friction = 0.7; // Bodenreibung
my.fall=off;
}
move_event();
my.skill11 = time*force2.x + max(1-time*friction,0)*my.skill11; // Geschwindigkeit vorwärts
my.skill13 = time*force2.z + max(1-time*friction,0)*my.skill13;
dist.y=0;
dist.x=time*my.skill11;
//Die Bewegungen
if(key_a==1) { my.bewegungsart=strafen; dist.y=key_a*time*my.geschwindigkeit_skill; }
if(key_d==1) { my.bewegungsart=strafen; dist.y=-(key_d*time*my.geschwindigkeit_skill); }
if(key_w==1) { my.bewegungsart=gehen; dist.x=key_w*time*my.geschwindigkeit_skill; }
if(key_s==1) { my.bewegungsart=gehen; dist.x=-(key_s*time*my.geschwindigkeit_skill); }
if(key_a==1)&&(key_w==1) { my.bewegungsart=str_geh; dist.x=key_w*time*5; }
if(key_d==1)&&(key_w==1) { my.bewegungsart=str_geh; dist.x=key_w*time*5; }
if(key_d==1)&&(key_s==1) { my.bewegungsart=str_geh; dist.x=-(key_s*time*5); }
if(key_a==1)&&(key_s==1) { my.bewegungsart=str_geh;dist.x=-(key_s*time*5); }
if(key_q==1) { force2.pan = 10 *key_q; }
if(key_e==1) { force2.pan = -10 *key_e; }
if(key_shift==1) { my.bewegungsart=rennen; dist.x*=1.5; }
dist.z = time*my.skill13; // Distanz vertikal
//////////////////////////////////////////////////
//Geschwindigkeitserfahrung und Rennen
if(key_shift==1)&&(key_s==1||key_w==1)
{
my.bewegungsart=rennen;
my.ausdauer-=0.1;
my.geschwindigkeit+=0.001;
if(my.ausdauer<=0)
{
my.ausdauer+=0.1;
my.geschwindigkeit-=0.001;
dist.x/=2;
}
}else{
if(my.ausdauer>=my.limit)
{
my.ausdauer-=0.1;
}
if(key_w==1)||(key_a==1)
{
my.ausdauer-=0.05;
}
my.ausdauer+=0.1;
}
if(my.geschwindigkeit>=50)
{
dist.x*=1.01;
if(stop3==0)
{
my.limit+=2;
stop3=1;
}
}
if(my.geschwindigkeit>=100)
{
dist.x*=1.01;
if(stop3==1)
{
my.limit+=1;
stop3=2;
}
}
////////////////////////////////////////////////////
//Zauber
if(mouse_left==1)&&(zaubern==1)
{
my.stamina-=0.5;
my.1erfahrung+=0.5;
if(my.stamina<=0)
{
stop=1;
if(my.transparent==off)
{
my.stamina+=0.5;
}
my.1erfahrung-=0.5;
}
}else{
if(my.stamina>=100)
{
my.stamina-=0.1;
}
if(my.transparent==off)
{
my.stamina+=0.1;
}
stop=0;
}
if(mouse_left==0)
{
zaubern=0;
}
///////////////////////////////////////////////////////
//Angriff
if(my.waffe_haben==0)
{
angriff_2();
}else{
angriff_1();
}
if (mouse_left == 1) && (player.waffe_haben==1)&&(key_s==0)&&(auswahl==0) || (mouse_left == 1) && (player.transparent==on)&&(key_s==0)&&(auswahl==0) || (mouse_left == 1) && (player.transparent==off)&&(key_s==0)&&(auswahl==0)
{
my.skill22 = 0; // reset "attack" frames
while (my.skill22< 100)
{
if(feuern==1) { break; }
if(reden==1) { break; }
ent_vertex(sword2, 291); // sword tip vertex coords - get the value in Med
ent_vertex(sword1, 306); // sword base vertex coords - get the value in Med
trace_mode = ignore_me + ignore_passable; // ignore me (the player) and all the entities that are passable
trace (sword1, sword2); // trace between these sword positions
if (result != 0) // the player has hit something
{
angriff_w=1;
if(you==enemy)
{
effect (particle_sparks, 10, target, normal);
if (you!=0) {enemy.leben -= random(0.5)+1;} // if it hasn't hit a wall, decrease health
}
if(you==goblin1)
{
effect (particle_blood, 10, target, normal);
if (you!=0) {goblin1.leben_goblin -= random(0.5)+1;}
}
if(you==monster1)
{
effect (particle_blood, 10, target, normal);
if (you!=0) {monster1.leben_monster -= random(0.5)+1;}
}
}
ent_cycle("attack", my.skill22); // play attack frames animation
my.skill22 += time*8; // "attack" animation speed
wait (1);
}
while (mouse_left == 1) {if(reden==1) { break; } wait (1);}
}
angriff_w=0;
//////////////////////////Springen und kriechen
if(key_space==1)&&(sprungbegrenzung<=25)&&(my.erlaube_springen==on)
{
my.skill22=0;
while(my.skill22<100)
{
my.bewegungsart=springen;
dist.z=1;
if(key_a==1) { dist.y=key_a*time*my.geschwindigkeit_skill_springen; }
if(key_d==1) { dist.y=-(key_d*time*my.geschwindigkeit_skill_springen); }
if(key_w==1) {dist.x=key_w*time*my.geschwindigkeit_skill_springen; }
if(key_s==1)&&(mouse_left==0)&&(my.waffe_haben==0) { dist.x=-(key_s*time*my.geschwindigkeit_skill_springen); }
if(key_a==1)&&(key_w==1) { dist.x=key_w*time*5; }
if(key_d==1)&&(key_w==1) { dist.x=key_w*time*5; }
if(key_d==1)&&(key_s==1) { dist.x=-(key_s*time*5); }
if(key_a==1)&&(key_s==1) { dist.x=-(key_s*time*5); }
sprungbegrenzung+=1;
ent_cycle("jump",my.skill22);
my.skill22+=time*8;
camera.x = player.x + cos(player.pan) * (-(100+abs(1*0.01)));
camera.y = player.y + sin(player.pan) * (-(100+abs(1*0.01)));
camera.z = player.z + 70;
camera.tilt = -20;
camera.pan = player.pan;
camera.roll = player.roll;
ent_move(dist,nullvector);
wait(1);
}
}
if(my.1erfahrung>1000)&&(stoppe_erste_erfahrung==0)
{
stoppe_erste_erfahrung=1;
}
move_mode = ignore_passable;
if(zoom_an == 0)
{
camera.x = player.x + cos(player.pan) * (-(100+abs(1*0.01)));
camera.y = player.y + sin(player.pan) * (-(100+abs(1*0.01)));
camera.z = player.z + 70;
camera.tilt = -20;
camera.pan = player.pan;
camera.roll = player.roll;
camera.genius = player;
}
else{
camera.tilt = 0;
camera.x = player.x ;
camera.y = player.y;
camera.z = player.z + 30;
camera.tilt = player.tilt;
camera.pan = player.pan;
camera.roll = player.roll;
camera.genius = player;}
if(my.bewegungsart==gehen)
{
if(key_w==1)&&(mouse_left==1)
{
dist.x=0;
}
if(key_s==1)||(key_w==1)||(key_w==1)&&(key_a==1)||(key_w==1)&&(key_d==1)||(key_s==1)&&(key_d==1)||(key_a==1)&&(key_s==1)&&(dist.z!=1)
{
ent_cycle("walk", my.skill48%100); // Animation endlos wiederholen.
my.skill48 += speed * time;
sound_warte+=1; //erhöhe die variable sound_warte immer um 1 wenn key:cuu gedrückt ist! Wenn sound_warte 25 ist setze es wieder auf null und spiele einen sound ab!
}
move_mode = ignore_passable + glide;
ent_move(dist,nullvector); // bewege Player
}
wait(1);
}
camera.x = player.x; /* Hier noch überall das gleich wie oben! */
camera.y = player.y;
camera.z = player.z+300; // die Z position der Kamera wird sehr erhöht!
camera.pan = player.pan;
camera.tilt = -90; //Die Kamera schaut nach unten!
camera.roll = 0;
camera.arc = 45;
while (my.skill24 < 80) // the enemy is dead
{
ent_cycle("death", my.skill24); // play death frames animation
my.skill24 += 1 * time; // "death" animation speed
wait (1);
}
blood.visible=on;
blood.alpha=0;
blood.transparent=on;
while(blood.alpha<75)
{
blood.alpha+=time*3;
wait(1);
}
}