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

Comments for Darkness More Objects

Return to Darkness More Objects

DenzienDenzien

2012/5/18

Doesn't work for me, when I copy all the code I need, in Darkness.class, in private void UpdateImage() where it says: "World world_ = (world)getWorld();" in (world) it says "cannot find symbol- class world" when you compile it.
DenzienDenzien

2012/5/18

Nevermind, just realised.....
A new version of this scenario was uploaded on Sun May 20 17:23:51 UTC 2012 Small bug for copying fixed.
A new version of this scenario was uploaded on Wed Jul 04 15:23:35 UTC 2012 Works faster, now!
KartoffelbrotKartoffelbrot

2014/1/26

Ich hatte auch mal soetwas gemacht, allerdings mit GreenfootImage, weil ich noch keine Ahnung von den javaeigenen Klasse hatte. Deshalb hat meine Version extrem viel RAM verbraucht. Was genau sind Composites? Ich werde daraus nicht ganz schlau, merke aber, dass die ganz schön wichtig sind.
KartoffelbrotKartoffelbrot

2014/1/26

Und darf ich dein Light.png benutzen?
KartoffelbrotKartoffelbrot

2014/1/26

Ach, brauche es gar nicht trotzdem danke.
Super_HippoSuper_Hippo

2014/1/26

Ich verstehe eigentlich gar nichts von seinem Code. Ich nutze für mein eines Spiel einfach ganz viele Schattenobjekte, die wie ein Raster in der Welt liegen. Eventuell langsamer, aber zumindest kann ich damit umgehen. Hier in der Klasse Darkness sind mir viel zu viele (um nicht zu sagen "fast alle") Methoden unbekannt.
Busch2207Busch2207

2014/1/26

@ Kartoffelbrot Composites sind ganz einfach Zusammensetzungen. In diesem Fall brauche ich die AlphaComposites-klasse um die Alpha-Zusammensetzung leichter zu bearbeiten. :) @ Super_Hippo Naja... Du brauchst den Code auch garnicht verstehen. Wie über dem Szenario erklärt, kannst du einfach nur die Klasse Darkness. Und die Actor-Unterklassen, die ein Licht erzeugen sollen, müssen nur die Interface 'Glower' implementieren und somit die darin vorgegebenen Methode 'getGlowImage()' enthalten und ausfüllen. ;) D.h. du erzeugst einfach nur ein Objekt der Klasse Darkness mit der richtigen höhe und breite. Und fügst die Glower-Objekte zur Welt hinzu. Mehr ist nicht zu tun. ;) Ggf. noch die paintorder der Objekte in der Welt-Klasse ändern, dass das Darkness-Objekt immer im Vordergrund ist! ^^
Super_HippoSuper_Hippo

2014/1/27

Das würde sicher auch wieder Probleme bereiten. Bei mir ist die Schattenklasse unter den Gebäuden und Einheiten. Hatte ich zuerst nicht so, aber das muss so sein, damit man die Gebäude sehen kann, wenn man sie einmal entdeckt hat. Dann setze ich einfach die Transparenz der Einheiten auf die Transparenz des Schattens unter sich. Hier gibt es ja keine Transparenz an einer Stelle, die man abfragen kann. (Glaube ich zumindest.)
KartoffelbrotKartoffelbrot

2014/1/27

Also mit der Methode getColorAt(int x, int y) von GreenfootImage kann man die Farbe an den Koordinaten in einem Bild abfragen. Dann könnte man den Alphawert auswerten, wenn das hilft.
Busch2207Busch2207

2014/1/28

Hm... Ich verstehe nicht ganz, was du meinst. Aber ich glaube, du meinst, dass Objekte erst in der Dunkelheit unsichtbar sein sollen, bis man sie findet und danach für immer sichtbar, oder? Das könnte man nähmlich auch recht leicht realisieren. Und zwar indem die Methode 'getGlowImage' einfach 'null' zurück gibt, wenn das Haus noch nicht gesehen werden soll. Und sobald man das Haus sehen soll, wird einfach das eigene Bild übergeben. (ggf. auch eine Kopie mit einem geringerem Alpha-Wert) Dann würde das Gebäude zu sehen sein. ;)
Super_HippoSuper_Hippo

2014/2/2

