Arsenil98
Arsenil98

Reputation: 16

AS3 - Shooting Game - hitTestObject

i'm about to finish my project for University. But I'm stuck with the hittestobject.

var Player: gun = new gun();
Player.x = mouseX;
Player.y = mouseY;
addChild(Player);

stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove);
stage.addEventListener(MouseEvent.MOUSE_DOWN, shoot);
stage.addEventListener(MouseEvent.MOUSE_UP, release_shoot);

function mousemove(e: MouseEvent): void
{
	Player.x = mouseX + 200;
	Player.y = mouseY + 35;
}

function shoot(event: Event): void
{
	var Bullet: bullet = new bullet();
	/*var explosion:explo1 = new explo1(); */
	Bullet.x = Player.x;
	Bullet.y = Player.y;
	/*	explosion.x = Player.x;
		explosion.y = Player.y;*/
	Player.rotationX = 5;
	Player.rotationY = 5;
	addChild(Bullet);
	/*	addChild(explosion);*/
	Bullet.addEventListener(Event.ENTER_FRAME, moveBullet);
}

function release_shoot(event: Event): void
{
	var explosion: explo1 = new explo1();
	Player.rotationX = -5;
	Player.rotationY = -5;
}

function moveBullet(e: Event): void
{
	e.target.y -= 12;
	e.target.x -= 96;
	if (e.target.y <= -200 || e.target.x <= -200)
	{
		e.target.removeEventListener(Event.ENTER_FRAME, moveBullet);
		removeChild(MovieClip(e.target));
	}
}

function goesside_1(event: Event): void
{
	mc_target.x -= 2;
	if (mc_target.x < -20)
		mc_target.x = 550;
}
mc_target.addEventListener(Event.ENTER_FRAME, goesside_1);

function targeting(event: Event): void
{
	var bullet: MovieClip = MovieClip(event.target);
	if (bullet.hitTestObject(mc_target))
	{
		mc_burst.x = mc_target.x;
		mc_burst.y = mc_target.y;
		mc_burst.gotoAndPlay(2);
		mc_target.x = 200;
		mc_target.removeEventListener(Event.ENTER_FRAME, targeting);
		mc_target.x = 200;
		trace("targerting");
	}
	else if (mc_target.x > 550)
		bullet.removeEventListener(Event.ENTER_FRAME, targeting);
	else
		bullet.y -= 12;
	bullet.x -= 96;
}

The bullet is going in the Target without any doubt, I see it haha... But won't replace mc_target with mc_burst.

EDIT

This is the working code I used for anyone who's interested:

var Player:gun = new gun(); 
Player.x = mouseX; 
Player.y = mouseY; 
addChild(Player); 

stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove); 
stage.addEventListener(MouseEvent.MOUSE_DOWN, shoot); 
stage.addEventListener(MouseEvent.MOUSE_UP, release_shoot); 
function mousemove(e:MouseEvent):void{ 
Player.x = mouseX + 200; 
Player.y = mouseY + 35; 
} 

function shoot(event:Event):void{ 
var bullet1:bullet = new bullet();
/*var explosion:explo1 = new explo1(); */
    bullet1.x = Player.x;
    bullet1.y = Player.y;
/*  explosion.x = Player.x;
    explosion.y = Player.y;*/
    Player.rotationX = 5;
    Player.rotationY = 5;
    addChild(bullet1); 
/*  addChild(explosion);*/
    bullet1.addEventListener(Event.ENTER_FRAME, targeting); 
} 

function release_shoot(event:Event):void{ 
var explosion:explo1 = new explo1(); 
    Player.rotationX =- 5;
    Player.rotationY =- 5;

}

function movebullet(e:Event):void{ 
e.target.y -= 12;
e.target.x -=96;/*When the function is called the targets Y position will be subract by 40 pixels every frame, this makes the movieclip move up. The target is the Bullet movieclip.*/
if(e.target.y <= -200 && e.target.x <= -200 ){ 
e.target.removeEventListener(Event.ENTER_FRAME, movebullet);
removeChild(MovieClip(e.target));
}
}
function goesside_1(event:Event):void {
    mc_target.x -= 2;
        if (mc_target.x < -20)
        mc_target.x = 550;
}
mc_target.addEventListener(Event.ENTER_FRAME, goesside_1);

function targeting(event:Event):void {
    var bullet1:MovieClip = MovieClip(event.target);
    if (bullet1.hitTestObject(mc_target)){
        mc_burst.x = mc_target.y;
        mc_burst.y = mc_target.x;
        mc_burst.gotoAndPlay(2);
        mc_target.x = 200;
        mc_target.removeEventListener(Event.ENTER_FRAME, targeting);
        mc_target.x = 200;
        trace("targerting");
    } 
    else if (mc_target.x > 550){
        bullet1.removeEventListener(Event.ENTER_FRAME, targeting);
    }
    else{
    bullet1.y -= 12;
    bullet1.x -= 96;}

}
// REPLACING CURSOR BY A SIGHT //

import flash.ui.Mouse;

Mouse.hide();

var myCursor:sight = new sight();

myCursor.visible = false;

function init()
{
    addChild(myCursor);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
    stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveHandler);
    stage.addEventListener(MouseEvent.ROLL_OVER, mouseLeaveHandler);
    stage.addEventListener(MouseEvent.ROLL_OUT, mouseMoveHandler);

}

