Eine reinweisse Wand reicht bei uns vollkommen. Sogar wenn das weiß ganz leicht gebrochen ist (NCS-Farbe 9010), so adaptiert das Auge den minimalen Farbfehler sofort.

Das machen wir bei uns zu Hause so.

Einfach vielleicht darauf achten, dass der Beamer sehr leise ist. Und BOSE verträgt sich schlecht mit einer Beameranlage. So mussten wir diverse Adapter kaufen, damit der Sound von hinten im Raum (DVD-Spieler/Beamer) korrekt nach vorn im Raum übertragen wird.

...zur Antwort
Eher nicht.

Unter 5'000'000 spreche ich nicht von 'halbwegs viel'. «Ganzweg viel» wären für mich wohl eher ca. 10'000'000; wenn man bedenkt, wie viele Menschen unter der Armutsgrenze leben, ist doch fraglich, warum nur ein sehr sehr kleiner Prozentsatz dann mehr als 5'000'000 besitzt und doch ist dort bei diesen Menschen das größte Vermögen der Welt auszumachen.

...zur Antwort
Andere Meinung // unschlüssig // keine Meinung

Ich weiß nicht, wie es in Deutschland ist. Im Kanton Zürich zumindest haben die Schüler ca. 30 % Mehr Schulzeit, als wir vor 30 Jahren noch hatten (zusätzlich kommen noch Hausaufgaben). Dieser Zeitverlust der Freizeit "zerstört" die Möglichkeiten Nachmittag im Wald Hütten zu bauen oder einem Hobby so tief nachzugehen, wie wir das noch konnten.

Dieser "Zeitverlust" hat zwei Ursachen: Erstens: Das Stimmvolk hat einem Lehrplan zugesagt, bei dem die Kinder mehr Zeit in der Schule verbringen, damit Eltern mehr Zeit um Arbeiten haben. Dies führte dazu, dass weitere Fächer eingestreut wurden, anstatt die bestehenden auszubauen. Daher (und [zweitens] aus einer Papier-Verkaufs-Philosophie des Lehrmittelverlags) kommen komplett unnötige neue Themen hinzu, die bei uns noch in die abstrakteren Fächer eingebaut wurden; so lernten wir "Kultur, Religionen und Ethik" im Geschichtsunterricht und Programmieren lernten wir im Mathe-Unterricht; die Informations-Mathematik (= Informatik) gehört für mich als Mathe-Lehrer eigentlich immer noch dahin. Themen wie "Sexualität und Gesundheit" hatten wir in Biologie und eine Fremdsprache reicht völlig, auch wenn es ca. 5000 lebende Sprachen gibt; so müssen unsere Kinder ja nicht alle können. Viele Themen sind daher auch nur "Absitz"-Themen, denn die Repetition kennt keine Grenzen (den Auflkärungs-Unterricht zum Beispiel müssen die Schüler nun alle drei Jahr über sich ergehen lassen. Meine beiden Kinder bestätigen: Neues war bei den beiden Repetitionen nie dabei.)

Durch die vielen Lehrer bereits in der Primarschule kann jedoch das Weltbild heute auch etwas geöffnet werden. So sehen die Kinder, dass andere Lehrer die Welt anders sehen, und einiges relativ ist. In diesem Sinne kann Kreativität auch wieder gefördert werden, denn es gibt da ja dann nicht nur "wahr und falsch", sondern vieles wird relativiert und die Schüler(s)/Innen*ers/er[Sie/Er] können sich sich ein offeneres Bild der Welt schaffen.

...zur Antwort

Go (auch Igo oder Baduk genannt). Gilt im Moment als das komplexeste zweipersonen Nullsummenspiel.

Hat sehr einfache Regeln und kann in 5-10 Minuten erlernt werden.

Die Komplexität hingegen schlägt Schach um mind. Faktor 5. Google hat sich damit fast die Zähne ausgebissen, aber mit AlphaGo dann doch geschafft, den Weltmeister zu besiegen.

Einstieg z. B. hier:

https://www.dgob.de/

...zur Antwort
Warum machen manche Leute immer so ein Drama, wenn jemand keine Kinder will?

Vor allem ältere Menschen, die selber Kinder haben.

