2D Space shooter -> es will nicht funktionieren

Posted By: ratz

2D Space shooter -> es will nicht funktionieren - 11/03/13 12:30

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

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
Posted By: Jog

Re: 2D Space shooter -> es will nicht funktionieren - 11/04/13 15:23

//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.
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/05/13 21:27

okey das raumschiff kann jetzt schießen und mit dem Feind kollidieren,
aber der schuss geht noch durch
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/06/13 17:20

HEY laugh ES TUTS !!
ich musste doch #define benutzen,
damit der schuss keine leeren were hat

hier der code laugh
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);
	}
}



Posted By: Jog

Re: 2D Space shooter -> es will nicht funktionieren - 11/07/13 18:23

:)Geht doch.

Also immer daran denken bei Pointer und co. immer besondere Sorgfalt walten lassen.

Gruß Jog
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/09/13 14:19

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

Code:
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

tongue
ich glaube ein bild sagt alles ...

Posted By: Ch40zzC0d3r

Re: 2D Space shooter -> es will nicht funktionieren - 11/09/13 15:25

Mach ne Variable in der shoot funktion und wait(25) dann dort denn jede Funktion wird wie eine art Thread durch den scheduler behandelt.
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/10/13 12:06

kann mir einer zeigen wie und wo ich das an welcher stelle in shoot machen soll ?

Code:
...
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
Posted By: Jog

Re: 2D Space shooter -> es will nicht funktionieren - 11/10/13 18:44

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
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/12/13 12:43

warum ich wohl ne i variable hab grin

alle enemies haben jetzt eine i_2 variable
Code:
enemies[i_2]




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 ?,

Code:
...

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
Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/12/13 12:43


laugh jetzt kann ich mehrmals schießen grin

nur hat der schuss halt keine collision mehr ...

ich guck mal weiter...

Code:
function shoot_1_event()
{
 
 shoot_1(i);
  wait(35);// MUSS, SONST KOMMEN ZUVIELE GLEICHZEITIG
 i++;	
}

function shoot_1(i)
{ 
 //if(shoot_var == 1)		
 //{
 // shoot_var = 0;	
 
 
   
  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;	
 //} 
}



Posted By: ratz

Re: 2D Space shooter -> es will nicht funktionieren - 11/15/13 14:56

soooooo .... grin laugh

der schuss musste auch noch ne collision mit dem feind haben

Code:
function shoot_1_event()
{
 
 shoot_1(i);
  wait(35);
 i++;	
}

function shoot_1(i)
{ 
 //if(shoot_var == 1)		
 //{
 // shoot_var = 0;	
 
 
   
  snd_play(laser, 90, 0); 

  _shoot[i] = pan_create("bmap = shot.bmp;",5);
  _shoot[i].pos_x = _ship.pos_x+30  - bullet_width / 2;
  _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;
  }   

  if ((((_shoot[i].pos_x + bullet_width >= enemies[i_2].pos_x) && (_shoot[i].pos_x + bullet_width <= enemies[i_2].pos_x + enemy_width)) ||
			((enemies[i_2].pos_x + enemy_width >= _shoot[i].pos_x) && (enemies[i_2].pos_x + enemy_width <= _shoot[i].pos_x + bullet_width)))
			&& (((_shoot[i].pos_y + bullet_height >= enemies[i_2].pos_y) && (_shoot[i].pos_y + bullet_height <= enemies[i_2].pos_y + enemy_height)) ||
			((enemies[i_2].pos_y + enemy_height >= _shoot[i].pos_y) && (enemies[i_2].pos_y + enemy_height <= _shoot[i].pos_y + bullet_height))))
   {
				score += 20; 
			   snd_play(explo, 90, 0); 
			     
				reset(_shoot[i], VISIBLE); 
				_shoot[i] = NULL; 
			    
				
				enemies[i_2].bmap = explo1_tga; 
				wait (6);
				enemies[i_2].bmap = explo2_tga;
				wait (6);
				enemies[i_2].bmap = explo3_tga;
				wait (6);
				enemies[i_2].bmap = explo4_tga;
				wait (6);
				
				reset(enemies[i_2], VISIBLE); 
				create_enemy(i_2);
   	
	}	
  
  wait(1);
 }
  _shoot[i] = NULL;	
 //} 
}



und bei create_enemy musste noch weiter gerechnet werden mit i_2++;

Code:
function create_enemy(i_2)
{
enemies[i_2] = pan_create("bmap = enemy2.bmp; flags = VISIBLE;", 20);
enemies[i_2].pos_x = random(650);
enemies[i_2].pos_y = random(350);
enemy_collisions(i_2);
i_2++; // hier !!
}




und noch nen paar sachen wie health bar , score , leben (zeigt noch die i var an tongue )

© 2024 lite-C Forums