Discuss Scratch

Baumus
Scratcher
100+ posts

KLON

Ich arbeite schon wieder an einem Projekt - Was für ein Wunder.
Diesmal geht's wieder um Klone
Wie könnte ich das ein Bisschen besser designen, dass es auch funktioniert? (Am Ende soll es ein Blitzeffekt sein)

Wenn ich als Klon entstehe :: control
falls <(Kopie) = [1]> dann
setze [Position 1 v] auf [(Zufallszahl von (1) bis (3))]
gehe zu x: (Element ((Position 1) v) von [Positionen 1 v] :: list) y: (25)
zeige dich
setze [Heeligkeit v] -Effekt auf (200)
sende [Blitz v] an alle
setze [Kopie v] auf [2]
wiederhole (Zufallszahl von (5) bis (10)) mal
erzeuge Klon von [mir selbst v]
end
end
NpChecker
Scratcher
100+ posts

KLON

Hallo Baumus!

Wenn du mit deinem gebrauchten Skript erreichen möchtest, dass die x-Position des Klons auf den Wert des Listenelements gesetzt wird, der den gleichen Wert der Variable Position 1 beinhaltet, kannst du das auch einfach so programmieren, dass die x-Position gleich auf den Wert der Variable Position 1 gesetzt wird, also etwa so:

setze x auf (Position 1)

Außerdem wird in deinem Skript der Helligkeit-Effekt auf 200 gesetzt. Das ist aber nicht nötig, da höchstens 100 gewählt werden kann; bei höheren Werten kommt da eben, glaube ich, der gleiche Helligkeit-Effekt wie bei 100.

Da ich jetzt nicht weiß, wozu genau die Variablen und die Nachricht dienen (hier ist ja nur ein Skript gepostet), hier noch einmal eine Möglichkeit für einen Blitzeffekt:

wiederhole (4) mal
ändere [Helligkeit v]-Effekt um (25)
end
wiederhole (4) mal
ändere [Helligkeit v]-Effekt um (-25)
end

Hierbei können die Zahlen auch variieren, du solltest sie eben richtig kombinieren.

Liebe Grüße
NpChecker
Baumus
Scratcher
100+ posts

KLON

OK Ich habe auch schon die beiden anderen Skripte verwendet:

Wenn ich als Klon entstehe
falls <(Kopie) = [2]> dann
gehe zu x: (Element ((Position 1)) von [Positionen 1 v] :: list) y: (25)
zeige dich
setze [Helligkeit v] -Effekt auf (200)
setze Richtung auf ((Zufallszahl von (-179) bis (269)))
gehe (10) er-Schritt
lösche diesen Klon
end

Und natürlich der Code zum spawnen der Klone:

Wenn ich [Start v] empfange
warte (1) Sek.
wiederhole (8) mal
erzeuge Klon von [mir selbst v]
warte (0.8) Sek.
end

Das Problem ist, die Klone werdender nicht gesetzt, obwohl ich mit
 setze [Kopie v] auf [1] 
die lokale Variable Kopie bei
 Wenn die grüne Flagge angeklickt 
jedesmal wieder resette.
NpChecker
Scratcher
100+ posts

KLON

Hallo erneut!

Ich rate dir als Tipp, bei solchen Problemen die entsprechende Variable beim Testen anzeigen zu lassen, sodass du sehen kannst, welchen Wert sie hat und wann dieser geändert wird. Außerdem solltest du prüfen, ob bzw. wann die Nachricht Start gesendet wird.

Liebe Grüße
NpChecker

Last edited by NpChecker (June 24, 2017 08:23:01)

Baumus
Scratcher
100+ posts

KLON

Ok, danke für den Tipp, werde ich machen.
Logical03
Scratcher
8 posts

KLON

hi! auch ich habe bei meinem letzten Projekt mit Klonen gearbeitet


Wenn ich als Klon entstehe
ändere [ x] um (24)
gehe zu x: ([x]) y: ([y])

Damit dann die Erzeugung von Klonen nicht so lange dauert, kann man direkt an das obere Skript noch
erzeuge Klon von [ mir selbst]
anhängen.

Das Projekt:
https://scratch.mit.edu/projects/167642202/

Ich hoffe ich konnte dir damit irgendwie helfen!
lg, Logical03

Last edited by Logical03 (June 29, 2017 17:46:18)

scriptimus-prime
Scratcher
25 posts

KLON

@Logical03

So funktioniert es aber nicht richtig, denn du hast eine endlose Rekursion beschrieben. Auch dein Projekt erzeugt unendlich Klone, da das “wenn ich als Klon entstehe”-Skript keinerlei Abbruchbedingung enthält, aufgrund derer es irgendwann einmal aufhören würde, sich selbst zu reproduzieren. Es klappt nur deshalb - und nur rein zufällig - weil Scratch maximal 300 (301) Klone erlaubt und danach einfach keine weiteren mehr erzeugt. Würde aber nicht diese recht knappe Systembeschränkung zuschlagen, würde dein Skript hunderte, tausende, Millionen an Klonen generieren. So etwas muss man im Programmcode unbedingt verhindern.