Ich will keine Kinder haben und das steht fest. Vielleicht auch keinen festen Freund/Ehemann. Meine Pläne für die Zukunft bestehen darin, etwas zu machen, was mich glücklich macht (z. B viel zu reisen), viel Geld zu haben und hoffentlich berühmt zu werden. Kinder haben in dem Leben, das ich will, einfach keinen Platz.

Sie schreien, machen Sachen kaputt, stellen nervige Fragen á la "Warum ist dein Hut rot?" und brauchen die ganze Zeit Aufmerksamkeit. Kleine Kinder neigen auch oft dazu, eklige Dinge zu machen wie z. B. ihre Kotze/Pipi/Kacke überall um sich herum zu verteilen. Auch beim Essen machen sie eine riesige Unordnung. Sie kosten viel Geld und Zeit und man hat mit ihren so gut wie keine Freiheit mehr. Dazu kommt noch, dass ich eine Phobie vor Schwangerschaft, Geburt und Stillen habe. Aber das Schlimmste ist, dass sie oft keine Privatsphäre respektieren. Beispiel: Mutter geht Duschen, Kind kommt mit und schaut ihr dabei zu. (Warum erlauben Eltern ihren Kindern sowas? Wenn es jemand weiß, erklärt es mir bitte.)

Natürlich sind nicht alle Kinder so, aber die Meisten.

Eigentlich mag ich Kinder, aber nur solange es nicht meine eigenen sind, denn wenn ich nicht Elternteil des Kindes bin, muss ich auch nicht mit all den Problemen zurechtkommen. Außerdem bin ich ein Introvert und 24/7 Kinder um mich herum zu haben wäre für mich Tortur pur.

Warum müssen Leute mir immer sagen, dass ich meine Meinung noch ändern und doch Kinder haben werde? Das ist doch mein Leben und meine Entscheidung.

Was ich nicht hören möchte: - Kinder sind etwas Wundervolles. - Warte einfach ab. - Du warst auch mal ein Kind. - Und wenn deine Eltern dich nicht gewollt hätten? - Ein Leben ohne Kinder hat keinen Sinn. - Erst wenn du Kinder hast, wirst du Liebe/Schmerz/Müdigkeit kennen. - Du bist so egoistisch! - Warte einfach ab, du wirst später noch welche wollen. - Wenn du alt bist, wirst du es bereuen.

Lavinius

...zum Beitrag

Wahrscheinlich würden viele auch ein Drama machen, gerade wenn man Kinder haben will: Speziell in einer Zeit der massiven Überbevölkerung. Doch wir Menschen sind nun mal wie die Lemminge oder die Schafe. Wir wissen zwar, dass wir viel Schrott machen, doch so lange es alle anderen auch machen kann es ja nicht sooo schlimm sein ;-)

Und wehe, Du bist nicht meiner Meinung! Dann mach ich sofort ein Drama! (Auch so ein menschliches Verhalten.)

...zur Antwort

Du hast die Scheitelform



gegeben. Der Scheitelpunkt ist S(m|n).

Berechne die Nullstellen x1 und x2 nun so:

Dies ergibt zwei Nullstellen x1 und x2 (sofern der Radikand positiv). Dann steht die Produktform bereits da:



Vorstellen kannst Du Dir das so:

  • Die Nullstellen müssen ja beide gleich weit von der x-Koordinate des des Scheitelpunktes entfernt sein, daher das PlusMinus (±).
  • Ist der Radikand (unter der Wurzel) negativ, so schneidet die Parabel die x-Achse nicht. Dann gibt es reell auch keine Lösung.
  • Je größer a, umso steiler die Parabel, daher steht a im Nenner. n gibt an, wie weit der Scheitelpunkt von der x-Achse entfernt ist, daher steht n im Zähler.
  • a und n müssen umgekehrte Vorzeichen haben, ansonsten gibt es keine Lösung, daher das Minus (-) unter der Wurzel.
...zur Antwort

Vielleicht findest Du hier eine Lösung?

https://programmieraufgaben.ch/aufgabe/kilobyte/nk4tg9hc

Die Antworten sind zwar oft nicht die besten, doch ich denke, gerade für Deine Aufgabe ist was passendes dabei.

