Gamestudio Links
Zorro Links
Newest Posts
Change chart colours
by 7th_zorro. 05/11/24 09:25
Data from CSV not parsed correctly
by dr_panther. 05/06/24 18:50
AUM Magazine
Latest Screens
The Bible Game
A psychological thriller game
SHADOW (2014)
DEAD TASTE
Who's Online Now
2 registered members (AndrewAMD, Nymphodora), 1,466 guests, and 4 spiders.
Key: Admin, Global Mod, Mod
Newest Members
firatv, wandaluciaia, Mega_Rod, EternallyCurious, howardR
19050 Registered Users
Previous Thread
Next Thread
Print Thread
Rate Thread
Page 1 of 2 1 2
2D Space shooter -> es will nicht funktionieren #432245
11/03/13 12:30
11/03/13 12:30
Joined: Oct 2008
Posts: 341
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

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

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 Offline
Member
Jog  Offline
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: Jog] #432404
11/05/13 21:27
11/05/13 21:27
Joined: Oct 2008
Posts: 341
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

Joined: Oct 2008
Posts: 341
okey das raumschiff kann jetzt schießen und mit dem Feind kollidieren,
aber der schuss geht noch durch

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
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

Joined: Oct 2008
Posts: 341
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);
	}
}




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 Offline
Member
Jog  Offline
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
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

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

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 ...


Last edited by ratz; 11/09/13 14:21.
Re: 2D Space shooter -> es will nicht funktionieren [Re: ratz] #432616
11/09/13 15:25
11/09/13 15:25
Joined: Oct 2011
Posts: 1,082
Germany
C
Ch40zzC0d3r Offline
Serious User
Ch40zzC0d3r  Offline
Serious User
C

Joined: Oct 2011
Posts: 1,082
Germany
Mach ne Variable in der shoot funktion und wait(25) dann dort denn jede Funktion wird wie eine art Thread durch den scheduler behandelt.

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
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

Joined: Oct 2008
Posts: 341
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

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 Offline
Member
Jog  Offline
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
R
ratz Offline OP
Senior Member
ratz  Offline OP
Senior Member
R

Joined: Oct 2008
Posts: 341
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

Last edited by ratz; 11/12/13 13:34.
Page 1 of 2 1 2

Moderated by  HeelX, Lukas, rayp, Rei_Ayanami, Superku, Tobias, TWO, VeT 

Gamestudio download | chip programmers | Zorro platform | shop | Data Protection Policy

oP group Germany GmbH | Birkenstr. 25-27 | 63549 Ronneburg / Germany | info (at) opgroup.de

Powered by UBB.threads™ PHP Forum Software 7.7.1