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

Report as inappropriate.

Busch2207
Busch2207 presents ...

2012/5/18

Darkness More Objects

You can move the blue Point with arrow keys.
If you want, you can copy this scenario to use it for your own scenarios.

How to use this:
First copy the complete Darkness-class in your own scenario.
If you want an object, to has a light, it has to implement the class 'Glower'. (Therefore, you can take a look at the Bulb-class)
If an Actor implements the Glower-class, it has to overwrite the 'getGlowImage()'-Method. (this method returns an image of the structure, the light should have. If it returns 'null', there will be no light)
And last two steps:
Add a Darkness-object to the world. This you can easily do by 'addObject(new Darkness(),0,0)' (if you want the light to fade slowly, just add a number in the brackets after 'new Darkness'. The number should be a 'double'-value between 0 and 3. (It will be set automatically in this range))
And the last step:
Set the paint-order by: 'setPaintOrder(Darkness.class,Actor.class);' (in the World-subclass)

7189 views / 28 in the last 7 days

6 votes | 0 in the last 7 days

Tags: simulation with-source light darkness

This scenario is a member of: Reusable actors & support classes


open in greenfoot
Your browser is ignoring the <APPLET> tag.
HTML5 version not available | Scenario not running?
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.

See all comments

Want to leave a comment? You must first log in.

Who likes this?

Kartoffelbrot David.Budnick birdy miles7191 SPower limefortheworld