...zur Antwort
  1. öffne die Eingabequelle (File, Webseite, ...). Dazu gibt es Kommandos im Kernel Mode wie "fopen(), new FileReader(), ...".
  2. öffne die Ausgabesenke (File, Webseite, Feld (Array), ...)
  3. identifiziere die Wörter (entweder lesen bis Satzzeichen, Leerschlag, Ziffer, ....). Dies hängt davon ab, was Du unter Wörter verstehst (Ist "Vorreiter-Handschuh" ein Wort, oder sind es zwei? Gilt "Haus42" als Wort oder nicht?). Hier gibt es in vielen modernen Sprachen Trennhilfen wie "split()" oder "regEx".
  4. Entscheide, ob das Wort groß oder Klein ist. Dies geht am besten, indem Du den ersten Buchstaben nimmst. Du kannst natürlich auch das ganze Wort in Kleinbuchstaben verwandeln (viele Sprachen bieten sowas an z. B. toLower() oder toLowercase()) und danach das neue Wort vergleichen. Ist es identisch, waren im Originalwort auch alle Buchstaben klein geschrieben (Dann gilt aber "hAUS" nicht als kleingeschrieben!).
  5. War das Wort klein, so schreibe dies in die Ausgabe.
  6. Wiederhole Schritt 3 - 5, solange noch Wörter zu behandeln sind. Dies ist mit einer Kopf- (bzw. Fuß-) gesteuerten Schleife (while, repeat, ...) möglich.
  7. Schließe die Ein- und Ausgabeströme wieder, damit nichts im RAM-Puffer hängenbleibt.
...zur Antwort
Lineare Kongruenzmethode
      long x0 =            1;
      long a  =           11;
      long b  =           13;
      long m  = 2_000_000_011;
      long x  = (a * x0 + b) % m;

      while(x != 1) {
         tuEtwasMit(x);
         x = (a * x + b) % m;
      }

Ich schlage Dir die lineare Kongruenzmethode vor. Hier erhältst Du 2'000'000'010 verschiedene Pseudozufallszahlen. Erst danach wiederholt sich die Sequenz. Du kannst auch mit anderen a, b und m ausprobieren. Etwas schnelleres wirst Du kaum finden.

Shuffle

Eine andere Variante ist es, ein Array mit allen möglichen Zahlen aufzufüllen (0, 1, 2, ...., n) und danach zu mischen (shuffle). Danach kannst du einfach jede Zahl aus dem Arrya nehmen und bist sicher, dass keine zweimal genommen wurde. Ein weiterer Vorteil der Shuffle-Methode: Du kannst vorab bestimmen, welche Zahlen vorkommen sollten und sogar allfällig aufzutretende Duplikate festlegen.

...zur Antwort

Ich arbeite meist mit einer eigenen Main-Methode (nenne sie mal top()).

Das sieht dann so aus, und Du brauchst Dich nie mehr um "static" zu kümmern.

import java.util.*;

public class Testclasse {   
 public static void main (String[] progArgumente){
   new Testclasse().top();
 }


 /*** DEIN CODE BEGINNT HIER: ***/
 void top() {
   addRezept("Test");
 }

 private HashMap<String, Rezept> rezeptList;
 rezeptList = new HashMap <String,Rezept>();

 void addRezept(String name) {
   rezeptList.put(name, new Rezept(name));
 }    

}
...zur Antwort

Was das Betriebssystem betrifft, ist wohl die Antwort von tavkomann sehr ausführlich.

Doch die Stabilität hat nicht nur mit dem Betriebssystem zu tun. Da gibt es sog. rugged Android Hanys wie z. B. das Smart 01 rugged. Würde gerne mal sehen, welches den 10m Falltest besser besteht, ein durchschnittliches iPhone, oder ein rugged Android.

Was ich auch schon oft gesehen hatte, sind zerbrochene Glasscheiben auf iPhones, und bei Android Handys habe ich das erst 2-3 mal gesehen. In unserer Schule müssen die Schüler ihre Handys regelmäßig bei Prüfungen abgeben, und da bekomme ich sehr sehr oft zersplitterte iPhone-Scheiben zu Gesicht.