@Busch: Hab es jetzt mal ausprobiert. Habe das Implementieren einigermaßen hinbekommen, allerdings bringt es mich nicht weiter, da dadurch das Spiel extrem hakt. In etwa so, als wenn ich bei meiner Version auf jeden Pixel ein Objekt der Klasse "Schatten" setze. Hier in diesem Szenario ist nur ein Objekt, dass sich bewegt und selbst hier läuft es nicht mehr ganz flüssig. Bei Dutzenden Einheiten war es nicht wirklich verwunderlich, dass es dann hakt. :) @Kartoffelbrot: Das ist im Grunde keine schlechte Idee, hat aber einen Haken. Ich kann den Wert vermutlich irgendwie auf transparent setzen, wenn eine eigene Einheit in die Nähe kommt, doch ist es, denke ich, nicht möglich, jeden Pixel wieder undurchsichtig zu machen, wenn eine gewisse Zeit lang keine eigene Einheit in der Nähe war. Liebe Grüße Hippo
Busch2207Busch2207

2014/2/2

Hm, komisch... Es ist für das Programm eigentlich komplett egal, ob sich das Objekt bewegt oder nicht. ;) Und bei mir läuft es bisher ohne irgendwelches hacken, aber gut. :)
A new version of this scenario was uploaded on Mon Feb 03 09:36:24 UTC 2014 Works much faster now, because progress is in an extra thread now. Darkness-class includes the Glower-interface, now.
A new version of this scenario was uploaded on Mon Feb 03 09:49:48 UTC 2014 Works much faster now, because progress is in an extra thread now. Darkness-class includes the Glower-interface, now.
A new version of this scenario was uploaded on Mon Feb 03 09:50:33 UTC 2014 Works much faster now, because progress is in an extra thread now. Darkness-class includes the Glower-interface, now.
A new version of this scenario was uploaded on Mon Feb 03 10:01:20 UTC 2014 If there's allready a darkness-object in world, no other one can be added, any more. (will be done automatically without any error)
A new version of this scenario was uploaded on Mon Feb 03 10:17:38 UTC 2014 Now it will also recognize the transparency of the GreenfootImage (not only the alpha-values)
Busch2207Busch2207

2014/2/3

So, hab das ganze jetzt nochmal fast komplett überarbeitet. Jetzt dürfte es nicht mehr hacken. Egal, bei welcher Spielgeschwindigkeit. ;) Ist jetzt ein bisschen anders, was die 'Glow'-Interface angeht. Aber wenn du die Darkness-Klasse nochmal aus diesem Szenario kopierst, dann müsstest du nur die alte 'Glow'-klasse löschen. ;)
Super_HippoSuper_Hippo

2014/2/3

Danke für deine Mühe! Es hakt nun in der Tat nicht mehr. Probleme, die auftreten: - das Bild light.png. Es sollte nicht nach außen hin schwächer werden, sondern konstant hell. Einheiten und Gebäude haben bei mir auch einen unterschiedlichen Sichtradius. Ich habe keinen Schimmer, wie ich das Bild gescheit ändern könnte. Bei mehreren Glow-Objekten überlagert sich das dann hier und ist heller (bzw. durchsichtiger) als bei einem einzelnen. Außerdem verschwindet es natürlich sofort, wenn die Einheit, also das Glow-Object stirbt oder weiterläuft. Du kennst es sicher von einigen Strategiespielen, dass man Gegenden noch eine Weile sieht, bevor sie wieder im Schatten verschwinden. Also ziemlich genau so, wie es bei mir war bzw. im Moment ist (siehe mein Szenario "Insect War"). Da überlappt sich auch nichts, alles läuft so, wie es sollte. Das einzige Problem, dass ich versuchte zu lösen, war, dass der Schatten nicht aus 5x5 großen Quadraten bestehen soll, was hier in deinem Szenario von dir umgesetzt wurde. Ich bekomme es allerdings mit deiner Variante nicht so übertragen, dass Gebiete weiterhin eine Weile sichtbar bleiben und dann wieder dunkler werden. Was mir dazu einfallen würde, ist ständig bei jeder Bewegung ein neues Objekt spawnen zu lassen, dass das Bild noch etwas aufrecht erhält, aber das würde wieder zu großen Haken führen und immer noch nicht funktionieren, da die Bilder sich dann ja trotzdem überlappen. - Manchmal bekomme ich auch eine Fehlermeldung, wenn eine Einheit stirbt, allerdings auch nicht immer: Exception in thread "Thread-1107" java.lang.IllegalStateException: Actor not in world. An attempt was made to use the actor's location while it is not in the world. Either it has not yet been inserted, or it has been removed. at greenfoot.Actor.failIfNotInWorld(Actor.java:663) at greenfoot.Actor.getX(Actor.java:157) at Darkness.updateImage(Darkness.java:107) at Darkness.access$600(Darkness.java:14) at Darkness$1.run(Darkness.java:70) Was ist überhaupt ein Interface und wie(so) nutzt man es?
A new version of this scenario was uploaded on Tue Feb 04 15:36:09 UTC 2014 Second constructor added. Now it's possible, that a fading light beam is dragged behind.
Busch2207Busch2207

