Hallo Gamestudio Com.

Hoffentlich könnt Ihr mir weiterhelfen ich bin schon am verzweifeln.

Bei meinem jetzigen Projekt, ein kleines Fake 2D Spiel, habe ich ein paar Probleme.

Also es Spielt sich alles im Weltraaum ab. Man sieht sein Raumschiff von oben und muss asteroiden ausweichen und gegner abschießen. kein sidescroller, ist ne offene welt. also wo man hinfliegen kann wo man will.

Meine Probleme:
- Manche Asteroiden explodieren einfach nicht
- Laser und Raketen ziehen nicht die richtigen schadenswerte vom healthwert der getroffenen Entity ab

Ich glaube es liegt an den Events.

Ich muss leider meinen ganzen Code posten da sonnst der zusammenhang schwer erkennbar ist.

Code:
///////////////////////////////
#include <acknex.h>
#include <default.c>
///////////////////////////////

function starfield(PARTICLE *p);
function fade_stars(PARTICLE *p);
function fire_effect(PARTICLE *p);
function fade_fire(PARTICLE *p);

function players_laser();
function move_plaser();
function remove_plaser();

function players_rocket();
function move_procket();
function remove_procket();

function neuer_asteroid();
function asteroid();
function schusstreffer_event();
function asteroid_destroy();
function asteroid_explodes();

function enemy_explodes();
function enemy_destroy();

function gegner_event();
function kill_player();

function blink();

function player_collisions();

///////////////////////////////

var Raketenzaehler = 0;

///////////////////////////////

STRING* explosion_pcx = "explo+9.pcx"	; // explosions sprite

///////////////////////////////

BMAP* star_tga = "star.tga";
BMAP* fire_tga = "fire.tga";
BMAP* firered_tga = "fire4_red.tga";

///////////////////////////////

action player1() // attach this action to the ship model
{
	var init_z;
	player = my; // I'm the player
	init_z = my.z;
	
	#define schaden skill51
	#define health skill52
	
	my.health = 100;
	my.schaden = 10;
	
	
	VECTOR player_speed, star_pos, temp, jet_offset, jet2_offset, jet3_offset, jet4_offset, jet5_offset, jet6_offset;
	var temp_x = 0, temp_y = 0;
	
	while (1)
	{
		// Triebwerkseffekt	
		vec_set(jet_offset.x, vector(-40, 50, 0)); 
		vec_set(jet2_offset.x, vector(-40, -50, 0));
		vec_set(jet3_offset.x, vector(10, 50, 0));
		vec_set(jet4_offset.x, vector(10, -50, 0));
		vec_set(jet5_offset.x, vector(-15, -65, 0));
		vec_set(jet6_offset.x, vector(-15, 65, 0));
		vec_rotate(jet_offset.x, my.pan);
		vec_rotate(jet2_offset.x, my.pan);
		vec_rotate(jet3_offset.x, my.pan);
		vec_rotate(jet4_offset.x, my.pan);
		vec_rotate(jet5_offset.x, my.pan);
		vec_rotate(jet6_offset.x, my.pan);
		vec_add(jet_offset.x, my.x);
		vec_add(jet2_offset.x, my.x);
		vec_add(jet3_offset.x, my.x);
		vec_add(jet4_offset.x, my.x);
		vec_add(jet5_offset.x, my.x);
		vec_add(jet6_offset.x, my.x);
		
		if((!key_a) || (!key_s) || (!key_w) || (!key_d))
		{
			temp_x = 0;
			temp_y = 0;
		}
		

		if(key_w)
		{
			temp_x += 20 * time_step;
			if (key_space)
			{
				temp_x += 20 * time_step;

				effect(fire_effect, 20, jet_offset.x, nullvector); // generate 20 fire particles each frame
				effect(fire_effect, 20, jet2_offset.x, nullvector);
			}
		
			else
			{
			effect(fire_effect, 10, jet_offset.x, nullvector); // generate 10 fire particles each frame
			effect(fire_effect, 10, jet2_offset.x, nullvector);
			}
		}
		
		if(key_s)
		{
			temp_x -= 20 * time_step;
			if (key_space)
			{
				temp_x -= 20 * time_step;

				effect(fire_effect, 20, jet3_offset.x, nullvector); // generate 20 fire particles each frame
				effect(fire_effect, 20, jet4_offset.x, nullvector);
			}
		
			else
			{
				effect(fire_effect, 10, jet3_offset.x, nullvector); // generate 10 fire particles each frame
				effect(fire_effect, 10, jet4_offset.x, nullvector);
			}
		}
		
		if(key_a)
		{
			temp_y += 20 * time_step;
			if (key_space)
			{
				temp_y += 20 * time_step;

				effect(fire_effect, 10, jet5_offset.x, nullvector);
			}
			
			else
			effect(fire_effect, 5, jet5_offset.x, nullvector);
		}
		
		if(key_d)
		{
			temp_y -= 20 * time_step;
			if (key_space)
			{
				temp_y -= 20 * time_step;

				effect(fire_effect, 10, jet6_offset.x, nullvector);
			}
			
			else
			effect(fire_effect, 5, jet6_offset.x, nullvector);
		}
			
		player_speed.x = temp_x;
		player_speed.y = temp_y;
		player_speed.z = 0;
		
		vec_set(temp.x,mouse_pos3d.x);
		vec_sub(temp.x,my.x);
		temp.z = 0;
		
		vec_to_angle(my.pan,temp);
		
		c_move(my,player_speed,NULLVECTOR,IGNORE_PASSABLE | GLIDE);
		
		my.emask |= (ENABLE_IMPACT | ENABLE_SCAN); // the player is sensitive to collisions with level blocks and entities
		my.event = player_collisions; // and runs this event function if it collides with something
		

		star_pos.x = my.x - 800 + random(1600); // x = -800...+1300
		star_pos.y = my.y - 800 + random(1600); // y = -800...+1300
		star_pos.z = 0;
		effect(starfield, 1, star_pos.x, nullvector);
		
		if(my.health <= 0)
		{
			asteroid_destroy();
		}
		
		wait (1);
	}
}

