Gå til innhold

[Flash] [AS3] McDuckadamy - Lær gangetabellen [For barn][Feedback pls]


Anbefalte innlegg

 

Oppgave IT2

  • Tidsfrist: 8. juni 2015 23:59

Lag et multimedieprodukt som har følgende egenskaper:

  • Hva: Et interaktivt læreprogram
  • Målsetting: Lære målgruppa hvordan noe virker, henger sammen eller er
  • Målgruppe: 10-åringer i barneskolen, både gutter og jenter.
  • Lages i Flash
  • Skal kunne testes på en virkelig 10-åring (f.eks. min Marius) for å få ei ærlig tilbakemelding... mao. må det være artig og interessant for en i målgruppa

 

Ta egne forutsetninger der det er nødvendig.

 

Link til spill: http://begj.nu/mcDuckadamy/

Inneholder en del bugs.. :hm:  :hmm:  :wallbash:

 

//To-Do: -Lagre spillernavn og score i Cookie

// -Highscore tavle, synkronisert mot cookie eller cloud.
// -Skyer som beveger seg i bakgrunnen
// -Grundigere sluttskjerm med analyse av spillsesjon(hvilke stykker var riktige, hva var feil etc)
// -Flere fiende-typer (magika fra tryll, tanks på bakken etc)
// -Høyere resolution -> flere fiender og bruker ser detaljene i assets.
// -Effektivisere programmering - Mye undøvendig loops, kunne unngått minst to. Dog gir dette mindre fleksibel programmering.
// - remove bugs. :|
// -mm.

Koding er av meg, og assets er av en kompis. 

 

Dersom du har noen innspill til forbedringer/bug fixes blir jeg glad. :w00t: 

Har akkurat levert inn prosjektet til vurdering hos faglærer. Dette er noget over nivået i klassen så er liten tvil om at det blir sekser.

 

Kode: 


//EVENTLISTENERS		----------------------------------------------------
stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseFire); //skyt
addEventListener(Event.ENTER_FRAME, onEnter); //hver frame
wavePause.addEventListener(TimerEvent.TIMER, aiWave);

//Hovedfunksjoner 		----------------------------------------------------
function onEnter(Event):void //hver frame
{
	if (currentFrame!=40) return;
    if (bg.currentFrame == bg.totalFrames) {stopAnim();    } //Stopper animasjonen + småting som kjøres en gang når spillet startes
	if (bg.currentframe == 2) {_isLoaded=false; }
	oppdaterRotasjon(); //oppdaterer rotasjonen til skrue
	oppdaterElementer(); //oppdaterer kulene, fiendene, og sjekker for kollisjon
	
} //Hver frame fyres diverse funksjoner av, og ulike betingelser. 
function stopAnim():void {
	
        bg.gotoAndStop(bg.totalFrames-1); //for at event ikke skal fyres av hver frame.
        //removeEventListener(Event.ENTER_FRAME, onEnter);
		_player.visible = true; //Vis skrue når animasjonen har stoppet
		_isLoaded = true; //Kan skyte først når animasjonen har stoppet
		trace("Anim finished");
		txtScore.visible = true;
		wavePause.start(); //Begynner spill
		gamePlaying = true;
} //Når intro animasjonen har avsluttet
function mouseFire(event:MouseEvent):void { 
//Når en skyter (trykker venstre museknapp)
		if (currentFrame!=40) return;
		
		// check if reloaded
		if (!_isLoaded) return;
		
		fire();
		_isLoaded = false;
		_reloadTimer = new Timer(_reloadSpeed);
		_reloadTimer.addEventListener(TimerEvent.TIMER, reloadTimerHandler);
		_reloadTimer.start();

} //Når en trykker inn musa
function fire():void
		{
			bulletID++;
			// precalculate the cos & sine
			_pcos = Math.cos(_player.gun.rotation * Math.PI / 180);
			_psin = Math.sin(_player.gun.rotation * Math.PI / 180);
			
			// start X & Y
			// calculate the tip of the barrel
			_startX = _player.x - _barrelLength * _pcos;
			_startY = _player.y - _barrelLength * _psin;
			
			// end X & Y
			// calculate where the bullet needs to go
			// aim 50 pixels in front of the gun
			_endX = _player.x - 50 * _pcos + Math.random() * _bulletSpread - _bulletSpread * .5;
			_endY = _player.y - 50 * _psin + Math.random() * _bulletSpread - _bulletSpread * .5;
			
			// attach bullet from library
			var tempBullet:MovieClip = new Bullet();
			
			// calculate velocity
			tempBullet.vx = (_endX - _startX) / _bulletSpeed;
			tempBullet.vy = (_endY - _startY) / _bulletSpeed;
			
			// set position
			tempBullet.x = _startX;
			tempBullet.y = _startY;
			
			// save starting location
			tempBullet.startX = _startX;
			tempBullet.startY = _startY;
			
			// set maximum allowed travel distance
			tempBullet.maxDistance = _maxDistance;
			
			//Kule rotasjon(vinkel)
			_bx = _player.x - stage.mouseX;
			_by = _player.y - stage.mouseY;
			
			//assign bulletID
			tempBullet.ID = bulletID;
			// which way to rotate
			var rotateTo:Number = getDegrees(getRadians(_dx, _dy));	
			
			// add bullet to bullets array
			_bullets.push(tempBullet);
			
			// add to display list
			stage.addChild(tempBullet);
			
			//skudd lyd
			myTransform.volume = 0.1;
			fxChannel = shot.play();
			fxChannel.soundTransform = myTransform;
			
			tempBullet.rotation = rotateTo - 180;
		} //Skyt funksjon
