2 registered members (AndrewAMD, Nymphodora),
1,466
guests, and 4
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
2D Space shooter -> es will nicht funktionieren
#432245
11/03/13 12:30
11/03/13 12:30
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
Hallo ich versuche mithilfe des Aum 82 ein eigenden ganz einfachen 2D Space Shooter zu programmieren. (ein Raumschiff, was einfach einen Feind abschießen können soll, der dann irgendwo zufällig wieder erscheint) :ABER: nun hab ich folgendes problem: Starte ich das Game kommt die meldung: Script-crash in space_ship(); -> diese meldung erscheint immer dann wenn ich die "Kollision" mit dem Feind wieder einschalte und ich schießen will -> (ich schalte die kollison ab der stelle: "COLLISION WITH ENEMY" mit */ ... */ aus ) und: mein Feind soll mit dem schuss kollidieren, was aber irgendwie nicht funtioniert, obwohl ich den gleichen Kollisions-code nehme hier der code
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////
var i = 0;
var score = 0;
function move_background();
function space_ship();
function shoot();
function enemy_event(i);
function enemy_collisions(i);
FONT* arial_font = "Arial#20";
///////////////////
PANEL* score_pan =
{
layer = 20;
digits (10, 10, "Score: %.f", arial_font, 1, score);
flags = visible;
}
PANEL* background1 =
{
bmap = "back_1.bmp";
pos_x = 0;
pos_y = 0;
flags = SHOW;
}
PANEL* background2 =
{
bmap = "back_1.bmp";
pos_x = 0;
pos_y = -769;
flags = SHOW;
}
PANEL* _ship =
{
bmap = "ship.bmp";
pos_x = 100;
pos_y = 100;
flags = SHOW | OVERLAY;
}
PANEL* _shoot[50];
PANEL* enemies[50];
function main()
{
vec_set(screen_size,vector(800,400,0));
vec_set(screen_color,vector(50,1,1)); // dark blue
vec_set(sky_color,vector(50,1,1)); // dark blue
video_window(NULL,NULL,0,"My New Game");
d3d_antialias = 1;
shadow_stencil = 3;
level_load(NULL);
move_background();
enemy_event(i);
space_ship();
}
function move_background()
{
while (1)
{
background1.pos_y += 3 * time_step;
background2.pos_y = background1.pos_y - 769;
if (background1.pos_y > 768)
{
background1.pos_y -= 768;
}
wait (1);
}
}
function space_ship()
{
while(1)
{
//UP
if (key_cuu == 1)
{
_ship.pos_y --;
}
//DOWN
if (key_cud == 1)
{
_ship.pos_y ++;
}
//LEFT
if (key_cul == 1)
{
_ship.pos_x --;
}
//RIGHT
if (key_cur == 1)
{
_ship.pos_x ++;
}
//SPACE && SHOOT == 0
if ((key_space) &&(!_shoot[i]))
{
i++;
_shoot[i] = pan_create("bmap = shot.bmp;",1);
_shoot[i].pos_x = _ship.pos_x+30;
_shoot[i].pos_y = _ship.pos_y;
_shoot[i].flags = VISIBLE;
}
//SHOOT EVENT
if (_shoot[i])
{
if (_shoot[i] .pos_y > 5)
{
_shoot[i].pos_y -= 5;
}
else
{
reset(_shoot[i] , VISIBLE);
i--;
_shoot[i] = NULL;
}
}
//COLLISION WITH ENEMY
if ((((_ship.pos_x + 67 >= enemies[i].pos_x) && (_ship.pos_x + 67 <= enemies[i].pos_x + 37)) ||
((enemies[i].pos_x + 37 >= _ship.pos_x) && (enemies[i].pos_x + 37 <= _ship.pos_x + 67)))&&
(((_ship.pos_y + 67 >= enemies[i].pos_y) && (_ship.pos_y + 67 <= enemies[i].pos_y + 37)) ||
((enemies[i].pos_y + 37 >= _ship.pos_y) && (enemies[i].pos_y + 37 <= _ship.pos_y + 67))))
{
score += 10;
reset(enemies[i],SHOW);
enemies[i].pos_x = random(400);
enemies[i].pos_y = random(400);
set(enemies[i],SHOW);
}
wait(1);
}
}
function enemy_event(i)
{
i++;
enemies[i] = pan_create("bmap = enemy2.bmp; flags = VISIBLE;", 20);
enemies[i].pos_x = random(150);
enemies[i].pos_y = random(150);
enemy_collisions(i);
}
function enemy_collisions(i)
{
while (1)
{
if (_shoot[i])
{
if (is (enemies[i], INVISIBLE)) {break;}
if ((((_shoot[i].pos_x >= enemies[i].pos_x) && (_shoot[i].pos_x <= enemies[i].pos_x)) ||
((enemies[i].pos_x >= _shoot[i].pos_x) && (enemies[i].pos_x <= _shoot[i].pos_x ))) &&
(((_shoot[i].pos_y >= enemies[i].pos_y) && (_shoot[i].pos_y <= enemies[i].pos_y )) ||
((enemies[i].pos_y >= _shoot[i].pos_y) && (enemies[i].pos_y <= _shoot[i].pos_y ))))
{
score += 20;
reset(_shoot[i], VISIBLE);
_shoot[i] = NULL;
reset(enemies[i], VISIBLE);
}
}
wait (1);
}
}
achja .. was mir noch ganz wichtig wäre: ich möchte keine #defines und temp variabeln beutzen da es sonst zu unübersichtlich wird
Last edited by ratz; 11/03/13 12:53.
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: ratz]
#432300
11/04/13 15:23
11/04/13 15:23
|
Joined: Aug 2003
Posts: 134 Saarland-Deutschland
Jog
Member
|
Member
Joined: Aug 2003
Posts: 134
Saarland-Deutschland
|
//SPACE && SHOOT == 0 if ((key_space) &&(!_shoot[i])) { i++;// Fehler _shoot[i] = pan_create("bmap = shot.bmp;",1); _shoot[i].pos_x = _ship.pos_x+30; _shoot[i].pos_y = _ship.pos_y; _shoot[i].flags = VISIBLE; } //SHOOT EVENT if (_shoot[i]) { if ( .pos_y > 5) { _shoot[i].pos_y -= 5; } else { reset(_shoot[i] , VISIBLE); i--;// Fehler _shoot[i] = NULL; } }
//COLLISION WITH ENEMY if ((((_ship.pos_x + 67 >= enemies[i].pos_x) && (_ship.pos_x + 67 <= enemies[i].pos_x + 37)) || ((enemies[i].pos_x + 37 >= _ship.pos_x) && (enemies[i].pos_x + 37 <= _ship.pos_x + 67)))&& (((_ship.pos_y + 67 >= enemies[i].pos_y) && (_ship.pos_y + 67 <= enemies[i].pos_y + 37)) || ((enemies[i].pos_y + 37 >= _ship.pos_y) && (enemies[i].pos_y + 37 <= _ship.pos_y + 67)))) { score += 10; reset(enemies[i],SHOW); enemies[i].pos_x = random(400); enemies[i].pos_y = random(400); set(enemies[i],SHOW); }
wait(1); } }
function enemy_event(i) { i++;// Fehler enemies[i] = pan_create("bmap = enemy2.bmp; flags = VISIBLE;", 20); enemies[i].pos_x = random(150); enemies[i].pos_y = random(150); enemy_collisions(i);
}
Fehlerbeschreibung: Beim 1 aufruf von _shoot[i] = pan_create("bmap = shot.bmp;",1); Ist _shoot[i] = _shoot[0] und enthält die werte vom Panel auf die du zugreifen kannst.
Dann zählst du _shoot[i] um 1 hoch also ist _shoot[i]= _shoot[1] und hat noch keine Panel werte zugewiesen bekommen, sondern zeigt auf einen leeren Speicherbereich.
Anstatt _ shoot[0] hast du shoot[1] übergeben.
In der Kollisionsüberprüfung greifst du dann auf nicht initialisierte werte wie z.b . _shoot.pos_x zu und erzeugst damit einen Crash.
Das gilt natürlich auch für enemies[i]
Also immer darauf Achten das Bereiche auf die man zugreift auch etwas enthalten.
Ich hoffe ich hab mich einigermaßen verständlich ausgedrückt
PS. Wenn du die mit Fehler gekennzeichneten Stellen auskommentierst funktioniert der Code.
Wenn Katzen Pferde w�hren, k�nnten wir die B�ume Hochreiten. *"Saarl�nder es kann nur einen geben"*
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: ratz]
#432478
11/06/13 17:20
11/06/13 17:20
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
HEY ES TUTS !! ich musste doch #define benutzen, damit der schuss keine leeren were hat hier der code
///////////////////////////////
#include <acknex.h>
#include <default.c>
#define enemy_width 51
#define enemy_height 64
#define bullet_width 5 // player's bullets' width and height
#define bullet_height 11
///////////////////////////////
var i = 1;
var score = 0;
function move_background();
function space_ship();
function shoot();
function enemy_event(i);
function enemy_collisions(i);
FONT* arial_font = "Arial#20";
///////////////////
PANEL* score_pan =
{
layer = 20;
digits (10, 10, "Score: %.f", arial_font, 1, score);
flags = visible;
}
PANEL* background1 =
{
bmap = "back_1.bmp";
pos_x = 0;
pos_y = 0;
flags = SHOW;
}
PANEL* background2 =
{
bmap = "back_1.bmp";
pos_x = 0;
pos_y = -769;
flags = SHOW;
}
PANEL* _ship =
{
bmap = "ship.bmp";
pos_x = 100;
pos_y = 100;
flags = SHOW | OVERLAY;
}
PANEL* _shoot[50];
PANEL* enemies[50];
function main()
{
vec_set(screen_size,vector(800,400,0));
vec_set(screen_color,vector(50,1,1)); // dark blue
vec_set(sky_color,vector(50,1,1)); // dark blue
video_window(NULL,NULL,0,"My New Game");
d3d_antialias = 1;
shadow_stencil = 3;
level_load(NULL);
move_background();
enemy_event(i);
space_ship();
}
function move_background()
{
while (1)
{
background1.pos_y += 3 * time_step;
background2.pos_y = background1.pos_y - 769;
if (background1.pos_y > 768)
{
background1.pos_y -= 768;
}
wait (1);
}
}
function space_ship()
{
while(1)
{
//UP
if (key_cuu == 1)
{
_ship.pos_y --;
}
//DOWN
if (key_cud == 1)
{
_ship.pos_y ++;
}
//LEFT
if (key_cul == 1)
{
_ship.pos_x --;
}
//RIGHT
if (key_cur == 1)
{
_ship.pos_x ++;
}
//SPACE && SHOOT == 0
if ((key_space) &&(!_shoot[i]))
{
_shoot[i] = pan_create("bmap = shot.bmp;",1);
_shoot[i].pos_x = _ship.pos_x+30;
_shoot[i].pos_y = _ship.pos_y;
_shoot[i].flags = VISIBLE;
}
//SHOOT EVENT
if (_shoot[i])
{
if (_shoot[i].pos_y > 5)
{
_shoot[i].pos_y -= 5;
}
else
{
reset(_shoot[i] , VISIBLE);
_shoot[i] = NULL;
}
}
//COLLISION WITH ENEMY
if ((((_ship.pos_x + 67 >= enemies[i].pos_x) && (_ship.pos_x + 67 <= enemies[i].pos_x + 37)) ||
((enemies[i].pos_x + 37 >= _ship.pos_x) && (enemies[i].pos_x + 37 <= _ship.pos_x + 67)))&&
(((_ship.pos_y + 67 >= enemies[i].pos_y) && (_ship.pos_y + 67 <= enemies[i].pos_y + 37)) ||
((enemies[i].pos_y + 37 >= _ship.pos_y) && (enemies[i].pos_y + 37 <= _ship.pos_y + 67))))
{
if(score > 1)
{
score -= 10;
}
reset(enemies[i],SHOW);
enemies[i].pos_x = random(400);
enemies[i].pos_y = random(400);
set(enemies[i],SHOW);
}
wait(1);
}
}
function enemy_event(i)
{
enemies[i] = pan_create("bmap = enemy2.bmp; flags = VISIBLE;", 20);
enemies[i].pos_x = random(650);
enemies[i].pos_y = random(350);
enemy_collisions(i);
}
function enemy_collisions(i)
{
while (1)
{
if (_shoot[i])
{
if (is (enemies[i], INVISIBLE)) {break;}
if ((((_shoot[i].pos_x + bullet_width >= enemies[i].pos_x) && (_shoot[i].pos_x + bullet_width <= enemies[i].pos_x + enemy_width)) ||
((enemies[i].pos_x + enemy_width >= _shoot[i].pos_x) && (enemies[i].pos_x + enemy_width <= _shoot[i].pos_x + bullet_width)))
&& (((_shoot[i].pos_y + bullet_height >= enemies[i].pos_y) && (_shoot[i].pos_y + bullet_height <= enemies[i].pos_y + enemy_height)) ||
((enemies[i].pos_y + enemy_height >= _shoot[i].pos_y) && (enemies[i].pos_y + enemy_height <= _shoot[i].pos_y + bullet_height))))
{
score += 20;
reset(_shoot[i], VISIBLE);
_shoot[i] = NULL;
reset(enemies[i], VISIBLE);
enemy_event(i);
}
}
wait (1);
}
}
Last edited by ratz; 11/06/13 17:27.
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: ratz]
#432536
11/07/13 18:23
11/07/13 18:23
|
Joined: Aug 2003
Posts: 134 Saarland-Deutschland
Jog
Member
|
Member
Joined: Aug 2003
Posts: 134
Saarland-Deutschland
|
:)Geht doch.
Also immer daran denken bei Pointer und co. immer besondere Sorgfalt walten lassen.
Gruß Jog
Wenn Katzen Pferde w�hren, k�nnten wir die B�ume Hochreiten. *"Saarl�nder es kann nur einen geben"*
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: Jog]
#432611
11/09/13 14:19
11/09/13 14:19
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
okey, jetz wollte ich noch, dass das Raumschiff nicht nur einmal schießt sondern öffters ... -> ich hab das ganze jetzt in ein block namens shoot gepackt
function space_ship()
...
if (key_space)
{
wait(25);
shoot_1(i);
}
...
wait(1);
}
}
function shoot_1(i)
{
snd_play(laser, 90, 0);
_shoot[i] = pan_create("bmap = shot.bmp;",1);
_shoot[i].pos_x = _ship.pos_x+30;
_shoot[i].pos_y = _ship.pos_y-20;
_shoot[i].flags = VISIBLE;
while(_shoot[i] != NULL)
{
_shoot[i].pos_y -= 0.5*time_step;
if(_shoot[i].pos_y > 5)
{
_shoot[i].pos_y -= 0.5*time_step;
}
else
{
reset(_shoot[i],VISIBLE);
break;
}
wait(1);
}
_shoot[i] = NULL;
}
problem: das raumschiff lässt sich werend des schießen nicht mehr steuern und wenn ich wait(25) entferne dann kommen zu viele glecihzeitig problem 2: die schüsse bewegen sich solange weiter bis ich leertaste drücke dannach nicht mehr, immer nur ein einzigster oder ich kann damit malen ich glaube ein bild sagt alles ...
Last edited by ratz; 11/09/13 14:21.
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: Ch40zzC0d3r]
#432641
11/10/13 12:06
11/10/13 12:06
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
kann mir einer zeigen wie und wo ich das an welcher stelle in shoot machen soll ?
...
var shoot_var = 1;
...
function space_ship()
{
...
if (key_space)
{
shoot_1(i);
}
...
}
function shoot_1(i)
{
if (shoot_var == 1)
{
shoot_var = 0;
wait(25);
snd_play(laser, 90, 0);
_shoot[i] = pan_create("bmap = shot.bmp;",1);
_shoot[i].pos_x = _ship.pos_x+30;
_shoot[i].pos_y = _ship.pos_y-20;
_shoot[i].flags = VISIBLE;
shoot_var = 1;
while(_shoot[i] != NULL)
{
if(_shoot[i].pos_y > 5)
{
_shoot[i].pos_y -= 1*time_step;
}
else
{
reset(_shoot[i],VISIBLE);
break;
}
wait(1);
}
_shoot[i] = NULL;
}
}
jetzt schießt er richtig aber der er bewegt sich nicht automartisch weiter nach oben , nur immer ein einiges _shoot[i].panel es hängt wohl irgendwie mit der while schleife zusammen
Last edited by ratz; 11/10/13 13:02.
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: ratz]
#432658
11/10/13 18:44
11/10/13 18:44
|
Joined: Aug 2003
Posts: 134 Saarland-Deutschland
Jog
Member
|
Member
Joined: Aug 2003
Posts: 134
Saarland-Deutschland
|
Hallo
Als erstes must du if ((key_space) &&(!_shoot[i])){ shoot_1(i); } Anstelle von if (key_space) Schreiben, dein Wait(25) kanst du weglassen
Dadurch wird ein Schuss erst erstellt wenn der erste seine Kollisionsrutine abgeschlossen hat.
Dadurch wird das "Zeichnen" wie du es beschrieben hast verhindert.
Wenn du aber mehrere Schüsse gleichzeitig haben willst must du mit Pointer oder Arrays Arbeiten.
Damit jeder Schuss seine eigene Instanz der Kollisionsrutine Abarbeiten kann.
Schau dir mal genau den Code im Aum82 an, dann weißt du was ich meine.
Ich hoffe dir damit etwas geholfen zu haben.
Gruß Jog
Wenn Katzen Pferde w�hren, k�nnten wir die B�ume Hochreiten. *"Saarl�nder es kann nur einen geben"*
|
|
|
Re: 2D Space shooter -> es will nicht funktionieren
[Re: Jog]
#432704
11/12/13 12:43
11/12/13 12:43
|
Joined: Oct 2008
Posts: 341
ratz
OP
Senior Member
|
OP
Senior Member
Joined: Oct 2008
Posts: 341
|
warum ich wohl ne i variable hab alle enemies haben jetzt eine i_2 variable so, jetzt kann ich mehrmals schießen aber der da die variable zuschnell nach oben rechnet macht der 3 schüsse hintereinander und dannach kommt nichts mehr... , kla weil i ja auch jetzt 50 ist aber: und wo soll ich dann i wieder auf 0 setzen ?,
...
if ((key_space) && (!_shoot[i]))
{
shoot_1_event();
}
...
function shoot_1_event()
{
shoot_1(i);
i++;
}
function shoot_1(i)
{
if(shoot_var == 1)
{
shoot_var = 0;
wait(35);
snd_play(laser, 90, 0);
_shoot[i] = pan_create("bmap = shot.bmp;",1);
_shoot[i].pos_x = _ship.pos_x+30;
_shoot[i].pos_y = _ship.pos_y-20;
_shoot[i].flags = VISIBLE;
shoot_var = 1;
while(_shoot[i] != NULL)
{
if(_shoot[i].pos_y > 5)
{
_shoot[i].pos_y -= 1;
}
else
{
reset(_shoot[i],VISIBLE);
break;
}
wait(1);
}
_shoot[i] = NULL;
}
}
//
an welcher stelle soll ich denn i=0 machen denn wenn ichs in den shootblcok ganz unten setze dann kann ich wieder nur einmal schießen
Last edited by ratz; 11/12/13 13:34.
|
|
|
|