action gegner()
{
	while (!player) {wait (1);}
	my.z = player.z; // align the power source entity at the same height with the player
	my.pan = random(360); // start with a random set of angles
	
	#define schaden skill51
	#define health skill52
	
	my.health = 100;
	my.schaden = 10;
	
	VECTOR temp,gegnergeschwindigkeit,jet_offset;
	
	vec_set(gegnergeschwindigkeit,vector(5,0,0));
	
	c_setminmax(me);
	set(my, POLYGON);
	
	while(1)
	{
		my.z = player.z;
		my.emask |= (ENABLE_BLOCK | ENABLE_IMPACT); 
		my.event = gegner_event; 
		
		// Triebwerkseffekt	
		vec_set(jet_offset.x, vector(-65, 0, 0)); 
		vec_rotate(jet_offset.x, my.pan);
		vec_add(jet_offset.x, my.x);
		
		c_scan(my.x,my.pan,vector(360,20,750),IGNORE_ME | SCAN_LIMIT);
		
		if(you)
		{
			vec_set(temp,your.x);
			vec_sub(temp,my.x);
			vec_to_angle(my.pan,temp);
		}
		
		if(result > 450)
		{
			c_move(me,gegnergeschwindigkeit,NULLVECTOR,IGNORE_PASSABLE);
			
			effect(fire_effect, 10, jet_offset.x, nullvector);
		}
		
		if(my.health <= 0)
		{
			enemy_destroy();
		}
		
		wait(1);
	}
	
}

function gegner_event()
{
	switch (event_type)
	{
		case EVENT_BLOCK:
		{
			my.health -= 10;
			
			blink();
			
			vec_to_angle(my.pan, normal);
			return;
		}
		
		case EVENT_IMPACT:
		{
			my.health -= you.schaden;
			you.health -= my.schaden;
			
			blink();
			return;
		}
	}
}


function blink()
{
	while(EVENT_BLOCK || EVENT_IMPACT)
	{
		my.ambient = 100;
		while(my.ambient > 0)
		{
			my.ambient -= 5;
			wait(1);
		}
		return;
	}
}

function player_collisions() // this is player's event function
{
	switch (event_type)
	{
		case EVENT_BLOCK:
		{
			my.health -= 10;
			
			blink();
			
			vec_to_angle(my.pan, normal);
			return;
		}
		
		case EVENT_IMPACT:
		{
			my.health -= you.schaden;
			you.health -= my.schaden;
			
			blink();
			return;
		}
	}

}


///////////////////////////////
function main()
{
	vec_set(sky_color, vector(1, 1, 1));
	fps_max = 80;
	
	video_screen = 1;
	
	level_load("spaceshooter.WMB");
	wait(5);
	
	random_seed(0);
	
	mouse_mode = 2;
		
	BMAP* Maus_tga = bmap_create("Maus.tga");
	mouse_map = Maus_tga;
	mouse_spot.x = bmap_width(Maus_tga)/2;
	mouse_spot.y = bmap_height(Maus_tga)/2;

	
	while(1)
	{
			
		vec_set(camera.x,player.x);
		vec_add(camera.x,vector(0,0,1200));
		vec_set(camera.pan,vector(0,-90,0));
		
		mouse_pos.x = mouse_cursor.x;
		mouse_pos.y = mouse_cursor.y;
		
		
		on_mouse_left = players_laser;
		on_mouse_right = players_rocket;
		
		// zufalls Asteroiden
		if(total_secs == 10)
		{
			ent_create("asteroid.mdl",vector(random(4000)-2000,random(4000)-2000,1000),neuer_asteroid);
			
			total_secs = 0;
		}
		
		
		wait(1);
	}
		
}