function oppdaterRotasjon():void {
			// calculate rotation based on mouse X & Y
			_dx = _player.x - stage.mouseX;
			_dy = _player.y - stage.mouseY;
			
			// which way to rotate
			var rotateTo:Number = getDegrees(getRadians(_dx, _dy));
			//trace(rotateTo);
			
			if (rotateTo > 90 && rotateTo < 270) {
				stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseFire); //skyt
			// keep rotation positive, between 0 and 360 degrees
			if (rotateTo > _player.gun.rotation + 180) rotateTo -= 360;
			if (rotateTo < _player.gun.rotation - 180) rotateTo += 360;
			if (rotateTo > _player.head.rotation + 180) rotateTo -= 360;
			if (rotateTo < _player.head.rotation - 180) rotateTo += 360;
			
			// ease rotation gun and head
			_trueRotation = (rotateTo - _player.gun.rotation) / _rotateSpeedMax;
			_player.gun.rotation += _trueRotation ;	
			_trueRotation = (rotateTo - _player.head.rotation) / _rotateSpeedMax;
			_player.head.rotation += _trueRotation ;	
			} else {
				stage.removeEventListener(MouseEvent.MOUSE_DOWN, mouseFire); //ikke skyt

			}
		} //Roterer gevær, hode, og angir maximum rotasjonvinkel. Regner også ut vinkler etc.
function oppdaterElementer():void {
			var i:int;
			var tempBullet:MovieClip;
			var b:int;
			var c:int;
			var tempEnemy:MovieClip;
			if (_enemies.length == 0 && gamePlaying) {
				wavePause.start();
			}
			// loop thru _bullets array
			for (i = 0; i < _bullets.length; i++)
			{
				// save a reference to current bullet
				tempBullet = _bullets[i];
				
				// update bullet position
				tempBullet.x += tempBullet.vx;
				tempBullet.y += tempBullet.vy;
				
				if (getDistance(tempBullet.startX - tempBullet.x, tempBullet.startY - tempBullet.y) > tempBullet.maxDistance + _barrelLength)
				{
					destroyBullet(tempBullet);
				}	// check if bullet went too far

				// loop thru _enemies array
				for (b = 0; b < _enemies.length; b++)
				{
					// save a reference to current enemy
					tempEnemy = _enemies[b];
				
					//if (checkCollisions(tempBullet.x, tempBullet.y))
					if (checkCollisions2(tempEnemy,tempBullet))
					{
						trace("Fiende nummer: "+tempEnemy.ID+". med svar: "+tempEnemy.svar+" was killed by "+"Bullet Nr."+tempBullet.ID+" Wave: "+tempEnemy.wave);
						//trace("	^Spawn wave: "+tempEnemy.wave);
						destroyBullet(tempBullet);
						trace("Prøver å fjerne: "+tempEnemy.ID)
						destroyEnemy(tempEnemy);
						
						//feedback text
						txtFeedback.visible = true;
						txtFeedback.x = tempEnemy.x - 80;
						txtFeedback.y = tempEnemy.y;
						
						if (tempEnemy.poeng) {
							myTransform.volume = 0.1;
							fxChannel = cashClick.play();
							fxChannel.soundTransform = myTransform;
							score++;
							oldWave(); //fjerner alle fiender -- BUG i funksjonen som ikke fjerner alle 
							txtFeedback.text = "Riktig!";
							
						} else {
							score--;
							txtFeedback.text = "Feil!"
						}
						txtScore.text = "Score: "+String(score);
					}	// check for collision with enemies
				} 
			}
				// loop thru _enemies array
				for (c = 0; c < _enemies.length; c++)
				{
					tempEnemy = _enemies[c]; //laster inn i temp memory
					
					// update enemy position
					tempEnemy.x += tempEnemy.vx;
					tempEnemy.y += tempEnemy.vy;
				
					// check if enemy went too far, dersom korrekt svar kræsjer i binge: minus poeng, ellers ingenting
					if (tempEnemy.x <= 250) {
						destroyEnemy(tempEnemy);
						if (tempEnemy.poeng) {
							score--;
						} else {
						}
					}
			}
		} //Oppdaterer posisjon og rotasjon på fiender og kuler. Inneholder også hva som skjer når nevnte elementer når max x-verdier, og hva som skjer når ulike betingelser skjer med dem. f.eks. blir truffet.

