actionscript 3 - Breakout game in AS3 error #2007 -
i came upon error can't fix. i'm making game , should "you lose" after losing 3 lives, in case freezes , error.
typeerror: error #2007: parameter hittestobject must non-null. @ flash.display::displayobject/_hittest() @ flash.display::displayobject/hittestobject() @ fatality/enterframeevents()[c:\documents , settings\labo\bureaublad\gip 12 mei\fatality.as:26]
have @ code. code i've written in class
basicly class "game over" power in breakout game. when touches paddle, it's game over. problem freezes after touches paddle instead of showing "you lose".
package { import flash.display.*; import flash.events.*; public class fatality extends movieclip { private var yspeed:number = 1; private var _root:movieclip; public function fatality() { // constructor code addeventlistener(event.added, beginclass); addeventlistener(event.enter_frame, enterframeevents); } private function beginclass(event:event):void { //defining _root document root ////je definieërt _root als het document root _root = movieclip(root); } private function enterframeevents(event:event):void { this.y = this.y + yspeed; if (this.hittestobject(_root.mcpaddle)) { this.removeeventlistener(event.enter_frame, enterframeevents); this.parent.removechild(this); if (_root.lives == 3) { _root.removechild(_root.hartje3); _root.removechild(_root.hartje2); _root.removechild(_root.hartje1); } else if (_root.lives == 2) { _root.removechild(_root.hartje2); _root.removechild(_root.hartje1); } else if (_root.lives == 1) { _root.removechild(_root.hartje1); } _root.gameover = true; //de listeners weg doen _root.mcball.removeeventlistener(event.enter_frame, _root.moveball); _root.mcpaddle.removeeventlistener(event.enter_frame, _root.movepaddle); removeeventlistener(event.enter_frame, _root.checklevel); removeeventlistener(event.enter_frame, _root.updatetextfields); //ga naar een lose frame _root.gotoandstop('lose'); } } } }
that last part refers lose frame, here code of lose frame
//de lose frame //reset het spel als je op je muis klikt stage.addeventlistener(mouseevent.click, resetgame); function resetgame(event:mouseevent):void{ //deze listener weg doen stage.removeeventlistener(mouseevent.click, resetgame); //het spel resetten gotoandplay(1); } //de eindscore laten zien txtscore.text = "final score: "+score;
i appreciate if helped me error because it's been annoying me quite alot, thanks.
edit
main code:
import flash.events.mouseevent; import flash.events.event; stop(); //variabelen //nodige variabelen voor de beweging van de bal var ballxspeed:number = 8;//x snelheid van de bal var ballyspeed:number = 8;//y snelheid van de bal //hoeveel bricks er on zijn op het stage (podium) var brickamt:int = 0; //hoeveel levens je hebt var lives:int = 3; //als het game on var gameover:boolean = false; //de score van het spel var score:int = 0; //eerst heb ik een een functie gemaakt waar //al de code in zit die nodig om het spel te starten //dit bevat listeners, variabelen en andere dingen function begincode(event:mouseevent):void { //doet de listener weg wanneer je klikt stage.removeeventlistener(mouseevent.click, begincode); //voegt een listener toe aan de paddle //die een functie runt elke keer als een frame voorbij mcpaddle.addeventlistener(event.enter_frame, movepaddle); //voegt een listener toe aan de ball; //die een functie runt elke keer als een frame voorbij mcball.addeventlistener(event.enter_frame, moveball); //voegt een listener toe om te checken of het level voorbij is; addeventlistener(event.enter_frame, checklevel); //verwijdert het "click start" tekst txtstart.text = ''; } function movepaddle(event:event):void { //de paddle volgt de muis mcpaddle.x = mousex - mcpaddle.width / 2; //houdt de paddle op het stage //als de muis te ver naar links gaat if (mousex < mcpaddle.width / 2) { //houdt de paddle op het stage mcpaddle.x = 0; } //als de muis te ver naar rechts gaat if (mousex > stage.stagewidth - mcpaddle.width / 2) { //houdt de paddle on stage mcpaddle.x = stage.stagewidth - mcpaddle.width; } } function continuegame(event:event):void { mcball.addeventlistener(event.enter_frame, moveball); } function moveball(event:event):void { //dit de code voor de beweging van de bal mcball.x += ballxspeed;//beweegt de bal horizontaal mcball.y += ballyspeed;//beweegt de bal verticaal //stuitert de bal weg van de muren if (mcball.x >= stage.stagewidth - mcball.width) { //als de bal de rechterkant raakt //van het scherm, en weg stuitert ballxspeed *= -1; } if (mcball.x <= 0) { //als de bal de linkerkant raakt //van het scherm, en weg stuitert ballxspeed *= -1; } if (mcball.y >= stage.stageheight - mcball.height) { //als de bal de grond raakt //stuitert het omhoog en verlies je 1 leven //ballyspeed *= -1; lives--; if (lives == 2) { removechild(this.hartje3); } else if (lives == 1) { removechild(this.hartje2); } else if (lives == 0) { removechild(this.hartje1); } ballxspeed = 8; ballyspeed = 8; mcball.x = 151.9; mcball.y = 264.9; mcball.removeeventlistener(event.enter_frame, moveball); stage.addeventlistener(mouseevent.click, continuegame); //wanneer er geen levens meer on zijn if (lives <= 0) { //het nu game on gameover = true; //de listeners weg doen mcball.removeeventlistener(event.enter_frame, moveball); mcpaddle.removeeventlistener(event.enter_frame, movepaddle); removeeventlistener(event.enter_frame, checklevel); removeeventlistener(event.enter_frame, updatetextfields); //ga naar een lose frame gotoandstop('lose'); } } else { if (mcball.y <= 0) { //als de bal de bovenkant raakt van het scherm //en stuitert terug naar beneden ballyspeed *= -1; } //je raakt de paddle if (mcball.hittestobject(mcpaddle)) { calcballangle(); } } } function calcballangle():void { //ballposition de positie van het balletje op de paddle var ballposition:number = mcball.x - mcpaddle.x; //hitpercent converts ballposition in een percentage //helemaal naar links -0.5 //helemaal naar rechts 0.5 //het midden 0 var hitpercent:number = (ballposition / (mcpaddle.width - mcball.width)) - .5; //neemt het hitpercent en maakt het een groter nummer zodat de bal //werkelijk stuitert ballxspeed = hitpercent * 10; //zorgt dat het balletje terug omhoog stuitert ballyspeed *= -1; } function makelvl():void {//zet de bricks op level 1 //checkt of er nog levels on zijn if (currentlvl > lvlarray.length) { //het nu game on gameover = true; //de listeners weg doen mcpaddle.removeeventlistener(event.enter_frame, movepaddle); mcball.removeeventlistener(event.enter_frame, moveball); removeeventlistener(event.enter_frame, checklevel); removeeventlistener(event.enter_frame, updatetextfields); //ga naar een lose frame gotoandstop("win"); } //vindt de array lengte van de level code //de index moet currentlvl-1 zijn want: //array indexes beginnen vanaf 0 en onze level start op 1 //onze level zal altijd 1 hoger zijn dan de index van de array var arraylength:int = lvlarray[currentlvl - 1].length; //de huidige rij van bricks die aan het maken zijn var brickrow:int = 0; //een lus die dr bricks op het stage zet (var i:int = 0; i<arraylength; i++) { //checkt of het een brick moet zetten daar if (lvlarray[currentlvl - 1][i] == 1) { //maakt een variabele aan van de brick var brick:brick = new brick(); //regelt de coordinaten van de brick via de variabele en brickrow brick.x = 15 + (i - brickrow * 7) * 75; brick.y = 10 + brickrow * 20; //checkt of de huidige brick een nieuwe rij nodig heeft (var c:int = 1; c<=10; c++) { if (i == c*7-1) { brickrow++; } } //nu zet dit de brick op het stage addchild(brick); } } } function checklevel(event:event):void { //checkt of de bricks allemaal weg zijn if (brickamt == 0) { //reset het level door het level te verhogen currentlvl++; //makelvl wordt opnieuw gerunt //reset de tekst "click begin" txtstart.text = "click begin"; makelvl(); //reset de positie van het balletje en de paddle mcball.x = 150; mcball.y = 265; mcball.width = 10; mcball.height = 10; mcpaddle.x = 230; //al de listeners weg doen mcpaddle.removeeventlistener(event.enter_frame, movepaddle); mcball.removeeventlistener(event.enter_frame, moveball); removeeventlistener(event.enter_frame, checklevel); //je "listent" voor een click van de muis om het spel terug te starten stage.addeventlistener(mouseevent.click, begincode); } } function updatetextfields(event:event):void { } //als je clickt met je muis, begint het spel stage.addeventlistener(mouseevent.click, begincode); //de tekst die tevoorschijn komt; txtstart.text = "click begin"; //een functie maken om de text fields te updaten addeventlistener(event.enter_frame, updatetextfields); //het level maken makelvl(); pausebutton.addeventlistener(mouseevent.click, pausegame); function pausegame(e:mouseevent):void { stage.framerate = 0; } playbutton.addeventlistener(mouseevent.click, resumegame); function resumegame(e:mouseevent):void { stage.framerate = 24; }
code brick class:
//klassen moeten altijd in een packed zitten package { //display elements importeren die kunnen gebruiken in deze klasse import flash.display.*; import flash.events.*; //de naam van de klasse definiëren en zeggen dat //het de movieclip klasse "extends", //dat wil zeggen dat het dezelfde properties heeft als die van een movieclip public class brick extends movieclip { //de main timeline private var _root:movieclip; //alle klassen moeten een functie hebben die elke keer //runt wanneer een instance van die klasse op het stage wordt gezet public function brick() { //deze code runt wanneer de brick op het stage wordt gezet addeventlistener(event.added, beginclass); //enter frame code addeventlistener(event.enter_frame, enterframeevents); } //private functions zijn functies die je niet kan gebruiken //vanuit de main timeline, maar enkel vanuit de klasse zelf private function beginclass(event:event):void { //je definieërt _root als het document root _root = movieclip(root); //verhoogt het aantal bricks op het stage _root.brickamt++; } private function enterframeevents(event:event):void { //controleren of de player heeft verloren if (_root.gameover) { //deze brick kapot maken this.parent.removechild(this); //stoppen met deze code te runnen; removeeventlistener(event.enter_frame, enterframeevents); } //hit testing met het balletje if (this.hittestobject(_root.mcball)) { //hierdoor stuitert het balletje verticaal _root.ballyspeed *= -1; //creeër een power (werk met een random //om een powerup te maken en werk met een //tweede random om te bepalen welke power) makepowerup(); //deze brick kapot maken this.parent.removechild(this); //stoppen met deze code te runnen; removeeventlistener(event.enter_frame, enterframeevents); //verlaagt het aantal bricks op het stage _root.brickamt--; //de score verhogen _root.score += 10; } } function makepowerup():void { //random plaatsen om te beslissen of er een power aangemaakt wordt //en zo ja, welke var getal = randomrange(1,40); if (getal < 3) { var power:power = new power(); power.x = this.x + 35; power.y = this.y + 5; _root.addchild(power); } else if (getal < 6) { var power2:power2 = new power2(); power2.x = this.x + 35; power2.y = this.y + 5; _root.addchild(power2); } else if (getal < 9) { var mario:enlarger = new enlarger(); mario.x = this.x + 35; mario.y = this.y + 5; _root.addchild(mario); } else if (getal < 14) { var power3:power3 = new power3(); power3.x = this.x + 35; power3.y = this.y + 5; _root.addchild(power3); } else if (getal < 16) { var fat:fatality = new fatality(); fat.x = this.x + 35; fat.y = this.y + 5; _root.addchild(fat); } else if (getal < 20) { var lifesteal:lifestealer = new lifestealer(); lifesteal.x = this.x + 35; lifesteal.y = this.y + 5; _root.addchild(lifesteal); } } function randomrange(minnum: number, maxnum:number):number { return (math.floor(math.random() * (maxnum - minnum + 1)) + minnum); } } }
the error referring line 26:
if (this.hittestobject(_root.mcpaddle))
the error telling _root.mcpaddle
null
@ point in program.
Comments
Post a Comment