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).
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.
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.
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;
}
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.
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.
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.
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
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. :(
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.
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.
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
2012/9/12
2012/9/12
2012/9/12
2012/9/12
2012/9/12
2012/9/12
2012/9/12
2012/9/12
2012/9/13
2012/9/13
2012/9/13
2012/9/13
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/14
2012/9/15
2012/9/16
2012/9/16
2012/9/16
2012/9/17
2012/9/17
2012/9/17
2012/9/17
2012/9/17