function checkCollisions(testX:Number, testY:Number):Boolean
		{
			var i:int;
			var tempWall:MovieClip;
			
			// loop thru _enemies array
			for (i = 0; i < _enemies.length; i++)
			{
				// save a reference to current object
				tempWall = _enemies[i];
				
				// do a hit test
				if (tempWall.hitTestPoint(testX, testY, true))
				{
					trace("Kollisjon "+testX+" "+testY);
					return true;
					// stop loop
					break;
				}
			}
			return false;
		}  //GAMMEL Kollisjons-detektering, return true or false. Kan fjernres
function checkCollisions2(enemy:MovieClip,bullet:MovieClip):Boolean
		{
			// save a reference to current object
				// do a hit test
				if (bullet.hitTestObject(enemy))
				{
					trace("Kollisjon");
					return true;
					// stop loop
					//break;
				} 
					return false;
				
		} //Bedre kollisjons-detektering, takk jms og google. return true or false
function aiWave(evt:TimerEvent):void {
		wavePause.stop();
		txtFeedback.visible = false;
		var i:int = 0;
		var fiendeY:Array = new Array;
		var tall1:int;
		var tall2:int;
		var pickRightEnemy:int = randomRange(0,enemiesNumber-1);
			
		if (waveNumber==waveNum){gamePlaying = false;gameManager();return;}
		trace("------	Riktig svar er: "+String(pickRightEnemy+1)+" --------");
		
		if (dif==1) {
			tall1 = randomRange(1,5);
			tall2 = randomRange(1,5);
		} else if (dif==2) {
			tall1 = randomRange(2,10);
			tall2 = randomRange(2,10);
		} else {
			tall1 = randomRange(2,20);
			tall2 = randomRange(2,20);
		}
		
		waveNum++;
		for (i = 0; i < enemiesNumber; i++){
			var tempEnemy:MovieClip = new Enemy();
			var used:Boolean;
			enemyGlobalID++;
			fiendeY[i]= Math.round(350/enemiesNumber*(i+1)+randomRange(-10,10)-40); //best algorythm ever i know.
			//trace(fiendeY[i]);
			tempEnemy.vy = 0;
			tempEnemy.vx = -2;
			tempEnemy.ID = enemyGlobalID;
			tempEnemy.wave = waveNum;
			
			if (i == pickRightEnemy) {
				tempEnemy.svar = String(tall1*tall2);
				tempEnemy.poeng = true;
			} else {
				if (dif==3) {
					tempEnemy.svar = String(randomRange(2,20)*randomRange(2,20));
				} else {
					tempEnemy.svar = String(randomRange(2,10)*randomRange(2,10));
				}
				tempEnemy.poeng = false;
			}
			if(tempEnemy.svar == tall1*tall2 && i != pickRightEnemy) {
				tempEnemy.svar += 3
			} //Skittent knep, men who cares. sparer flere linjer med kode 
			
			bg.binge.txtBinge.text = String(tall1)+"×"+String(tall2);
			tempEnemy.x = 976+Number(randomRange(-5,100));//stage.width funka ikke?
			tempEnemy.y = fiendeY[i];
			
			// add enemy to enemies array
			_enemies.push(tempEnemy);
			// add to display list
			stage.addChild(tempEnemy);
			tempEnemy.txtSum.text  = String(tempEnemy.svar);
		} 
		trace(_enemies);
} //Spawner fiendtlige waves og gir fiender properties. 

//Side funksjoner		----------------------------------------------------
function reloadTimerHandler(e:TimerEvent):void 
		{
			// stop timer
			e.target.stop();
				//trace("Reloaded");
			// clear timer var
			_reloadTimer = null;
			
			_isLoaded = true;
		} // "reloadManager"
