-
[AS2.0] Creating dynamic enemies, having trouble with the dynamic part...
Hey guys, I'm developing my first game and it's rather ambitious.
The development is going well but I'm having trouble with the enemies.
I'm very new to using arrays. I know the solution to the problem but I'm unsure of the syntax required to make it work.
Here is the game
One thing I want to do is make it so two enemies don't occupy the same space. At the moment they overlap.
I know it would be something like if(this.hitTest(enemy[n])) {this._x += 0} but yeah... I don't really know how to implement arrays in flash.
Also I want to give the enemy melee attacks that knocks the main character back, relative to the direction the enemy is facing. At the moment it knocks the character back (_x += 2) regardless because I wasn't sure what to put there.
I've FLA is 1MB so I couldn't attach it to this message but I've uploaded it to rapid share
You can find the enemies on frame 2 on the appropriate layer.
Here is the movement script for the enemy, I'd imagine the key to fixing it would be there
Actionscript Code:
// Combat if (this._x < _root.char._x) { if (_root.char._x < ((this._x) + 100)) { this.stances.gotoAndStop("attacking"); } else { this.stances.gotoAndStop("inCombat"); this._xscale = 100; this._x += 2; } } else if (this._x > _root.char._x) { if (_root.char._x > ((this._x) - 100)) { this.stances.gotoAndStop("attacking"); } else { this.stances.gotoAndStop("inCombat"); this._xscale = -100; this._x -= 2; } }
I'm really not sure how to fix this and I'll appreciate any help you can provide. Thanks
-
Senior Member
To knock back in the direction enemy is facing, use its xscale property:
_x += 2 * _xscale/100;
As for arrays, first create array when you enter screen with enemies:
enemyArr = [enemy1, enemy2, enemy3];
where "enemy1" etc are instance names of enemy movie clips.
To check if any 2 enemies overlap you use 2 loops:
for(i = 0; i < enemyArr.length; i++){
var en1 = enemyArr[i];
for(j = i +1; j < enemyArr.length; j++){
var en2 = enemyArr[j];
if(Math.abs(en1._x - en2._x) < 10){
//push apart
}
}
}
-
awesome, thanks a lot. Continuing from that, what would be the correct syntax for the main character colliding with any of the enemies in the array? if
Actionscript Code:
(this.hitTest(_root.enemyArr [i])) { //do something }
?
EDIT:
Don't worry, I worked it out
Last edited by dmakinde; 09-13-2011 at 07:26 AM.
Reason: solved it
-
Actually another problem has come up, i'm not sure if you'll be able to help. Essentially the above script you gave me only seems to work for two enemies. Also I tried to adapt the script so it would remove the enemy from the array once it had been defeated but it didn't seem to work. So as of now, if an enemy dies and is unloaded, the previous enemy still stands there as if something is obstructing it. At the moment I added a lazy script that just shoves the _x of the enemy off stage so the enemies can move accordingly but that seems kind of inefficient to me.
It there any way this can be solved? Here's the code I attempted.
Actionscript Code:
onClipEvent (enterFrame) {
for (i = 0; i < _root.levelOneEnemy.length; i++) { var en1 = _root.levelOneEnemy[i]; for (j = i + 1; j < _root.levelOneEnemy.length; j++) { var en2 = _root.levelOneEnemy[j]; if (Math.abs(en1._x - en2._x) < 50) { //trace("occupying") _root.levelOneEnemy[j].occupying = true; } else { //trace("not occupying") _root.levelOneEnemy[j].occupying = false; } } } for (i = 0; i <= _root.levelOneEnemy.length; i++) { if (_root.levelOneEnemy[i].dead) { _root.levelOneEnemy.splice(i); } } }
the "occupying" variable governs the enemy's speed
Actionscript Code:
if(!occupying) { movementSpeed = 2; } else if (occupying) { this.stances.gotoAndStop("idle"); movementSpeed = 0; }
P.S I just wanna say thanks a lot for the above
-
Senior Member
I am pretty sure splice needs another argument:
//delete 1 member from array at position i
_root.levelOneEnemy.splice(i, 1);
-
Ah I see, thanks again. Unfortunately that didn't seem to solve the problem but it has brought me closer to fixing it. But going back to my first question can this for loop only ever work for two enemies? Is there a way to make it extend to the other enemies on the level?
-
Senior Member
Its not limited to any number, I have used same kind of loop for hundreds of objects. You need to give each enemy different instance name of course.
-
haha you're right, the code is flawless! Turns out the problem was the way I determined how the enemy pushes apart. Instead of using a variable I just did _x-= the xscale divided by 50. Thanks a lot! It still bugs out every now and then, as you can see here but still, It works. The times when the enemies overlap could make it a fair challenge for the player
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|