Ebenfalls sind nicht alle iPhones im Tauchtest erfolgreich (die meisten Android übrigens auch nicht, doch die Behauptung aus der Frage war ja, dass ausnahmslos alle iPhones stabiler sind als alle Android Geräte). Aus irgend einem Grund bieten ja Dritthersteller extra Hüllen fürs iPhone an, um unter Wasser aufnahmen zu machen ;-)

Doch abgesehen von der zerbrechlichen Hülle, dem horrenden Preis und dem wirklich sch... Aussehen sind iPhones sicher eine Alternative, wenn es um rasche Ausführung von Programmen geht.

...zur Antwort

Poly = Viel

morphos = Gestalt.

Polymorphismus = Vielgestaltigkeit.

So kann eine geometrische Figur einfach als "Klasse Figur" implementiert werden mit einer Position (x, y) und einer Methode "move()" und einer einfachen Methode "draw()", welche einfach einen Punkt an die Stelle x,y zeichnet..

In den vererbten Klassen Dreieck, Rechteck und Kreis werden wir die Methode "draw()" nun überschrieben, sodass ein Dreieck, ein Rechteck beziehungsweise ein Kreis gezeichnet wird.

Eine Zeichnung besteht nun aber nicht aus drei Listen, eine für die Dreiecke, eine für die Rechtecke und eine für die Kreise, sondern nur noch aus einer einzigen Liste "Figuren". Da "Figur" die Überklasse über die drei konkreten Figuren ist, brauche ich nur noch eine einzige "foreach"-Schleife, um nun alle Figuren anzuzeigen. Der Array "meineFiguren" ist somit poly-morph und kann viele (in diesem Beispiel im wahrsten Sinne des Wortes) Formen annehmen:

Figur f;

foreach f aus meineFiguren do:

f -> draw()

oder in Java

for(Figur f: meineFiguren) f.draw();

Ich poste dennoch einen Link, wo ich Kapitel 20 empfehle. Dort sind weitere Beispiele:

https://programmieraufgaben.ch/uploads/oo.pdf

...zur Antwort

Hier ein Antwortversuch. Ein "Thread" (deutsch Faden) ist eine Art Hintergrundprozess (genauer ein Hintergrundprozess, der den selben Speicherbereich wie das Hauptprogramm nutzt).

Damit lässt sich ein "Timer" gut implementieren. Beachte vor allem die Methode "run()", welche so heißen muss:


package timer;


public class Timer implements Runnable {

   // Tausend Millisekunden = eine Sekunde
   public static final int SEKUNDE = 1000;


   public static void main(String[] args) {
      new Timer().top();
   }


   void tuEtwas() {
      System.out.println("etwas");
   }


   void top() {
      starteTimer();
   }


   Thread faden;
   boolean laeuft;


   void starteTimer() {
      faden = new Thread (this);
      laeuft = true;
      faden.start();
   }


   public void stop() {
      laeuft = false;
   }


   @Override
   public void run() {
      while(laeuft) {
         tuEtwas();
         try {
            Thread.sleep(SEKUNDE);
         } catch (InterruptedException ie) {
            System.out.println("Tread wurde unterbrochen");
            stop();
         }
      }
   }

} // end of class Timer
...zur Antwort