function destroyEnemy(enemy:MovieClip):void
		{
			var i:int;
			var tempEnemy:MovieClip;
			
			// loop thru _bullets array
			for (i = 0; i < _enemies.length+1; i++)
			{
				// save a reference to current bullet
				tempEnemy = _enemies[i];
				
				// if found enemy in array
				if (tempEnemy == enemy)
				{
					// remove from array
					_enemies.splice(i, 1);
					
					// remove from display list
					trace("Enemy was removed, ID: "+enemy.ID);
					enemy.parent.removeChild(enemy);
					return;
				}		
				trace("Enemy was not removed, ID: "+enemy.ID);
			}
		} //remove child enemy		OBS: BUG.
function destroyBullet(bullet:MovieClip):void
		{
			var i:int;
			var tempBullet:MovieClip;
			
			// loop thru _bullets array
			for (i = 0; i < _bullets.length; i++)
			{
				// save a reference to current bullet
				tempBullet = _bullets[i];
				
				// if found bullet in array
				if (tempBullet == bullet)
				{
					// remove from array
					_bullets.splice(i, 1);
					
					// remove from display list
					bullet.parent.removeChild(bullet);
					
					// stop loop
					return;
				}
			}
		} //remove child bullet
function oldWave():void {
	var b:int=0;
	trace("!-Sletter resten av WAVE:");
	for (b = 0; b < _enemies.length; b++) {
			destroyEnemy(_enemies[b]);
			trace("Prøver å fjerne, ID: "+_enemies[b].ID)
	}
	return;
}	//Fjerner fiender 		OBS: BUG MELLOM DENNE OG REMOVE ENEMY FUNKSJONEN
function gameManager():void {
	//
	trace(" /n Spillet er slutt");
	gotoAndStop("Slutt");

} //Gå til vinne/tape bilde.	NOTAT: UNØDVENDIG FUNKSJON/FRAME SKIFTE.


//Verktøy funksjoner	----------------------------------------------------
function getDegrees(radians:Number):Number
		{
			return Math.floor(radians/(Math.PI/180));
		} // Radianer til grader
function getRadians(delta_x:Number, delta_y:Number):Number
		{
			var r:Number = Math.atan2(delta_y, delta_x);
			
			if (delta_y < 0)
			{
				r += (2 * Math.PI);
			}
			return r;
		} // Grader til radianer 
function getDistance(delta_x:Number, delta_y:Number):Number
		{
			return Math.sqrt((delta_x*delta_x)+(delta_y*delta_y));
		} // Delta_x delta_y etc
function randomRange(minNum:Number, maxNum:Number):Number 
{
    return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
} //randomRange(min,max);

Forøvrig dersom noen her trenger Assistanse er jeg selvsagt behjelpelig med hjelp og/eller eventuelle prosjektfiler.

Endret av BeGj
Lenke til kommentar
Videoannonse
Annonse

Jeg er litt streng, men mener godt. Har ikke så mye si, men dette kan kanskje hjelpe:

  • Koden er ikke lett å lese og forstå (orker ikke å prøve engang). Ikke rart at det er vanskelig å fikse bugs? :)
  • Fjern kommentert kode (støy).
  • Hold dere til ett språk i kommenterene og koden (helst engelsk).
  • Kjør koden gjennom en «code formatter/beautifier», men dette er ikke nødvendig hvis koden formatteres ordentlig fra grunnen av. Bruk tekstredigerer/IDE som tilrettelegger for dette.
  • Skriv «selvdokumenterende» kode og fjern ubrukelige kommentarer.
  • Søk opp SoC («separation of concerns»).

Personlig synes jeg at punktene over burde ha trukket ned karakteren (under 6). Jeg ville skrevet koden på nytt. :)

 

Ellers vil jeg si at selve idéen var ganske god, og så lenge mekanikken fungerer er det av «spillbar» kvalitet.

Endret av ahw_
Lenke til kommentar

Jeg er litt streng, men mener godt. Har ikke så mye si, men dette kan kanskje hjelpe:

  • Koden er ikke lett å lese og forstå (orker ikke å prøve engang). Ikke rart at det er vanskelig å fikse bugs? :)
  • Fjern kommentert kode (støy).
  • Hold dere til ett språk i kommenterene og koden (helst engelsk).
  • Kjør koden gjennom en «code formatter/beautifier», men dette er ikke nødvendig hvis koden formatteres ordentlig fra grunnen av. Bruk tekstredigerer/IDE som tilrettelegger for dette.
  • Skriv «selvdokumenterende» kode og fjern ubrukelige kommentarer.
  • Søk opp SoC («separation of concerns»).

Personlig synes jeg at punktene over burde ha trukket ned karakteren (under 6). Jeg ville skrevet koden på nytt. :)

 

Ellers vil jeg si at selve idéen var ganske god, og så lenge mekanikken fungerer er det av «spillbar» kvalitet.

Takk for tilbakemelding! Muntlig/praktisk eksamen imorgen så takk for kvass og god kritikk

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...