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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import local.minecraft as minecraft # import modułu minecraft
import local.block as block # import modułu block
import local.minecraftstuff as mcstuff # import biblioteki do rysowania figur
from local.vec3 import Vec3 # klasa reprezentująca punkt w MC
os.environ["USERNAME"] = "Steve" # nazwa użytkownika
os.environ["COMPUTERNAME"] = "mykomp" # nazwa komputera
mc = minecraft.Minecraft.create("") # połaczenie z symulatorem
figura = mcstuff.MinecraftDrawing(mc) # obiekt do rysowania kształtów
def plac(x, y, z, roz=10, gracz=False):
"""
Funkcja tworzy podłoże i wypełnia sześcienny obszar od podanej pozycji,
opcjonalnie umieszcza gracza w środku.
Parametry: x, y, z - współrzędne pozycji początkowej,
roz - rozmiar wypełnianej przestrzeni,
gracz - czy umieścić gracza w środku
Wymaga: globalnych obiektów mc i block.
"""
podloga = block.STONE
wypelniacz = block.AIR
# podloga i czyszczenie
mc.setBlocks(x, y - 1, z, x + roz, y - 1, z + roz, podloga)
mc.setBlocks(x, y, z, x + roz, y + roz, z + roz, wypelniacz)
# umieść gracza w środku
if gracz:
mc.player.setPos(x + roz / 2, y + roz / 2, z + roz / 2)
def linie():
# Funkcja rysuje linie
# tuple z współrzędnymi punktów
punkty1 = ((-10, 0, -10), (10, 0, -10), (10, 0, 10), (-10, 0, 10))
punkty2 = ((-15, 5, 0), (15, 5, 0), (0, 5, 15), (0, 5, -15))
p1 = Vec3(0, 0, 0) # punkt początkowy
for punkt in punkty1:
x, y, z = punkt
p2 = Vec3(x, y, z) # punkt końcowy
figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.WOOL, 14)
for punkt in punkty2:
x, y, z = punkt
p2 = Vec3(x, y, z) # punkt końcowy
figura.drawLine(p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, block.OBSIDIAN)
def main():
mc.postToChat("Biblioteka minecraftstuff") # wysłanie komunikatu do mc
plac(-15, 0, -15, 30)
linie() # wywołanie funkcji
return 0
if __name__ == '__main__':
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:
54 55 56 57 | def kolo(x, y, z, r):
# Funkcja rysuje koło pionowe i poziome o środku x, y, z i promieniu r
figura.drawCircle(x, y, z, r, block.LEAVES, 2)
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()
:
60 61 62 | def kula(x, y, z, r):
# Funkcja rysuje kulę o środku x, y, z i promieniu r
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:
65 66 67 68 69 70 71 | def ksztalt():
# Funkcja łączy podane w liście wierzchołki i opcjonalnie wypełnia figurę
ksztalt = [] # lista punktów
ksztalt.append(Vec3(-11, 0, 11)) # współrzędne 1 wierzchołka
ksztalt.append(Vec3(11, 0, 11)) # współrzędne 2 wierzchołka
ksztalt.append(Vec3(0, 0, -11)) # współrzędne 3 wierzchołka
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: | 2022-05-22 o 19:52 w Sphinx 1.5.3 |
---|---|
Autorzy: | Patrz plik “Autorzy” |