Ein Vergleich "x = true", wie in älteren Sprachen (z. B. PL1 oder Pascal) ist in Java so nicht möglich, denn das einfache Gleichheitszeichen bedeutet in Java (und allen anderen von C abgeleiteten Sprachen eine Zuweisung.

Auch in PL/1 ist x = true eine Zuweisung, aber dort wird "x = true" innerhalb von Bedingungen (if) immer als Vergleich angesehen. Somit kein Problem.

C-Sprachen, wie auch in Java, können wir jede Zuweisung (hier x = true, sprich "x wird true") auch als Ausdruck ansehen. Somit ist (y = (x = true)) sowohl die Zuweisung "x wird true", wie auch "y wird Resultat von (x wird true)". Der Wert einer Zuweisung (hier x wird true) ist dann aber auch der zugewiesene Wert. Also z. B. "y = x = 5 + 7" bedeutet, dass sowohl x, wie auch y später den Wert 12 haben werden. Ich könnte auch schreiben "y = (x = 5 + 7) + 2"; somit hätte x den Wert 12 aber y den Wert 14. Dies wurde ursprünglich eingeführt, um Initialisierungen zu vereinfachen (a = b = c = d = 0, somit sind alle Variable 0); hat sich aber als Gefahr erwiesen. Ich verwende die Zuweisung als Ausdruck aber lediglich in while-Schleifen, um das Vor- bzw. Nachlesen nur einmal tippen zu müssen.

In Deinem Fall schreibe also:

if(x) {...}

Natürlich ginge (Weil ein Vergleich in Java mit Verdopplung des Gleichheitszeichens geschrieben werden muss) dies auch:

if(x == true) {...}

Doch hier werden zu viele Fehler gemacht, sodass ich allenfalls ein

if(true == x) {...}

noch durchgehen lassen könnte. Generell wird ein "== true" IMMER weggelassen, um den Fehler des Vertippens zu umgehen.

Stell Dir vor, Du willst "x == true" schreiben und vertippst Dich "x = true" (kann Dir auch passieren, wenn Du obiges gut verstanden hast). Nun hast Du nicht nur eine Zuweisung (x wird true) sondern auch noch den Ausdruck ("true"). Der Wert der Variable spielt also gar keine Rolle mehr und ist nach dem Vergleich immer "true".

1. Regel: Konstanten IMMER links:

if(true == x), if (4 == y), if("Meier".equals(name)), ...

2. Regel: Bei Vergleichen mit boolean niemals die Literale "true" bzw. "false" einsetzen, sondern <<direkt unverändert "false/true"-Variable einsetzen>> (DUFTE). In der Literatur als "Gebundenheit boolescher Variable" bekannt. Also

if(x) statt if(true == x) 
if(!x) statt if(false == x)

Für weitere "Fallen" siehe hier:

http://www.santis-training.ch/java/pitfalls.php

Dort unter "Vergleich Boole'scher-Ausdrücke" findest Du Deine Problematik.


...zur Antwort

Die Dateiendung ändert nichts daran, ob es sich um eine Textdatei oder einen Java-Quellcode handelt. Nebenbei: Jeder Java-Quellcode ist eine Textdatei (dabei spielt die Textcodierung noch keine Rolle).

Wenn Du das Programm jedoch kompilieren (also in java-Bytecode = Java-Maschinensprache übersetzen) willst, muss es die File-Endung ".java" lauten und gleich heißen, wie die Hauptklasse innerhalb der Datei. Also z. B. "MeineKlasse.java" anstelle von "meine_klasse.txt" (dabei ist auch die Groß-/Kleinschreibung wichtig).

...zur Antwort

Ich z. B. wollte es einfach können. Der Rest ergab sich von alleine. In Singapore (da hatte ich keinen Computer), hab ich mir dann 1987 das Buch "The C Programming Language" gekauft und komplett durchgelesen (ohne Computer). Das hat gereicht.

...zur Antwort

Den einfachen & bzw. einfachen | gibt es auch logisch (und nicht nur bitweise, wie man nach obigen Antworten denken könnte).

Sind a() und b() Funktionen (oder komplexere Ausdrücke) mit booleschem Resultat, dann bedeutet

a() & b(),

dass zuerst a() ausgewertet wird, dann wird b() ausgewertet und am Schluss wird das logische "und" der beiden booleschen Resultate genommen (Analog | für oder).

Hingegen bedeutet

a() && b(),

dass b() nicht ausgewertet wird, wenn die Funktion a() bereits "false" liefert. WICHTIG: Der Aufruf der Funktion b() wird bei && evtl. gespart, wohingegen beim alleinigen & die Funktion b() IMMER aufgerufen wird, auch wenn a() false ist!

Man bezeichnet darher &&  (und ||) auch als "Abkürzungsoperatoren" (Shortcut-evaluation).

Alles klar?

PS: Das einfache & (bzw. |) wird sehr selten für logische Zusammensetzung benötigt, da es zum einen langsamer ist und meistens b() tatsächlich irrelevant ist, wenn die Aussage bereits aus a() errechnet werden kann. Es gibt jedoch seltene Ausnahmen, wenn der User z. B. beides gefragt werden muss (a() und b()), wenn eine Subroutine Nebeneffekte aufweist.

vornameEingabeOK() & mailEingabeOK()

...zur Antwort

Die Frage ist: Warum seid ihr 2 Stunden vorher gegangen.

Wenn es vorsätzliches Schulschwänzen war, gibt es wohl keine Entschuldigung mehr. Blödsinn eingestehen, zugeben und Stafe absitzen.

War es jedoch eine höhere "Gewalt" wie z. B. "Todesfall in der Familie", "Plötzliches Unwohlsein", ... dann müsste eine Entschuldigung angenommen werden. Aber aufpassen: Eine Notlüge wäre dann ein zweiter Vorsatzt und das Strafmaß beim "Erwischtwerden" wäre unter Umständen noch höher als beim Zugeben des 1. Vorsatzes.

Die Frage ist also nicht, was geschieht beim Fernbleiben des Unterrichtes, sondern ganz einfach: War das Fernbleiben vorsätzlich oder nicht.

...zur Antwort

Ja, ist möglich. Ich bin als Informatiktrainer gerade dabei, mit einem Schüler in seiner Individuellen Praxisarbeit (IPA) zu helfen, einen Compiler in C# für eine von ihm entwickelte Sprache in die Sprache Redcode (und Redcode ist ein Maschinencode, wenn auch nur ein virtueller) zu schreiben.

Theoretisch kannst Du in jeder universellen Sprache (Python, BASH, Java, BASIC, C#,...) einen Compiler schreiben, der jede andere Sprache in einen eigene Code übersetzt (sofern die Aktionen in beiden Sprachen möglich sind). Ein Informatik-Studienkollege hatte damals (1993) einen Compiler geschrieben, der PL/1 in PL/1 so übersetzte, dass keine GOTO mehr vorkommen.

Wenn das Projekt groß wird (also nicht nur +. -. *. /. Zahlenliterale und Variable), würde ich aber eher Bison/Flex oder CoCo anstelle von Java verwenden. CoCo ist nicht mehr so populär, jedoch sein Erfinder (Hr. Mössenböck) war damals mein Professor in Algrorithmen und Datenstrukturen :-)

...zur Antwort
Wie bekomme ich eine Kollisionsbehandlung hin?

Hi Leute :) Ich bin dabei ein kleines Jump&Run in Java zu programmieren und bin nun schon seit geraumer Zeit an der Kollisionsauflösung hängengeblieben. Die Erkennung von Kollisionen habe ich bereits gelöst. Ich habe nun schon das halbe Internet abgesucht, bin aber nicht schlauer geworden. Könnt ihr mir helfen? Ich habe bisher eine HALBWEGS funktionierende Kollisionserkennung hinbekommen.

Gegeben sind mir: -Position des Spielers(px, py), -Größe des Spielers(playerSize), -Pos. der Hitbox(bx, by), -Seitenlänge der Hitbox(boxSize), -Bewegungsrichtung des Spielers(movex, movey), -Zielposition des Spielers ohne Einbezug der Kollision(destx, desty), -Geschwindigkeit des Spielers(vel) --- alles vom Typ "int"

Das Problem: so wie ich das gelöst habe ist die Auflösung fehlerhaft. Wenn ich geradewegs auf die Hitbox zukomme mit einer Geschwindigkeit von z.B. 5 Pixel pro Frame und ich rage bei der Kollision so in die Hitbox hinein, dass der x-Anteil größer ist als der y-Anteil, dann wird es nach y aufgelöst.

Ich wollte in jedem Schleifendurchlauf die Kollision mit allen überlappenden Tiles so auflösen: Mein bisheriger Code:

if(intersect(...)){ //wenn die Kollision mit der aktuellen Box feststeht
int tilex = bx
int tiley = by
                    
int yover = desty + playerSize - by;        //positiv wenn überlappung
int yunder = by + boxSize - desty;      //positiv wenn überlappung
int xleft = xdest + playerSize - bx;        //positiv wenn überlappung
int xright = bx + boxSize- destx;       //positiv wenn überlappung
                    
boolean left = false, right = false, top = false, bottom = false;  

//Überragt der Spieler die obere, untere, linke oder Rechte Seite der Box 
                    
if(desty < by) top = true;
if(desty + playerSize > by + boxSize) bottom = true;
if(destx < bx) left = true;
if(destx + playerSize > bx + boxSize) right = true;
                    
if(top && !right && !left) desty = by - playerSize;
if(bottom && !right && !left) desty = by + boxSize;
if(left && !top && !bottom) destx = bx - playerSize;
if(right && !top && !bottom) destx = bx + boxSize;
                    
if(top && right){
    if(yover < xright) desty = by - playerSize;
    if(yover > xright) destx = tilex + boxSize;
}
if(top && left){
    if(yover < xleft) desty = by - playerSize;
    if(yover > xleft) destx = bx - playerSize;
}
if(bottom && left){
    if(yunder < xleft) desty = by + boxSize;
    if(yunder > xleft) destx = bx - playerSize;
}
if(bottom && right){
    if(yunder < xright) desty = by + boxSize;
    if(yunder > xright) destx = bx + boxSize;
}
}

