Anonym342r234erf342ewt4gawrewerfg Skrevet 8. juni 2015 Del Skrevet 8. juni 2015 (endret) Oppgave IT2 Tidsfrist: 8. juni 2015 23:59Lag 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.. //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. 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 8. juni 2015 av BeGj Lenke til kommentar
Anonym342r234erf342ewt4gawrewerfg Skrevet 9. juni 2015 Forfatter Del Skrevet 9. juni 2015 (endret) Dokumentasjon: Vurdering: Endret 9. juni 2015 av BeGj Lenke til kommentar
ahw_ Skrevet 9. juni 2015 Del Skrevet 9. juni 2015 (endret) 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 10. juni 2015 av ahw_ Lenke til kommentar
Anonym342r234erf342ewt4gawrewerfg Skrevet 11. juni 2015 Forfatter Del Skrevet 11. juni 2015 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå