PDA

Volledige versie bekijken : Probleem met kogels


BlindCarrot
%Europe/Berlin %879 %2009, 22:07
Ik heb (zoals velen) een probleempje. Ik probeer meerdere kogels af te schieten.
Nou verschijnen ze wel. Alleen de ene gaat steeds harder dan de vorige. Ik heb veel
gekeken bij tutorials en hier kwam ik op uit, verder kom ik niet.
Hier is mijn code:


onClipEvent (load) {
//Variabels for bullets
var bulletArray = new Array();
var bulletCount;
}
onClipEvent (enterFrame) {
for (i=0; i<bulletArray.length; i++) {
bulletArray[i]._y -= 10;
if (bulletArray[i]._y<0) {
bulletArray[i].removeMovieClip();
bulletCount--;
}
}
}
onClipEvent (mouseDown) {
var bullet = _root.attachMovie("mcBullet", "bullet"+bulletCount, 1000+bulletCount);
bulletCount++;
bullet._x = this._x;
bullet._y = this._y;
bulletArray.push(bullet);
}


Dit alles staat in een movieclip.
Ik hoop dat iemand mij hier kan helpen.

Jan
%Europe/Berlin %092 %2009, 03:13
onClipEvent (load)
{
//Variabels for bullets
var bulletArray = [];
var bulletCount:Number=0;;
}
onClipEvent (enterFrame)
{
for (var i:Number=0; i<bulletArray.length; i++)
{
bulletArray[i]._y -= 10;
if (bulletArray[i]._y<0)
{
bulletArray[i].removeMovieClip();
bulletArray.splice(i,1);
}
}
}
onClipEvent (mouseDown)
{
var bullet = _root.attachMovie("mcBullet", "bullet"+bulletCount, _root.getNextHighestDepth());
bulletCount++;
bullet._x = this._x;
bullet._y = this._y;
bulletArray.push(bullet);
}
Je hebt toevallig nergens anders nog script staan dat het verder nog zou kunnen beïnvloeden?

Groeten;
Jan

BlindCarrot
%Europe/Berlin %786 %2009, 19:52
Ik denk het niet,
Wat doe jij met de functie:
bulletArray.splice(i.1)

En is er een verschil tussen:
var bulletArray = [];
en var bulletArray = new Array();

Jan
%Europe/Berlin %790 %2009, 19:58
Jij removed de bullets wel van het scherm maar niet uit je array. (Daarom die splice)
In principe is er geen verschil tussen [] en new Array()
Lees mijn andere post van vandaag erover:
http://www.flashfocus.nl/forum/showpost.php?p=369387&postcount=11

Script OP je objecten zetten is trouwens heel verouderd en niet zo'n goede manier van scripten. Geef je objecten instance names en zet je script in een frame op de hoofdtijdlijn

Groeten;
Jan

BlindCarrot
%Europe/Berlin %807 %2009, 20:22
Bedankt voor je antwoord adnez,
Ik ben nog een beetje nieuw met as dus die dingen ben ik nu allemaal aan het leren, de voornaamste reden dat ik hier ben trouwens.. =p

Allemaal leuk en aardig,
alleen ik zit nog steeds met mijn probleem.
Waar kan de fout zitten.

De kogels worden wel afgevuurd maar bij elke
kogel gaat de kogel sneller...
En als er al een kogel op het scherm is verdwijnt deze als je een andere afvuurt.
Dit is ook niet de bedoeling.
Iemand een oplossing.

[EDIT]
Ik zie nu dat de eerste 2 kogels wel de goede snelheid hebben lijkt wel,
vreemd..
Misschien dat dit helpt voor de oplossing?

Jan
%Europe/Berlin %812 %2009, 20:30
En als er al een kogel op het scherm is verdwijnt deze als je een andere afvuurt.
Dat komt omdat je instance names of je depths niet uniek zijn...
In je eerste script had je:
var bulletCount;
Daardoor zit er 'undefined' in bulletCount
En vervolgens doe je:
var bullet = _root.attachMovie("mcBullet", "bullet"+bulletCount, 1000+bulletCount);
bulletCount++;
bulletCount++ komt neer op:
undefined++ en dat levert opnieuw undefined op dus "bullet"+bulletCount
levert voor elke bullet op: "bulletundefined" en dus hebben ze allemaal dezelfde instance name.
En hetzelfde geldt voor de depth : 1000+bulletCount, dat levert altijd 1000+undefined op dus altijd 1000 en daardoor overschrijf je telkens de vorige.

Haal al het script weg van dat object en zorg ook dat er nergens ander script staat dat het kan beïnvloeden.
En dan klik je in frame1 van de hoofdtijdlijn, druk je F9 en zet je in het actionspanel:
var bulletCount:Number=0;
this.onMouseDown=function()
{
var bullet = this.attachMovie("mcBullet", "bullet"+bulletCount, this.getNextHighestDepth());
bulletCount++;
bullet._x = _xmouse;
bullet._y = _ymouse;
bullet.onEnterFrame=function()
{
this._y-=10;
if(this._y<0)
{
this.removeMovieClip();
}
}
}

