This site requires JavaScript, please enable it in your browser!
Greenfoot back

Comments for Breakout

Return to Breakout

CockyCocky

2012/9/12

auch auf deutsch?
CockyCocky

2012/9/12

war auf deutsch,sorry
CockyCocky

2012/9/12

ich weiß aber nicht wie man das programmiert
Das Szenario könnte dir helfen: http://www.greenfoot.org/scenarios/5847 oder einfach: mit der X-Koordinate des Balls minus der X-Koordinate der Schlägers kriegst du die relative position. Un den Winkel veränders du dann indem du diesen Wert in ner If anweisung einbaust (aber auch unter berücksichtigung von Einfallswinkel = Ausfallswinkel).
CockyCocky

2012/9/12

ich werde nicht schlau daraus
Ok aber den Teil mit dem X-Koordinaten subtrahieren has du doch noch verstanden oder? Ich erklär dir mal den part vom code von meinem Szenario der hierfür wichtig ist: int dif = Schlaeger.getYPos()-getY(); // hier berechne ich die relative position des balles. int turn = (int) ((-1.5*getRotation())+450); // das hier ist ne mathematische funktion. (typ f(x) = m*x+b), du kannst aber auch deine Funktion mit Einfallswinkel = Ausfallswinkel als grundlage nemen. //hier beginnt dann die if anweisung die ich bereits erwähnt habe. if (dif < 125 && dif > -125) {// wenn die differenz (relative position) zwichen -125 und 125 liegt wurde der Schläger getroffen (bei deinem Schläger sind es andere werte da der nicht die selbe größe hat.) //hier unterteile ich den Schläger nun in verschiedene Abteile. if (dif >= -125 && dif <= -100) {//in diesem Abteil wird die rotation des Balles um 50 % erhöht turn += turn*0.5; } else if (dif >= -100 && dif <= -75) {//hier sinds nur noch 40% turn += turn*0.4; } else if (dif >= -75 && dif <= -50) {//30% turn += turn*0.3; } else if (dif >= -50 && dif <= -25) {// den Rest kannst du dir warscheinlich denken turn += turn*0.2; } else if (dif >= -25 && dif <= 0) { turn += turn*0.1; } else if (dif >= 0 && dif <= 25) { turn -= turn*0.1; } else if (dif >= 25 && dif <= 50) { turn -= turn*0.2; } else if (dif >= 50 && dif <= 75) { turn -= turn*0.3; } else if (dif >= 75 && dif <= 100) { turn -= turn*0.4; } else if (dif >= 100 && dif <= 125) { turn -= turn*0.5; } //hier schließe ich dann nur noch aus das der Winkel > 245 oder < 280 ist damit der Ball nicht ewig an der oberen und unteren Wand hin und her titscht. turn(turn); while (getRotation() > 245 && getRotation() < 280) { turn(5); } while (getRotation() > 70 && getRotation() < 105) { turn(5); } //und hier stelle ich sicher das der Ball nicht zweimal geschlagen wird, indem ich ihn von dem Schläger entferne. for (int i = 0; getX() <= 100 && i < 25; i++) { stepp(); } } So ich hoffe ich konnte dir helfen.
CockyCocky

2012/9/12

sorry, aber ich kann das spiel nicht mehr öffnen. Kannst du es veröffentlichen, dann kann ich es downloaden
welches meinst du? Pong? Also bei mir ist das öffentlich. Ich kanns zumindest downloaden
CockyCocky

2012/9/13

nein das Breakout in dem du hier kommentierst.
CockyCocky

2012/9/13

ich aber es doch noch einmal hingekriegt es zu öffnen nur jetzt sieht es etwas anders aus.
CockyCocky

2012/9/13

aber ich weiß nicht wo ich deinen Code einfügen soll
Der Code den ich oben Kommentier hab ist aus meinem Pong Spiel. Un der Code is öffentlich. Zur Frage wohin: In deiner Klasse Ball (oder wie auch immer du den Felsen da nennst) muss irgentwo stehen was passiert wenn der Ball auf den Schläger unten trifft. Und da fügst du dann ein was ich dir gestern geschickt hab nur halt auf deinen Code umgestimmt (also andere werte oder so). Ich könnte dir aber bestimmt besser helfen wenn du mir mal den code zeigst.
CockyCocky