function neuer_asteroid()
{
	while(my.z > player.z)
	{
		c_move(me,NULLVECTOR,vector(0,0,-5),IGNORE_PASSABLE);
		wait(1);
	}
	
	asteroid();
}


function starfield(PARTICLE *p)
{
	p.alpha = 5 + random(50);
	p.bmap = star_tga;
	p.size = 2 + random(1); // generate stars with random sizes
	p.flags |= (BRIGHT | TRANSLUCENT);
	p.event = fade_stars;
}

function fade_stars(PARTICLE *p)
{
	p.alpha -= 0.5 * time_step; // fade out the stars
	if (p.alpha < 0) 
	{
		p.lifespan = 0;
	}
}


// Triebwerk 

function fire_effect(PARTICLE *p)
{
	p->vel_x = (1 - random(2)) / 5; // set a random particle speed on the x and y axis
	p->vel_y = (1 - random(2)) / 5;
	p->vel_z = 0;
	p.alpha = 25 + random(50); // and a random transparency
	p.bmap = fire_tga;
	p.size = 10; // gives the size of the fire particles
	p.flags |= (BRIGHT | MOVE);
	p.event = fade_fire;
}

function rocketfire_effect(PARTICLE *p)
{
	p->vel_x = (1 - random(2)) / 5; // set a random particle speed on the x and y axis
	p->vel_y = (1 - random(2)) / 5;
	p->vel_z = 0;
	p.alpha = 25 + random(50); // and a random transparency
	p.bmap = firered_tga;
	p.size = 10; // gives the size of the fire particles
	p.flags |= (BRIGHT | MOVE);
	p.event = fade_fire;
}


function fade_fire(PARTICLE *p)
{
	p.alpha -= 25 * time_step; // fade out the fire particles quickly
	if (p.alpha < 0) 
		p.lifespan = 0; // and remove them completely when they become invisble
}

// Schießen (Laser)


function players_laser()
{
	
	VECTOR plaser_offset;
	vec_set(plaser_offset.x, vector(20, 0, 0)); 
	vec_rotate(plaser_offset.x, player.pan);
	vec_add(plaser_offset.x, player.x);
	ent_create("laser1.mdl", plaser_offset.x, move_plaser);

	wait (1); 
}

function players_rocket()
{
	Raketenzaehler += 0.5;
	
	VECTOR plaser_offset;
	
	if(fraction(Raketenzaehler))
	vec_set(plaser_offset.x, vector(0, 20, 0));
	
	else
	vec_set(plaser_offset.x, vector(0, -20, 0)); 
	
	vec_rotate(plaser_offset.x, player.pan);
	vec_add(plaser_offset.x, player.x);
	ent_create("rakete.mdl", plaser_offset.x, move_procket);

	wait (1); 
}



function move_plaser()
{
	c_setminmax(me);
	set(my, PASSABLE);
	set(my, POLYGON);
	my.pan = player.pan; 

	my.emask |= (ENABLE_BLOCK | ENABLE_ENTITY); 
	my.event = remove_plaser; 
	
	#define schaden skill51
	#define health skill52
	
	my.schaden = 10;
	my.health = 10;
	
	while (my) 
	{
		if (vec_dist(my.x, player.x) > 70) 
			reset(my, PASSABLE); 
			
		if (vec_dist(my.x, player.x) > 900)
			remove_plaser();	
			
		c_move(my, vector(75 * time_step, 0, 0), nullvector, IGNORE_PASSABLE); 
		wait (1);
	}
}

function move_procket()
{
	c_setminmax(me);
	set(my, PASSABLE);
	set(my, POLYGON);
	my.pan = player.pan; 

	my.emask |= (ENABLE_BLOCK | ENABLE_ENTITY); 
	my.event = remove_procket; 
	
	#define schaden skill51
	#define health skill52
	
	my.schaden = 50;
	my.health = 10;
	
	// Triebwerkseffekt
		VECTOR jet_offset;

	while (my) 
	{
		if (vec_dist(my.x, player.x) > 70) 
			reset(my, PASSABLE); 
			
		if (vec_dist(my.x, player.x) > 900)
			remove_procket();	
			
		c_move(my, vector(50 * time_step, 0, 0), nullvector, IGNORE_PASSABLE); 
		
		vec_set(jet_offset.x, vector(-15, 0, 0)); 
		vec_rotate(jet_offset.x, my.pan);
		vec_add(jet_offset.x, my.x);
		
		effect(rocketfire_effect, 10, jet_offset.x, nullvector); // generate 20 fire particles each frame
		
		wait (1);
	}
}