function mouseMoveHandler(evt:MouseEvent):void
{
    myCursor.visible = true;
    myCursor.x = evt.stageX + 10;
    myCursor.y = evt.stageY + 10;
}

function mouseLeaveHandler(evt:Event):void
{
    myCursor.visible = false;
}
init();

Upvotes: 0

Views: 150

Answers (2)

Arsenil98
Arsenil98

Reputation: 16

I would like to thanks BadFeelingAboutThis for his fast help here.

So for people who want to use my code, go head it works now

var Player:gun = new gun(); 
Player.x = mouseX; 
Player.y = mouseY; 
addChild(Player); 

stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove); 
stage.addEventListener(MouseEvent.MOUSE_DOWN, shoot); 
stage.addEventListener(MouseEvent.MOUSE_UP, release_shoot); 
function mousemove(e:MouseEvent):void{ 
Player.x = mouseX + 200; 
Player.y = mouseY + 35; 
} 

function shoot(event:Event):void{ 
var bullet1:bullet = new bullet();
/*var explosion:explo1 = new explo1(); */
    bullet1.x = Player.x;
    bullet1.y = Player.y;
/*  explosion.x = Player.x;
    explosion.y = Player.y;*/
    Player.rotationX = 5;
    Player.rotationY = 5;
    addChild(bullet1); 
/*  addChild(explosion);*/
    bullet1.addEventListener(Event.ENTER_FRAME, targeting); 
} 

function release_shoot(event:Event):void{ 
var explosion:explo1 = new explo1(); 
    Player.rotationX =- 5;
    Player.rotationY =- 5;

}

function movebullet(e:Event):void{ 
e.target.y -= 12;
e.target.x -=96;/*When the function is called the targets Y position will be subract by 40 pixels every frame, this makes the movieclip move up. The target is the Bullet movieclip.*/
if(e.target.y <= -200 && e.target.x <= -200 ){ 
e.target.removeEventListener(Event.ENTER_FRAME, movebullet);
removeChild(MovieClip(e.target));
}
}
function goesside_1(event:Event):void {
    mc_target.x -= 2;
        if (mc_target.x < -20)
        mc_target.x = 550;
}
mc_target.addEventListener(Event.ENTER_FRAME, goesside_1);

function targeting(event:Event):void {
    var bullet1:MovieClip = MovieClip(event.target);
    if (bullet1.hitTestObject(mc_target)){
        mc_burst.x = mc_target.y;
        mc_burst.y = mc_target.x;
        mc_burst.gotoAndPlay(2);
        mc_target.x = 200;
        mc_target.removeEventListener(Event.ENTER_FRAME, targeting);
        mc_target.x = 200;
        trace("targerting");
    } 
    else if (mc_target.x > 550){
        bullet1.removeEventListener(Event.ENTER_FRAME, targeting);
    }
    else{
    bullet1.y -= 12;
    bullet1.x -= 96;}

}
// REPLACING CURSOR BY A SIGHT //

import flash.ui.Mouse;

Mouse.hide();

var myCursor:sight = new sight();

myCursor.visible = false;

function init()
{
    addChild(myCursor);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);
    stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveHandler);
    stage.addEventListener(MouseEvent.ROLL_OVER, mouseLeaveHandler);
    stage.addEventListener(MouseEvent.ROLL_OUT, mouseMoveHandler);

}

function mouseMoveHandler(evt:MouseEvent):void
{
    myCursor.visible = true;
    myCursor.x = evt.stageX + 10;
    myCursor.y = evt.stageY + 10;
}

function mouseLeaveHandler(evt:Event):void
{
    myCursor.visible = false;
}
init();

Upvotes: -1

BadFeelingAboutThis
BadFeelingAboutThis

Reputation: 14406

Assuming the code you've posted is everything, the issue is that the targeting method is never called.

Seems like you want to add it as a handler for the enter frame event (as you are removing a listener to that end inside the method)

eg.

bulletInstance.addEventListener(Event.ENTER_FRAME, targeting);

That said, looking at your code, you're going to want to combine your move and targeting functions (you don't want to keep collision checking after you've removed the bullet in your moveBullet function) - or at least remove the targeting enter frame listener when you remove the button from the screen.

Possibly something like this:

function removeBullet(b:MovieClip):void {
    b.removeEventListener(Event.ENTER_FRAME, moveBullet);
    removeChild(MovieClip(b));
}

function moveBullet(e:Event):void { 
    var bullet:MovieClip = MovieClip(event.target);

    bullet.y -= 12;
    bullet.x -= 96;

    if(bullet.y <= -200 || bullet.x <= -200 ){ 
        removeBullet(bullet);
    }

    if (bullet.hitTestObject(mc_target)){
        mc_burst.x = mc_target.x;
        mc_burst.y = mc_target.y;
        mc_burst.gotoAndPlay(2);
        mc_target.x = 200;

        removeBullet(bullet);
        trace("targerting");
    } else if (mc_target.x > 550){  
        removeBullet(bullet);
    }
}

If you have many bullets, you'll probably want to have just one enter frame handler, and iterate through each bullet there - instead of having a separate enter frame handler for each bullet.

Also, I'm surprised you are not getting errors, because you have ambiguous naming going on. You have a class called bullet, but then you create vars called bullet as well. Standard practice in AS3 is the give your class names a capitol first letter, and your instance names a lowercase first letter. I'd recommend you do this to avoid errors and ambiguous code.

Upvotes: 2

Related Questions