Meine Frage ist nun: Wie bekomme ich so eine realistische und genaue Kollisionsbehandlung hin (mit destx und desty als Zielpositionen)? Es geht mir dabei nicht um einwandfreies Java, es zählt nur die Logik dahinter (von mir aus auch Pseudo-code).

Vielen Dank im Voraus :)

...zum Beitrag

Hallo

Das ist eine spannende Frage, die ich selbst auch noch nie im Detail gelöst habe, dennoch habe ich schon starke Vereinfachungen dieser Problematik umgesetzt. Vielleicht helfen Dir einige Überlegungen, die ich selbst auch angestellt hatte. Dein Problem wird damit aber noch nicht gelöst, dazu fehlen einige Infos.

Die Collision Detection, also die Kollisiosnerkennung hast Du bereits gelöst.

Nun hast Du den Exakten Zusammenstoß-Zeitpunkt berechnet (liegt typischrweise zwischen den Frame-Steps; will sagen: Wenn Du alle 1/10 Sekunden eine Collision-Detect ausführst, könnte es ja sein, dass zwei Objekte sich nur gerade dazwischen berühren würden (also weder vorher, noch nachher). Daher gibt es diesen Zeitpunkt zwischen den Frames, wo sich die Oberflächen gerade berühren.)

Aus Deinem Modell gehe ich davon aus, dass Deine Objekte flach sind (eine Z-Achse kommt nicht vor). Das vereinfacht die Realität natürlich sehr. So wie kleine Plättchen, die auf einem Luftkissenbot schweben, ohne Schwerkraft?

Nun geht es an die "Collision response". Schau mal hier:

https://en.wikipedia.org/wiki/Collision\_response

Hier spielen Reibung und Drall der Objekte auch eine Rolle. Bei elastischen Stößen bleibt der Gesamtimpuls (Masse * Geschwindigkeit) immer konstant. Ebenso erhält sich der gesamte Drehimpuls. Also die Massen der einzelnen Objekte ist hier ganz wichtig, dieses sehe ich aber in Deinem Code nicht.

Ebenso anzuschauen ist die Reibung zwischen den Objekten. Fällt eine Seife auf den Boden, wird sie im wesentlichen (unelastisch, ohne Reibung) einfach wegrutschen, wohiengegen ein Jonglierball einfach liegenbleibt. Ein Gummiball, wird wie eine Billardkugel zurückgeworfen. Gut illustriert sind die vielen Fälle auch hier: https://www.toptal.com/game/video-game-physics-part-ii-collision-detection-for-solid-objects leider nur die Detection, und die hast Du ja schon.

Wenn man nun weiß, welche Kollisionsauflösung Du genau haben willst, und wie weit Du gehen willst, ist die Suche nach dem Algorithmus im Internet auch etwas einfacher. Am einfachsten ist der voll elastische Stoß.

  • Behandelst Du nur Rechtecke?
  • Behandelst Du auch Konkave Formen?
  • Ist die Reibung zu vernachlässigen?
  • Drehen sich die Objekte vor und nach dem Stoß?
  • Benötigst Du eine Schwerkraft?
  • ...

Vielleicht kann ich noch weiter helfen, wenn ich weitere Infos dazu habe.

...zur Antwort