In deinem Pixel-Malbereich sind zwar nur 270 Pixel-Stellen, aber die überzähligen 31 Klone sitzen alle in der untersten Zeile in den linken Spalten gleich mehrfach übereinander. Und wie gesagt - wenn nicht die Scratch-Systembeschränkung dem ganzen Einhalt gebieten würde, säßen dort unten hunderttausende Klone übereinander.

Also - weder die “wiederhole fortlaufend”-Schleife in deinem Startskript, sollte endlos Klone erzeugen, noch sollte ein Klon sich selbst reproduzieren, wenn diese Rekursion nicht durch eine geeignete Abbruchbedingung irgendwann geplant endet.

Last edited by scriptimus-prime (June 29, 2017 19:42:12)



Baumus
Scratcher
100+ posts

KLON

Das stimmt nicht erstens habe ich keine wiederhole fortlaufend-Schleife verwendet, zweitens wird die Reproduktion der Klone dadurch gestoppt dass ich die lokale geklonte Variable “Kopie” für den Klon (Und somit auch für die nächste Klonebene) auf 2 gesetzt wird.

Ein Freund hat mir gesagt dass man Klone nicht in einer Schleife setzen darf, weil es sonst zu Fehlern kommen kann. Stimmt das?
Arnie1_0
Scratcher
100+ posts

KLON

Baumus wrote:

Ein Freund hat mir gesagt dass man Klone nicht in einer Schleife setzen darf, weil es sonst zu Fehlern kommen kann. Stimmt das?

Kannst du deinen ‘Freund’ dann bitte einmal fragen, wo er das Geschwafel her hat? Ich benutze Kone normal immer in Schleifen. Bei mir sieht das dann oft ca. so aus:

...
setze [c_number v] auf [0] // c_number ist eine globale Variable
wiederhole (10) mal
ändere [c_number v] um (1)
erzeuge Klon von [mir selbst v]
end
...
Wenn ich als Klon entstehe
zeige dich
setze [ID v] auf (c_number)// ID ist eine private Variable
falls <(ID) = [1]> dann
...
end
falls <(ID) = [2]> dann
...
end
...

So hat man immer die Anzahl an Klonen, die erstellt wurden und jeder Klon hat eine ID, über die die Klone unabhängig voneinander agieren können.

Wenn du mir jetzt erklären kannst, was daran Fehler verursachen soll, wäre ich dir dankbar
Falls du das mit der Rekursion meinst … da hat dich Optimus Prime (ähem ich meine scriptismus prime) ja schon darauf hingewiesen.

Linux fedora, Flash 11.2 (release 202)
Windows XP, Flash 20.0 (release 0)


scriptimus-prime
Scratcher
25 posts

KLON

Baumus wrote:

Das stimmt nicht erstens habe ich keine wiederhole fortlaufend-Schleife verwendet, zweitens wird die Reproduktion der Klone dadurch gestoppt dass ich die lokale geklonte Variable “Kopie” für den Klon (Und somit auch für die nächste Klonebene) auf 2 gesetzt wird.
Meine Antwort galt auch nicht dir, sondern Logical03. Sein Beispiel und sein verlinktes Projekt erzeugt durch die Rekursion unerndlich Klone.


Baumus
Scratcher
100+ posts

KLON

OK

#Arnie1_0

Mein Freund hat außerdem noch gesagt, dass in dem unteren Teil des Skriptes nicht nur Steuerungsblöcke setzen darf.
Außerdem habe ich bereits geschrieben, dass ich zum setzen der Klone nur eine wiederhole 8 mal-Schleife verwendet habe.
Arnie1_0
Scratcher
100+ posts

KLON

Ich bezog mich bei der Antwort nur auf das, was du von einem Freund' geschrieben hast. Das steht in keinem Zusammenhang mit dem, was du angegeben hast.

Tut mir Leid, wenn ich falsch verstanden wurde

Liebe Grüße
Arnie

Linux fedora, Flash 11.2 (release 202)
Windows XP, Flash 20.0 (release 0)


Baumus
Scratcher
100+ posts

KLON

Wie ist das gemeint? Ich meine alles so wie ich es geschrieben habe. Mein Freund hat mir erzählt, dass wenn

… die Klone in Schleifen gesetzt werden
…und der Skript nur Steuerungsblöcke enthält,

das Ganze nicht funktioniert.

Baumus wrote:

Ein Freund hat mir gesagt dass man Klone nicht in einer Schleife setzen darf, weil es sonst zu Fehlern kommen kann. Stimmt das?

Baumus wrote:

Mein Freund hat außerdem noch gesagt, dass in dem unteren Teil des Skriptes nicht nur Steuerungsblöcke setzen darf.

Powered by DjangoBB