gf2:projekte:minecraft:tipps_bauen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
gf2:projekte:minecraft:tipps_bauen [2022/11/24 14:34] lehmannrgf2:projekte:minecraft:tipps_bauen [2023/12/04 22:31] (aktuell) – [6. Items ins Inventar eines Spielers/Agenten/Chest legen] lehmannr
Zeile 32: Zeile 32:
   * [[https://ngcm.github.io/PythonTool-Mod/startcoding/house/]]*/   * [[https://ngcm.github.io/PythonTool-Mod/startcoding/house/]]*/
  
 +==== 2. Blöcke drehen ====
 +Es gibt Blöcke, die nicht symmetrisch sind (z.B. Treppenstufen, Türen etc.). Diese kann man mithilfe des Befehls ''blocks.block_with_data'' drehen:
 +<sxh Python>    blocks.place(blocks.block_with_data(JUNGLE_WOOD_STAIRS, 3), pos(0, 0, 0))
 +</sxh>
  
-==== 2. Deny, Allow und Border-Blocks ====+==== 3. Deny, Allow und Border-Blocks ====
  
   * Wenn man möchte, dass sich die Spieler nur in einem bestimmten Bereich aufhalten können, kann man sogenannte Border-Blocks verwenden.   * Wenn man möchte, dass sich die Spieler nur in einem bestimmten Bereich aufhalten können, kann man sogenannte Border-Blocks verwenden.
Zeile 44: Zeile 48:
  
 Um die Welt unveränderbar zu machen, verwendet man ''\immutableworld'' Um die Welt unveränderbar zu machen, verwendet man ''\immutableworld''
- 
  
 Will man diese allow-, deny, oder border-Blöcke mit Code erstellen (z.B. über ''blocks.fill''), dann muss man statt des Namens die ID verwenden (210 = Allow-Block, 211=Deny-Block, 212 = Border-Block) Will man diese allow-, deny, oder border-Blöcke mit Code erstellen (z.B. über ''blocks.fill''), dann muss man statt des Namens die ID verwenden (210 = Allow-Block, 211=Deny-Block, 212 = Border-Block)
Zeile 50: Zeile 53:
 In [[https://educommunity.minecraft.net/hc/en-us/articles/360047116852-Specialty-Blocks-Allow-Deny-Border-Structure-| diesem Video]] (3 Minuten, engl.) wird das Grundprinzip kurz erklärt. In [[https://educommunity.minecraft.net/hc/en-us/articles/360047116852-Specialty-Blocks-Allow-Deny-Border-Structure-| diesem Video]] (3 Minuten, engl.) wird das Grundprinzip kurz erklärt.
  
-==== 3. Komplexere Strukturen effizient bauen ====+==== 4. Komplexere Strukturen effizient bauen ====
 Angenommen, wir wollen eine etwas komplexere Struktur bauen, die wir nicht einfach mit einer for-Schleife oder einem einfachen Programm erstellen können. Natürlich könnten wir alle Blöcke einzeln mit ''blocks.place()'' setzen, aber unser Programm wäre dann recht lang und redundant. Angenommen, wir wollen eine etwas komplexere Struktur bauen, die wir nicht einfach mit einer for-Schleife oder einem einfachen Programm erstellen können. Natürlich könnten wir alle Blöcke einzeln mit ''blocks.place()'' setzen, aber unser Programm wäre dann recht lang und redundant.
  
Zeile 61: Zeile 64:
 Wir könnten die 25 "Punkte" in einer Liste mit 25 Elementen speichern, wobei wir z.B. für "Luft" eine 0, für "gelb" eine 1 und für "schwarz" eine 2 speichern. Wenn man links oben beginnt und dann nach rechts und unten alle Pixel durchgeht, hätte man dann die Liste: Wir könnten die 25 "Punkte" in einer Liste mit 25 Elementen speichern, wobei wir z.B. für "Luft" eine 0, für "gelb" eine 1 und für "schwarz" eine 2 speichern. Wenn man links oben beginnt und dann nach rechts und unten alle Pixel durchgeht, hätte man dann die Liste:
  
-<code Python>Smiley = [0,1,1,1,0,1,2,1,2,1,1,1,1,1,1,1,2,1,2,1,0,1,2,1,0] +<sxh Python>Smiley = [0,1,1,1,0,1,2,1,2,1,1,1,1,1,1,1,2,1,2,1,0,1,2,1,0] 
-</code+</sxh
 Die ersten fünf Zahlen wären die erste Zeile, die nächsten fünf die zweite etc. Doch diese Darstellung ist nicht sehr übersichtlich. Es ist angenehmer, wenn man die Codierung so macht, dass man eine Liste erstellt, in welche man alle Zeilen speichert - diese Zeilen sind ihrerseits wieder Listen: Die ersten fünf Zahlen wären die erste Zeile, die nächsten fünf die zweite etc. Doch diese Darstellung ist nicht sehr übersichtlich. Es ist angenehmer, wenn man die Codierung so macht, dass man eine Liste erstellt, in welche man alle Zeilen speichert - diese Zeilen sind ihrerseits wieder Listen:
-<code Python>Smiley2 = [[0,1,1,1,0],[1,2,1,2,1],[1,1,1,1,1],[1,2,1,2,1],[0,1,2,1,0]] +<sxh Python>Smiley2 = [[0,1,1,1,0],[1,2,1,2,1],[1,1,1,1,1],[1,2,1,2,1],[0,1,2,1,0]] 
-</code+</sxh
  
 **Wie kann man auf die Elemente zugreifen?** **Wie kann man auf die Elemente zugreifen?**
Zeile 71: Zeile 74:
 Wenn man nun z.B. ''Smiley2[0]'' aufruft, so erhält man das erste Element der Liste 'Smiley2'. Dies ist aber wieder eine Liste (die erste Zeile). D.h. ''Smiley2[0]'' ist ''[0,1,1,1,0]''. \\ Wenn man nun z.B. ''Smiley2[0]'' aufruft, so erhält man das erste Element der Liste 'Smiley2'. Dies ist aber wieder eine Liste (die erste Zeile). D.h. ''Smiley2[0]'' ist ''[0,1,1,1,0]''. \\
 Nimmt man nun von dieser Liste z.B. das dritte Element: ''Smiley2[0][2]'' so erhält man die 1. Dies ist der Pixel in der Mitte der ersten Zeile. Nimmt man nun von dieser Liste z.B. das dritte Element: ''Smiley2[0][2]'' so erhält man die 1. Dies ist der Pixel in der Mitte der ersten Zeile.
-Die Elemente einer solchen Tabelle (d.h. einer "zweidimensionalen Liste") kann man aufrufen, indem man zwei Eckige Klammern verwendet und quasi die x- und die y-Komponente angibt.   +Die Elemente einer solchen Tabelle (d.h. einer "zweidimensionalen Liste") kann man aufrufen, indem man zwei Eckige Klammern verwendet und quasi die x- und die y-Komponente angibt. Also beispielsweise ''Smiley2[3][4]'' für den fünften Pixel (ganz rechts) in der vierten Zeile. \\ 
 + 
 +** Wie kann man den Smiley automatisch bauen lassen? **  
 + 
 +Wenn der Smiley mit der Liste der Zeilen codiert wurde, kann ich mit dem Befehl ''for i in...'' alle Pixel durchgehen und dann entsprechend einen gelben oder schwarzen Block bauen. Ich muss also ''Smiley2[0][0]'' bis ''Smiley2[4][4]'' abklappern. Dies kann ich wie unten gezeigt machen. Dazu benötige ich zwei for-Schleifen: eine Schleife (''for i in range(5)'') wählt die Zeile (von 0 bis 4) und die zweite (''for j in range(5)'') geht dann diese Zeile durch (wieder von 0 bis 4): 
 + 
 +<sxh Python> 
 +Smiley2 = [[0,1,1,1,0],[1,2,1,2,1],[1,1,1,1,1],[1,2,1,2,1],[0,1,2,1,0]] 
 + 
 +for i in range(5): 
 +    for j in range(5): 
 +        zahl = Smiley2[i][j] # die Zahl des Pixels holen in der Liste Smiley2 (0,1,2)  
 +        if zahl == 1: # wenn die Zahl 1 ist: gelber Block bauen 
 +            blocks.place(GOLD_BLOCK, world(i, 4, j)) # Die Koordinaten sind world(i,4,j) 
 +        if zahl == 2: # wenn die Zahl 2 ist: schwarzen Block bauen  
 +            blocks.place(COAL_BLOCK, world(i, 4, j)) 
 +        # wenn die Zahl 0 ist wird nichts gebaut (Air)     
 +</sxh> 
 +Es ist nicht ganz einfach, das Programm von oben zu verstehen, doch mit diesem Prinzip kann man recht elegant und effizient komplexe Strukturen bauen. Die Koordinaten muss man an die eigenen Bedürfnisse anpassen. im Beispiel von oben geht man davon aus, dass die Figur auf der "Höhe" 4 gebaut wird und bei den x- und z-Koordinaten 0 beginnt. 
 + 
 +==== 5. Einen Block "bewegen" lassen ==== 
 +Will man, dass sich ein Block "bewegt", so muss man ihn durch Luft ersetzen und dann einen Block weiter wieder bauen. Dadurch entsteht der Eindruck, der Block habe sich um ein Feld bewegt. 
 +Spiele mit Bewegung laufen häufig in einem Game-Loop ab. Dies ist eine Schleife, die x Mal pro Sekunde ausgeführt wird (FPS=Frames pro Sekunde). Bei jedem Frame wird die Welt gelöscht und neu gezeichnet. Dadurch entsteht der Eindruck einer Bewegung. 
 + 
 +<sxh python> 
 +running = True # solange dies auf True ist, läuft der Game-Loop 
 + 
 +def stopGame(): # wenn "stop" in den Chat geschrieben wird, running auf False setzen 
 +    global running 
 +    running = False  
 + 
 +player.on_chat("stop", stopGame)  
 + 
 +x = -60 
 +frame = 0 
 + 
 +while running: 
 +    frame += 1 
 +    if (frame % 50 == 0):  # immer nach 50 Frames  
 +        blocks.place(DIAMOND_BLOCK, world(x+1,-60,0))  # Block an neuer Position bauen 
 +        blocks.place(AIR, world(x, -60, 0))   # Block löschen 
 +        x = x+1  # Position anpassen 
 +</sxh> 
 +==== 6. Dinge in das Inventar eines Spielers/Agenten/Chest legen ==== 
 +Manchmal möchte man Items oder Blöcke in das Inventar eines anderen Spielers, des Agenten oder einer Kiste legen. Dazu kann man den Chat-Befehl ''/replaceitem entity @c slot.inventory 0 barrier'' verwenden. Denentsprechend kann man im Pythoncode ''player.execute("replaceitem entity @c slot.inventory 0 barrier")'' verwenden, um z.B. dem Agenten Barrier-Blöcke oder auch Items zu geben. Verwendet man statt ''entity'' das Wort ''block'', kann man auch in das Inventar von Blöcken (Chest) Dinge legen.
  
 [[gf2:projekte:minecraft:start|Zurück zur Übersicht des Projektes]] [[gf2:projekte:minecraft:start|Zurück zur Übersicht des Projektes]]
  • gf2/projekte/minecraft/tipps_bauen.1669296840.txt.gz
  • Zuletzt geändert: 2022/11/24 14:34
  • von lehmannr