2012/9/14

ok welchen code den vom Ball
CockyCocky

2012/9/14

der code von Ball lautet:public class Ball extends Actors { int xchange = 3; int ychange = -3; public static int counter = 0; public void act() { setLocation(getX() +xchange, getY() +ychange); if(atWorldSide()) { xchange=-xchange; } if(atWorldTop()) { ychange=-ychange; } if(canSee(Stein.class)) { ychange=-ychange; eat(Stein.class); counter = counter + 1; if(counter >= 15) { Greenfoot.stop(); } public boolean atWorldTop() { if(getY<20) return true; else return false; } } public boolean atWorldSide() { if(getX() < 20 || getX() > getWorld().getWidth()-20) return true; else return false; } public boolean atWorldBottom() { if(getY() > 20 || getY() < getWorld().getHeight()-20) return true; else return false; }
CockyCocky

2012/9/14

ich habe noch vergessen zu sagen: die methoden: canSee(Class clss) und eat(Class clss) sind in der Klasse Actors geschrieben.
Ist das der ganze code von deinem ball? eigentlich müsste in der act methode noch eine if anweisung sein die prüft ob du den Schläger (das braune Rechteck unten) getroffen hast. Sollte etwa so aussehen: if (canSee(Schläger.class)) { // statt schläger den klassennamen den du verwendest. ychange=-ychange; }
CockyCocky

2012/9/14

o ja ich habee vergessen das mit hinzuschreiben
Tja da has du leider genau das wichtigste vergessen. Aber egal. Da wo das steht was du vergessen hast musst du so was ähnliches schreiben wie den code den ich dir Kommentiert habe.
CockyCocky

2012/9/14

in das if(canSee(Schläger.class)) ?
ja da muss so ein ähnlicher code rein wie der den ich dir da oben kommentiert hab. Aber wie gesagt musst du die variablen ändern, da dein Schläger eine andere Größe hat als der in meinem Pong Szenario. Und du musst beachten das in meinem Szenario der Schläger Vertikal und in deinem Szenario Horizontal ist also musst du getY() durch getX() ersetzen.
CockyCocky

2012/9/14

soll ich dann auch das ychange=-ychange löschen?
du musst die variable verändern damit der ball in eine andere Richtung fliegt. Du solltest die Zeile erst mal stehen lassen aber den wert nachträglich noch verändern.
CockyCocky

2012/9/14

welchen Wert?
den der Variable ychange
CockyCocky

2012/9/14

achso und in wie fern ändern? Soll ich den Wert -3 in eine positive Zahl umsetzen?
nein statt -3 nimmst du mal -2 und mal -4
CockyCocky

2012/9/14

achso
CockyCocky

2012/9/14

der Compiler meldet aber das er die Methode getYPos() nicht kennt.
wenn du die nicht deklarier hast kann der die auch schlecht kennen. versuch mal den code: //global in ball private Schlaeger schlaeger; // für Schlaeger setzt du den klassennamen von deinem schläger ein wenn der nicht so ist. public void act() { if (schlaeger == null) { if (getWorld().getObjects(Schlaeger.class).size() != 0) { schlaeger = (Schlaeger) getWorld().getObjects(Schlaeger.class).get(0); } } else { //hier dann der restliche code; //bei der stelle mit dem problem schreibst du dann einfach schlaeger.getX(); du brauchst getX() weil du horizontal bewegst. } }
A new version of this scenario was uploaded on Fri Sep 14 16:00:27 UTC 2012
CockyCocky

2012/9/14

der Compiler meldet immer noch den gleichen Fehler.
dann steht noch irgentwo anders dieser methodenaufruf du musst alle löschen und durch schlaeger.getX() ersetzen
CockyCocky

2012/9/14

ach, dann müsste ich ja noch mal von vorne anfangen. Im nächsten BreakOut-Spiel von mir werde ich das machen. Aber trotzdem: vielen vielen vielen vielen Dank. Bitte verzeihen sie mir, den es war für mich eine sehr schwierige Aufgebe dieses Spiel zu Programmieren. Und ich müsste das alles wieder löschen. Und wen es dann nicht klappt wäre es echt doof, weil ich dann das alles nicht wieder rückgängig machen könnte. :(
CockyCocky

2012/9/14

Entschuldigung aber Sie haben mir wirklich gut geholfen. Sie haben es zumindest versucht, auch wenn ich fast nichts verstanden habe. Vielen Dank.
Kein Problem ich helf immer gern. Aber ein kleine Tip noch wenn du nicht einfach dein Szenario überschreiben willst: Dafür hat man sowas wie sicherheitskopien erfunden.
CockyCocky

2012/9/14

aber wie wendet man diese sicherheitskopien an?
Du kopierst einfach dein Szenario und wenn das Szenario das du verändert hast nicht richtig funktuiniert löschst du das und benutzt wieder die kopie.
CockyCocky

2012/9/14

o ja danke
CockyCocky

2012/9/14

ok Sie können meinen Score Code doch öffnen und dann sagen Sie mir einfach bitte was ich ändern soll. Sie dürfen den Code frei verwenden. Bitte machen Sie das.
ok also an der stelle in dem Code von deinem Ball wo er auf den Schläger trifft schreibst du einfach das rein. //den folgenden Teil fügst du Global ein also ganz oben unter der klassendeklaration. private Schlaeger schlaeger; //das hier kommt an den Anfang der act methode. public void act() { if (schlaeger == null) { if (getWorld().getObjects(Schlaeger.class).size() != 0) { schlaeger = (Schlaeger) getWorld().getObjects(Schlaeger.class).get(0); } } else { //hier fügst du den gesamten Code ein den du bereits in der Klasse Ball hast. Das würde sonst zu Exceptions führen. ... //hier kommt nun der wichtige Teil den du in deinem Code ersetzen musst if (canSee(Schlaeger.class)) { ychange= -ychange; int dif = getX()-schlaeger.getX(); if (dif < (int) (schlaeger.getImage().getWidth()/3)) { if (ychange > 2) { ychange--; } } else if (dif > (int) ((schlaeger.getImage().getWidth()/3)*2)) { if (ychange < 4) { ychange++; } } } ... } } den code an der stelle "schlaeger.getImage().getWidth()" kannst du auch durch die breite des Bildes von deinem Schlaeger ersetzen aber so sollte es auf funktionieren. Noch ein Tip: wenn du die Startwerte der variablen xchange und ychange vergrößerst wird der ball schnelle. könnte das spiel etwas anspruchsvoller gestalten. Aber du solltest dann auch diese passage in dem Schläger verändern: if (Greenfoot.isKeyDown("left")) { setLocation(getX()-3, getY()); } if (Greenfoot.isKeyDown("ritght")) { setLocation(getX()+3, getY()); } Du solltest die werte bei setLocation getX()+... erhöhen damit dein schläger schneller wird. wie schnell musst du dann mal ausprobieren. Und eins noch: hör bitte auf mich zu Sie-zen ok.
CockyCocky

2012/9/16

ok vielen Dank
CockyCocky

2012/9/16

aber jetzt bewegt sich der Ball nicht mehr
hast du den restlichen Code den du vorher hattest auch eingefügt? sonst kann der ball nichts machen, außer vom Schläger abprallen.
CockyCocky

2012/9/17

ja habe ich
CockyCocky

2012/9/17

/home/gabriel/smily_2.gif
CockyCocky

2012/9/17

oh mist was habe ich da geschrieben?
ok versuch ma den code den du vorher hattest aus der if / else anweisung rauszunehmen und dahinter zu setzen. Aber der code den ich dir geschrieben hab muss im else teil bleiben
CockyCocky

2012/9/17

ok
A new version of this scenario was uploaded on Wed Sep 19 15:15:49 UTC 2012
A new version of this scenario was uploaded on Wed Sep 19 15:17:33 UTC 2012