|
Invaders schlagen wieder zu
A4
beinhaltet auch ein starkes Engine 2D. Ich habe ein Demo eines einfachen
Spieles kreiert, vom Typ Invaders, indem ich dieses 2D Engine benutzt habe.
Das ganze Projekt steht zur Verfügung zum downloaden; Kopiert den
Folder Invaders in das Innere des Folders in den ihr 3DGS installiert habt.
PANEL
ship_pan {
BMAP ship_map;
LAYER 11;
POS_X 320;
POS_Y 400; // Er wird an der Basis des Bildschirms erscheinen
FLAGS OVERLAY, REFRESH;
}
Wir
definieren ship wie ein panel, wir set-up noch nicht den flag VISIBLE.
Auf dieselbe Weise gehen wir vor, wenn wir enemy, rocket (die Kugel des
Players) und fractal (die Kugel des Feindes) definieren.
function
main()
{
LOAD_LEVEL <invaders.wmb>;
WAITT 16;
CAMERA.PAN = 0; // Verändert diese Werte um andere Positionen zu erreichen
CAMERA.TILT = 285;
CAMERA.X = -60;
CAMERA.Y = -170;
CAMERA.Z = -420;
restart (); // Initialisiert das Spiel
move_ship ();
move_enemy ();
move_rocket ();
move_fractal ();
set_collisions ();
}
WAITT
16 wartet auf das laden des Niveaus; andernfalls können wir die Position
und die Winkel des Raumes nicht set-up. Wir fügen den Himmel hinzu,
aus einem einfachen wmb, welcher rotiert, indem wir ent_rotate aus template
benutzen.
function
move_ship ()
{
WHILE (1)
{
IF (KEY_CUL == ON && ship_pan.POS_X > 40)
{
ship_pan.POS_X -= 2;
}
IF (KEY_CUR == ON && ship_pan.POS_X < 600)
{
ship_pan.POS_X += 2; }
WAITT 1;
}
}
Wenn
wir den Pfeil von links drücken und POS_X von ship ist größer
als 40, bewegen wir ship nach links; genauso gehen wir vor, wenn wir den
Pfeil rechts drücken, und POS_X ist kleiner als 600.
function
move_enemy ()
{
WHILE (1)
{
IF (enemy_pan.POS_X > 40 && enemy_flag == 1)
{
enemy_pan.POS_X -= 1;
}
ELSE
{
enemy_flag = 0; // Enemy will sich nach rechts bewegen
IF (enemy_pan.POS_X == 40 && enemy_pan.POS_Y < 350)
{
WHILE (counter < 40)
{
enemy_pan.POS_Y += 1; // enemy kommt dem ship nahe
counter += 1;
WAITT 1;
}
counter = 0; // wir wollen ihn auch am Rande rechts gebrauchen
}
}
IF (enemy_pan.POS_X < 580 && enemy_flag == 0)
{
enemy_pan.POS_X += 1; //er bewegt sich nach rechts
}
ELSE
{
enemy_flag = 1; // er will sich nach links bewegen
IF (enemy_pan.POS_X == 580 && enemy_pan.POS_Y < 350)
{
WHILE (counter < 40)
{
enemy_pan.POS_Y += 1;
counter += 1;
WAITT 1;
}
counter = 0; // gesettet für den Rand links
}
}
WAITT 1;
}
}
Wenn
POS_X des enemy größer als 40 und enemy_flag = 1, wird enemy
sich nach links bewegen. Wenn POS_X des enemy egal mit 40, wird enemy sich
dem Player nahen indem er die Schleife WHILE (counter <40) benutzt.
Indem nun enemy_flag = 0, wird sich enemy nach rechts bewegen. Wenn POS_X
des enemy 580 ist, wird enemy sich erneut dem ship nähern; enemy nähert
sich ship so lange POS_Y kleiner ist als 350.
function
move_rocket ()
{
WHILE (1)
{
IF (KEY_SPACE == ON && ship_pan.VISIBLE == ON)
{
rocket_pan.POS_X = ship_pan.POS_X + 18;
rocket_pan.VISIBLE = ON; // Zeige rocket
PLAY_SOUND rocket_snd,100;
WHILE (rocket_pan.POS_Y > 10)
{
rocket_pan.POS_Y -= 4; // bewege rocket nach oben
WAITT 1;
}
rocket_pan.VISIBLE = OFF; // verdecke rocket
rocket_pan.POS_Y = 388; // unterbreche die Zusammenstöße wenn
ship getroffen ist
}
WAIT 1;
}
}
Wenn
man die Taste space drückt und ship ist nicht getroffen, bringen wir
rocket zum Vorschein und bewegen es nach oben, in die Richtung von enemy.
Wir benutzen den Wert 18 = die Breite von ship/ 2 - die Breite von fractal
/ 2 und 16 = Breite von enemy/ 2 als offset auf x und auf y, weil wir wollen
dass fractal aus der Mitte von enemy geschossen wird.
function
move_fractal ()
{
WHILE (1)
{
IF (enemy_pan.VISIBLE == ON)
{
fractal_pan.POS_X = enemy_pan.POS_X + 10;
fractal_pan.POS_Y = enemy_pan.POS_Y + 16;
PLAY_SOUND fractal_snd,50;
WHILE (fractal_pan.POS_Y < 480)
{
fractal_pan.VISIBLE = ON;
fractal_pan.POS_Y += 4;
WAITT 1;
}
fractal_pan.POS_Y = 72;
fractal_pan.VISIBLE = OFF;
}
WAIT 1;
}
}
Die
Funktionen für das aufspüren der Zusammenstöße und
für den Restart des Spieles sind ziemlich einfach, also lassen wir
sie als Übungen.
Laser-Waffen - wie sehr brauchen wir sie?
ACTION
laser_beam // Füge sie jeder Entität bei, sie bleibt unsichtbar
{
MY.PASSABLE = ON;
MY.INVISIBLE = ON;
WHILE (1)
{
// set-up die Entfernung bei 5000 quants am Anfang
laser_temp.X=5000*COS(player.PAN)*COS(CAMERA.TILT)+player.X;
laser_temp.Y=5000*SIN(player.PAN)*COS(CAMERA.TILT)+player.Y;
laser_temp.Z=5000*SIN(CAMERA.TILT)+player.Z;
SHOOT player.POS,laser_temp;
// jetzt laser_temp speichert den Wert von RESULT
.
pos1.X = MY.X;
pos1.Y = MY.Y;
pos1.Z = MY.Z + 16;
pos2.X = PLAYER.X;
pos2.Y = PLAYER.Y;
pos2.Z = PLAYER.Z;
laser_particle();
WAIT 1;
}
}
Die
Funktion laser_particle ist eine Derivate von particle_line
in template und wird eine Linie von Partikeln generieren zwischen
pos 1 (Ziel) und pos 2 (player).
function
particle_start()
{
IF (MY_AGE == 0)
{
MY_COLOR.RED = 200; // der rote Laserstrahl
MY_COLOR.GREEN = 0;
MY_COLOR.BLUE = 0;
MY_SIZE = 100;
return;
}
MY_ACTION = NULL;
}
In
dieser Aktion zerstören wir sofort die Partikel, die wir kreiert haben.
MY_SIZE kann verändert werden, je nach der Entfernung, so dass die
Partikel, die sich näher am Player befinden, kleiner sind.
|