Groeten;
Jan

BlindCarrot
%Europe/Berlin %818 %2009, 20:38
Hartstikke bedankt,
het werkt nu prima.

Begrijp ik hieruit dat je met:

bullet.onEnterFrame=function()
{
this._y-=10;
if(this._y<0)
{
this.removeMovieClip();
}
}
}
een functie aan die bullet geeft die die MovieClip dat uit zichzelf altijd doet.
Dus kan je dan ook als je ipv onEnterFrame, MouseDown doet,
dat hij dan als je je muis indrukt iets doet, zonder dat je het nog een keer zelf moet aangeven?

Jan
%Europe/Berlin %820 %2009, 20:41
een functie aan die bullet geeft die die MovieClip dat uit zichzelf altijd doet.
Helemaal correct. :)

Dus kan je dan ook als je ipv onEnterFrame, MouseDown doet,
dat hij dan als je je muis indrukt iets doet, zonder dat je het nog een keer zelf moet aangeven?
Paar keer gelezen maar ik denk niet dat ik weet wat je begrijpt. Kan je het met een iets concrete voorbeeld uitleggen? Wat is je concreet doel uiteindelijk.
Wat moet wat doen wanneer? :)

Groeten;
Jan

BlindCarrot
%Europe/Berlin %824 %2009, 20:47
Ik zou nu met die kogels iets willen raken..
Als ik dan bijvoorbeeld aan de kogels toevoeg:
bullet.onEnterFrame=function()
{
this._y-=10;
if(this._y<0)
{
this.removeMovieClip();
}
if (this.hitTest(enemy)) {
this.removeMovieClip();
}

}
}

Dan heb ik deze vijanden als volgt op de stage gezet:


this.onLoad = function() {
var rows = 4;
var columns = 10;
for (i=1; i<=columns; i++) {
for (j=1; j<=rows; j++) {
var enname = "enemy"+i+"_"+j;
var enemy:MovieClip = _root.attachMovie("mcEnemy", "enname", 100+10*i+j);
enemy._x = 60*i;
enemy._y = 30*j;
enemy.onEnterFrame = function() {
if (this.hitTest(bullet)) {
this.removeMovieClip();
}
};
}
}
};

Werkt dat dan goed?

Jan
%Europe/Berlin %831 %2009, 20:56
Nee dat gaat niet goed werken. :)
Eerst en vooral zitten er wat foutjes in:
var enname = "enemy"+i+"_"+j;
var enemy:MovieClip = _root.attachMovie("mcEnemy", "enname", 100+10*i+j);
elke enemy gaat enname heten want je zet er quotes rond waardoor Flash het als tekst ziet en niet meer als de variabele uit de regel erboven.En ik vind het ook te ingewikkeld. Ik heb het simpeler opgelost met die index.

Verder heeft het geen zin om zowel de enemy als de bullet te laten kijken of ze elkaar raken. 1 keer is genoeg. Maar je zal wel 1 soort objecten (bullets of enemies) in een array moeten steken:
var rows:Number = 4;
var columns:Number = 10;
var enemies:Array=[];
var index:Number=0;
for (var i:Number=1; i<=columns; i++)
{
for (var j:Number=1; j<=rows; j++)
{
index++;
var enemy:MovieClip = this.attachMovie("mcEnemy", "enemy"+index, this.getNextHighestDepth());
enemies.push(enemy);
enemy._x = 60*i;
enemy._y = 30*j;
}
}
//-----------------------
var bulletCount:Number=0;
this.onMouseDown=function()
{
var bullet = this.attachMovie("mcBullet", "bullet"+bulletCount, this.getNextHighestDepth());
bulletCount++;
bullet._x = _xmouse;
bullet._y = _ymouse;
bullet.onEnterFrame=function()
{
this._y-=10;
if(this._y<0)
{
this.removeMovieClip();
}
for(var i:Number=0; i< enemies.length; i++)
{
if(this.hitTest(enemies[i]))
{
this.removeMovieClip()
enemies[i].removeMovieClip()
enemies.splice(i,1);
}
}
}
}

Groeten;
Jan

BlindCarrot
%Europe/Berlin %868 %2009, 21:50
Als ik dat eerste deel,
met het creeëren van de enemy's gewoon in het frame zet,
loopt mijn flashplayer vast met de mededeling:
"A script is causing this to move slowly"
"Do you want to abort the script"

Of iets in die richting.
Als ik het in een onLoad functie zet werkt het niet.

Dit brengt mij trouwens op nog een vraag...
Wat betekent het als je script direct in het frame zet en niet in een onMouseDown, enterFrame of iets dergelijks?

Ik zal nu proberen zelf de fout eruit te halen =p
Maar als iemand iets eerder ziet, hoor ik dat natuurlijk graag