function remove_plaser() 
{
	wait (1);
	ent_remove(my);
}

function remove_procket() 
{
	wait (1);
	ent_create (explosion_pcx, my.x, asteroid_explodes); // create the explosion sprite	
	ent_remove(my);
}


action asteroid()
{
	c_setminmax(me);
	set(my, POLYGON);

	while (!player) {wait (1);}
	my.z = player.z; // align the power source entity at the same height with the player
	my.pan = random(360); // start with a random set of angles

	
	#define health skill51
	#define schaden skill52

	my.health = 30;
	my.schaden = 10;
	
	my.emask |= (ENABLE_IMPACT | ENABLE_BLOCK);
	my.event = schusstreffer_event;
	
	VECTOR asteroidengeschwindigkeit;
	var i = random(5);
	vec_set(asteroidengeschwindigkeit,vector(i, 0, 0));

	while (my)
	{
		my.z = player.z;
		
		c_move(my,asteroidengeschwindigkeit,NULLVECTOR,IGNORE_PASSABLE);
		
		if(my.health <= 0)
		{
			asteroid_destroy();
		}
		
		wait (1);
	}
}

function schusstreffer_event()
{
	switch (event_type)
	{
		case EVENT_BLOCK:
		{
			vec_to_angle(my.pan, bounce);
			return;
		}
	
		case EVENT_IMPACT:
		{
			my.health -= you.schaden;
			you.health -= my.schaden;
		
			blink();
			return;
		}
	}

}

function asteroid_destroy()
{
	vec_add(my.x, vector(0,0,5));
	ent_create (explosion_pcx, my.x, asteroid_explodes); // create the explosion sprite			
	wait (-0.2);	
	ent_remove(my);
}

function asteroid_explodes() // drives the explosion sprite
{
	set (my, PASSABLE); // the explosion sprite is passable

	my.scale_x = 0.4;
	my.scale_y = my.scale_x;
	my.scale_z = my.scale_x;
	set (my, BRIGHT); // set its bright flag
	my.ambient = 100; // give it an ambient of 100
	set (my, TRANSLUCENT); // and make it transparent
	my.alpha = 100; // but we set it to be completely opaque for now
	my.roll = random(360);
	while (my.frame < 9) // go through all the animation frames
	{
		if (my.frame > 2) // a part of the explosion animation was played?
		{
			if (you) // if the enemy ship hasn't been removed yet
				set(you, INVISIBLE); // then make it invisible (the ship and the explosion sprite have overlapped during the 2 animation frames)
		}
		my.frame += 0.7 * time_step; // 0.7 gives the animation speed
		wait (1);
	}

	while (my.alpha > 0) // now fade the last frame quickly
	{
		my.alpha -= 50 * time_step; // 50 = fading speed
		wait (1);
	}
	ent_remove (my); // time to remove the explosion sprite
}

function enemy_destroy()
{
	vec_add(my.x, vector(0,0,5));
	ent_create (explosion_pcx, my.x, enemy_explodes); // create the explosion sprite			
	wait (-0.2);	
	ent_remove(my);
}

function enemy_explodes() // drives the explosion sprite
{
	set (my, PASSABLE); // the explosion sprite is passable

	my.scale_x = 0.8;
	my.scale_y = my.scale_x;
	my.scale_z = my.scale_x;
	set (my, BRIGHT); // set its bright flag
	my.ambient = 100; // give it an ambient of 100
	set (my, TRANSLUCENT); // and make it transparent
	my.alpha = 100; // but we set it to be completely opaque for now
	my.roll = random(360);
	while (my.frame < 9) // go through all the animation frames
	{
		if (my.frame > 2) // a part of the explosion animation was played?
		{
			if (you) // if the enemy ship hasn't been removed yet
				set(you, INVISIBLE); // then make it invisible (the ship and the explosion sprite have overlapped during the 2 animation frames)
		}
		my.frame += 0.7 * time_step; // 0.7 gives the animation speed
		wait (1);
	}

	while (my.alpha > 0) // now fade the last frame quickly
	{
		my.alpha -= 50 * time_step; // 50 = fading speed
		wait (1);
	}
	ent_remove (my); // time to remove the explosion sprite
}



Danke fürs lesen.

Bitte helft mir.