2014/2/4

Es ist nicht unbedingt ein MUSS, dass du das Bild light.png nimmst. Die Methode 'getGlowImage()' kann jedes x-beliebige Bild zurückgeben. ^^ :) Du kannst das light.png-Bild auch ganz einfach größer oder kleiner skalieren, wie es im Konstruktor der Bulb-Klasse getan wird! ^^ So... Ich hab jetzt die Darkness-Klasse so überarbeitet, dass das Licht nicht sofort verschwindet, sondern ganz langsam verblasst, wenn ein Objekt an einen anderen Ort bewegt, oder komplett gelöscht wurde. Dazu habe ich einen zweiten Konstruktor eingefügt, der eine 'double'-Zahl von 0 bis 3 erwartet. 0->Licht verschwindet garnicht. 3->Licht verschwindet schnell. (Je größer die Zahl, desto mehr kann es sein, dass das Licht leicht pulsiert. (Darum auch die Grenze mit 3). Aber ich denke das reicht vollkommen für dein Projekt. ;) ) Dazu musst du anstatt new Darkness() einfach nur new Darkness( 'irgendeine Zahl' ) schreiben. Eine Interface... Nun... Wie erkläre ich das am besten... Interfaces werden für Schnittstellen verwendet. Wenn ein Objekt mit anderen Objekt arbeiten soll (wie hier die Klasse Darkness mit Glower-Objekten), die Objekte aber nicht schon vorher festgelegt oder in einer besonderen vererb-Hirarchie sein sollen, dann kann man so genannte Interfaces verwendet. JEDE Klasse kann man ein interface implementieren lassen und diese Klasse muss dann die in der Interface vorgeschriebenen Methoden überschreiben, damit mit der Klasse gearbeitet werden kann... Hier: Darkness braucht Glower, die eine x- und y-Postion haben und die ein 'Glow'-Image zurückgeben. Darum arbeitet diese Klasse einfach mit dem Glower-Interface, da durch dieses Interface vorgegeben ist, dass alle Objekte, die dann ein Glower-Objekt sind, diese Methoden überschreiben. (Ich hoffe diese Erklärung hat geholfen. Falls nicht, frag einfach nach! ;) )
Mir hat die geholfen, danke :)
Welche Methoden muss eine Klasse, die das Interface implementiert, überschreiben, alle öffentlichen?
Busch2207Busch2207

2014/2/7

Sie muss alle Methoden implementieren. Ein Interface kann nur öffentliche (also public) Methoden haben! ;)
Super_HippoSuper_Hippo

2014/2/7

Dieses Interface steht ja in einer Klasse (hier in Darkness). Hat es irgendetwas zu bedeuten, wo es steht oder spielt es überhaupt eine Rolle?
Busch2207Busch2207

2014/2/7

mh... Ich weiß nicht ob ich die Frage richtig verstanden hab... Aber ich versuchs mal ;) Eine interface-Klasse kann, wie auch eine ganz normale Klasse zu einer anderen oder in einer anderen Klasse geschrieben werden. Die Interface kann aber, wie jede andere Klasse auch, auch alleine stehen. Ich habe sie in diesem Szenario einfach zu der Darkness-Klasse dazugeschrieben, damit die Leute nur eine Klasse kopieren müssen. (Um einen besser Überblick bewahren zu können) :) Letztendlich ist es also egal, ob eine Klasse/Interface/Enum im selben Fenster einer anderen Klasse steht oder ein eigenes Fenster hat. (Solange sie nicht IN die andere Klasse geschrieben wird, denn dann muss sie über die andere Klasse aufgerufen werden) ;)
RudolfRudolf

2014/3/10

Hallo Zusammen, wie ich sehe gibt es hier auch jemanden der Deutsch schreibt:) Ich möcht ein Menü in meine Welt einfügen, weiß aber nicht wie ich eine Grenze einfügen kann. Die Gegenstände sollen aus dem Menü gezogen werden können aber nicht mehr zurück ins Menü. Kennt sich da jemand aus? Für Hilfe wäre ich echt dankbar...
Super_HippoSuper_Hippo

2014/3/10

Ich glaube, es wäre das einfachste, wenn du oben rechts auf "Discuss" gehst und dort deine Frage stellst, anstatt sie unter ein zufällig ausgewähltes Szenario zu schreiben. Dort kann man dir sicher besser helfen.