9.2. Figury 2D i 3D
Możliwość programowego umieszczania różnych bloków w Minecraft Pi Edition można wykorzystać jako atrakcyjny sposób wizualizacji różnych figur. Jednak o ile budowanie prostych kształtów, jak np. kwadrat czy sześcian, nie stanowi raczej problemu, o tyle trójkąty, koła i bardziej skomplikowane budowle nie są trywialnym zadaniem. Tworzenie 2- i 3-wymiarowych konstrukcji ułatwi nam biblioteka minecraftstuff.
Instalacja
Symulator mcpi-sim
domyślnie nie działa z omawianą biblioteką i wymaga modyfikacji.
Zmienione pliki oraz omawianą bibliotekę umieściliśmy w archiwum
mcpi-sim-fix.zip
, które po ściągnięciu
należy rozpakować do katalogu ~/mcpi-sim/local
nadpisując oryginalne pliki.
9.2.1. Linia
W pustym pliku mcsim-fig.py
umieszczamy kod:
1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4import os
5import local.minecraft as minecraft # import modułu minecraft
6import local.block as block # import modułu block
7import local.minecraftstuff as mcstuff # import biblioteki do rysowania figur
8from local.vec3 import Vec3 # klasa reprezentująca punkt w MC
9
10os.environ["USERNAME"] = "Steve" # nazwa użytkownika
11os.environ["COMPUTERNAME"] = "mykomp" # nazwa komputera
12
13mc = minecraft.Minecraft.create("") # połaczenie z symulatorem
14figura = mcstuff.MinecraftDrawing(mc) # obiekt do rysowania kształtów
15
16
17def plac(x, y, z, roz=10, gracz=False):
18 """
19 Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
20 opcjonalnie umieszcza gracza w środku.
21 Parametry: x, y, z - współrzędne pozycji początkowej,
22 roz - rozmiar wypełnianej przestrzeni,
23 gracz - czy umieścić gracza w środku
24 Wymaga: globalnych obiektów mc i block.
25 """
26
27 podloga = block.STONE
28 wypelniacz = block.AIR
29
30 # podloga i czyszczenie
31 mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
32 mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
33 # umieść gracza w środku
34 if gracz:
35 mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)
36
37
38def linie():
39 # Funkcja rysuje linie
40 # tuple z współrzędnymi punktów
41 punkty1 = ((-10, 0, -10), (10, 0, -10), (10, 0, 10), (-10, 0, 10))
42 punkty2 = ((-15, 5, 0), (15, 5, 0), (0, 5, 15), (0, 5, -15))
43 p1 = Vec3(0, 0, 0) # punkt początkowy
44 for punkt in punkty1:
45 x, y, z = punkt
46 p2 = Vec3(x, y, z) # punkt końcowy
47 figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.WOOL, 14)
48 for punkt in punkty2:
49 x, y, z = punkt
50 p2 = Vec3(x, y, z) # punkt końcowy
51 figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.OBSIDIAN)
52
53
54def main():
55 mc.postToChat("Biblioteka minecraftstuff") # wysłanie komunikatu do mc
56 plac(-15, 0, -15, 30)
57 linie() # wywołanie funkcji
58
59 return 0
60
61
62if __name__ == '__main__':
63 main()
Większość kodu omówiona została w Podstawach. W nowym kodzie, który został podświetlony,
importujemy bibliotekę minecraftstuff oraz klasę Vec3. Reprezentuje ona punkty o podanych
współrzędnych w trójwymiarowym świecie MC. Polecenie figura = mcstuff.MinecraftDrawing(mc)
tworzy instancję
głównej klasy biblioteki, która udostępni jej metody.
Do rysowania linii wykorzystujemy metodę drawLine()
, której przekazujemy jako argumenty
współrzędne punktu początkowego i końcowego, a także typ bloku i ewentualnie podtyp.
Ponieważ chcemy narysować kilka linii wychodzących z tego samego punktu, współrzędne punktów końcowych
umieszczamy w dwóch tuplach (niemodyfikowalnych listach) jako… tuple.
W pętlach odczytujemy je (for punkt in punkty1:
), rozpakowujemy (x, y, z = punkt
) i przekazujemy do konstruktora omówionej wyżej klasy Vec3
(p2 = Vec3(x, y, z)
).
Całość omówionego kodu dla przejrzystości umieszczamy w funkcji linie()
,
którą wywołujemy w funkcji głównej i testujemy.
9.2.2. Koło
Przed funkcją główną main()
wstawiamy kod:
54def kolo(x, y, z, r):
55 # Funkcja rysuje koło pionowe i poziome o środku x, y, z i promieniu r
56 figura.drawCircle(x, y, z, r, block.LEAVES, 2)
57 figura.drawHorizontalCircle(x, y, z, r, block.LEAVES, 2)
Funkcja kolo(x, y, z, r)
wykorzystuje metodę drawCircle()
do rysowania koła w pionie
oraz drawHorizontalCircle()
do rysowania koła w poziomie. Obydwie metody pobierają współrzędne
środka koła, jego promień oraz typ i podtyp bloku, służącego do rysowania.
Umieść wywołanie funkcji, np. kolo(0, 10, 0, 10)
, w funkcji głównej i przetestuj.
9.2.3. Kula
Do skryptu wstawiamy kolejną funkcję przed funkcją main()
:
60def kula(x, y, z, r):
61 # Funkcja rysuje kulę o środku x, y, z i promieniu r
62 figura.drawSphere(x, y, z, r, block.WOOD, 2)
Metoda drawSphere()
buduje kulę. Pierwsze trzy argumenty to współrzędne środka,
kolejne to: promień, typ i ewentualny podtyp bloku. Umieść wywołanie funkcji,
np. kula(0, 10, 0, 9)
, w funkcji głównej i przetestuj.
9.2.4. Kształt
Przed funkcją main()
wstawiamy:
65def ksztalt():
66 # Funkcja łączy podane w liście wierzchołki i opcjonalnie wypełnia figurę
67 ksztalt = [] # lista punktów
68 ksztalt.append(Vec3(-11, 0, 11)) # współrzędne 1 wierzchołka
69 ksztalt.append(Vec3(11, 0, 11)) # współrzędne 2 wierzchołka
70 ksztalt.append(Vec3(0, 0, -11)) # współrzędne 3 wierzchołka
71 figura.drawFace(ksztalt, True, block.SANDSTONE, 2)
Chcąc narysować trójkąt do listy do listy ksztalt
dodajemy trzy instancje klasy Vec3
definiujące kolejne wierzchołki: ksztalt.append(Vec3(-11, 0, 11))
.
Do rysowania dowolnych kształtów służy metoda drawFace()
, która punkty przekazane w liście łączy
liniami budowanymi z podanego bloku. Drugi argument, logiczny, decyduje o tym, czy figura
ma zostać wypełniona (True
), czy nie (False
).
Po wywołaniu wszystkich omówionych funkcji możemy zobaczyć w symulatorze poniższą budowlę:

Ćwiczenie 1
Wykorzystując odpowiednią metodę biblioteki minecraftstuff, spróbuj zbudować napis „KzK” podobny do pokazanego poniżej. Przetestuj swój kod w symulatorze i w Minecrafcie Pi.

Materiały Python 101
udostępniane przez
Centrum Edukacji Obywatelskiej na licencji
Creative Commons Uznanie autorstwa-Na tych samych warunkach 4.0 Międzynarodowa.
- Utworzony:
2025-04-12 o 10:21 w Sphinx 7.3.7
- Autorzy: