Programista Junior 12

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 84

Powrót do szkoły

Inauguracja nowego roku szkolnego za nami! Zapewne będziecie mogli pochwalić się znajomym. Na sam koniec
stęskniliście się za kolegami i koleżankami, więc mamy zostawiliśmy małą perełkę: tworzenie własnego sklepu w
nadzieję, że z przyjemnością wróciliście do klas. Życzymy Robloxie!
powodzenia, jak najlepszych ocen, fantastycznych przygód Czy zastanawialiście się kiedyś, jakie czynności w przy-
i zdobywania nowej wiedzy. Mamy nadzieję, że aktualne szłości będą wykonywać za nas roboty oraz w czym będą
wydanie PJr pomoże Wam w niektórych zajęciach oraz spo- nas zastępować? Kto je zbuduje i zaprogramuje? W artyku-
woduje, że nie raz zaskoczycie nauczycieli, rodziców, opieku- le o LEGO Mindstorms odpowiemy na niektóre z tych pytań
nów oraz znajomych! A co znajdziecie w nowym numerze? oraz pokażemy Wam… jak zaprojektować własny joystick!
😉
Zapnijcie pasy i przygotujcie się na niezwykłą jazdę . Większość z Was ma już zapewne swój własny smart-
Tematem numeru są bazy danych. Jak pewnie wiecie, fon. Te małe urządzenia oferują dziś nie tylko komunikację
jednym z najważniejszych zadań komputera jest zapisywa- ze znajomymi, robienie zdjęć czy przeglądanie Internetu,
nie i przechowywanie różnego rodzaju danych. Z artykułu ale także coraz bardziej rozbudowane aplikacje i gry. Przy-
okładkowego dowiecie się, czym są i do czego służą bazy gotowaliśmy dla Was naprawdę ciekawy artykuł, z którego
danych, jakiego narzędzia można użyć do ich utworzenia, dowiecie się, jak stworzyć aplikację na Androida, w której
a także jak tworzyć tabele oraz dodawać, usuwać i mody- pościgamy się samochodami!
fikować w nich dane przy pomocy języka SQL. Serdecznie Temat prywatności podczas korzystania z Internetu po-
polecamy, bo działanie na bazach danych to nie tylko fajna jawia się coraz częściej jako przedmiot dyskusji zarówno
zabawa, ale i wiedza, która na pewno się Wam przyda. w koleżeńskich rozmowach dzieci, jak również w świecie
Czy słyszeliście kiedyś o fraktalach? Jeżeli nie, to warto dorosłych. Pewnie znane są już Wam takie nazwy jak VPN
sprawdzić, czym są te obiekty o tajemniczo brzmiącej na- czy TOR w kontekście rozwiązań pozwalających na ukry-
zwie oraz dlaczego fascynują matematyków, fizyków, przy- wanie tożsamości w Internecie. Dziś wyjaśnimy, czym jest
rodników, ale też artystów, grafików komputerowych czy VPN, do czego można go zastosować oraz przed jakimi za-
programistów na całym świecie. Przekonacie się, że mate- grożeniami nas nie ochroni.
matyka w połączeniu ze Scratchem… może być po prostu Ponadto w numerze kolejna porcja ciekawych zagadek
piękna! matematycznych oraz wyzwań w programowaniu. Gorąco
Wiemy, że większość z Was uwielbia gry komputerowe. zachęcamy do główkowania nad zadaniami zaproponowa-
Nic dziwnego, my też jesteśmy ich fanami. Gry w odpowied- nymi przez autorów!
niej dawce mogą być nie tylko rozrywką, ale i wartościo- Na koniec mamy dla Was coś nowego: ciekawe przygo-
wym narzędziem do nauki i poznawania świata. A wiecie, dy niezwykłego robota Scottiego w formie komiksu. Jeste-
co jest jeszcze lepsze niż granie? Tworzenie własnych gier śmy przekonani, że historyjki wciągną Was równie mocno
i niezwykłych światów! Z artykułu o tworzeniu gry RPG jak nas. A dodatkowo nauczycie się nowych sztuczek w pro-
w środowisku Unity dowiecie się, w jaki sposób wykorzy- gramowaniu.
stać zebrane surowce do wytwarzania broni, które pomogą
Redakcja PJr
nam stawić czoła przeciwnikom najeżdżającym naszą wio-
skę. Z kolejnej części serii poświęconej kreowaniu własnej
Ps. Dla nauczycieli mamy kolejny ciekawy scenariusz, dzięki
gry przygodowej Enigma dowiecie się natomiast, jak two-
któremu nauczycie dzieci, jak stworzyć algorytm sprawdzający
rzyć funkcje oraz jak wyświetlać grafiki w Pythonie. Będzie w językach Scratch i Python.
to kolejny krok do zostania mistrzem tego popularnego ję-
PS. 2. Kolejna część serii „Wstęp do języka Python” ukaże się
zyka programowania oraz do napisania świetnej gry, którą w następnym numerze.
Wprowadziliśmy nowe oznaczenia do artykułów: kolor oraz wiek czytelnika. Zielony oznacza poziom łatwy, żółty poziom średni,
a czerwony oznacza, że treść artykułu przeznaczona jest dla zaawansowanych Czytelników.

10+ 12+ 14+


Artykuł dla prawie każdego, nie musisz Musisz posiadać jakąś wiedzę w temacie, Poziom dla zaawansowanych! Ale spoko-
posiadać specjalnych wiadomości, by choć z lekką pomocą Internetu (może kolegów jnie, czytając magazyn, na pewno dojdziesz
zrozumieć treść. Poziom łatwy. i koleżanek?) dasz radę! Poziom średni. i do tego poziomu. Poziom trudny.

PODSTAWY PROGRAMOWANIA BEZPIECZEŃSTWO

Bazy danych. Czyli jak programy przechowują informacje 6 Czym jest VPN? 66
Wojciech Sura Łukasz Basa

JĘZYKI PROGRAMOWANIA PROGRAMISTYCZNE WYZWANIA

Czy matematyka może być piękna? O fraktalach słów kilka 14 Programistyczne wyzwania 70
Justyna Klimczyk Konrad Jagaciak

PROGRAMOWANIE GIER 3.14159

Średniowieczna przygoda – gra RPG w środowisku Unity. Zagadki matematyczne dla dzieci w wieku 11+ 72
Ostatnie starcie 22
Michał Kremzer
Tomasz Błaszczyk

Gra przygodowa „Enigma – Polacy, którzy uratowali świat”. WYDARZENIA I EDUKACJA


Tworzymy pierwsze okno z tłem 32
Adam Jurkiewicz, Katarzyna Wasilkowska Lubisz programować? Dołącz do codeweekowej społeczności! 76
Aleksandra Zacharska
Budowniczy Robloxa: sklep z przepustkami 38
Przemysław Folholc
KOMIKS

PROJEKTY Scottie Go! 74

Programowanie zdalnego sterowania


SCENARIUSZE ZAJĘĆ DLA NAUCZYCIELI
w LEGO MINDSTORMS ROBOT INVENTOR 50
Natalia Trzaska
Rok przestępny, czyli jak stworzyć algorytm sprawdzający
Wyścigi formuły jeden – animacje na Androidzie 56 w Scratchu i Pythonie? 80
Urszula Piechota Justyna Klimczyk

Dwumiesięcznik Programista Junior wydawany jest przez Dom Wydawniczy Anna Adamczyk Nota prawna
Wydawca: Adres wydawcy: Redakcja zastrzega sobie prawo do skrótów
Anna Adamczyk Dereniowa 4/47, i opracowań tekstów oraz do zmiany planów
(annaadamczyk@programistajr.pl) 02-776 Warszawa wydawniczych, tj. zmian w zapowiadanych tematach
Redaktor naczelny: Strona internetowa: artykułów i terminach publikacji, a także nakładzie
Łukasz Łopuszański www.programistajr.pl i objętości czasopisma.
(llopuszanski@programistajr.pl) Druk: O ile nie zaznaczono inaczej, wszelkie prawa do
Redaktor prowadzący: http://www.edit.net.pl/ materiałów i znaków towarowych/firmowych
Mariusz "maryush" Witkowski Nakład: 5000 egz. zamieszczanych na łamach magazynu Programista
Korekta: Projekt okładki: Junior są zastrzeżone. Kopiowanie i rozpowszechnianie
Tomasz Łopuszański, Katarzyna Włodarczyk Maciek Empro ich bez zezwolenia jest Zabronione.
Skład: Współpraca:
Redakcja magazynu Programista Junior nie
Krzysztof Kopciowski Gynvael Coldwind, Rafał Kocisz, Wojciech Biały,
ponosi odpowiedzialności za szkody bezpośrednie
Dział reklamy: foxtrot_charlie , Paweł "KrzaQ" Zakrzewski,
i pośrednie, jak również za inne straty i wydatki
reklama@programistajr.pl Michał "Kafej" Zbyl, Sławomir Zborowski,
poniesione w związku z wykorzystaniem informacji
tel.: +48 663 220 102, Maciek Empro (fb/everybodywantstobeempro),
prezentowanych na łamach magazynu Programista
Prenumerata: Alicja Puszakowska
Junior.
prenumerata@programistajr.pl
PODSTAWY PROGRAMOWANIA

Wojciech Sura

Bazy danych
Czyli jak programy przechowują informacje
Jednym z najważniejszych zastosowań komputerów jest przechowywanie i przetwarzanie
danych. Czasami dane te są pojedyncze – jak na przykład zdjęcia z wakacji: każde z nich
znajduje się w osobnym pliku. Zdarza się jednak, że informacje są ze sobą w jakiś sposób
powiązane, a my wiedzę o tych powiązaniach chcemy zachować.

10+

Dowiesz się Potrzebna wiedza


օ Czym są i do czego służą relacyjne bazy danych. օ Umiejętność sprawnego poruszania się w Interne-
cie i podstawowa obsługa systemu operacyjnego.
օ Jakiego narzędzia można użyć do utworzenia
bazy danych.

օ Jak utworzyć tabelę, a potem wprowadzić, mody-


fikować i usuwać z niej dane.

BIBLIOTEKA KSIĄŻKI UŻYTKOWNICY GATUNKI AUTORZY


Przypuśćmy, że chcemy napisać program do obsługi Przygody Wojtek Kryminał Arthur C.
biblioteki. Jego zadaniem będzie przede wszystkim prze- Sherlocka Doyle
Holmesa
chowywanie katalogu książek, które można wypożyczyć,
Księga urwi- Basia Przygodo- Edmund
a także listy osób, które są do tego uprawnione. Zależy
sów wa Niziurski
nam również na prowadzeniu rejestru wypożyczeń –
Awantura w Natalia Fantasy Kornel Ma-
musimy bowiem wiedzieć, kto przechowuje pożyczone Niekłaju kuszyński
książki i w jakim terminie powinny one zostać zwrócone.
Szatan z VIII Łukasz Terry Prat-
Przydatną opcją będzie również wyszukiwanie dostęp- klasy chett
nych książek według nazwy, autora oraz gatunku. Zbrojni Tomek
Nie trzeba być doświadczonym programistą, by domy-
śleć się, że podstawowymi strukturami danych, z których
skorzystamy, będzie po prostu szereg list. W pierwszej Zwróćmy uwagę, że pomiędzy elementami tych list za-
z nich zawrzemy wszystkie książki będące własnością chodzą pewne szczególne zależności. Przede wszystkim
biblioteki, druga zawierać będzie użytkowników, trzecia każda książka ma swojego autora (przyjmijmy tak dla
gatunki, wreszcie czwarta – autorów książek. Listy te uproszczenia, czasami zdarzają się bowiem książki, któ-
mogą wyglądać następująco: re mają wielu autorów) oraz jeden lub więcej gatunków.

6 [ 4 - 202 1 ]
Bazy danych

Poza tym każda z książek może być wypożyczona przez o nazwie SQLite Studio. Jest on napisany w taki sposób,
jednego z użytkowników (ale tylko przez jednego naraz). że nie trzeba go nawet instalować w systemie – wystar-
Zależności te są bardzo ważne, ponieważ niosą ze czy pobrać odpowiedni plik, rozpakować go i już można
sobą istotne informacje. Jeżeli bowiem przypiszemy z tego programu korzystać.
w odpowiedni sposób książki do gatunków, możemy Aby to zrobić:
pomóc komuś, komu spodobał się „Sherlock Holmes” 1. Przejdź pod adres https://sqlitestudio.pl.
i szuka kolejnego kryminału (niezależnie od autora i ty- 2. Odnajdź u góry link o nazwie „Download” i przejdź tam.
tułu). Analogicznie, jeżeli zapamiętamy powiązania po- 3. Przewiń stronę nieco w dół, by odnaleźć link do po-
między książkami i autorami, komuś, komu spodobała brania programu (w czasie pisania tego artykułu naj-
się „Awantura w Niekłaju” autorstwa Edmunda Niziur- nowszą wersją SQLite Studio była wersja 3.3.3, zaś
skiego, będziemy mogli polecić „Księgę Urwisów”. plik nazywał się SQLiteStudio-3.3.3.zip).
W projektach programistycznych bardzo często 4. Pobierz plik i rozpakuj go do dowolnego katalogu.
spotykamy się z sytuacją, w której zależy nam na zapa- SQLite Studio jest gotowe do pracy – wystarczy uru-
miętaniu informacji o zależnościach pomiędzy różnymi chomić program SQLiteStudio.exe.
danymi. W związku z tym powstały specjalne narzędzia,
które pozwalają przechowywać tego typu informacje. TABELA
Ponieważ wspomniane wcześniej zależności w facho- Zanim zaczniemy używać SQLite Studio, musimy do-
wym języku nazywane są relacjami, narzędzia te okre- wiedzieć się trochę, w jaki sposób bazy danych przecho-
ślane są mianem relacyjnych baz danych. I o nich wła- wują nasze informacje.
śnie chciałbym opowiedzieć w tym artykule. Jednym z najważniejszych pojęć w bazach danych
jest tabela. Jej zadaniem jest przechowywanie informacji
SQLITE dotyczących jednego, konkretnego rodzaju danych. Po-
Bazy danych nie są wbrew pozorom zagadnieniem niżej możemy zobaczyć przykładową tabelę przechowu-
bardzo skomplikowanym, ale najłatwiej jest nauczyć jącą informacje o książkach.
się ich obsługi, po prostu samodzielnie eksperymentu-
jąc. Na rynku dostępna jest bardzo duża liczba silników BOOKS
bazodanowych, czyli programów, które pomagają użyt- ID TITLE ORIGINALTI- PUBLISHY- PRINTEDBY
kownikom (ale również i innym programom) przecho- TLE EAR

wywać i wyszukiwać dane. Do najpopularniejszych nale- 1 Przygody The Adventu- 1892 Oficyna
żą między innymi Microsoft SQL Server, Oracle, MySQL Sherlocka res of Sher- Wydawni-
Holmesa lock Holmes cza RYTM
MariaDB czy PostgreSQL.
Instalacja i skonfigurowanie większości z nich zajmu- 2 Księga 1954 Greg
urwisów
je sporo czasu i wymaga trochę informatycznej wiedzy.
3 Awantura 1962 Greg
Serwery te są też często bardzo duże (zwykle zajmu-
w Niekłaju
ją kilkaset megabajtów), a do tego pracują cały czas w
4 Szatan z 1937 Nasza Księ-
tle, pochłaniając zasoby komputera. Wreszcie część z
VII klasy garnia
nich dostępna jest tylko odpłatnie, więc nie są one zbyt
5 Zbrojni Men at Arms 1993 Prószyński
atrakcyjne do nauki. Istnieje jednak silnik, który został
i S-ka
stworzony po to, by zajmować bardzo mało miejsca i ob-
6 Zbrojni Men at Arms 1993 Prószyński
sługiwać niewielkie bazy danych mieszczące się w jed-
i S-ka
nym pliku, który świetnie nada się do naszych potrzeb, a
nazywa się on SQLite.
Jeżeli macie ochotę przećwiczyć ze mną projekto- W środowisku baz danych każda tabela musi mieć swoją
wanie baz, a następnie wyszukiwanie w nich różnych unikalną nazwę – abyśmy mogli odróżnić jedną od dru-
danych, zachęcam do pobrania niewielkiego programu giej. Ponieważ w projektach programistycznych przyjęło

[ PROGR AMI STAJR . PL ] 7


PODSTAWY PROGRAMOWANIA

się korzystać z angielskiego nazewnictwa, tabelę prze- Zwróć uwagę, że w naszej tabeli „Zbrojni” autorstwa
chowującą informację o książkach nazwałem Books. Terry’ego Pratchetta występują dwukrotnie – ponieważ
Tabele w bazach danych składają się z wierszy w naszej bibliotece mamy dwa egzemplarze tej książki.
i kolumn. Oczywiście wszystkie dotyczące ich informacje są do-
Każdy wiersz reprezentuje pojedynczy element prze- kładnie takie same, więc bez takiej specjalnej kolumny
chowywany w tabeli: w naszym przypadku będą to in- nie bylibyśmy w stanie odróżnić jednej od drugiej. Ko-
formacje o pojedynczej książce. Warto wiedzieć, że lumna ta nosi bardzo ważną nazwę klucz główny.
w literaturze poświęconej bazom danych możecie spo- W naszym przypadku rolę klucza głównego pełni
tkać się również z innymi określeniami wiersza, takimi kolumna Id. Jest to bardzo popularna nazwa dla kluczy
jak rekord, encja albo (rzadziej) krotka. głównych, a pochodzi od skrótu – w różnych wersjach
W listach, które wstępnie przygotowaliśmy na po- – od Index (indeks), Identifier – (identyfikator) lub Iden-
czątku, przechowywaliśmy bardzo mało informacji. Na tification Data (dane identyfikacyjne). Klucz główny nie
przykład na liście książek znajdowały się tylko ich tytuły. musi być koniecznie liczbą, jednak rozwiązanie takie jest
Bazodanowa tabela pozwala jednak przechować w każ- dosyć wygodne, ponieważ bazy danych zawierają szereg
dym wierszu znacznie więcej informacji, a ich liczbę i ro- mechanizmów pomagających w obsłudze tej kolumny.
dzaj określamy, definiując dla tabeli kolumny. Dbanie o prawidłową wartość kolumny Id stanowi
Każda z kolumn opisuje pojedynczy aspekt, cechę pewien problem. Dane w bazie zmieniają się – są wsta-
elementu tabeli. W naszej przykładowej tabeli prze- wiane i usuwane, co powoduje, że numeracja przestaje
chowujemy pięć informacji o każdej książce. Jej unikal- być ciągła. Bez przejrzenia całej zawartości tabeli trudne
ny identyfikator (o którym za chwilę), tytuł (Title), tytuł może być ustalenie takiej wartości nowego wiersza, któ-
oryginału w przypadku książek obcojęzycznych (Origi- ra nie pokryje się z już istniejącą. Dlatego też bazy da-
nalTitle), rok pierwszej publikacji (PublishYear) oraz wy- nych oferują mechanizm autoinkrementacji, który ko-
dawnictwo (PrintedBy). lumnie Id nadaje pierwszą wolną, prawidłową wartość.
Decyzję o tym, ile kolumn (i jakiego typu) będzie mia- Na koniec wreszcie każda kolumna powinna mieć
ła tabela, podejmuje programista podczas projektowania zdefiniowany jednoznacznie typ. Baza danych musi wie-
bazy danych. Kieruje on się zwykle informacjami o tym, dzieć, czy wartość zapisywana w danej kolumnie będzie
ile danych użytkownicy aplikacji będą w stanie dostar- tekstem, liczbą całkowitą, zmiennoprzecinkową, warto-
czyć, a także które z nich są tak naprawdę warte prze- ścią typu bool (prawda/fałsz) czy datą lub czasem. Po-
chowania. W naszym przypadku moglibyśmy w tabeli zwala to na optymalizowanie sposobu, w który zapisy-
książek przechowywać również informacje o prawach wane są dane, a także otwiera drogę do wykonywania
autorskich, nazwisku ilustratora, adresie wydawnictwa, na danych różnych operacji (na przykład obliczania sum,
liczbie rozdziałów i tak dalej – jednak tego typu informa- średnich i tak dalej).
cje w bibliotece są zwykle mało użyteczne.

KOLUMNY

Ciekawostka
Bazy danych przewidują, że niektóre pola w wierszach
mogą pozostać niewypełnione. Dla przykładu kolum-
na OriginalTitle w przypadku tytułów polskojęzycznych
Klucz główny nie musi być pojedynczą kolumną. W niektó-
nie ma większego sensu – możemy więc zrezygnować
rych, rzadkich przypadkach klucz główny składa się z kilku
z wprowadzania do niej wartości. Podczas projektowania kolumn. W takiej sytuacji wszystkie wiersze muszą różnić
tabeli trzeba jednak jasno zaznaczyć, czy zgadzamy się się wartością przynajmniej jednej z nich. Gdyby na przykład
na to, żeby pole mogło być puste, czy też nie. klucz główny stanowiła para kolumn: Imię i Nazwisko, w
tabeli mogłyby znajdować się jednocześnie wpisy: Adam
Większość tabel powinna zawierać kolumnę, która
Kowalski, Michał Kowalski oraz Michał Nowak. Niedopusz-
jednoznacznie identyfikuje dany wiersz (to znaczy: nie czalne byłoby jednak istnienie dwóch Adamów Kowalskich.
istnieją dwa różne wiersze, które mają tę samą wartość).

8 [ 4 - 202 1 ]
Bazy danych

SQL
Gdy wymieniałem popularne serwery bazodanowe,
zwróciliście pewnie uwagę na to, że w większości z nich
zawarty jest skrót SQL. Rozwija się on do angielskiej na-
zwy: Structured Query Language, który przetłumaczy-
my jako język strukturalnych zapytań. Język ten został
zaprojektowany specjalnie do komunikacji z bazami da-
nych i przeważająca większość silników bazodanowych
(a już na pewno te z „SQL” w nazwie) potrafi go prawi-
dłowo zinterpretować.
Dobra wiadomość jest taka, że język SQL jest bardzo
czytelny. Polecenia pisane w tym języku przypominają
zdania napisane po angielsku – łatwo jest więc się go na-
uczyć. W dalszej części artykułu postaram się pokazać
kilka podstawowych poleceń, które pomogą nam utwo-
rzyć odpowiednie tabele, manipulować rekordami, a na- Ilustracja 2. Konfigurujemy nową bazę

stępnie wykonać kilka zapytań.


Dodana baza pojawi się na liście dostępnych baz z lewej
DO DZIEŁA! strony. Wystarczy ją teraz dwukrotnie kliknąć, by nawią-
Dosyć teorii – spróbujmy przygotować nową bazę zać z nią połączenie – teraz będziemy mogli wykonywać
danych i wypełnić ją informacjami. na niej zapytania (Ilustracja 3).
Aby utworzyć nową bazę, uruchamiamy SQLite Stu-
dio, a następnie wybieramy opcję Bazy Danych | Dodaj
bazę danych (Ilustracja 1).

Ilustracja 3. Dodana baza w „SQLite Studio”

Ilustracja 1. Dodawanie nowej bazy danych


Warto wiedzieć
Programiści mają tendencję nadawania trudnych terminów
dla prostych czynności. Inkrementacja oznacza po prostu
W następnym kroku musimy poinformować SQLite Stu- zwiększenie pewnej wartości o 1 – autoinkrementacja jest
więc automatycznym zwiększaniem o 1. Jeżeli ostatni wiersz
dio, że chcemy utworzyć nową bazę. Klikamy więc zielo-
w naszej tabeli ma Id równe 10, następny otrzyma wartość
ny plusik i wybieramy, gdzie będziemy chcieli ją zapisać. 11, kolejny – 12 i tak dalej.
SQLite Studio wypełni pozostałe pola za nas (Ilustracja 2).

[ PROGR AMI STAJR . PL ] 9


PODSTAWY PROGRAMOWANIA

Na koniec otwórzmy edytor SQL. Możemy zrobić programiści często mają taki właśnie nawyk, bo dzięki
to poprzez wciśnięcie skrótu klawiaturowego Alt+E lub temu zapytania czyta się nieco łatwiej. SQLite Studio tak
klikając na ikonkę skryptu (Ilustracja 4). Edytor SQL jest czy inaczej zawsze pogrubi je, co ułatwi ich odnalezienie.
podstawowym narzędziem, z którego będziemy korzy- CREATE TABLE jest wyrażeniem, które oznacza, że
stać najwięcej – warto więc się z nim zaznajomić. chcemy utworzyć nową tabelę. Zaraz za nim musimy
podać jej nazwę, a potem – w nawiasach – listę kolumn
oddzielonych przecinkami.
Każda z kolumn musi mieć minimalną postać Nazwa
Typ. Nazwa jest oczywiście nazwą kolumny, zaś Typ okre-
śla rodzaj danych, które chcemy w niej przechowywać.
Oprócz tego możemy również dołączyć dodatkowe in-
formacje, które bardziej szczegółowo opisują kolumnę.
Pierwsza kolumna o nazwie Id będzie przechowywać
liczby całkowite – INTEGER. Powiadamiamy też SQLite
Studio, że ma to być klucz główny (PRIMARY KEY) tej ta-
beli oraz że ma tam działać mechanizm autoinkremen-
tacji (AUTOINCREMENT). Dzięki temu podczas dodawania
nowych wierszy nie będziemy musieli zaprzątać sobie
głowy wprowadzeniem kolejnego unikalnego identyfi-
katora – baza danych zrobi to za nas.
Ilustracja 4. Otwieramy edytor SQL Kolejną kolumną jest Title, która przechowywać
będzie tekst (jak pamiętamy, ma być to tytuł książki).
TWORZYMY TABELĘ Kolumna ta jest obowiązkowa: wiersz chyba razem się
Aby utworzyć nową tabelę, musimy wykonać odpo- pisze nazwy książki nie ma dla nas żadnego sensu. Pi-
wiednie zapytanie. Zobaczmy najpierw, jak ono wygląda, sząc więc po niej NOT NULL, wymuszamy, by w każdym
a zaraz dowiemy się, z jakich elementów się ono składa. wierszu w tej kolumnie pojawiła się jakaś wartość. Bazy
danych są środowiskiem, w którym do spójności danych
Listing 1. Tworzymy nową tabelę przykładana jest naprawdę duża waga. W efekcie, jeże-
CREATE TABLE Books ( li oznaczymy kolumnę jako NOT NULL, nie ma żadnych
Id INTEGER PRIMARY KEY AUTOINCREMENT, szans, żeby udało się wstawić wiersz łamiący tę zasadę.
Title TEXT NOT NULL, Kolejne definicje kolumn możecie rozszyfrować sami.
OriginalTitle TEXT DEFAULT NULL, Pojawia się tam tylko jedna nieznana nam jeszcze kon-
PublishYear INTEGER NOT NULL, strukcja: DEFAULT NULL. Informuje ona SQLite Studio,
PrintedBy TEXT NOT NULL); że wartość tej kolumny może być pusta (nieustawiona)
i mało tego – domyślnie będzie właśnie taka. Oznacza
Osoby, które znają choć trochę język angielski, po- to, że podczas wprowadzania danych do tabeli można ją
winny bez większego problemu przeczytać powyższe pominąć – SQLite automatycznie ustawi ją na NULL (czyli
polecenie – SQL jest naprawdę bardzo czytelnym języ- na „brak wartości”).
kiem. Przyjrzyjmy się jednak powyższej komendzie i roz- Polecenia SQL kończymy średnikiem. Nie jest to
bierzmy ją na czynniki pierwsze. konieczne, ale stanowi dobry zwyczaj i jest pomocne
Przede wszystkim zwróć uwagę na to, że część słów szczególnie wówczas, gdy chcemy wykonać kilka pole-
jest pogrubiona i napisana wersalikami (TO ZNACZY W ceń naraz.
TAKI SPOSÓB), a część nie. Są to tak zwane słowa klu- Po wywołaniu komendy zauważymy, że nowa tabela
czowe SQL, czyli takie, które mają specjalne znaczenie. pojawiła się na liście tabel w naszej bazie (Ilustracja 5).
Nie ma konieczności pisania ich wielkimi literami, ale

10 [ 4 - 202 1 ]
Bazy danych

1993,
"Prószyński i S-ka"),
("Zbrojni",
"Men at Arms",
1993,
"Prószyński i S-ka");

Polecenie wstawienia danych zaczyna się od słów klu-


czowych INSERT INTO, po których następuje nazwa tabeli,
do której chcemy wstawić dane. Następnie wymieniamy
w nawiasach nazwy wszystkich kolumn, dla których chce-
my podać wartości. Powinniśmy wymienić tam wszystkie
Ilustracja 5. Dodaliśmy tabelę do bazy!
obowiązkowe kolumny (to jest takie, które nie mają war-
tości domyślnej lub nie są autoinkrementowane), bo ina-
WPROWADZAMY DANE czej SQLite nie pozwoli wprowadzić nam takich wierszy.
Spróbujmy teraz wprowadzić pierwsze wpisy do naszej Po liście kolumn występuje słowo VALUES oznacza-
tabeli. Skorzystajmy z danych, które pojawiły się w przy- jące, że chcemy teraz wprowadzić konkretne wiersze.
kładowej, przedstawionej wcześniej tabeli. Każdy z nich zamykamy w nawiasach, a wartości oddzie-
lamy przecinkami; kolejne wiersze również oddzielamy
Listing 2. Wprowadzamy dane do tabeli przecinkami. Musimy pamiętać, by wartości w nawiasach
INSERT INTO Books podać w takiej kolejności, w jakiej podaliśmy wcześniej
(Title, kolumny. Pierwsza wartość trafi bowiem do pierwszej
OriginalTitle, kolumny, druga – do drugiej i tak dalej.
PublishYear, Zauważmy, że nie podaliśmy wśród kolumn Id. Właśnie
PrintedBy) tu korzystamy z mechanizmu autoinkrementacji, który
VALUES przyporządkuje identyfikatory wierszom automatycznie.
("Przygody Sherlocka Holmesa", Jeżeli nie popełniliśmy nigdzie błędu, SQLite powia-
"The Adventures of Sherlock Holmes", domi nas, że operacja się powiodła. W okienku statusu
1892, znajdziemy informację:
"Oficyna Wydawnicza RYTM"),
Listing 3. Powiadomienie o sukcesie
("Księga urwisów",
NULL, [19:32:52] Zapytanie ukończone w 0.012 sekund(y).
1954, Liczba przetworzonych wierszy: 6
"Greg"),
("Awantura w Niekłaju", Oznacza to, że dane zostały prawidłowo wstawione
NULL, do bazy; dostajemy też informację, ile wierszy zostało
1962, zmienionych (czyli w naszym przypadku – dodanych): 6.
"Greg"),
("Szatan z VII klasy", POBIERANIE DANYCH
NULL, Nasza tabela zawiera już informacje, ale trochę nie za
1937, bardzo to widać. SQLite zapamiętało dla nas 6 książek,
"Nasza Księgarnia"), ale miło byłoby się przekonać, że dane faktycznie zostały
("Zbrojni", prawidłowo zapisane.
"Men at Arms", Do pobierania danych z bazy służy komenda SELECT.
Jest to chyba najbardziej rozbudowane polecenie SQLa po-

[ PROGR AMI STAJR . PL ] 11


PODSTAWY PROGRAMOWANIA

zwalające pobrać dane z bazy na setki sposobów, łączyć ze do wierszy, zaś w drugiej – które wiersze chcemy w ten
sobą tabele, filtrować i sortować dane i przetwarzać je na sposób zmodyfikować.
całą masę sposobów. Możemy jednak skorzystać z jego naj- W naszym przypadku będziemy chcieli zmienić tylko
prostszej postaci, która po prostu prosi o pobranie wszyst- pojedynczy wiersz zawierający informacje o książce „Win-
kich danych z tabeli. Komenda ta wygląda tak: netou”. W takiej sytuacji najwygodniej będzie sprawdzić
wcześniej, jaka jest jej wartość kolumny Id (klucza głów-
Listing 4. Pobieramy dane z naszej tabeli nego naszej tabeli). Przy małej liczbie książek możemy po-
SELECT * FROM Books; brać znów całą tabelę – okazuje się, że wartością tą jest 7.
Możemy teraz napisać polecenie, które poprawi
Nareszcie! Teraz faktycznie możemy zobaczyć nasze błędny wpis.
dane (Ilustracja 6).
Zapytanie SELECT jest bardzo krótkie i raczej dosyć Listing 7. Poprawiamy błędny wpis
czytelne. Warto tylko wspomnieć, że symbol gwiazdki UPDATE Books
oznacza, że interesują nas wszystkie kolumny z tej tabe- SET OriginalTitle = "Winnetou", PublishYear = 1893
li. Gdybyśmy chcieli pobrać na przykład tylko identyfi- WHERE Id = 7;
kator i tytuł, moglibyśmy napisać tak:
Polecenie UPDATE rozpoczynamy, wskazując, którą ta-
Listing 5. Pobieramy tylko niektóre kolumny belę chcemy zmodyfikować – w naszym przypadku jest
z tabeli
to oczywiście tabela Books. Następnie – po słowie klu-
SELECT Id, Title FROM Books; czowym SET (oznaczającym „ustaw”) – wprowadzamy
listę zmian, które chcemy przeprowadzić: pole Orig-
MODYFIKACJA I USUWANIE inalTitle ustawić na „Winnetou”, zaś PublishYear na
Wprowadźmy nowy wiersz do naszej tabeli. 1893. Wreszcie przy pomocy słowa kluczowego WHERE
wskazujemy, które konkretnie wiersze chcemy zmienić.
Listing 6. Dodajemy kolejną książkę W naszym przypadku wymagamy, by wartość Id zmie-
INSERT INTO Books nianego rekordu była równa 7, co w efekcie zmieni tylko
(Title, pojedynczy wiersz.
OriginalTitle, Warto wiedzieć, że przy pomocy polecenia UPDATE
PublishYear, możemy wprowadzać hurtowe zmiany, czyli modyfi-
PrintedBy) kować wiele wierszy naraz. W takim przypadku należy
VALUES jednak bardzo uważnie opisać wiersze, które chcemy
("Winnetou", zmienić, bo możemy przypadkowo wprowadzić zmiany
NULL, w innym miejscu niż zamierzaliśmy.
1993, Załóżmy teraz, że ostatni czytelnik wypożyczoną
"Wydawnictwo Przez Lądy i Morza"); książkę (właśnie „Winnetou”) przyniósł w opłakanym
stanie. Nie ma strony tytułowej, w książce brakuje stron,
O kurczak, pomyliliśmy się! Winnetou został wyda- sama książka zaś rozlatuje się. Po analizie dochodzi-
ny w 1893 roku, a nie 1993. Poza tym polską nazwą jest my do wniosku, że książka ta jest już stara i zniszczo-
wprawdzie „Winnetou”, ale jest to książka w oryginale na w stopniu, który powoduje, że nie ma sensu jej dalej
obcojęzyczna, więc powinniśmy też wypełnić kolumnę wypożyczać. Decydujemy się więc usunąć ją z rejestru
OriginalTitle. książek dostępnych do wypożyczenia, a w jej miejsce za
Na szczęście SQL przewiduje możliwość zmienia- jakiś czas kupić nową.
nia istniejących już rekordów, a służy do tego specjal- Usuwanie rekordów z bazy odbywa się poprzez za-
na instrukcja UPDATE. Dzieli się ona na dwie części: w stosowanie polecenia DELETE. W naszym przypadku bę-
pierwszej określamy, jakie zmiany chcemy wprowadzić dzie ono wyglądało następująco:

12 [ 4 - 202 1 ]
Bazy danych

Ilustracja 6. Pobraliśmy dane z bazy!

Listing 8. Usuwamy wpis z bazy pomocy bardzo wygodnego języka o nazwie SQL. Pisane
DELETE FROM Books w nim zapytania przypominają zdania pisane w języku an-
WHERE Id = 7; gielskim, co jeszcze bardziej upraszcza proces nauki.
W następnej części dowiemy się, jak powiązać ze
Składnia jest chyba bardzo czytelna – musimy najpierw sobą kilka tabel oraz jak wyciągać z nich potrzebne nam
wskazać, z której tabeli chcemy usunąć rekordy, a potem informacje.
wskazać, które konkretnie z nich są nam już niepotrzeb-
ne. Użycie klucza głównego – jak w powyższym przy-
padku – zawęzi wynik do jednego konkretnego wiersza. Wojciech Sura
Wykonanie zapytania z Listingu 4 powinno potwierdzić,
Programuje od 25 lat, z czego 10 komercyjnie; ma
że wiersz został prawidłowo usunięty. na koncie aplikacje desktopowe, webowe, mobilne
i wbudowane – pisane w C#, C++, Javie, Delphi, PHP,
CIĄG DALSZY NASTĄPI… JavaScript i w jeszcze kilku innych językach. Obecnie
Relacyjne bazy danych są bardzo wygodnym narzę- pracuje w firmie WSCAD, rozwijającej oprogramowa-
dziem pozwalającym na przechowywanie dużych ilości nie nowej generacji CAD dla elektrotechników.
danych oraz – co ważne – zależności pomiędzy nimi. Mo-
WOJCIECHSURA@GMAIL.COM
żemy operować na nich w stosunkowo łatwy sposób przy

!
Zapamiętaj Ćwicz w domu
օ Pobierz i zainstaluj lub rozpakuj program SQLite օ . Programy komputerowe często przechowują
Studio. informacje w bazach danych.

օ Użyj SQLite Studio, by zbudować opisaną w arty- օ Bazy danych pozwalają nie tylko na przechowywa-
kule bazę danych. nie dużych ilości informacji, ale również zależno-
ści pomiędzy nimi.
օ Spróbuj przy pomocy tego programu wstawić do
bazy dane. օ Do komunikacji z bazami danych wykorzystuje się
język SQL.

[ PPROGR
ROGR AMI STAJR . PL ] 13
JĘZYKI PROGRAMOWANIA

Justyna Klimczyk

Czy matematyka może być piękna?


O fraktalach słów kilka
Fascynują matematyków, fizyków, przyrodników, ale też artystów, grafików komputero-
wych czy programistów. Do tej pory nie stworzono ich jednoznacznej definicji, gdyż ich
ilość i różnorodność na to nie pozwala. O czym mowa? Rzecz jasna chodzi o fraktale.

12+

Dowiesz się Potrzebna wiedza


օ Czym są fraktale. օ Podstawowa znajomość środowiska Scratch.
օ Jak tworzyć w Scratchu skrypty rysujące różne օ Znajomość pojęcia rekurencji.
fraktale.

Ilustracja 1. Fraktal Mandelbrota


(źródło: https://pixabay.com/pl/illustrations/zbi%c3%b3r-mandelbrota-fraktal-6385080/)

14 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka

W dużym uproszczeniu fraktal jest figurą, której część


jest podobna do całości, czyli samopodobną. Dla
ułatwienia matematycy stworzyli listę cech, którymi fi-
Każde rozgałęzienie składa się z dwóch elementów, o po-
łowę krótszych niż poprzednie. Między nimi jest kąt 90°.
Zobaczmy, jak wygląda przykładowy skrypt, w wyni-
gura powinna się odznaczać, by móc być określona mia- ku działania którego powstało drzewo.
nem fraktala.
Fraktalność można odnaleźć w strukturze chmur,
płatków śniegu, kalafiora, aloesu, paproci czy szyszki,
ale też w strukturze fiordów, naczyniach krwionośnych,
błyskawicach czy systemie rzek. Przykładów jest wiele.
Spróbujmy przyjrzeć się bliżej budowie niektórych zna-
nych fraktali, a później stworzymy w Scratchu skrypty
tworzące te fraktale, a kto wie – może nawet zaprojek-
tujemy własny.

ZACZNIJMY OD CZEGOŚ PROSTEGO


Przyjrzyjmy się prostej konstrukcji fraktalnej i zasta-
nówmy się, jak powstała. Zwróćmy uwagę na samopo-
dobieństwo dowolnego fragmentu drzewa do całości.

Ilustracja 4. Fragment skryptu zawierający procedurę


rekurencyjną „drzewo(konar)”

Czy zwróciliście uwagę na to, że w procedurze wywoły-


Ilustracja 2. Przykład prostego fraktala wygenerowany
w Scratchu wana jest ona sama? Taką sytuację nazywamy rekurencją.

Ilustracja 3. Przykłady występowania fraktali w przyrodzie. Od lewej aloes, szyszka, brokuł (źródła: https://pixa-
bay.com/pl/photos/aloes-soczysty-aloes-polyphylla-510113/ https://pixabay.com/pl/photos/szyszki-szyszka-jesie-
%c5%84-las-3026691/ https://pixabay.com/pl/photos/romanescu-romanesco-warzywo-3297134/)

[ PROGR AMI STAJR . PL ] 15


JĘZYKI PROGRAMOWANIA

Ciekawostka
Pojęcie fraktala zostało wprowadzone do matematyki przez
Benoît Mandelbrota w latach 70. ubiegłego wieku. Odkryty
przez niego zbiór Mandelbrota nie był jednak pierwszym
przykładem fraktala.
Szczególnymi fraktalami – jeszcze zanim zostały tak
nazwane – zajmowało się wielu matematyków, w tym Polak
Wacław Sierpiński (o tym później). Mandelbrot, używając
komputera do wizualizacji, uczynił z fraktali przedmiot in-
tensywnych badań. O ważności tego zagadnienia zadecydo-
wały zastosowania w różnych dziedzinach, zwłaszcza poza
matematyką.
Źródło: Wikipedia
Pod linkiem: https://math.hws.edu/eck/js/mandelbrot/
MB.html znajdziecie generator online fraktala Mandelbrota.
Umożliwia on wybór między innymi palety kolorów, mak-
Ilustracja 5. Fragment skryptu zawierający wywołanie
symalnej liczby iteracji oraz powiększenie dowolnej jego
procedury „drzewo(konar)”
części.
Cały skrypt można znaleźć pod adresem:
» https://scratch.mit.edu/projects/556219010

Pod linkiem https://www.visnos.com/demos/fractal znaj-


dziecie generator online powyższego fraktala. Możecie
modyfikować kilka zmiennych i obserwować, jak zmienia
Ilustracja A. Okno generatora fraktala Mandelbrota się jego postać. Finalnie obraz można zapisać w pliku.

W zależności od parametru (konar) powyższa proce-


dura narysuje drzewo o określonej wielkości. Przy para-
metrze 180 powstanie sześciostopniowe rozgałęzienie,
zaś przy parametrze 100 – pięciostopniowe. Ogranicza
nas jednak wielkość scratchowej sceny.
Pamiętajmy, że aby taka procedura zadziałała, musi
zostać wywołana. Powinniśmy zadbać również o usta-
wienie duszka (pozycja, kierunek, widoczność), który
będzie rysował drzewo, a także odpowiednie ustawienia
pisaka (kolor, grubość). Pamietajmy, że aby móc wyko-
rzystać pisak, musimy w Scratchu dodać rozszerzenie Ilustracja 6. Okno generatora
„Pióro”.

16 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka

FRAKTALNOŚĆ LIŚCI PAPROCI rekurencji stają się coraz krótsze. Zwróćcie uwagę na
fakt, że procedura Paproć(długość) wywołuje samą
siebie trzykrotnie. Spowoduje to znaczne wydłużenie
działania skryptu i przynajmniej kilkunastosekundowe
oczekiwanie na efekt końcowy jej działania. By od razu
zobaczyć wynik procedury, należy uruchomić w Scrat-
chu tryb turbo (patrz „Ciekawostka").

Ilustracja 7. Orlica pospolita


(źródło: https://pixabay.com/pl/photos/orlica-ro-
%c5%9bliny-charakter-li%c5%9b%c4%87-3701765/)

Jednym z wielu – choć niezwykle ciekawym – przykła-


dem fraktalności w przyrodzie jest liść paproci.
Zobaczmy, jak mógłby wyglądać przykładowy skrypt
rysujący paproć.

Ilustracja 9. Przykład działania skryptu

Oczywiście, podobnie jak w poprzednim projekcie, po-


winniśmy zadbać o ustawienia duszka oraz pisaka, aby
element graficzny zmieścił się na scratchowej scenie i był
dobrze widoczny. Powyższy efekt uzyskamy, dwukrot-
nie wywołując procedurę. Zanim wywołana zostanie
drugi raz, należy zmienić położenie duszka i kolor pi-
saka. Zachęcam do tworzenia własnych paprociowych
kompozycji.
Kompletny projekt jest dostępny pod linkiem:
» https://scratch.mit.edu/projects/559890950

KRZYWA KOCHA
Ilustracja 8. Procedura „Paproć(długość)” Dość znanym przykładem fraktalności jest krzywa
Kocha. Połączenie trzech krzywych tworzy element
Parametr procedury paproć określa początkową dłu- przypominający płatek śniegu i nazywany jest płatkiem
gość łodygi, jest też punktem wyjścia do wyznaczania Kocha (od nazwiska szwedzkiego matematyka Nielsa Fa-
długości poszczególnych odgałęzień, które za sprawą biana Helge von Kocha).

[ PROGR AMI STAJR . PL ] 17


JĘZYKI PROGRAMOWANIA

Warto wiedzieć
Krzywa powstaje z odcinka, który dzielimy na 3 rów-
ne części i zastępujemy środkowy dwoma odcinkami
o tej samej długości, które wraz z usuniętą częścią two-
Dywan Sierpińskiego – fraktal otrzymany z kwadratu za
rzą trójkąt równoboczny. Czynność tą możemy powta- pomocą podzielenia go na dziewięć (3x3) mniejszych kwa-
rzać w nieskończoność, uzyskując coraz bardziej skom- dratów, usunięcia środkowego kwadratu i ponownego reku-
plikowany obraz. rencyjnego zastosowania tej samej procedury do każdego
z pozostałych ośmiu kwadratów. Jego konstrukcja została
podana przez polskiego matematyka Wacława Sierpińskiego
w 1915 roku.

Ilustracja 10. Etapy tworzenia krzywej Kocha

Spróbujmy teraz stworzyć procedurę w Scratchu, któ-


ry pozwoli generować kolejne iteracje krzywej Kocha.
W tym celu naszą procedurę wyposażymy w dwa para-
metry: ile i długość. Pierwszy z nich pozwoli tworzyć
dowolne iteracje krzywej, drugi natomiast określa dłu-
gość odcinka, który będzie poddawany podziałowi. Dla
parametru ile = 1 krzywa przyjmie postać odcinka;
Ilustracja B. Dywan Sierpińskiego (czwarta iteracja)
zwiększanie jego wartości będzie oznaczać kolejne jego
przekształcenia. Wygenerowany na:
» https://codinglab.huostravelblog.com/math/fractal-
-generator/index.php

Trójwymiarowy odpowiednik dywanu Sierpińskiego na-


zywamy kostką Mengera lub gąbką Mengera. Konstrukcja
kostki została podana przez austriackiego matematyka
Karla Mengera w roku 1927.

Ilustracja C. Kostka Mangera (źródło: https://com-


mons.wikimedia.org/wiki/File:Menger-Schwamm.png)

Źródło: Wikipedia

Ilustracja 11. Przykład procedury rysującej krzywą Kocha

18 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka

By krzywa mogła się zamienić w płatek, procedura


powinna być wywołana trzykrotnie wraz ze zmianą po-
łożenia duszka o kąt 120°.

Ilustracja 12. Fragment skryptu odpowiedzialny za ryso-


wanie płatka Kocha

Całość znajdziecie pod linkiem:


» https://scratch.mit.edu/projects/556241227.
Ilustracja 14. Procedura rysująca dowolną iterację trój-
kąta Sierpińskiego

Kompletny skrypt dostępny jest pod linkiem:


» https://scratch.mit.edu/projects/556687182

TRÓJKĄT SIERPIŃSKIEGO
Fraktalami zajmował się również polski matematyk
Wacław Sierpiński. Przyjrzymy się z bliska jednemu z tych
fraktali i stwórzmy procedurę, która rysuje dowolną jego
iterację.
Trójkąt Sierpińskiego – bo o nim mowa – powstaje STWÓRZMY WŁASNY FRAKTAL
w wyniku podziału trójkąta równobocznego na cztery Omówiliśmy kilka przykładów popularnych fraktali,
mniejsze trójkąty w wyniku łączenia środków boków czas spróbować stworzyć własny!
tego pierwszego. Następnie usuwany jest trójkąt środ- Wykorzystajmy duszka w postaci trójkąta (możecie
kowy, a operacja podziału powtarzana jest na pozosta- go stworzyć samodzielnie w zintegrowanym edytorze
łych trzech trójkątach. grafiki). W kolejnych krokach procedury tworzone są
coraz mniejsze trójkąty, a każdy z nich jest przesunięty
i odwrócony o kąt. Sześciokrotne wywołanie procedury,
połączone z przesunięciem o kąt, spowoduje powstanie
poniższego obiektu. Czy coś wam to przypomina?

Ilustracja 13. Kolejne etapy powstawania trójkąta Sier-


pińskiego

Procedura trójkąt ma dwa parametry. Pierwszy z nich


określa stopień podziału trójkąta na mniejsze, drugi zaś
długość boku. Zwróćmy uwagę na to, że zgodnie z zasa-
dą bok dzielony jest na połowy, a czynność ta powtarza-
na jest aż do chwili, gdy zmienna ile osiągnie wartość
mniejszą od 1. Ilustracja 15. Efekt wywołania procedury „mój_fraktal”

[ PROGR AMI STAJR . PL ] 19


JĘZYKI PROGRAMOWANIA

cedura. Pamiętajcie jednak, aby nie zmieniać wszystkich


wartości jednocześnie. Róbcie to kolejno i obserwujcie
różnice.
Link do projektu:
» https://scratch.mit.edu/projects/555200610

INNE POPULARNE PRZYKŁADY FRAKTALI

Ilustracja 16. Procedura rysująca pojedynczy element


kolorystyczny

Ilustracja 18. Zbiór Julii (Źródło: https://commons.wiki-


media.org/wiki/File:Julia-Menge_-0.4%2B0.6i.png)

Nazwa tego fraktala nie pochodzi - jakby się wydawało


- od imienia Julia, ale od nazwiska francuskiego mate-
matyka. Gaston Maurice Julia miał znaczący wpływ na
współczesną teorię fraktali.

Ilustracja17. Fragment skryptu, w którym wywołana zo-


staje procedura „mój_fraktal”

Zachęcam do eksperymentowania i modyfikowania tego Ilustracja 19. Drzewo pitagorejskie


projektu. Spróbujcie zmienić w procedurze rozmiar po-
czątkowy, ilość kroków przesunięcia pojedynczego trój- Wygenerowane na:
kąta i jego kąt obrotu. Zmian możecie dokonywać także » https://codinglab.huostravelblog.com/math/frac-
we fragmencie skryptu, w którym wywoływana jest pro- tal-generator/index.php

20 [ 4 - 202 1 ]
Czy matematyka może być piękna? O fraktalach słów kilka

Ciekawostka
Nietrudno zauważyć, że fraktal zbudowany jest z kwa-
dratów. Na każdym etapie jego konstrukcji wymaga ry-
sowania dwóch kwadratów opartych na odpowiednich
bokach trójkąta prostokątnego (w tym przypadku trójką- W sytuacji, kiedy chcemy przyspieszyć wykonywanie rozbu-
ta prostokątnego równoramiennego), których własności dowanego skryptu, warto włączyć w Scratchu tryb „Turbo”.
Efekt działania będzie natychmiast widoczny na scenie.
ilustrują twierdzenia Pitagorasa - stąd jego nazwa. Tryb „Turbo” włączymy, klikając zieloną chorągiewkę przy
wciśniętym klawiszu Shift. Powtórzenie tej czynności przy-
wraca normalny tryb działania.

Ilustracja D. Włączony tryb „Tryb turbo”

zafascynowała wielu ludzi. W świecie fraktali inspiracji


szukali i nadal szukają artyści, architekci, a także – co
ciekawe - ekonomiści czy kompozytorzy. Można więc
powiedzieć, że to, co Mandelbrot nazwał geometrią frak-
talną, nie opisuje tylko określonych kształtów, ale jest też
Ilustracja 20. Krzywa smoka (Smok Heighwaya)
punktem wyjścia do obliczeń, analiz w wielu dziedzinach.
Wygenerowany na:
» https://codinglab.huostravelblog.com/math/frac- Justyna Klimczyk
tal-generator/index.php
Nauczycielka informatyki i matematyki w Szkole
Podstawowej im. Janusza Korczaka w Kleszczowie.
Fraktale to ciekawe i często bardzo piękne obiekty gra- Autorka bloga „TIKowy Belfer”, należy do grupy
ficzne. Możemy je dostrzec wokół nas, gdyż wiele tworów Superbelfrzy RP. Zagorzała zwolenniczka wykorzy-
fraktalnych występuje w przyrodzie. O kilku takich przy- stywania TIK w codziennej pracy z uczniem.
kładach wspomniałam, ale to tylko nieliczne przypadki z
niemal niekończącej się listy. Oryginalność tych obrazów KLIMCZYK.JUSTYNA@GMAIL.COM

!
Zapamiętaj Ćwicz w domu
օ Fraktal – w dużym uproszczeniu figura, której օ Spróbuj zmodyfikować ostatni skrypt według wła-
część jest podobna do całości, inaczej figura snego pomysłu, tak aby powstająca w wyniku jej
samopodobna. wywołania figura zmieniła swój kształt.

օ Rekurencja – sytuacja, w której procedura wywo- օ Zastanów się, jak wykorzystać rekurencję
łuje samą siebie ze zmienionymi danymi. w ostatniej procedurze.

օ Stwórz własny skrypt rysujący figurę będącą


fraktalem. Zainspiruj się przykładami fraktalności
w przyrodzie.

օ Poszukaj w Internecie informacji na temat innych


fraktali.

օ Dowiedz się, czym jest sztuka fraktalna.

[ PPROGR
ROGR AMI STAJR . PL ] 21
PROGRAMOWANIE GIER

Tomasz Błaszczyk

Średniowieczna przygoda
– gra RPG w środowisku Unity
Ostatnie starcie
Poprzednie części artykułu pozwoliły nam zapoznać się z wieloma aspektami tworzenia
gier w Unity. Przebrnęliśmy zarówno przez podstawowe kwestie wizualne, jak i logiczne,
jednak nadal jest to tylko kropla w morzu możliwości, jakie oferuje nam silnik. Idąc o krok
dalej, w ostatniej już części tej serii damy graczowi możliwość wykorzystania zebranych
surowców do wytworzenia broni, które mogą okazać się przydatne w walce z przeciwnika-
mi najeżdżającymi naszą wioskę. Zapraszam!

12+

Dowiesz się Potrzebna wiedza


օ Jak obsłużyć wiele kamer na scenie. օ Znajomość kluczowych zasad pisania kodu
w języku C#.
օ Jak działają przyciski oraz w jaki sposób wykryć
i obsłużyć zdarzenie kliknięcia. օ Zainteresowanie grami oraz odrobina kreatywno-
ści i zapału do pracy.
օ Jak „nagrywać” animacje w Unity.
օ Znajomość poprzednich artykułów tej serii.
օ Jak skutecznie łączyć ze sobą funkcjonalności
wielu skryptów.

INTERFEJS
Komu udało się odwzorować utworzone ostatnim prostego interfejsu kuźni. Postępując analogicznie do
razem funkcjonalności, ten z pewnością ma już pełny utworzonego już ekwipunku, dodajemy nowy Canvas
ekwipunek zdobytych surowców. Chcąc nie chcąc, zmu- i zmieniamy jego nazwę w panelu hierarchii na przy-
szeni byliśmy do ich magazynowania z powodu braku ja- kład na SmithCanvas (smith to po angielsku kowal). Jak
kiegokolwiek kupca w okolicy... Lecz bez obaw, młodzi poprzednio, warto zwrócić uwagę na odpowiednie ska-
wojownicy, gdyż otrzymałem właśnie ważną wiadomość lowanie naszego płótna, stąd też pamiętajmy o dosto-
od wędrownego rzemieślnika, który postanowił osiąść sowaniu komponentu Canvas Scaler do rozdzielczości
na dłuższy czas w naszej wiosce w celu wytworzenia bazowej Full HD, czyli 1920x1080 pikseli. Tak przygoto-
broni dla wszystkich mieszkańców. Mówi się, że dostar- wane płótno możemy uzupełnić o kolejne elementy, ja-
czając odrobinę drewna i żelaza, jesteśmy w stanie uzy- kimi będą obiekty typu Text (napisy) oraz Image (obraz-
skać bardzo ciekawy oręż. Pomóżmy kowalowi rozłożyć ki). Wiemy już, jak z nich korzystać, więc zaproponuję
wszystkie potrzebne rzeczy! Zaczniemy od stworzenia tylko mój przykładowy układ (Ilustracja 1).

22 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity

by pokrótce przybliżyć rolę poszczególnych składowych


nowego komponentu (Ilustracja 2).

Ilustracja 1. Przykładowy interfejs lokalnej kuźni

Zaczynamy od dodania podstawowego panelu rozcią-


gniętego na całą szerokość ekranu. Możemy umieścić
w nim grafikę przedstawiającą kuźnię. Następnie niepeł-
ny, półprzezroczysty panel stanowiący tło dla przedmio-
tów oferowanych przez kowala. W celu ich stworzenia
najlepiej będzie dodać sobie jeden obiekt nadrzędny za- Ilustracja 2. Panel inspektora – komponent „Button”
wierający trzy obrazki z ikonami: miecza, drewna i żelaza
oraz dwa napisy oznaczające cenę wytworzenia danej Idąc od góry, widzimy opcję Interactable, czyli proste
broni. Tak przygotowany element możemy teraz zdu- pole typu prawda/fałsz, mówiące o tym, czy możliwa
plikować, przesunąć względem pierwszego oraz pod- jest interakcja z danym przyciskiem. Jeżeli zostanie wy-
mienić wyświetlane wartości. Wszystkie potrzebne łączone, przycisk staje się niewrażliwy na kliknięcia, co
ikony zamieszczam w sekcji Do pobrania na stronie przy domyślnych ustawieniach da się również zauważyć
internetowej PJr. Przedstawiony układ jest oczywiście od strony wizualnej. Transition z kolei określa, w jaki
tylko propozycją, dlatego jeśli przyszedł ci do głowy ja- sposób przycisk będzie reagował na działania ze stro-
kiś lepszy pomysł na zbudowanie interfejsu dla naszego ny gracza. Do wyboru są cztery stany: None, Color Tint
kowala, to gorąco zachęcam do spróbowania swoich sił (domyślny), Sprite Swap oraz Animation. W pierwszym
w tym aspekcie. Pamiętaj jednak o zachowaniu porząd- przypadku przycisk pozbawiony jest wszelkich efektów.
ku w projekcie poprzez intuicyjne nazywanie obiektów Akcja zostanie wywołana w momencie kliknięcia, lecz
w panelu hierarchii! Teraz, kiedy część wizualna została nastąpi to bez żadnego efektu wizualnego. Przy wyborze
już przygotowana, możemy zająć się interakcją oraz samą opcji drugiej (przy której pozostaniemy) komponent roz-
logiką. Po pierwsze, za pośrednictwem naszych ikon budowuje się o kilka opcji przedstawionych na ilustracji
z mieczami będziemy chcieli dokonywać konkretnych z komponentem.
transakcji. W skrócie: muszą one stać się przyciskami, » Target Graphic to komponent graficzny przycisku
których kliknięcie spowoduje wywołanie odpowiedniej (na przykład jego tło). Konieczne jest jego podłącze-
funkcji zakupu dla wybranego rodzaju broni. W tym celu nie, gdyż środowisko musi wiedzieć, czego kolor ma
zaznaczamy je w panelu hierarchii, następnie z poziomu ulec zmianie wraz z zaistniałą akcją.
panelu inspektora wybieramy przycisk Add Component, » Normal Color to kolor przycisku w chwili, gdy nie
gdzie dodajemy komponent Button (z ang. przycisk), zachodzi z nim żadna interakcja.
wyszukując go odpowiednią frazą. » Highlighted Color to kolor występujący w momen-
W ramach przypomnienia, możliwość wyrywkowego cie najechania na powierzchnię przycisku kursorem
zaznaczenia wielu obiektów jednocześnie uzyskujemy, myszy.
wybierając je z przytrzymanym klawiszem Ctrl. Kiedy » Pressed Color określa kolor, jaki przybiera wciśnięty
wszystkie ikony stały się już interaktywne, warto było- przycisk.

[ PROGR AMI STAJR . PL ] 23


PROGRAMOWANIE GIER

» Selected Color to barwa przycisku, który został


kliknięty. Utrzymuje się aż do momentu wywołania
interakcji z innym obiektem, na przykład kliknięcie
innego przycisku lub obszaru poza nim (tła).
» Disabled Color to barwa przycisku nieaktywnego
(z niezaznaczoną opcją Interactable).

Każdy z przedstawionych kolorów możemy dostosować


według własnych preferencji, klikając na rubrykę z kolo-
rem i wybierając nowy z wyświetlonej palety. Czas trwa-
nia przejścia z jednego stanu do drugiego (w sekundach)
możemy określić przy pomocy opcji Fade Duration. Za- Ilustracja 3. Komponent „Sphere Collider” jako miejsce
łóżmy na przykład, że wartość ta ustalona jest na 5, wów- interakcji z kowalem
czas najeżdżając kursorem myszy na przycisk, zmianę
jego barwy odnotowalibyśmy dopiero po pięciu sekun- z widokiem kuźni, stąd też nazywamy je na przykład
dach. Tyle jeśli chodzi o kwestie wizualne. Najistotniejsza smithCanvas. Następnie potrzebujemy odpowiednio
w przycisku jest jednak obsługa zdarzeń. U dołu kompo- wykorzystać utworzoną detekcję. Kiedy gracz podejdzie
nentu znajdziemy przeznaczoną temu sekcję On Click(). do kowala (wejdzie w obszar triggera) – obiekt smith­
Domyślnie przycisk jest bezczynny, stąd też jego lista Canvas zostanie aktywowany. Analogicznie, kiedy odej-
zdarzeń będzie początkowo pusta. Aby dodać nową pozy- dzie, interfejs zostanie wyłączony. Dobrze byłoby także
cję, klikamy przycisk +, jednak w tym momencie musimy dezaktywować go na początku, gdyż w momencie roz-
już wiedzieć, co konkretnie nasz przycisk miałby robić, poczęcia rozgrywki nie będziemy znajdować się przy
gdyż konieczne będzie wskazanie obiektu z przypisanym kuźni. W tym celu w metodzie Start ustalamy status
skryptem, którego jedna z metod będzie wykonywana aktywności obiektu na false. Podobną funkcjonalność
w chwili jego naciśnięcia. Do tego zagadnienia jednak po- tworzyliśmy już ostatnio, lecz w ramach przypomnienia
wrócimy w chwili, gdy gotowy będzie nasz skrypt. opisane kroki prezentuję w Listingu 1.

INTERAKCJA Listing 1. Logika początkowej interakcji z kowa-


lem
Zanim jednak go utworzymy, warto byłoby wyposa-
żyć naszą kuźnię o trigger, który wykrywając obecność public class SmithTrigger : MonoBehaviour
gracza, wyświetli na ekranie przygotowany wcześniej {
interfejs. W tym celu analogicznie do triggerów z po- public GameObject smithCanvas;
przedniej części użyjemy obiektu z colliderem podsta-
void Start()
wowej geometrii. W moim przypadku będzie to Sphere
{
Collider umiejscowiony jak na Ilustracji 3.
smithCanvas.SetActive(false);
Pamiętajmy o zaznaczeniu najistotniejszego pola
}
Is Trigger w panelu inspektora, gdyż jak pamiętamy,
to właśnie ono aktywuje naszą detekcję. Jeśli wszystko private void OnTriggerEnter(Collider other)
udało się pomyślnie odwzorować, możemy przejść do {
skryptowania. W tym celu w katalogu Scripts tworzymy if (other.tag == "Player")
nowy plik języka C# i nazywamy go na przykład Smith­ {
Trigger. Skrypt ten wedle założeń obsłuży wyświetlanie smithCanvas.SetActive(true);
ofert z przedmiotami. Po pierwsze, tworzymy publicz- }
ne odwołanie typu GameObject. Za jego pośrednictwem }
chcemy odwoływać się do nowo utworzonego Canvasa

24 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity

private void OnTriggerExit(Collider other)


{
if (other.tag == "Player")
{
smithCanvas.SetActive(false);
}
}
}

Gotowy skrypt dołączamy do obiektu z triggerem, a na-


stępnie przeciągamy obiekt naszego płótna w pustą ru-
brykę publicznego odwołania. Ilustracja 4. Symulacja „trzymania” broni przez postać
gracza
Świetnie! Jedna pozycja z naszej listy odhaczona. Mo-
żemy iść dalej! Skoro trzymamy już miecz, dobrze byłoby nauczyć się
wykonywać jakiś prosty atak. W drugiej części serii
NAUKA WŁADANIA MIECZEM o średniowiecznej przygodzie animowaliśmy wysuwany
Kolejnym krokiem logicznym jest możliwość dokona- panel ekwipunku. Tym razem czeka nas nieco większe
nia zakupu którejś z przedstawionych broni. Dobrze by- wyzwanie, gdyż chcemy stworzyć coś na wzór szybkie-
łoby jednak najpierw je przygotować, aby dobrze leżały go pchnięcia poprzedzonego lekkim wycofaniem ostrza.
w „dłoni” gracza oraz miały swoje animacje. W tym celu zaznaczając obiekt miecza, przechodzimy
W paczce dołączonej do pierwszej części artykułu do panelu Animation i analogicznie jak poprzednim ra-
znalazł się katalog o nazwie Cartoon Heroes, którego zem tworzymy animację bezczynnego miecza (Idle) wraz
zawartość między innymi stanowiły ciekawe, animowa- z kontrolerem.
ne postaci. Rozmieściliśmy je wówczas w różnych miej- Kiedy pomocniczy stan bezczynności jest już gotowy,
scach wioski, przez co zyskała ona swoich mieszkańców. możemy przejść do części właściwej, jaką jest animacja
Tym razem jednak interesują nas zawarte w paczce bro- ataku. Tworzymy nowy klip i wymyślamy mu intuicyjną
nie, które znajdziemy w podkatalogu Weapons. Ku miłe- nazwę. W moim przypadku będzie to SwordAttackAni­
mu zaskoczeniu autor przygotował ich aż cztery. mation (sword to z ang. miecz).
Wybierając którąś z nich, przechodzimy do folde- Omawiając temat animacji, powiedzieliśmy sobie,
ru 3D, a następnie przeciągamy oteksturowany model że w pierwszej kolejności należy dodać do klipu odpo-
miecza do obiektu kamery należącej do postaci gracza wiednie właściwości, takie jak na przykład pozycja czy
w panelu hierarchii. Dlaczego do kamery, a nie do sa- rotacja animowanego obiektu. Następnie za ich pośred-
mego obiektu Player? Powodem jest to, że nasza postać nictwem jesteśmy w stanie ustalić konkretne wartości
ma możliwość obracania kamery przy pomocy myszy. dla poszczególnych osi w czasie trwania animacji. Jest
Chcemy, aby broń była ułożona poprawnie niezależ- to oczywiście dobry sposób, lecz nie jedyny. W zakładce
nie od tego, czy gracz patrzy w górę, czy przed siebie. Animation znajdziemy bowiem pewien ciekawy przy-
Umieszczając ją w kamerze, zyskujemy jej rotację wraz cisk oznaczony czerwoną kropką. Symuluje on niejako
z obiektem nadrzędnym. „nagrywanie” animacji. Jak z tego skorzystać? Po doda-
W kolejnym kroku przechodzimy do panelu inspek- niu interesujących nas właściwości tworzymy punkty na
tora, gdzie zerujemy położenie na wszystkich osiach, co osi czasu i najeżdżamy na nie wskaźnikiem. Teraz klika-
pozwoli nam ustawić model wewnątrz postaci. Z tego my czerwony przycisk nagrywania, a następnie ręcznie
miejsca w łatwy sposób możemy doszukać się najlepsze- przesuwamy lub obracamy obiekt na scenie przy po-
go ułożenia, modyfikując wartości komponentu Trans­ mocy poznanych już narzędzi. Warto zwrócić uwagę, że
form wedle własnego uznania. W moim przypadku bę- podczas „nagrywania” animacji elementy osi czasu oraz
dzie to ręka prawa jak na Ilustracji 4. tło przycisku stają się czerwone, co nie pozwoli nam

[ PROGR AMI STAJR . PL ] 25


PROGRAMOWANIE GIER

przeoczyć, czy proces już się zakończył, czy animacja Pora na utworzenie parametru wyzwalającego nasz
nadal sczytuje nowe wartości (Ilustracja 5). atak. W przypadku panelu ekwipunku używaliśmy typu
Bool, który poprzez swoje logiczne stany informował
animatora, która animacja ma zostać odtworzona. Tym
razem skorzystamy z Triggera. Hmm… Gdzieś padło już
to słowo! W tym przypadku nie będzie to jednak trigger
działający w oparciu o collider, a specjalny wyzwalacz
animacyjny, powodujący przejście do konkretnego blo-
ku. Aby go dodać, wybieramy zakładkę Parameters, na-
Ilustracja 5. Wizualne zmiany towarzyszące nagrywanej stępnie + i Trigger. Nazwijmy go na przykład Attack. Te-
animacji raz, by wszystko działało jak należy, wybieramy strzałkę
prowadzącą do animacji ataku i z prawej strony w sekcji
Dodajmy teraz kilka nowych punktów na osi czasu i przy Conditions wybieramy z listy nazwę nowo utworzone-
pomocy narzędzia do nagrywania odwzorujmy mniej lub go triggera. Jeśli chodzi o strzałkę powrotu, to pozostaje
bardziej realistyczny cios naszego ostrza. Każdorazowo ona bez przypisanego triggera, ponieważ każdorazowo
przy ukończeniu modyfikacji obiektu w czasie pamiętaj- po wykonaniu ataku mieczem chcemy, by przeszedł on
my o dezaktywacji czerwonego przycisku, aby uniknąć w stan bezczynności. W panelu animatora to w zasadzie
przypadkowych, niepożądanych zmian w edytowanym tyle. Teraz musimy jeszcze tylko wyłączyć zapętlenie
elemencie. Finalnie powinniśmy uzyskać coś na wzór użytych animacji, odnajdując je w jednym z folderów pa-
zamachu, szybkiego cięcia lub pchnięcia i powrotu do nelu projektowego i odznaczając pole Loop Time w pa-
pozycji początkowej. Nie przejmujmy się, jeżeli nie wyj- nelu inspektora. W porządku! Pora przejść do kolejnego
dzie nam za pierwszym razem, gdyż wymaga to nieco etapu, jakim będzie zaimplementowanie utworzonych
wyobraźni i wprawy. W tym przypadku dobrze jest dojść funkcjonalności w kodzie.
do perfekcji metodą prób i błędów, badając przebieg ani- W tym celu tworzymy nowy skrypt języka C# i na-
macji i modyfikując ustalone wartości. zywamy go na przykład SwordController. Na ten mo-
Jeśli wszystko jest gotowe, to możemy przejść do za- ment posłuży nam on jedynie do odtwarzania animacji
kładki Animator, w której nadamy klipom konkretne re- ataku, która wywoływana będzie z każdym naciśnięciem
lacje. Domyślnie na wejściu powinniśmy znaleźć animację wybranego przycisku. Po pierwsze, definiujemy w kla-
bezczynności, gdyż będzie to nasz stan początkowy. Klika- sie prywatne pole typu Animator, następnie pobiera-
jąc ją prawym przyciskiem myszy, wybieramy opcję Make my jego odwołanie funkcją GetComponent w domyślnej
Transition i prowadzimy utworzoną strzałkę do animacji metodzie Start. Możemy to zrobić, ponieważ skrypt ten
ataku. Analogicznie w drugą stronę, dzięki czemu uzyska- podpięty będzie do tego samego obiektu co komponent
my obustronną możliwość przejścia, jak na Ilustracji 6. animatora. Następnie w metodzie Update z każdą klat-
ką sprawdzamy, czy kliknięty został lewy przycisk myszy
(Mouse0). Jeżeli tak, wówczas na rzecz animatora wy-
wołujemy funkcję SetTrigger i w cudzysłowie podajemy
nazwę utworzonego przed chwilą parametru. Całość
prezentuje się jak w Listingu 2.

Listing 2. Ciało klasy „SwordController”

public class SwordController : MonoBehaviour


{
private Animator animator;
Ilustracja 6. Odpowiednio połączone klipy animacyjne
void Start()

26 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity

{ Jeśli udało nam się w ten sposób utworzyć kilka poten-


animator = GetComponent<Animator>(); cjalnie różnych obiektów, możemy przetestować całość.
} Aby wszystkie bronie nie były widoczne naraz, zosta-
void Update() wiamy jedną, a resztę dezaktywujemy, odznaczając pole
{ znajdujące się na samej górze panelu inspektora, tuż
if(Input.GetKeyDown(KeyCode.Mouse0)) obok nazwy danego obiektu. Co istotne, stan aktywności
{ możemy zmieniać również w czasie trwania rozgrywki.
animator.SetTrigger("Attack");
} PRZENIKANIE MIECZA
} Testując nasze nowe bronie, napotkałem jeden wi-
} zualny problem. Mianowicie, gdy zbliżamy się do ścia-
ny jakiegoś budynku lub innego obiektu, ostrze niejako
Zapisujemy i wracamy do Unity. Tak przygotowany przenika przez napotkaną przeszkodę, co nie wygląda
skrypt przeciągamy teraz z panelu projektowego do in- zbyt zachęcająco (Ilustracja 8).
spektora naszego miecza, czyli obiektu z animatorem.
Rozpoczynamy rozgrywkę i testujemy. Jeśli wszystko
działa jak należy, możemy spróbować dodać kolejne bro-
nie z oferty kowala. Ponowne odwzorowywanie wszyst-
kich poprzednich kroków byłoby jednak troszkę cza-
sochłonne, dlatego pójdziemy na skróty i skorzystamy
z przygotowanych elementów, podmieniając wyświe-
tlany model danego miecza. Zaznaczamy jego obiekt
w panelu hierarchii i wciskamy kombinację klawiszy
Ctrl + D (duplikowanie). Wybieramy nowy, zduplikowany
element i odszukujemy w jego panelu inspektora kom-
ponent Mesh Filter. Z listy przy rubryce Mesh wybie-
Ilustracja 8. Przenikanie miecza przez inne obiekty
ramy inny model miecza (najlepiej ten z kolejnej ikony u
kowala). Teraz kierujemy wzrok poniżej do komponentu Problem ten możemy naprawić na kilka sposobów. Cie-
Mesh Renderer i w miejsce oznaczone jako Element 0 kawym rozwiązaniem jest zastosowanie drugiej kamery,
wybieramy pasujący materiał (Ilustracja 7). której zadaniem będzie osobne renderowanie samego
obiektu miecza. Klikając prawym przyciskiem myszy na
już istniejącą kamerę w obiekcie Player, wybieramy po-
zycję Camera. Została ona dodana jako kolejny podobiekt
głównej kamery razem ze wszystkimi mieczami. Teraz
musimy pobawić się warstwami. Warstwy, tak samo jak
tagi, są kolejnym, bardzo wygodnym sposobem grupo-
wania obiektów. W przypadku kamery okazuje się to dla
nas o tyle przydatne, że możemy zadecydować o tym,
które warstwy mają być renderowane, a które nie.
W pierwszej kolejności tworzymy nową warstwę na ta-
kiej samej zasadzie jak tworzyliśmy tagi. W moim przy-
padku nadana została nazwa Item. Następnie zaznacza-
my obiekty naszych broni i oznaczamy je odpowiednią
Ilustracja 7. Podmiana siatki i materiału w zduplikowa-
pozycją z rozwijanej listy Layer. Kolejnym krokiem bę-
nym obiekcie miecza
dzie edycja kamery głównej. W jej komponencie Camera

[ PROGR AMI STAJR . PL ] 27


PROGRAMOWANIE GIER

dla pozycji Culling Mask odznaczamy naszą nowo utwo- Listing 3. Ciało klasy „ItemsController”
rzoną warstwę, co spowoduje ukrycie jej przedstawicieli public class ItemsController : MonoBehaviour
z obrazu kamery. Teraz przechodzimy do drugiej, po- {
mocniczej kamery i postępujemy dokładnie odwrotnie, public List<SwordController> swords;
czyli zaznaczamy naszą warstwę, a odznaczamy wszyst- private InventoryController inventoryController;
kie inne. Pojawia się jednak pytanie, której kamery ob-
void Start()
raz będzie brany pod uwagę jako pierwszy? Do określe-
{
nia ich priorytetu służy tak zwana głębia (ang. depth).
inventoryController = FindObjectOfType
W naszym przypadku pierwsza będzie renderowała
<InventoryController>();
kamera Main, stąd też w jej inspektorze pozostawiamy
}
domyślną wartość głębi (0), a kamera druga (podrzędna),
zgodnie z przyjętą regułą, dostanie wartość Depth rów- private void Update()
ną 1. Ostatnim krokiem będzie zmiana opcji Clear Flags {
na Depth only w kamerze pomocniczej, co spowoduje if (Input.GetKeyDown(KeyCode.Alpha1))
renderowanie z głębi w niewypełnionych obrazem miej- {
scach. Efekt widoczny jest na Ilustracji 9. ActiveSword(0);
}

if (Input.GetKeyDown(KeyCode.Alpha2))
{
ActiveSword(1);
}

if (Input.GetKeyDown(KeyCode.Alpha3))
{
ActiveSword(2);
}
}

Ilustracja 9. Naprawienie przenikania miecza przy uży- public void ActiveSword(int id)
ciu drugiej kamery {
for (int i = 0; i < swords.Count; i++)
Celowo zrzut ekranu został wykonany w tym samym {
miejscu co Ilustracja 8, aby dobrze zaobserwować po- swords[i].gameObject.SetActive
wstałą różnicę. (i == id && swords[i].isPurchased &&
!swords[i].gameObject.activeInHierarchy);
ZAKUP BRONI }
Kiedy wszystkie aspekty wizualne mamy już przygo- }
towane, możemy dezaktywować wszystkie obiekty bro-
public void BuySword(int id)
ni i przejść do napisania najważniejszego skryptu łączą-
{
cego wszystkie powyższe elementy w spójną, logiczną
int woodCost = 0;
całość. Tworzymy nowy plik języka C#, który nazywamy
int ironCost = 0;
na przykład ItemsController. Za jego pomocą zgodnie
z wcześniejszym planem będziemy chcieli móc dokonać switch (id)
zakupu wybranego miecza oraz obsłużyć jego aktywo- {
wanie w ręce gracza. Cały skrypt przedstawiony został case 0:
w Listingu 3. woodCost = 4;

28 [ 4 - 202 1 ]
Średniowieczna przygoda – gra RPG w środowisku Unity

ironCost = 6; Pod spodem warunek: Jeżeli liczba aktualnie posiadane-


break; go drewna i żelaza jest większa lub równa wymaganej
case 1: > Zabierz je z mojego ekwipunku i zaktualizuj wyświetla-
woodCost = 5; ne na widoku dane.
ironCost = 8; Na koniec dobrze byłoby wiedzieć, który miecz został
break; już kupiony, a który jeszcze nie. W tym celu na moment
case 2: przejdziemy do skryptu SwordController i dodamy mu
woodCost = 8; publiczne pole typu bool o nazwie isPurchased. Za jego
ironCost = 10; pomocą oznaczymy sobie obiekty już kupione. Zapisuje-
break; my i wracamy do ItemsController. Teraz odwołując się
} do obiektu miecza o określonym ID na liście, ustalamy
if (inventoryController.Wood >= woodCost wartość isPurchased na true, co jasno informuje nas,
&& inventoryController.Iron >= ironCost) że miecz ten został właśnie zakupiony.
{ Skoro faktycznie możemy coś już kupić, przydałoby
inventoryController.Wood -= woodCost; się pokazać to na widoku. Do tego posłuży nam metoda
inventoryController.Iron -= ironCost; ActiveSword, której działanie również opiera się o do-
inventoryController.UpdateItemsCount(); starczony w parametrze identyfikator. Przechodzimy
pętlą po wszystkich broniach, a następnie aktywowany
swords[id].isPurchased = true;
zostanie ten miecz, którego ID zgadza się z tym dostar-
}
czonym, który ma status zakupionego oraz nie jest aktu-
}
alnie aktywny w hierarchii.
}
Ostatnia część warunku zapewni nam niejako dzia-
łanie obustronne, ponieważ gdy miecz będzie aktualnie
W pierwszej kolejności tworzymy potrzebne odwołania. trzymany przez postać, zostanie on schowany. Teraz
W tym przypadku przyda nam się publiczna lista mieczy, funkcję tę wywołujemy w domyślnej metodzie Update.
które zdefiniujemy za pośrednictwem panelu inspektora, W zależności od klikniętego na klawiaturze przycisku
a także napisany ostatnim razem InventoryController, numerycznego (1, 2 lub 3) funkcja ta otrzyma inny para-
przechowujący informacje o aktualnie posiadanych przez metr z identyfikatorem miecza. Tyle!
gracza surowcach. To odwołanie będzie z kolei prywatne, Wracamy do Unity i podpinamy całość. Nasz skrypt
gdyż wyszukujemy i przypisujemy ów skrypt w ciele do- ItemsController dobrze byłoby podłączyć do obiektu,
myślnej metody Start. którego status aktywności nie ulega zmianie, gdyż sta-
Idąc dalej, potrzebujemy metody, która przypisana le potrzebujemy dostępu do jego funkcjonalności. Ja dla
do konkretnego przycisku na interfejsie kuźni, pozwoli przykładu umieściłem go w obiekcie SmithTrigger. Roz-
nam kupić wybraną broń. Myślę, że dobrą nazwą będzie wijamy teraz publiczne odwołanie do listy mieczy, poda-
tutaj BuySword. Metoda ta przyjmowała będzie para- jemy ich ilość, a następnie przeciągamy każdy z nich do
metr typu int, określający identyfikator danego miecza. osobnej rubryki jak na Ilustracji 10.
Jak pamiętamy z Ilustracji 1, każdy oręż miał swoją ściśle
określoną cenę przedstawioną w surowcach. Musimy
w takim razie zdefiniować sobie pomocnicze zmienne
liczbowe przechowujące te wartości. Dla drewna będzie
to woodCost, natomiast dla żelaza ironCost. Początko-
wo obie otrzymają wartość 0 w celu zainicjalizowania
zmiennych lokalnych. Następnie tworzymy instrukcję
Switch, która w zależności od wybranego miecza (do- Ilustracja 10. Zdefiniowanie listy mieczy w komponencie

starczonego ID) ustali ceną zgodnie z cennikiem w kuźni.

[ PROGR AMI STAJR . PL ] 29


PROGRAMOWANIE GIER

Na koniec, kiedy nasz skrypt jest już gotowy, cofnie- numerów, lecz w tym miejscu zostawiam was, młodzi
my się do początku, gdzie wspominaliśmy o obsłudze wojownicy i wojowniczki. Pamiętajcie, że średniowiecz-
zdarzeń klikniętych przycisków. Musimy teraz odszukać na przygoda nadal może trwać dzięki wam. Dlatego też
na Canvasie kuźni wszystkie nasze przyciski. W sekcji w materiałach na stronie internetowej PJr dorzucam
OnClick jako odwołanie przeciągamy obiekt ze skryp- ciekawą niespodziankę. Znajdziecie tam przygotowany
tem ItemsController, następnie rozwijamy listę z pra- przeze mnie prefab mrocznego rycerza, będącego na-
wej strony, wybieramy ItemsController > BuySword. Po jeźdźcą naszej wioski. Rozstawiając jego obiekty w świe-
wyborze metoda ta odsłoniła poniżej dodatkową rubry- cie gry, wioska nie będzie już taka spokojna. Dodałem
kę na wpisanie jej przyjmowanego parametru z identyfi- też skrypt AttackController, który pozwoli nam podjąć
katorem broni. W programowaniu indeksujemy od zera, walkę i pokonać rycerza przy pomocy wytworzonego
stąd też przycisk pierwszy zyska wartość 0, drugi 1, miecza. Uwaga! Konieczne jest podłączenie go w inspek-
a trzeci 2. Jeżeli wszystko udało się pomyślnie podpiąć, torze naszej postaci… Inaczej nie zadziała. Powodzenia!
możesz nazbierać trochę surowców i przejść do testów.
Kowal z pewnością nie może doczekać się pierwszego
klienta! Tomasz Błaszczyk
Autor książki „Tworzenie gier dla początkujących”,
PODSUMOWANIE na co dzień programista gier w katowickim studiu.
Na zakończenie pozostaje mi podziękować za tę Po godzinach korepetytor, pasjonat elektronicznej
wspólną przygodę, która, mam nadzieję, potwierdziła rozrywki oraz fan dobrej książki. Ceni sobie kre-
słowa, że w tworzeniu gier ogranicza nas jedynie nasza atywność, solidnie wykonaną pracę i pasję.
wyobraźnia. Temat, którego podjąłem się w serii swo-
HTTPS://TOMASZBLASZCZYK.GITHUB.IO/PORTFOLIO/
ich artykułów, jest na tyle wszechstronny, że można
TOMASZBLASZCZYK1998@GMAIL.COM
by rozbudowywać go jeszcze przez kolejne kilkanaście

Zapamiętaj Ćwicz w domu


օ Przy pracy z wieloma kamerami ich priorytet ren- օ Zapoznaj się z treścią dołączonych dodatkowo
derowania określa tak zwana głębia (Depth). skryptów i spróbuj stworzyć mechanizm, który po
uderzeniu nas przez przeciwnika wyświetli pół-
օ Zdarzenie kliknięcia przycisku może zostać ob-
przezroczyste czerwone płótno na ekranie, które
służone poprzez podłączenie obiektu ze skryptem
będzie znikać w momencie kliknięcia (zjedzenia)
i wybranie konkretnej jego metody.
owocu w panelu ekwipunku.
օ Animacje możemy tworzyć, wpisując konkretne
wartości lub „nagrywając” je.

օ Przytrzymując klawisz „Ctrl” lub „Shift”, jesteśmy


w stanie zaznaczyć w panelu hierarchii więcej
obiektów naraz. Przetestuj oba, by zobaczyć
różnicę.

30 [ 4 - 202 1 ]
PROGRAMOWANIE GIER

Adam Jurkiewicz, Katarzyna Wasilkowska

Gra przygodowa „Enigma


– Polacy, którzy uratowali świat”
Tworzymy pierwsze okno z tłem
W poprzednim artykule nauczyliście się, w jaki sposób używać programowania obiek-
towego oraz jak korzystać z różnych dodatków w Pythonie. Dzisiaj zaczniecie zabawę
z obrazem, czyli w oknie na naszej platformie (https://kodujwpythonie.pl/pl/enigma) bę-
dziecie wyświetlać różne tła. W kolejnych rozdziałach na tle pojawi się bohater, a także
dodatkowe elementy.

12+

Dowiesz się Potrzebna wiedza


օ Jak tworzymy funkcje. օ Definiowanie funkcji w języku Python.
օ Jak możemy wyświetlać pliki graficzne w języku օ Typy zmiennych i obiektów w języku Python.
Python.
օ Znajomość poprzednich artykułów tej serii.
օ Jak wywoływać metody wbudowane w języku
Python.

FORMATY GRAFICZNE PLIKÓW Zdefiniujcie funkcję, która będzie miała następujące


Na pewno wiecie, że istnieją różne formaty graficzne, właściwości:
jak na przykład JPG, PNG, GIF, TGA, WMF, BMP. » jako parametry będzie przyjmować napis, który po-
W grze będziecie wykorzystywać dwa rodzaje plików: jawi się w tytule, oraz nazwę pliku graficznego, który
» JPG – dla wyświetlania tła naszej gry. będziemy chcieli wyświetlić,
» PNG – dla wyświetlania różnych elementów, jak na » sprawdzi, czy podaliśmy jakiekolwiek dane, aby móc
przykład postaci czy teleportów (które będą poma- działać,
gały bohaterowi przenosić się w przestrzeni). » nie będzie weryfikować, czy plik graficzny istnieje
(założymy, że pliki istnieją, ale jeśli ktoś jest chętny,
Tło w plikach PNG może być przezroczyste i tak jest zawsze może spróbować napisać odpowiedni kod
właśnie u nas. Wyświetlone obiekty nie będą zatem weryfikujący istnienie pliku),
prostokątami. » wyświetli zawartość obrazka z pliku na ekranie.
W poprzedniej części artykułu nauczyliście się stero-
wać rozmiarem okna i jego tytułem, czas więc wykorzy- Rzućmy okiem na kod funkcji i zastanówmy się, jak on
stać tę wiedzę. działa:

32 [ 4 - 202 1 ]
Gra przygodowa „Enigma – Polacy, którzy uratowali świat”

Ilustracja 1. Obraz ekranu startowego gry (autor ilustracji: Ignacy Trojanowicz)

# definiujemy funkcję, która wyświetli obrazek


Zauważcie, że pierwszym elementem tej funkcji jest
# tła podany jako parametr
instrukcja warunkowa, która bada, czy podano jakąkol-
def game_window(title, background):
wiek wartość dla obiektu title lub background. W języ-
if not title or not background:
ku Python, jeśli wartość obiektu wynosi 0, None jest ko-
return None
lekcją bez żadnego elementu lub jest pustym łańcuchem
file = ( znaków "", wyrażenie not obiekt ma wartość True. Za-
"./sandbox/images/background/" tem: jeśli nie będzie żadnej wartości dla title lub back-
+ background ground, wówczas funkcja kończy swoje działanie, czyli
) nic się nie wykona.
# ustalimy tytuł okna, aby móc sprawdzać, A co będzie, jeśli nie podamy w ogóle żadnych parame-
# czy odpowiednie pliki są wyświetlane trów? Wtedy nasze środowisko zgłosi błąd. Na przykład:
pygame.display.set_caption(title + " - " +
str(window_size) + " | " + background) TypeError: game_window() takes exactly 2 arguments
# wczytujemy plik tła (0 given) on line 36
background_picture = pygame.image.load(file)
# wyświetlamy plik tła Właściwie nie ma potrzeby nic tu wyjaśniać – wystarczy
window.blit(background_picture, (0, 0)) przeczytać komunikat. Oczywiście musimy sobie radzić
# aktualizujemy wyświetlane okno z językiem angielskim, ale jak powiedzieliśmy już sobie
pygame.display.update() wcześniej – jeśli chcemy programować, musimy go znać.

[ PROGR AMI STAJR . PL ] 33


PROGRAMOWANIE GIER

Żeby nasz program działał bez błędów, w kodzie na Aktualizuje ono ekran, czyli powoduje „wyświetlenie
naszej platformie www.kodujwpythonie.pl wstawmy znak fizyczne na ekranie” wszystkich elementów, które usta-
komentarza na początku linii 36 (gdzie znajduje się kod liliśmy wcześniej. Musimy zwracać baczną uwagę na to,
„game_window()”) w skrypcie z Rozdziału 04. gdzie i ile razy wykonujemy tę funkcję w naszym pro-
Dla chętnych – możemy też zmienić definicję funkcji, gramie, ponieważ bardzo absorbuje pracę przeglądarki.
aby nasze parametry przyjmowały jakieś domyślne war- Jeśli będziemy wywoływać ją zbyt często, możemy spra-
tości. W takim przypadku nawet wywołanie bez argu- wić, że nasza przeglądarka w komputerze się „zawiesi”,
mentów da poprawny efekt. Jeśli chcemy tak zdefinio- a wtedy będziemy musieli ją zrestartować.
wać funkcję, używamy składni: Wróćmy do głównego programu. Wywołajmy naszą
zdefiniowaną funkcję game_window() z różnymi warto-
def nazwa_funkcji(parametr_1 = "wartość domyślna", ściami parametrów, a następnie każdorazowo funkcję
parametr_2 = 10): sleep(), aby przez kilka sekund zatrzymać obraz na
# ekranie. W ten sposób będziemy mogli zaobserwować
# blok kodu funkcji zmiany w obrazie.
Sprawdźmy, jak może wyglądać nasz przykładowy kod:
Ważna jest metoda pygame.image.load(file). Tworzy
ona specyficzny obiekt, który zawiera obraz z wczyta- # tworzymy pierwsze okno z tłem
nego pliku. Używamy go potem w poleceniu window. #
blit(background_picture, (0, 0)). import pygame
Skąd jednak wiemy, że możemy skorzystać z win- from time import sleep
dow_size oraz window dla metody blit()? Musimy
# definiujemy funkcję, która wyświetli obraz tła
opowiedzieć tu o koncepcji „przestrzeni nazw” w języku
# podany jako parametr
Python. Możemy ją (przynajmniej na wczesnym etapie
def game_window(title, background):
nauki programowania w języku Python) połączyć z klasą,
if not title or not background:
metodą lub funkcją. To nie są wszystkie możliwości, ale
return none
na początek będą w sam raz. W naszym przypadku mu-
simy zapamiętać pewną bardzo ważną zasadę. file = (

Otóż jeśli utworzymy obiekt w globalnej przestrzeni "./sandbox/images/background/"

nazw programu (czyli umieścimy kod tworzący go poza + background

funkcjami, czy też bez żadnych wcięć), możemy odwołać )

się do niego z każdej funkcji tego programu, jeśli funkcję # ustalimy tytuł okna, aby móc sprawdzać,

wywołamy po inicjalizacji takiego obiektu. # czy odpowiednie pliki są wyświetlane

Dzięki takiej możliwości wewnątrz naszej funkcji pygame.display.set_caption(

mamy dostęp do obiektu window czy też do window_size. title

Tu krótka zapowiedź tematu, któremu przyjrzymy + " - "

się dokładniej w następnych artykułach, a mianowicie: + str(window_size)

obiekty rodzaju mutable (z ang. zmienne) oraz obiek- + " | "

ty rodzaju immutable (z ang. niezmienne). W tej chwili + background

przyjmijcie tylko fakt, że obiekt window (jako obiekt zde- )

finiowanej klasy) jest rodzaju mutable, a obiekt window_ # wczytujemy plik tła

size (jako typ tuple) jest rodzaju immutable. O tych background_picture = pygame.image.load(file)

rodzajach obiektów opowiemy w następnym numerze. # wyświetlamy plik tła

Na końcu naszej funkcji wykonujemy bardzo ważne window.blit(background_picture, (0, 0))

polecenie: pygame.display.update().

34 [ 4 - 202 1 ]
Gra przygodowa „Enigma – Polacy, którzy uratowali świat”

Ilustracja 2. Obraz ekranu gry (autor ilustracji: Ignacy Trojanowicz)

# aktualizujemy wyświetlane window title2 = "Aktualna lokalizacja : "


pygame.display.update() window_title = title1 + title2

pygame.init() # wywołujemy funkcję z naszymi wartościami


WIDTH = 870 # parametrów
HEIGHT = 435 win_title = window_title + "Lwów"
# zmienna window_size jest typu `tuple` game_window(
window_size = (WIDTH, HEIGHT) win_title, "rooms-poland-lwow-sknilow-02.jpg"
# tworzymy obiekt okna tylko 1 raz na początku )
window = pygame.display.set_mode(window_size) sleep(3)

# ustalamy tytuł okna # koniec aplikacji, zamykamy środowisko


title1 = ( pygame.quit()
"Polacy w Biurze Szyfrów - tajemnica Enigmy"
+ "\n"
)

[ PROGR AMI STAJR . PL ] 35


PROGRAMOWANIE GIER

Eksperymentujmy – sprawdźmy różne nazwy plików.


Do dyspozycji mamy między innymi: Adam Jurkiewicz
Haker edukacji, członek nieformalnej grupy „Su-
» rooms-england-bletchley-park-01.jpg perbelfrzyRP”. Absolwent kursów Massachusetts
» rooms-england-bletchley-park-02.jpg Institute of Technology oraz IBM Professional Data
» rooms-england-bletchley-park-03.jpg Science z języka programowania Python. Trener
języka programowania Python, robotyki. Programi-
» rooms-france-paris-01.jpg
sta, administrator systemów UNIX/Linux, twórca
» rooms-france-paris-02.jpg remiksu edukacyjnego FREE_Desktop.
» rooms-france-paris-03.jpg
» rooms-german-uboot-01.jpg ADAM@ABIXEDUKACJA.EU
» rooms-german-uboot-02.jpg
» rooms-poland-lwow-sknilow-01.jpg
» rooms-poland-lwow-sknilow-02.jpg K a t a r z y n a W a s i l k o w s ka
» rooms-poland-warsaw-cipher-bureau-01.jpg Autorka licznych powieści i opowiadań dla dzieci
» rooms-poland-warsaw-cipher-bureau-02.jpg i młodzieży, odpowiedzialna za opiekę literacką pro-
» rooms-poland-warsaw-cipher-bureau-03.jpg jektów Fundacji Rozwoju Edukacji Cyfrowej, między
» rooms-poland-warsaw-cipher-bureau-04.jpg innymi książki „Koduj w Pythonie – tworzymy grę
przygodową”.

KATARZYNA.WASILKOWSKA@GMAIL.COM

Zapamiętaj Ćwicz w domu


օ Pliki graficzne mają różne formaty. օ Spróbuj tak zmodyfikować kod, aby wyświetlić po
kolei wszystkie pliki graficzne na ekranie. Jeśli
օ W języku Python występują przestrzenie nazw.
ktoś chce, może spróbować zrobić to w maksy-
օ Jeśli utworzymy obiekt w głównej przestrzeni malnie 10 linijkach kodu (poza definicją funkcji
nazw, mamy do niego dostęp z każdej przestrzeni, „game_window()”).
na przykład z wnętrza funkcji.

օ W języku Python pewne obiekty są rodzaju „muta-


ble”, a pewne „immutable”.

օ Parametry funkcji mogą w definicji przyjmować


wartości domyślne.

օ Metoda „pygame.display.update()” aktualizuje


fizyczny obraz gry w przeglądarce.

36 [ 4 - 202 1 ]
PROGRAMOWANIE GIER

Przemysław Folholc

Budowniczy Robloxa: sklep z przepustkami


Roblox jest jedną z najpopularniejszych platform do tworzenia gier komputerowych. Cykl
„Budowniczy Robloxa” to seria artykułów, dzięki którym krok po kroku wspólnie zapro-
gramujemy projekty gier, poznamy dostępne funkcje platformy i podstawy języka Lua.
Przed nami projekt „Gamepass Shop”. Do dzieła!

10+

Dowiesz się Potrzebna wiedza


օ Jak stworzyć sklep w Robloxie. օ Podstawowa wiedza o Robloxie.
օ Jak dodać narzędzia do projektu. օ Podstawowa umiejętność pisania kodów w Lua.
օ Jak stworzyć przepustkę. օ Umiejętność poruszania się po środowisku „Roblox
Studio”.
օ Odkryjesz jedną z tajemnic „Budowniczego
Robloxa”.

P rzepustki, inaczej nazywane „Passes”, zapewniają gra-


czom specjalne przywileje i umiejętności w grach, na
przykład super skok czy zwiększona szybkość porusza-
TWORZENIE NOWEGO PROJEKTU
„GAMEPASS SHOP”
Uruchamiamy Roblox Studio i zaczynamy od wybra-
nia. Przepustki te można tworzyć bezpłatnie i sprzeda- nia szablonu Baseplate.
wać za określoną ilość robuxów w danej grze. Jest to je- Kiedy już projekt zostanie stworzony, pierwszą czyn-
den ze sposobów na zarobienie tej cennej waluty. nością, którą należy wykonać, jest publikacja projektu.

Ilustracja 1. Główne menu z szablonami do tworzenia gier w „Roblox Studio”

38 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami

Klikamy przycisk FILE, który znajduje się w lewym Następnie przechodzimy do kategorii Security i włą-
górnym rogu ekranu, kolejno wybieramy z listy Publish czamy opcję Allow Third Party Sales. Pozwoli nam to
to Roblox. przeprowadzić test zakupu na uruchomionym lokalnie
serwerze. Po sprawdzeniu możesz wyłączyć tę opcję.

Ilustracja 4. Ustawienia gry – kategoria bezpieczeń-


stwo
Ilustracja 2. Publikacja projektu w „Roblox Studio”

Nazwa projektu jest dowolna, można go nazwać na przy- Zaczynamy budowanie sklepu od dodania ScreenGui do
kład Gamepass Shop. StarterGui, które znajduje się w Explorerze.
Po uruchomieniu projektu przechodzimy do usta-
wień gry. Przycisk Game Settings znajdziesz w kategorii
HOME. Do tych ustawień można również dostać się za
pomocą przycisku FILE. Ilustracja 5. Dodany „ScreenGui”

Następnie zmieniamy nazwę ScreenGui na Shop i doda-


jemy do niego TextButton – Ilustracja 6.
Ilustracja 3. Przycisk ustawień gry

Ilustracja 6. Dodanie i modyfikacja właściwości elementu „TextButton”

[ PROGR AMI STAJR . PL ] 39


PROGRAMOWANIE GIER

Kolejno modyfikujemy właściwości w TextButton: TWORZENIE NAPISU „GAMEPASS SHOP”


» BackgroundColor3: [42, 120, 214] ORAZ PRZYCISKU DO ZAMYKANIA SKLEPU
» BorderColor3: [42, 120, 214] Aby to osiągnąć, należy dodać TextButton oraz Text­
» BorderSizePixel: 5 Label do Frame, następnie zmieniamy nazwę TextBut­
» Position: {0.03,0},{0.35,0} ton na ExitButton.
» Size: {0.1,0},{0.1,0}
» SizeConstraint: RelativeXX
» Font: FredokaOne
» Text: GAMEPASS SHOP
» TextColor3: [255, 255, 255]
» TextScaled: Zaznaczony
Ilustracja 8. Dodany „TextButton” oraz „TextLabel” do
„Frame”
Kolejnym krokiem jest dodanie Frame do Shop oraz do-
datkowo zmieniamy nazwę TextButton na OpenButton.
Następnie modyfikujemy właściwości we Frame:
» AnchorPoint: 0.5, 0.5
» BackgroundColor3: [180, 180, 180]
» BorderColor3: [42, 120, 214]
» BorderMode: Inset Ilustracja 9. Element „TextButton” po zmianie nazwy na
„ExitButton”
» BorderSizePixel: 4
» Position: {0.5, 0},{0.5, 0} Następnie zmieniamy właściwości:
» Size: {0.3, 0},{0.2, 0}
» SizeConstraint: RelativeXX EXITBUTTON: TEXTLABEL:
› BackgroundColor3: [255, › BackgroundColor3: [42,
0, 0] 120, 214]
› BorderColor3: [42, 120, 214] › BorderColor3: [42, 120, 214]
› BorderMode: Inset › BorderMode: Inset
› BorderSizePixel: 4 › BorderSizePixel: 4
› Position: {0.8, 0},{0, 0} › Position: {0, 0},{0, 0}
› Size: {0.2, 0},{0.2, 0} › Size: {0.8, 0},{0.2, 0}
› SizeConstraint: RelativeXX › SizeConstraint: RelativeXX
› Font: FredokaOne › Font: FredokaOne
› Text: X › Text: GAMEPASS SHOP
› TextColor3: [255, 255, 255] › TextColor3: [255, 255, 255]
› TextScaled: Zaznaczony › TextScaled: Zaznaczony

Ilustracja 7. Dodanie i modyfikacja „Frame”

Ciekawostka
Zmiana punktu zakotwiczenia „AnchorPoint” pozwala na
łatwiejsze wycentrowanie elementu GUI.

Ilustracja 10. Dodany tekst „GAMEPASS SHOP” oraz


zamykanie sklepu

40 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami

W sklepie nie ma jeszcze żadnych przycisków do Zaznaczenie jej pozwoli na rozciągnięcie elementu gra-
przepustek. Aby to zmienić, dodaj dwa ImageButton do ficznego na pełny ekran.
Frame.

Wskazówka!

Budujesz interfejs graficzny, ale przeszkadza ci on w


pracy, gdy chcesz coś dodać do swojej gry? Wystarczy, że
klikniesz na przycisk z oczkiem znajdujący się w prawym
górnym rogu nad ekranem sceny.

Ilustracja 11. Dodanie dwóch „ImageButton” do „Frame”

Ilustracja 14. Ilustracja 15.


Kliknięcie na
Widoczny inter- Niewidoczny in-
przycisk
fejs graficzny terfejs graficzny

Sklep już jakoś wygląda, ale nie jest jeszcze funkcjonalny.


Możesz się o tym przekonać, wchodząc do gry.
Ilustracja 12. Zmiana nazwy dwóch „ImageButton”
Zaczniemy od stworzenia programów do otwierania
Kolejno zmieniamy właściwości: i zamykania sklepu.
Zanim do tego przystąpimy, należy wyłączyć widocz-
GRAVITYCOILBUTTON: SPEEDCOILBUTTON: ność sklepu. Aby to zrobić, wystarczy zmienić w obiek-
› BackgroundTranspar- › BackgroundTranspar- cie Frame właściwość Visible na odznaczoną.
ency: 1 ency: 1 Następnie dodajemy LocalScript do OpenButton oraz
› Position: {0.05, 0},{0.35, 0} › Position: {0.55, 0},{0.35, 0}
› Size: {0.4, 0},{0.4, 0} › Size: {0.4, 0},{0.4, 0} ExitButton
› SizeConstraint: RelativeXX › SizeConstraint: RelativeXX
› Image: rbxassetid://6208999878 › Image: rbxassetid://6350449886

W momencie kiedy już wprowadzisz wszystkie zmiany,


sklep powinien wyglądać jak na Ilustracji 13.

Ilustracja 16. Umiejscowienie dwóch programów typu


„LocalScript”

Ilustracja 13. Skończona warstwa wizualna sklepu


Warto wiedzieć
Chcesz mieć inny obrazek do przepustek? Możesz dodać
TAJEMNICA BUDOWNICZEGO ROBLOXA swój własny obrazek do „Images” w „Asset Manager” lub
Chcesz, aby twój sklep był na pełnym ekranie, ale znaleźć go w „Toolbox” w kategorii „Images”.
ograniczają cię systemowe guziki? Jest na to rada!
W ScreenGui znajduje się właściwość IgnoreGuiInset.

[ PROGR AMI STAJR . PL ] 41


PROGRAMOWANIE GIER

Program do otwierania sklepu za pomocą przycisku:

Listing 1. Kod programu „LocalScript”


w „OpenButton” Ilustracja 17. Przycisk „Toolbox”

function Open()
-- zmień we Frame Dodanie danego elementu z Toolboxa polega na kliknię-
-- właściwość Visible na true ciu na niego lewym przyciskiem myszy.
script.Parent.Parent.Frame.Visible = true
end

-- kiedy lewy przycisk kliknięty,


-- połącz się z funkcją Open
script.Parent.MouseButton1Click:Connect(Open)

Program do zamykania sklepu za pomocą przycisku:

Listing 2. Kod programu „LocalScript” w „ExitButton”

function Exit()
-- zmień we Frame
-- właściwość Visible na false Ilustracja 18. Dodanie „GravityCoil”

script.Parent.Parent.Visible = false
end

-- kiedy lewy przycisk kliknięty,


-- połącz się z funkcją Exit
script.Parent.MouseButton1Click:Connect(Exit)

-- odwołanie do serwisu UserInputService


local uIS = game:GetService("UserInputService")
-- kiedy jest żądanie skoku,
-- połącz się z funkcją Exit
uIS.JumpRequest:Connect(Exit)
Ilustracja 19. Dodanie „SpeedCoil”

Po napisaniu kodu można uruchomić grę i sprawdzić, Kiedy wybierzemy narzędzie, zostaniemy zapytani o to,
w jaki sposób działa otwieranie i zamykanie sklepu za czy umieścić narzędzie w starter pack. Zgadzamy się,
pomocą przycisków. Jak możesz zauważyć, w powyż- ponieważ należy je przetestować przed dodaniem go do
szym kodzie znajduje się również opcja zamykania skle- przepustki. Nie chcemy przecież, żeby ktoś zapłacił ro-
pu podczas skoku. Może się to przydać, kiedy gra zosta- buxami za niedziałające dodatkowe narzędzie.
nie uruchomiona na telefonie.

DODANIE NARZĘDZI GRAVITYCOIL ORAZ


SPEEDCOIL
GravityCoil to sprężynka, która pozwala na wyższe ska-
kanie. SpeedCoil pozwala na przyspieszenie poruszania.
Ilustracja 20. Dodanie narzędzie do „starter pack”
Na początku należy dodać dodatkowe narzędzia do
gry. W tym celu przechodzimy do Toolbox, a następnie Uruchamiamy grę i wybieramy dane narzędzie poprzez
wyszukujemy i dodajemy SpeedCoil oraz GravityCoil. wciśnięcie klawisza 1 lub 2 na klawiaturze. Można je

42 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami

również wybrać za pomocą kliknięcia myszką w dany


Ważne!
obrazek.
Sprawdź, czy nazwy narzędzi są takie same jak na ilu-
stracjach! Wielkość liter również ma znaczenie. Pamię-
taj także, aby nie stawiać spacji pomiędzy wyrazami
– w przeciwnym razie kod programu nie zadziała.

TWORZENIE PRZEPUSTEK
Przechodzimy do strony Robloxa pod adres WWW:
https://www.roblox.com/home i klikamy Create lub
wykorzystujemy bezpośredni link: https://www.roblox.
com/develop. Przechodzimy do My Creations.
Ilustracja 21. Test „GravityCoil” Przy aktualnie tworzonym projekcie klikamy zębatkę,
a następnie wybieramy z listy Create Pass.
Jeżeli jakieś narzędzie nie działa, spróbuj poszukać inne-
go. Często zdarza się, że obiekty z Toolboxa nie działają
tak jak powinny.

Ilustracja 25. Tworzenie przepustki dla danego projektu

Ilustracja 22. Test „SpeedCoil” Wskazówka!

Jeżeli wyświetliła się inna strona, pamiętaj, żeby zalogo-


Po udanych testach przenosimy GravityCoil oraz Spe­ wać się oraz kliknąć „Manage my experiences”.
edCoil do ReplicatedStorage. Jest to potrzebne, ponie-
waż będziemy dawać te narzędzia osobom, które wyku-
pią odpowiednią przepustkę.

Ilustracja 23. Przenosimy do Ilustracja 24.


Narzędzia „Replicated­ Narzędzia prze-
w „StarterPack” Storage” niesione do „Re-
plicatedStorage”

Ilustracja 26. Inna strona

[ PROGR AMI STAJR . PL ] 43


PROGRAMOWANIE GIER

Kiedy już jesteś na tym etapie, należy wybrać obrazek


z komputera (zalecany jest rozmiar 512x512 pikseli) oraz
format .jpg , .gif , .png , .tga lub .bmp. Następnie trzeba
nazwać przepustkę oraz stworzyć krótki opis. Na końcu
klikamy Preview.

Wskazówka!

Ponieważ grafika zostanie przycięta do postaci okrągłego


obrazu, nie należy umieszczać ważnych szczegółów na jej
obrzeżach.

Ilustracja 29. Pomyślne utworzenie przepustki oraz


przejście do konfiguracji

W kategorii General można zmienić nazwę przepustki,


obrazek oraz opis. Przechodzimy do kategorii Sales.

Ilustracja 27. Dodanie grafiki, nazwy oraz opisu prze-


pustki

Przed udostępnieniem przepustki sprawdzamy, czy wszyst-


ko wpisaliśmy poprawnie. Jeżeli wszystko jest w porząd-
ku, klikamy Verify Upload.

Ilustracja 30. Miejsce konfiguracyjne przepustki

Aby inni gracze mogli kupić naszą przepustkę, musimy ją


udostępnić do sprzedaży. W tym celu klikamy na przełącz-
nik, aby wyświetliła się możliwość wpisania ceny. W tym
przypadku została ustawiona na 10 robuxów. Na sam ko-
niec klikamy Save i powinna pojawić się informacja Suc­
cessfully updated.

Ilustracja 28. Weryfikacja przepustki

Po udanym wgraniu przepustki na serwer Robloxa po-


winna ukazać się informacja „Pass successfully created!”.
Następnie klikamy w zębatkę i przechodzimy do konfi- Ilustracja 31. Miejsce konfiguracyjne przepustki
guracji poprzez kliknięcie przycisku Configure.

44 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami

Listing 3. Kod programu do „AddTools”

Ciekawostka -- odwołanie do MarketplaceService


local mS = game:GetService("MarketplaceService")
Jak możesz zauważyć, 70% zarobionej kwoty przeznaczona
jest dla twórcy, pozostała część idzie do właścicieli Robloxa. -- odwołanie do ReplicatedStorage
local rS = game.ReplicatedStorage

-- id przepustki Gravity Coil


local idGC = 16547057
-- id przepustki Speed Coil
Ważne!
local idSC = 16548602
Do tworzonych programów będzie potrzebne id danej
-- odwołanie do zdarzenia AddGravityCoil
przepustki. Znajdziesz go w adresie strony (zaznaczone
kolorem żółtym): https://www.roblox.com/game-pass/ addGC = rS:WaitForChild("AddGravityCoil")
configure?id=16547057#!/sales. Dostęp do tego miejsca -- odwołanie do zdarzenia AddSpeedCoil
ma tylko twórca danej przepustki. addSC = rS:WaitForChild("AddSpeedCoil")

-- odwołanie do narzędzia GravityCoil


Tą samą czynność wykonujemy dla drugiej przepustki. gC = rS:WaitForChild("GravityCoil")
-- odwołanie do narzędzia SpeedCoil
DODANIE ZDARZEŃ sC = rS:WaitForChild("SpeedCoil")
Aby gracz mógł dostać narzędzie za odpowiednią
-- funkcja dodawania narzędzia
przepustkę, potrzebujemy dodać do Replicated Storage
function AddToolGravityCoil(player)
dwa RemoteEvent. Następnie zmieniamy im nazwę na
-- sklonuj narzędzie
AddGravityCoil oraz AddSpeedCoil.
local cloneGC = gC:Clone()
-- przypisz narzędzie do plecaka gracza
cloneGC.Parent = player.Backpack
end

function AddToolSpeedCoil(player)
local cloneSC = sC:Clone()
Ilustracja 32. Zmieniamy nazwę Ilustracja 33. cloneSC.Parent = player.Backpack
Dodanie dwóch na „AddGravity- Elementy po end
„RemoteEvent” Coil” oraz „Add- zmianie nazwy
do „Replicated SpeedCoil” -- kiedy gracz zostanie dodany
Storage”
game.Players.PlayerAdded:Connect(function(player)
Kolejnym krokiem jest utworzenie odpowiedniego pro- -- oraz dodany Character
gramu serwerowego. Tworzymy więc nowy skrypt do player.CharacterAdded:Connect(function()
ServerScriptService i nazywamy go AddTools.
-- ustaw zmienne logiczne na false
local hasPassGC = false
local hasPassSC = false

-- sprawdzenie, czy dany gracz


Ilustracja 34. Zmieniamy nazwę Ilustracja 35.
Skrypt dodany skryptu na Skrypt po zmia- -- posiada daną przepustkę
do „Server- „AddTools” nie nazwy hasPassGC = mS:UserOwnsGamePassAsync(
ScriptService”
player.UserId, idGC)
hasPassSC = mS:UserOwnsGamePassAsync(

[ PROGR AMI STAJR . PL ] 45


PROGRAMOWANIE GIER

player.UserId, idSC) Listing 4. Kod programu do „LocalScript”


-- jeżeli gracz posiada daną przepustkę w „GravityCoilButton”
if hasPassGC == true then
-- odwołanie do przycisku
-- użyj funkcji dodawania narzędzia
button = script.Parent
AddToolGravityCoil(player)
-- odwołanie do MarketplaceService
end
mS = game:GetService("MarketplaceService")
if hasPassSC == true then
-- id przepustki GravityCoil
AddToolSpeedCoil(player)
idGravityCoil = 16547057
end
-- odwołanie do lokalnego gracza
end)
player = game.Players.LocalPlayer
end)
-- kiedy przycisk zostanie kliknięty
-- jeżeli zostało wywołane zdarzenie na serwerze
button.MouseButton1Click:Connect(function()
addGC.OnServerEvent:Connect(function(player)
-- zmień przezroczystość na 0.5
-- użyj funkcji dodawania narzędzia
button.ImageTransparency = 0.5
AddToolGravityCoil(player)
-- czekaj jedną dziesiątą sekundy
end)
wait(0.1)
addSC.OnServerEvent:Connect(function(player) -- zmień przezroczystość na 0
AddToolSpeedCoil(player) button.ImageTransparency = 0
end) -- wywołaj zakup przepustki
mS:PromptGamePassPurchase(player, idGravityCoil)
-- jeżeli zakup przepustki został zakończony
end)
mS.PromptGamePassPurchaseFinished:Connect(
function(player,id,purchased) Listing 5. Kod programu do „LocalScript”
-- z powodzeniem i o danym id w „SpeedCoilButton”
if purchased and id == idGC then
button = script.Parent
-- użyj funkcji dodawania narzędzia
mS = game:GetService("MarketplaceService")
AddToolGravityCoil(player)
-- id przepustki SpeedCoil
elseif purchased and id == idSC then
idSpeedCoil = 16548602
AddToolSpeedCoil(player)
player = game.Players.LocalPlayer
end
end) button.MouseButton1Click:Connect(function()
button.ImageTransparency = 0.5
Kolejnym krokiem jest dodanie LocalScript do Gravity­ wait(0.1)
CoilButton oraz SpeedCoilButton. button.ImageTransparency = 0
mS:PromptGamePassPurchase(player, idSpeedCoil)
end)

CZAS NA TESTY!
Odpalamy grę, naciskając przycisk Play. W ten spo-
sób możemy sprawdzić, czy gracz, który zakupił prze-
pustkę, dostanie oczekiwany przedmiot. Nie musimy
kupować przepustek do tworzonego projektu, ponieważ
Ilustracja 36. Dodanie dwóch „LocalScript” właściciel posiada wszystkie przepustki tej gry.

46 [ 4 - 202 1 ]
Budowniczy Robloxa: sklep z przepustkami

Ilustracja 37. Pierwsze testy


Ilustracja 40. Testowy zakup na lokalnym serwerze
Dlatego podczas próby zakupu zostanie wyświetlony
komunikat, że już posiadasz ten przedmiot. Po kliknięciu przycisku z ikoną robuxa powinna ukazać
się informacja, że zakup GravityCoil zakończył się suk-
cesem. Następnie klikamy OK.

Ilustracja 38. Komunikat o posiadaniu danego przedmiotu


Ilustracja 41. Udany zakup na lokalnym serwerze
Kolejnym sposobem na sprawdzenie przepustek jest test
na serwerze. Polega on na utworzeniu lokalnego ser- Na koniec powinniśmy otrzymać nasz zakup. Można te-
wera i sprawdzeniu zakupu. Przycisk Start znajdziemy raz przetestować, czy możemy wysoko skakać.
w karcie TEST.

Ilustracja 39. Miejsce uruchomienia lokalnego serwera

Po uruchomieniu lokalnego serwera można przetesto-


wać zakup na jednym z wybranych graczy – w tym przy-
padku jest ich dwóch. Podczas zakupu pojawi się rów-
nież informacja, że jest to testowy zakup i twoje konto Ilustracja 42. Przetestowanie narzędzia na lokalnym
nie zostanie obciążone. serwerze

[ PROGR AMI STAJR . PL ] 47


PROGRAMOWANIE GIER

Ostatni test jest już za prawdziwe robuxy, więc w tym


przypadku konto zostaje już obciążone. Test został wy-
konany za pomocą innego konta, aby sprawdzić działa-
nie sklepu z przepustkami.

Ilustracja 43. Zakup przepustki za prawdziwe robuxy

Ilustracja 46. Udany zakup!

Dotarliśmy już do końca artykułu. Do zobaczenia w ko-


lejnych projektach z cyklu „Budowniczy Robloxa”, w któ-
rych poznacie jego kolejne tajemnice i dowiecie się, jak
Ilustracja 44. Udany zakup za prawdziwe robuxy stworzyć następny niesamowity projekt w Robloxie!

Przemysław Folholc
Programista oraz pasjonat tworzenia gier. Trener
w Gigantach Programowania. Produkcje, nad
którymi pracuje, można zobaczyć na jego profilu
w Robloxie pod nickiem PrzemekV5 i grupie „Dewe-
loperzy Robloxa” oraz na fanpage’u FoloGames na
Facebooku: https://www.facebook.com/fologames.

PFOLHOLC@GMAIL.COM
Ilustracja 45. Gracz otrzymał narzędzie

Zapamiętaj Ćwicz w domu


օ Przepustki pozwalają na zarabianie robuxów. օ Wypróbuj różne narzędzia z Toolboxa.
օ Do „StarterGui” dodajemy interfejsy graficzne. օ Spróbuj wykonać więcej przepustek.
օ Identyfikator danej przepustki znajdziesz w adre- օ Stwórz bardziej rozbudowany sklep.
sie strony przy jego konfiguracji.

48 [ 4 - 202 1 ]
PROJEKTY

Natalia Trzaska

Programowanie zdalnego sterowania


w LEGO MINDSTORMS ROBOT INVENTOR
Większość z nas myśląc o nowych technologiach i przyszłości, zastanawia się, jakie czyn-
ności będą wykonywane przez roboty i w czym będą one nas zastępować. A czy zastana-
wiałeś/aś się kiedyś, kto je zbuduje i zaprogramuje?

8+

Dowiesz się Potrzebna wiedza


օ Jak zaprojektować własny joystick. օ Podstawy budowania robotów LEGO.
օ W jaki sposób zaprogramować robota.
օ Dlaczego do jazdy w tył potrzebna jest ujemna
prędkość.

B udowaniem robotów zazwyczaj zajmują się wyspe-


cjalizowani inżynierowie, którzy nie tylko je projek-
tują, ale też programują tak, aby urządzenie wykonywało
Zanim zaczniemy, powinniśmy zbudować naszą kon-
strukcję tak, aby tworzące ją klocki nigdy nie krępowały
ruchu robota. Na przykład koła nie mogą trzeć o kloc-
czynności, do których zostało zaprojektowane. ki, ponieważ wtedy mogą mieć problem ze skręcaniem
Zazwyczaj prace nad nową technologią trwają kilka, i rozwijaniem prędkości.
a nawet kilkanaście lat i potrzeba do tego wielu inżynie-
rów. Skąd oni się biorą? Tak naprawdę to każdy z was
może w przyszłości zostać inżynierem, a żeby poczuć
się jak młody specjalista, możesz budować i programo-
wać roboty, które służą do nauki i zabawy. Jednym z ta-
kich zestawów (najnowszym) jest LEGO MINDSTORMS
ROBOT INVENTOR. Z tego artykułu dowiesz się, w jaki
sposób można programować roboty tego typu.

CIEKAWOSTKA
Dzisiaj joystick kojarzony jest z padem, dzięki któremu
można grać na konsoli. Jednak został on opatentowany już
w 1926 roku i dopiero w latach 60. zaczął służyć graczom do
gry. Wcześniej był używany w lotnictwie i kosmonautyce.
Ilustracja 1. Przykładowy robot

50 [ 4 - 202 1 ]
Programowanie zdalnego sterowania

Ilustracja 2. Interfejs aplikacji

Ilustracja 3. Zajęte porty

[ PROGR AMI STAJR . PL ] 51


PROJEKTY

Robot będzie napędzany dwoma silnikami, do sterowa-


nia którymi wykorzystamy aplikację oraz specjalny joy-
stick, który sami zaprojektujemy i zaprogramujemy.
Programowanie wymaga od nas użycia specjalistycz-
nego języka. W tym przypadku możemy użyć najłatwiej-
szego języka Scratch, przeznaczonego dla dzieci, lub
bardziej skomplikowanego Pythona. Dziś będziemy pi-
sać kod w tej łatwiejszej wersji.
Na początku powinieneś/powinnaś sprawdzić nazwy
portów, do których podpiąłeś/podpięłaś silniki i ewen-
tualne czujniki. Aby to zrobić, podłącz robota do kom-
putera/tabletu (za pomocą bluetooth lub kabla). Można
to sprawdzić w prawym górnym rogu aplikacji. Informa-
Ilustracja 6. Panel projektowania joysticku
cja ta będzie potrzebna do programowania.
Czas zacząć programowanie! Aby nasz robot zaczął jeź- Przykładowa konsola została pokazana na Rysunku 7.
dzić, powinieneś/powinnaś zadeklarować silniki, to znaczy
powiedzieć robotowi, które silniki będą odpowiedzialne
za ruch. Z różowej zakładki „RUCH” przeciągamy blo-
czek „ustaw silniki ruchu na” (tak jak na Ilustracji 4). Je-
śli robot podczas testów będzie jechać do tyłu, a nie do
przodu, wystarczy porty silników zamienić stronami, na
przykład A+B na B+A.

Ilustracja 4. Bloczki deklaracji silników

Gdy masz ustalone silniki ruchu, to czas zaprojektować


Ilustracja 7. Przykładowa konsola
nasz joystick. Po prawej stronie aplikacji znajdziesz ikon-
kę, która przypomina pada (Ilustracja 5). Daje ona możli- Kiedy dodamy wszystkie przyciski, po lewej stronie po-
wość programowania pada, wystarczy kliknąć w ikonkę, jawi się zakładka „Zdalne sterowanie” i to właśnie z niej
a wyświetli ci się panel. Klikając plus, przejdziesz do try- będziesz korzystać. Na początku powinieneś/powinnaś
bu projektowania zastanowić się, co tak naprawdę chcesz uzyskać, to zna-
czy: po naciśnięciu którego przycisku twój robot ma je-
chać do przodu, kiedy ma zmieniać prędkość i tak dalej.
W tym przypadku robot będzie mógł sterować kie-
runkiem za pomocą modułu, który został nazwany
Ilustracja 5. Ikona otwierająca pada kierunki.
Po zadeklarowaniu silników można przejść do pro-

Warto wiedzieć
gramowania joystickow. W przykładzie robot będzie ru-
szał się zgodnie ze strzałkami, które zostaną naciśnięte.
Programując joystick, można dodać przyciski zmieniające Z zakładki „Zdalne sterowanie” przeciągnij bloczek
prędkość. Wówczas będziesz mieć nie tylko kontrolę nad (Ilustracja 8).
kierunkiem jazdy, ale też prędkością.

52 [ 4 - 202 1 ]
Programowanie zdalnego sterowania

Ilustracja 8. Bloczek dający możliwość programowania


przycisków

W tym bloczku można zmieniać kierunek, który na-


ciśniesz. Aby to zrobić, powinieneś/powinnaś kliknąć
okno „góra” – wtedy rozwija się pasek z możliwością
wyboru. Ilustracja 9. Funkcje bloczku joysticka

Ilustracja 10. Wszystkie potrzebne bloczki z zakładki „Zdalne sterowanie”

Ilustracja 11. Zbudowany program

[ PROGR AMI STAJR . PL ] 53


PROJEKTY

Następnie utwórz pięć bloczków z wszystkimi wyżej


pokazanymi opcjami.
To, co będzie się działo po kliknięciu danego przyci-
sku, możesz zaprogramować różowymi bloczkami, które
odpowiedzialne są za ruch – skręty w prawo, ruch prosto
i na samym końcu zatrzymanie. Dodatkowo można dodać
wyświetlanie animacji bądź dźwięk z innych zakładek Ilustracja 12. Program umożliwiający jazdę w tył

Ilustracja 13. Ostateczny program

Najtrudniejszym elementem jest jazda do tyłu, ponie- Ostateczny program powinien wyglądać tak jak na
waż powinieneś/powinnaś ustawić „Rozpocznij ruch w Ilustracji 13.
tył”, lecz nie ma takiego bloku.
Do rozwiązania tego problemu użyj ujemnej prędko- Natalia Trzaska
ści, to znaczy zamiast 100% ustawiamy –100%. Wtedy
Instruktorka robotyki w „Planecie Robotów”, stu-
twój robot będzie poruszał się do tyłu.
dentka Politechniki Warszawskiej oraz pasjonatka
Należy pamiętać o późniejszej zmianie ujemnej pręd- konstruowania i programowania robotów
kości. W przykładzie prędkość zmienia się za każdym ra-
zem, gdy nie naciskamy żadnego przycisku. TRZASKA.NATALIA01@GMAIL.COM

!
Zapamiętaj Ćwicz w domu
օ Stwórz dodatkowy suwak zmieniający prędkość. օ Przy pomocy robotów do nauki nauczysz się kon-
struować i programować roboty.
օ Do programu dodaj bloczki zajmujące się światłem
i dźwiękiem. օ Budowanie i programowanie robotów rozwija
nasze inżynierskie umiejętności i wyobraźnię
przestrzenną.

54 [ 4 - 202 1 ]
PROJEKTY

Urszula Piechota

Wyścigi formuły jeden – animacje na Androida


Marzyliście kiedyś o tym, żeby stworzyć aplikację na telefon, która robiłaby dokładnie to,
co chcecie? Zastanawialiście się, jak to zrobić, żeby nie tylko pokazać obrazek na ekranie,
ale też sprawić, by poruszał się w określony sposób? Wydaje się, że to bardzo trudne, ale
wcale takie nie jest. Wystarczy odrobina wyobraźni i kilka prostych fragmentów kodu,
które poznacie już za chwilę. A przy okazji stworzymy razem prostą aplikację, w której
będziemy animować ścigające się samochody.

10+

Dowiesz się Potrzebna wiedza


օ Jak stworzyć prostą aplikację na Androida. օ Co to jest obiekt.
օ Jak zaprogramować prostą animację obiektu օ Jak przenieść pliki z komputera na telefon za
w Androidzie. pomocą kabla USB.

ANDROID STUDIO – PROGRAM, Takim środowiskiem dla Androida jest Android Studio.
W KTÓRYM PRACUJĄ PROFESJONALIŚCI Można je bez problemu pobrać ze strony https://deve-
Pewnie wiele razy zastanawialiście się, jak powstają loper.android.com/studio/index.html. Jego instalacja
aplikacje na smartfony. Co jest do tego potrzebne? Je- jest bardzo prosta, wystarczy podążać za poleceniami
śli myślicie, że smartfon, to macie trochę racji – w koń- instalatora. Aplikacja jest w języku angielskim, ale jak
cu na czymś trzeba testować tworzoną aplikację – ale wiesz, programista musi znać dobrze ten język. Na wy-
bez smartfona również da się programować. Trudno to padek, gdyby pojawily się problemy, instrukcję instalacji
natomiast zrobić bez środowiska programistycznego. w języku polskim, krok po kroku, znajdziecie na stronie
https://istis.pl/polonistka-programuje/przygotowuje-
my-piaskownice/ i kolejnych, widocznych po kliknięciu
przycisku „Następna lekcja” na dole każdego artykułu.
Jeśli udało ci się już zainstalować Android Studio,

Warto wiedzieć
możemy zacząć pracę nad naszą aplikacją. Kiedy uru-
chomisz środowisko po raz pierwszy, pojawi się okien-
Piaskownicą (ang. sandbox) informatycy nazywają wy- ko pozwalające zdecydować, co chcesz zrobić. Wybierz
dzielone środowisko, w którym uruchamiane są programy. pozycję „Start a New Android Studio Project”. Kiedy bę-
Program uruchomiony w takiej piaskownicy ma dostęp tylko dziesz uruchamiać Android Studio po raz kolejny, takie-
do tego, do czego mu pozwolimy. Dzięki temu aplikacja nie
go okienka już nie będzie – wtedy żeby stworzyć nowy
projekt, trzeba wybrać File→ New → New Project…
popsuje nam nic na komputerze. Takich piaskownic używa
się głównie do uruchamiania programów, którym nie ufamy.

56 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida

AKTYWNOŚCI I FRAGMENTY – CZYLI JAK


ZBUDOWANA JEST APLIKACJA
Z listy możliwych aktywności (Activity) wybierzemy
Ciekawostka
EmptyActivity. Aktywność to taki podstawowy element Android nie jest nazwą języka programowania, tylko syste-
aplikacji na Androida. Drugim podstawowym elementem mem operacyjnym. Dlatego mówimy, że piszemy aplikację
na Androida, a nie w Androidzie. Do pisania programów na
są fragmenty (Fragment). Aktywność to coś w rodzaju Androida można używać jednego z dwóch głównych języ-
mistrza odpowiadającego za całą zawartość aplikacji lub ków – Java i Kotlin. Obecnie bardziej popularny jest Kotlin,
za określoną jej część. Fragmenty to uczniowie – frag- ale Java jest językiem bardziej uniwersalnym, bo używa się
ment zawsze musi być powiązany z jakąś aktywnością. jej również do pisania aplikacji na inne systemy, na przykład
Windows.
Aktywność odpowiada za najważniejsze elementy apli-
kacji, takie, które są używane w wielu fragmentach –
jak na przykład menu. Dzięki temu przy przechodzeniu jest nazwa projektu, a nie nazwa aplikacji, dlatego nie
między ekranami zawsze możemy mieć do tych elemen- wolno w niej używać polskich liter ani spacji. Ja swój
tów dostęp. projekt nazwałam „Samochodziki”. Pole Package name
Na kolejnym ekranie (Ilustracja 1) nadaj nazwę swo- zostawimy tym razem bez zmian. W Save location usta-
jemu projektowi, wpisując ją w pole Name. Pamiętaj – to wiamy miejsce na dysku, gdzie zapisze się nasz projekt.

Ilustracja 1. Ekran tworzenia aplikacji w „Android Studio”

[ PROGR AMI STAJR . PL ] 57


PROJEKTY

Wybierz takie, żeby później móc go łatwo znaleźć! Do- to taki wydzielony kawałek kodu, który ma za zadanie
myślnie jest to \users\USER\AndroidStudioProjects. robić jakąś konkretną rzecz. Metoda onCreate(Bundle
Ostatnim polem, które ustawimy, będzie Language – savedInstanceState) jest metodą androidową, czyli
wybierz w nim wartość Java. To pole pozwala wybrać ję- taką, która zawsze musi być uruchomiona. Takich metod
zyk programowania, którego będziemy używać podczas jest kilka, ta jest najważniejsza, ponieważ uruchamia się
pisania kodu. na samym początku.
Jak zapewne zauważyliście, na tym ekranie mamy » super.onCreate(savedInstanceState); – mówi sys-
jeszcze jedno ciekawe pole: Minimum SDK. Mówi nam temowi, że ma zrobić wszystko to, co domyślnie robi
ono, na jakiej najniższej wersji systemu Android aplika- się przy uruchamianiu każdej aplikacji. Dzięki temu
cja będzie działać. Zostawimy je ustawione domyślnie – będziemy mogli na przykład zrobić coś wcześniej
obecnie niewiele jest urządzeń mających niższą wersję (wtedy piszemy kod przed tą linijką) albo nie robić
systemu niż Lollipop. Jeśli jednak twój telefon ma starszy tego wcale, kiedy na przykład mamy zamiar sami po-
system, ustaw sobie w tym polu swoją wersję systemu wiedzieć aplikacji, co ma robić na początku.
i kliknij Finish. » setContentView(R.layout.activity_main); – mówi,
że wygląd pierwszego ekranu ma być taki, jak w pliku
ZACZYNAMY PISAĆ KOD activity_main.xml.
Android Studio stworzyło dla nas bardzo prostą ak-
tywność, która na razie jeszcze nic nie robi. Kod, który Przyjrzyj się teraz kolumnie widocznej po lewej stronie
powstał, wygląda tak: kodu. Masz tam pokazaną hierarchię plików w aplika-
cji – czyli pliki i ich położenie, podobnie jak możesz to
Listing 1. Klasa „MainActivity” zobaczyć w komputerze w Eksploratorze plików. Andro-
package com.example.samochodziki; id Studio pokazuje nam od razu położenie naszej klasy
import androidx.appcompat.app.AppCompatActivity; MainActivity, tak jak widać na Ilustracji 2. Jeśli w polu
import android.os.Bundle; na górze nie masz ustawionej wartości Project, tylko
inną, np. Android – przełącz ją na Project.
public class MainActivity
Jak widzisz, Android Studio stworzyło nam sporo
extends AppCompatActivity {
różnych katalogów i plików. Wszystkie one są ważne, ale
@Override nie musimy się nimi teraz zajmować. Interesuje nas te-
protected void onCreate(Bundle raz, oprócz klasy MainActivity, którą już obejrzeliśmy,
savedInstanceState) { layout activity_main.xml. Znajdziesz go w katalogu res/
super.onCreate(savedInstanceState); layout (Ilustracja 2). Otwórz go, klikając dwa razy myszką.
setContentView(R.layout.activity_main);
}
}

Warto wiedzieć
Plik, w którym znajduje się nasz kod, nazywamy klasą. Takie
pliki mają rozszerzenie .java, a w przypadku Kotlina – .kt.
Linijka public class MainActivity extends App­ Nazwy kolejnych wersji systemu Android są angielskimi
CompatActivity mówi nam, że klasa nazywa się Main- nazwami różnych słodyczy, zaczynającymi się od kolejnych
Activity (tak domyślnie nazywa się zwykle główną liter alfabetu. Lollipop, czyli Android 5.0, oznacza lizaka.
Kolejne wersje to Marshmallow, Nougat, Oreo, Pie (z angiel-
aktywność aplikacji – dosłownie znaczy to właśnie
skiego ciasto). Niestety później Google przestał nadawać
„główna aktywność”). Nie będziemy teraz omawiać ca- kolejnym wersjom słodkie nazwy. Obecnie najnowsza wersja
łości kodu, zrozumiesz go z czasem, skupimy się tylko na Androida to 11.
tym najważniejszym dla nas fragmencie, czyli na meto-
dzie onCreate(Bundle savedInstanceState). Metoda

58 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida

Listing 2. Plik „activity_main.xml”

<?xml version="1.0" encoding="utf-8"?>


<androidx.constraintlayout.widget
.ConstraintLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:app=
"http://schemas.android.com/apk/res-auto"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf=
"parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
Ilustracja 2. Hierarchia plików w „Android Studio” app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget
.ConstraintLayout>
Zobaczysz edytor graficzny, który pozwala na zbudo-
wanie layoutu. Layout oznacza po polsku „układ”. Jest to Ten kod nie jest napisany w Javie, a w XML– to specjal-
plik, w którym decydujemy o tym, jak ma wyglądać kon- ny język, używany do tworzenia dokumentów w sie-
kretny ekran naszej aplikacji. Nasz na razie jest pusty. ci WWW, który w Androidzie wykorzystywany jest do
Można go zmieniać za pomocą tego edytora graficzne- łatwego tworzenia grafiki. Każdy element ma wygląd
go, który widzisz, ale żeby zrobić coś bardziej skompli- <Typ> </Typ> – nazywamy to znacznikami. Pomiędzy
kowanego, będzie nam potrzebny widok kodu. Dlatego symbolami < i > możemy wstawić informacje o tym, jak
popatrz teraz na prawą stronę ekranu – znajdziesz tam ma wyglądać dany element, a między <Typ> i </Typ>
takie trzy przyciski, jak na Ilustracji 3. możemy wstawić inne elementy, które mają się znaleźć
w środku tego pierwszego. W naszym layoucie mamy już
wstawiony element typu ConstraintLayout, a wewnątrz
niego element TextView. O pozostałych polach wpisa-
Ilustracja 3. Przyciski do zmiany widoku
nych w elementy będziemy jeszcze mówić później. Teraz
Zaznaczony przycisk Design pozwala widzieć edytor wystarczy nam wiedza, że odpowiadają one za to, gdzie
graficzny. Przycisk Code pokazuje sam kod, a przycisk ma się element znaleźć i jak ma wyglądać. TextView to
Split – kod i edytor graficzny jednocześnie. Jest to naj- pole, w które można wpisać tekst. Wpisujemy go, dodając
wygodniejsza metoda pracy z layoutami, dlatego kliknij wewnątrz pola atrybut android:text="Hello World!".
teraz przycisk Split. Każde z tych pól zaczynających się od „android” lub
Na środkowej części ekranu zobaczysz taki mniej „app” nazywamy atrybutem.
więcej kod:

[ PROGR AMI STAJR . PL ] 59


PROJEKTY

URUCHAMIAMY APLIKACJĘ przejmuj – niektóre telefony sprawiają dużo problemów


Teraz przyszła pora, żeby uruchomić naszą aplikację, z podłączeniem. W takim wypadku użyj emulatora.
która na razie nie robi nic poza wyświetleniem napisu
„Hello World!”. Jeśli masz telefon z Androidem, możesz Uruchamianie na emulatorze
uruchomić ją na swoim telefonie. Jeśli nie, użyjesz emu- Żeby uruchomić aplikację na emulatorze, musimy
latora – to taki wirtualny telefon, który pojawi się po najpierw sobie ten emulator stworzyć.
prostu na ekranie komputera. Znajdź w górnym pasku Android Studio ikonki, które
widzisz na Ilustracji 5.
Uruchamianie na telefonie
Uruchomienie aplikacji na telefonie wymaga włącze-
nia w nim najpierw Opcji programistycznych. Na więk-
szości telefonów wystarczy w tym celu kilkakrotnie Ilustracja 5. Ikonki „Android Studio”

dotknąć pola z numerem kompilacji (poszukaj tej opcji


w ustawieniach), pojawi się wtedy informacja, że jesteś Naciśnij środkową z nich. Otworzy się okienko, w któ-
programistą. W przypadku niektórych starszych urzą- rym będzie przycisk „Create Virtual Device” – kliknij go.
dzeń robi się to inaczej – w razie problemów poszukaj Pojawi się ekran z opcjami wyboru, jaki telefon będzie
w instrukcji do swojego telefonu lub w google, jak to zro- użyty jako emulator. Wybierz jaki chcesz, ale nie prze-
bić. Kiedy już włączysz opcje programistyczne, podłącz stawiaj pola Category, które widzisz po lewej – na razie
telefon kablem USB do komputera i jeśli zostaniesz po- chcemy, żeby nasz emulator był telefonem, a nie telewi-
proszony o zainstalowanie sterowników, zrób to. Potem zorem czy zegarkiem. Kliknij Next. Zobaczysz taki ekran,
wejdź w telefonie w opcje programistyczne i znajdź tam jak na Ilustracji 6.
pozycję „Debugowanie USB” – włącz ją. Odczekaj chwilę Kliknij Download przy systemie Q i poczekaj, aż się
– komputer może cię znów poprosić o instalację sterow- ściągnie. Potem kliknij Next, a na kolejnym ekranie Fi-
ników, a telefon może pytać o zgodę na połączenie – za- nish. Zamknij okienko tworzenia emulatora krzyżykiem,
znacz „Zawsze zezwalaj z tego komputera” i potwierdź. po czym wybierz nowy emulator w okienku z Ilustracji 4,
Jeśli nic się nie stanie, upewnij się, że debugowanie USB jeśli sam się tam nie ustawił. Następnie kliknij zieloną
jest włączone, odłącz kabel USB i po chwili podłącz po- strzałkę – uruchomisz w ten sposób emulator z wirtu-
nownie. Pamiętaj, że kabel musi pozwalać na przesyła- alnym telefonem.
nie plików – taki służący tylko do ładowania urządzenia
nie wystarczy. Możesz również spróbować zrestartować Po uruchomieniu aplikacji
komputer. Po kliknięciu zielonej strzałki będzie trzeba dłuższą
Teraz popatrz na górę ekranu. Zobaczysz tam okien- chwilę poczekać, szczególnie jeśli wybrałeś/aś urucho-
ko takie jak na Ilustracji 4. mienie na emulatorze. Bądź cierpliwy/a. Na emulatorze
możesz przez dłuższy czas widzieć symbol google albo
ikonki na pulpicie emulowanego telefonu. Niczego nie
naciskaj i cierpliwie czekaj. W końcu zobaczysz okienko
takie jak na Ilustracji 7 albo taki sam obraz na telefonie.
Ilustracja 4. Okno uruchamiania aplikacji

W okienku z rysunkiem zielonego robocika powinno Nie zamykaj emulatora, wtedy przy kolejnym uruchomie-
pojawić się app – to nazwa modułu w naszej aplikacji niu aplikacji nie będzie trzeba tyle czekać. A będziemy ją
(o modułach powiemy sobie innym razem). W okien- uruchamiać często, żeby zobaczyć efekt naszych działań.
ku z rysunkiem szarego telefonu powinieneś/powin-
naś zobaczyć nazwę swojego telefonu. Żeby uruchomić TWORZYMY SAMOCHODZIKI
aplikację, należy kliknąć zielony trójkącik, który znajdu- Teraz nareszcie możemy zacząć tworzyć nasze sa-
je się obok. Jeśli nie widzisz nazwy telefonu, to się nie mochodziki. Na początku będziesz potrzebować dwóch

60 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida

Ilustracja 6. Ekran wyboru systemu dla symulatora

obrazków png z rysunkiem samochodu. Możesz je nary-


sować sam albo ściągnąć z Internetu, postaraj się jednak,
żeby rysunki nie były zbyt duże.
Spójrzmy znów na plik activity_main.xml. Skasuje-
my teraz wszystko, co jest w tym pliku i zamiast tego
napiszemy:

Listing 3. Plik „activity_main.xml”

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>

Jak widzisz, pierwsza linijka niczym się nie różni od


tej, która była tam poprzednio. Ona zawsze musi być
na początku pliku layout. Reszta kodu tworzy nam tło
aplikacji. Atrybut android:layout_width określa, jaka
ma być szerokość tego pola – "match_parent" ozna-
cza, że ma ono rozciągnąć się na całą szerokość ekra-
nu. Atrybut android:layout_height wskazuje, jaka ma
być wysokość pola – również na całą szerokość ekranu. Ilustracja 7. Emulator z uruchomioną aplikacją

[ PROGR AMI STAJR . PL ] 61


PROJEKTY

LinearLayout oznacza, że to, co tam umieścimy, będzie Jak widzisz, ImageView ma te same atrybuty
się samo układało w rządku, tak jak zaraz zobaczysz. android:layout_width i android:layout_height, co Lin-
Teraz wstawimy sobie do środka samochodziki. earLayout. Każdy element musi je mieć. Tym razem nada-
Znajdź swoją aplikację w Eksploratorze Windows – bę- jemy obrazkowi konkretny rozmiar – 80 dp na wysokość
dzie w tym katalogu, który podałeś/aś przy instalacji i 80 dp na szerokość. Za pomocą atrybutu android:src
Android Studio. U mnie jest to C:\AndroidAplikacje\Sa- ustawiamy w polu obrazek. Atrybut android:id pozwa-
mochodziki\, tak jak widać na Ilustracji 1. Teraz wejdź la na nadanie nazwy elementowi, żeby potem móc się
do katalogu app\src\main\res\drawable\ i tu wklej do niej odnieść w kodzie. Nazwa zawsze musi się zaczy-
obrazki samochodów. Nazwij je auto1.png i auto2.png. nać od @+id/ i nie może się powtarzać – każdy element
Teraz wróć do kodu. Wstawimy do niego element musi mieć inną nazwę.
ImageView, który służy do wyświetlania obrazków. Nasz Po prawej stronie możesz zobaczyć, jak teraz wy-
kod będzie teraz wyglądać tak: gląda nasz ekran – pojawił się nasz samochodzik! Teraz
wstawimy drugi, dokładnie tak samo.
Listing 3. Plik „activity_main.xml” z jednym samo-
chodzikiem Listing 4. Plik „activity_main.xml” z dwoma samo-
chodzikami
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas <?xml version="1.0" encoding="utf-8"?>
.android.com/apk/res/android" <LinearLayout xmlns:android=
android:layout_width="match_parent" "http://schemas.android.com/apk/res/android"
android:layout_height="match_parent" android:layout_width="match_parent"
> android:layout_height="match_parent"
>
<ImageView
android:id="@+id/auto1" <ImageView
android:layout_width="80dp" android:id="@+id/auto1"
android:layout_height="80dp" android:layout_width="80dp"
android:src="@drawable/auto1" android:layout_height="80dp"
/> android:src="@drawable/auto1"
</LinearLayout> />

<ImageView
android:id="@+id/auto2"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/auto2"

Ciekawostka
/>
</LinearLayout>

Skrót „dp” lub „dip” oznacza jednostkę gęstości ekranu, nie- Na ekranie mamy już dwa samochodziki, ale są usta-
zależną od fizycznej wielkości ekranu. Zamiast tego można
użyć też skrótu px (piksele), in (cale), mm (milimetry), pt wione jeden za drugim, a my chcemy, żeby były jeden
(punkty – jeden punkt to 1/72 cala). W przypadku czcionek pod drugim – inaczej nie mogłyby się ze sobą ścigać.
używa się skrótu „sp” (skala), który oznacza prawie to samo Dlatego dodamy teraz do LinearLayout atrybut, któ-
co „dp”, ale jest dostosowany do fontu. Najczęściej używa ry powie systemowi, że ma układać elementy pionowo:
się skrótu „dp” – dzięki temu obraz na różnych ekranach
wygląda podobnie. android:orientation="vertical". Nagłówek Linear-
Layout powinien teraz wyglądać tak:

62 [ 4 - 202 1 ]
Wyścigi formuły jeden – animacje na Androida

Listing 5. Plik „activity_main.xml” – ustawianie Listing 6. Metoda „onCreate” w klasie „MainActivity”


orientacji layoutu
@Override
<LinearLayout xmlns:android= protected void onCreate(Bundle
"http://schemas.android.com/apk/res/android" savedInstanceState) {
android:layout_width="match_parent" super.onCreate(savedInstanceState);
android:layout_height="match_parent" setContentView(R.layout.activity_main);
android:orientation="vertical" ImageView auto1 = findViewById(R.id.auto1);
> ImageView auto2 = findViewById(R.id.auto2);
}
Uruchom teraz swoją aplikację, klikając zieloną strzałkę.
Mamy już na ekranie dwa samochodziki, tak jak na Ilu- Jeśli fraza ImageView wyświetla się na czerwono, kliknij
stracji 8. na nią myszką, a potem naciśnij na klawiaturze jednocze-
śnie lewy Alt i Enter – czerwone podświetlenie powinno
zniknąć. Za pomocą tego skrótu dodajemy importy, któ-
re pojawiają się na górze klasy. Mówią one systemowi,
gdzie szukać w budowanych klasach definicji podanych
elementów.
Na początku piszemy rodzaj pola, w którym w pliku
xml jest nasz samochodzik, czyli ImageView, po czym
nadajemy mu jakąś nazwę – najlepiej taką samą, jaką
podaliśmy w xml w atrybucie android:id. Później sta-
wiamy znak =, który mówi nam, że dalej podamy to, co
będziemy mieć na myśli, zawsze kiedy wpiszemy słowo
auto1 albo auto2. Słowa findViewById znaczą po angiel-
sku „znajdź widok po identyfikatorze” (widzisz? angiel-
ski się przydaje). W nawiasie podajemy nazwę pola wzię-
tą z xml. Na jej początku piszemy R.id. – dzięki temu
system wie, że chodzi nam o pole, a nie o obrazek czy
inny element.
Teraz, kiedy mamy już nasze dwa samochodziki, mo-
żemy im dodać animację. Dlatego dodamy teraz taki kod:

Listing 7. Animacja samochodzika

ObjectAnimator animation1 = ObjectAnimator


.ofFloat(auto1, "translationX", 1000f);
animation1.setDuration(2000);
animation1.start();

Ilustracja 8. Widok ekranu z dwoma samochodzikami


Dodaj go zaraz za tym kodem, który pisaliśmy przed
A TERAZ JAZDA! chwilą, ale przed znakiem }.
Sprawmy teraz, żeby nasze samochodziki zaczęły Pierwsza linijka służy do utworzenia animacji. Mó-
się ruszać. W tym celu wrócimy do naszej klasy Main­ wimy: uruchamiamy metodę ofFloat na obiekcie Ob-
Activity. Aby zrobić cokolwiek z samochodzikami, mu- jectAnimator z parametrami auto1, "translationX"
simy je najpierw znaleźć, dlatego dopiszemy w naszej i 1000f. Wiem, brzmi strasznie trudno – jednak gdy się
metodzie onCreate dwie linijki: przyjrzysz, to zobaczysz, że w kodzie to bardzo proste.

[ PROGR AMI STAJR . PL ] 63


PROJEKTY

Teraz ważne są parametry. Parametr auto1 mówi, do @Override


czego będziemy dodawać animację – do naszego pierw- protected void onCreate(Bundle
szego samochodzika. Parametr "translationX" ozna- savedInstanceState) {
cza, że będziemy przesuwać samochodzik w poziomie, super.onCreate(savedInstanceState);
czyli wzdłuż osi X. Ostatni parametr, 1000f, mówi, jak setContentView(R.layout.activity_main);
daleko samochodzik ma się przesunąć. ImageView auto1 = findViewById(R.id.auto1);
Kolejna linijka, animation1.setDuration(2000); ImageView auto2 = findViewById(R.id.auto2);
oznacza czas trwania naszej animacji. A ostatnia linijka, ObjectAnimator animation1 = ObjectAnimator
animation1.start();, jak pewnie się już domyślasz, .ofFloat(auto1, "translationX", 1000f);
uruchamia animację. animation1.setDuration(2000);
Uruchom teraz aplikację. Pierwszy samochodzik je- animation1.start();
dzie do przodu i wyjeżdża poza ekran. Poeksperymentuj ObjectAnimator animation2 = ObjectAnimator
chwilę, zmieniając wartość 1000f na jakąś inną, mniej- .ofFloat(auto2, "translationX", 1000f);
szą lub większą (zawsze na końcu musi być literka f – animation2.setDuration(3000);
oznacza ona, że wartość, którą podajemy, jest typu float, animation2.start();
a więc zmiennoprzecinkowa). Pozmieniaj też wartość }
w nawiasie przy setDuration. Obserwuj, co się dzieje }
z samochodzikiem.
Teraz dodamy animację do drugiego samochodzika. SPRÓBUJ SAM
Może spróbujesz sam? Dla każdego z samochodzików Pobaw się jeszcze tym kodem. Jeśli chcesz, żeby obrazek
możesz ustawić różne wartości. Na przykład jeden może poruszał się w pionie, możesz wpisać "translationY"
jechać w tempie 2000, a drugi 1000, każdy może przeje- zamiast "translationX". A może zamienisz obrazki
chać inną odległość. samochodzików na inne i zmienisz ich wielkość? Albo
Mój kod po dodaniu animacji drugiego samochodzika spróbujesz dodać jednocześnie animację pionową i po-
wygląda tak: ziomą do tego samego samochodzika?

Listing 8. Klasa „MainActivity”

package com.example.samochodziki; Urszula Piechota


Programistka Androida w firmie Lekseek Polska.
import android.animation.ObjectAnimator;
Oprócz Informatyki skończyła też Polonistykę (hu-
import android.os.Bundle;
manista też może programować!). Prywatnie intere-
import android.widget.ImageView; suje się teatrem, uwielbia czytać książki i bawić się
import androidx.appcompat.app.AppCompatActivity; z psami – bo na programowaniu życie się nie kończy.
public class MainActivity extends
URSZULA.PIECHOTA@OP.PL
AppCompatActivity {

!
Zapamiętaj Ćwicz w domu
օ Obrazki przechowujemy w obiekcie „ImageView”. օ Spraw, żeby samochodzik poruszał się w pionie.
Animujemy je za pomocą obiektu „ObjectAnima-
օ Dodaj trzeci samochodzik.
tor”. Parametr „translationX” przesuwa obrazek
w poziomie, a „translationY” w pionie. օ Zmień wielkość samochodzika.

64 [ 4 - 202 1 ]
BEZPIECZEŃSTWO

Łukasz Basa

Czym jest VPN?


Temat prywatności podczas korzystania z Internetu pojawia się coraz częściej jako przed-
miot dyskusji zarówno na poziomie koleżeńskich rozmów, jak również świata dorosłych.
Być może znane są ci takie pojęcia jak VPN czy TOR w kontekście rozwiązań pozwalają-
cych na ukrywanie naszej tożsamości w Internecie. W poniższym artykule postaram się
wytłumaczyć, czym jest VPN, do czego możesz go zastosować oraz przed jakimi zagroże-
niami cię nie ochroni.

12+

Dowiesz się Potrzebna wiedza


օ Co to jest VPN. օ Podstawowa wiedza na temat działania Internetu.
օ Jak wykorzystać VPN do zwiększenia poziomu
prywatności w sieci.

օ Przed czym VPN cię nie ochroni.

ŚWIAT „WODNEGO INTERNETU” staje piękny dom z adresem nazywanym „adresem IP”.
Czyli jeden z sąsiadów mieszka na wyspie UPC pod ad-
resem 1.2.3.4, a drugi mieszka pod adresem 5.6.7.8. Może
Ważna informacja
też zdarzyć się, że wiele osób mieszka pod jednym ad-
Zanim przeczytasz: poniżej znajdziesz obrazowy opis resem (na przykład w hotelu czy biurowcu danej firmy).
działania rozwiązań VPN. Nie jest to tekst techniczny Mieszkańcy świata „wodnego Internetu” za każdym
i przyjmuje on poziom dużego uproszczenia. razem, gdy chcą przeczytać artykuł na stronie inter-
netowej bezpieczny.blog, muszą wybrać się w podróż
przez ocean Internetu na wyspę bezpieczny.blog. Jest
Wyobraź sobie, że Internet to wielki i nieskończony oce- to długa i czasem niebezpieczna wyprawa. Każdy z nich
an, na którym znajdują się różne wyspy. Wyspy te budu- płynie własną łódką w kierunku swojej docelowej wyspy.
ją najczęściej dostawcy Internetu (tak aby mógł na nich Świat Internetu jest tak skonstruowany, że na każdej ło-
zamieszkać ktoś taki jak ty), ale robią to także twórcy dzi wywieszona jest wielka flaga z adresem IP, z którego
stron internetowych. Mieszkańcy tych wysp nazywa- wyruszamy, oraz adresem wyspy, na którą płyniemy. Po
ją się „internautami”. Tak więc kupując Internet domo- drodze ci bardziej spostrzegawczy widzą innych inter-
wy od firmy UPC, zostajesz mieszkańcem „wyspy UPC”, nautów płynących w tym samym lub innym kierunku.
a kupując do swojego smartfona kartę SIM firmy Orange Widzą, jak są ubrani, skąd wracają, dokąd płyną. Potrafią
(wraz z pakietem Internetu) – zostajesz mieszkańcem nawet podpłynąć na tyle blisko, żeby podsłuchać, o czym
„wyspy Orange”. Każdy z mieszkańców danej wyspy do- rozmawiają z innymi internautami.

66 [ 4 - 202 1 ]
Czym jest VPN?

Ilustracja 1. Przykład połączenia internetowego ze stroną


http://bezpieczny.blog z wykorzystaniem protokołu HTTP

Tak właśnie (w bardzo dużym uproszczeniu) wyglą- stępują wtedy, gdy widzicie zamkniętą kłódkę na pasku
da Internet. Inni ludzie, będący w tej samej sieci, mogą adresu w przeglądarce internetowej. Warto zapamiętać,
obserwować twoją łódź lub śledzić twoje wyprawy że taki most jest szybko budowany, gdy internauta za-
(przy braku szyfrowania, o czym później), a serwer, któ- pragnie odwiedzić jakąś wyspę, która wspiera szyfrowa-
ry odwiedzasz, zna twój adres IP i wie dokładnie, skąd nie, a po zakończeniu wizyty jest bezpowrotnie niszczo-
„przypływasz”. ny (czyli technicznie połączenie jest zakończone). Dzięki
tym mostom właściciel wyspy docelowej nadal zna adres
BUDUJEMY MOSTY! internauty, ale nikt poza nimi dwoma nie wie, co w ra-
Z uwagi na zagrożenie dla poufności danych, które mach mostu jest przenoszone i o czym internauta roz-
z nami płyną, wiele wysp (takich jak na przykład banki, mawia z drugą stroną.
sklepy internetowe czy nawet strona, na której jesteście)
zdecydowało się na zbudowanie mostów bezpośrednio SCHODZIMY POD WODĘ!
z twojego domu, aż na wyspę docelową. Każdy internau- Aby zapewnić jeszcze większy poziom poufności, zbu-
ta ma swój most, oddzielny na każdą wyspę, i nikt inny dowane zostały wyspy o nazwie VPN ( Virtual Private Ne-
nie jest w stanie zobaczyć, co się na tym moście dzie- twork – Wirtualna Sieć Prywatna). Usługa ta działa w ten
je. Takie „mosty” nazywamy szyfrowaniem SSL (Secure sposób, że gdy internauta zapragnie odwiedzić jakąś
Socket Layer) lub TLS (Transport Layer Security). Wy- stronę internetową i jest aktualnie podłączony do VPN-a,

Ilustracja 2. Przykład połączenia internetowego ze stroną


https://bezpieczny.blog z wykorzystaniem protokołu HTTPS
(połączenie szyfrowane)

[ PROGR AMI STAJR . PL ] 67


BEZPIECZEŃSTWO

Ilustracja 3. Przykład połączenia internetowego ze stroną http://bezpieczny.blog z wykorzystaniem pośredniczące-


go serwera VPN

to wsiada w swoim domu do specjalnej, przeznaczonej DO CZEGO MOŻE SŁUŻYĆ VPN?


tylko dla niego, szybkiej łodzi podwodnej, która trans- Poza wykorzystaniem połączeń VPN do zachowania
portuje go po kryjomu na wyspę VPN. Nikt po drodze poufności komunikacji firmy bardzo często wykorzystują
nie jest w stanie dowiedzieć się o tym, kto znajdował się go do zapewnienia swoim pracownikom zdalnego dostę-
w tej łodzi. Na wyspie VPN internauta wsiada w specjalną pu do infrastruktury wewnętrznej organizacji. Od strony
łódkę (lub buduje szyfrowany most) i płynie już w zwykły technicznej odbywa się to najczęściej tak, że brama VPN
sposób na docelową wyspę bezpieczny.blog. Magią tego udostępniana jest w sieci Internet i jest swoistym łączni-
całego rozwiązania jest to, że flaga na łódce nie zawiera kiem świata zewnętrznego z siecią lokalną firmy. Dzięki
już jego adresu domowego 1.2.3.4, a zamiast tego – adres niej pracownik uwierzytelniając się w odpowiedni sposób
serwera VPN (z którego mogą korzystać tysiące innych (na przykład za pomocą haseł lub specjalnych certyfika-
użytkowników, w naszym przykładzie 9.9.8.8). Dzięki tów kryptograficznych), może z dowolnego miejsca na
temu można zobaczyć, że ktoś płynie w kierunku naszej kuli ziemskiej utworzyć bezpieczny, szyfrowany tunel po-
wyspy docelowej, lecz nie wiadomo, kim ta osoba jest między swoim komputerem a serwerami firmowymi (lub
i skąd tak naprawdę przypłynęła. Nie będą o tym wie- nawet urządzeniami takimi jak telefon VoIP czy drukarka).
dzieć ani osoby postronne, które nasz bohater spotka po Dzięki temu może korzystać z zasobów firmy w podobny
drodze, ani też administrator serwera bezpieczny.blog. sposób, jakby to robił, będąc w biurze. W okresie pan-
demii wiele firm zdecydowało się w taki właśnie sposób
CZY WARTO KORZYSTAĆ Z USŁUGI VPN? umożliwić pracę zdalną swoim pracownikom.
Na to pytanie każdy musi odpowiedzieć sobie sam. Pa- Innym powodem, dla którego może być stosowany
miętajmy, bazując na powyższym przykładzie, że sam VPN VPN, jest chęć ominięcia blokad, które mogą być usta-
nie zapewnia bezpiecznego i bezpośredniego szyfrowania wione dla danego kraju. Wyobraźmy sobie, że pewien
od twojego urządzenia do serwera docelowego. Szyfro- serwis udostępniający materiały video oferuje swoją
wanie mamy zapewnione jedynie do serwera VPN, a dalej usługę wyłącznie mieszkańcom USA. Stosując pośredni-
poruszamy się standardową drogą. Osoba (lub firma) za- czący w naszej komunikacji serwer VPN zlokalizowany
rządzająca serwerem VPN posiada informacje na temat w Stanach Zjednoczonych, nasze połączenie przyjdzie
naszego adresu IP oraz adresów, z którymi się łączymy. z adresu IP wskazującego na USA. Powinno to pozwolić
Warto jest używać serwerów VPN, jeżeli znajdujemy na ominięcie zastosowanego ograniczenia. Należy jed-
się w niezaufanej sieci bezprzewodowej (na przykład ho- nak zaznaczyć w tym miejscu, że omijanie takich blokad
tel, restauracja czy nawet firmowa sieć Wi-Fi dla gości). jest niezgodne z prawem i nie powinno się tego robić.
W zależności od zabezpieczeń tej sieci może się zdarzyć, Ponadto warto zauważyć, że dostawcy treści, którzy
że ktoś będzie w stanie podsłuchać naszą komunikację. zdecydowali się na wprowadzenie tego typu ograniczeń,
W takim przypadku bezpiecznie przepłyniemy z wyspy często znają najpopularniejsze zakresy adresów IP sto-
„hotel” do naszej bezpiecznej przystani VPN, gdzie już sowane przez komercyjne serwery VPN i są w stanie
dalej wypłyniemy na głębokie wody Internetu. skutecznie taki ruch blokować.

68 [ 4 - 202 1 ]
Czym jest VPN?

SKĄD WZIĄĆ VPN-A? kupić może jedynie osoba pełnoletnia, więc uzgodnij to
Jeżeli mamy odpowiednie umiejętności, serwer VPN najpierw ze swoimi rodzicami lub opiekunami.
najlepiej skonfigurować samodzielnie, wykorzystując do
tego na przykład zasoby chmury Google Cloud Platform, CZY VPN OD FIRMY TRZECIEJ TO JEDYNA
Amazon AWS czy Microsoft Azure. Jeżeli takich umiejęt- MOŻLIWOŚĆ?
ności nie mamy, pozostaje nam skorzystać z usługi firmy Oczywiście, że nie. Usługę VPN można także skon-
trzeciej, która za pewną opłatą udostępnia swoje serwe- figurować samemu, jeżeli posiadamy wykupiony serwer
ry. Na rynku istnieje bardzo wielu dostawców tego typu typu VPS (Virtual Private Server) lub inny, u dostawcy
usług – istnieją zarówno darmowe, jak i płatne wersje. takiego jak OVH, Google Cloud czy też Amazon. Wyma-
Przestrzegam jednak przed korzystaniem z darmowych ga to już jednak większej wiedzy technicznej. Osobom
sieci VPN, w myśl zasady, że wszędzie tam, gdzie nie zainteresowanym pragnę polecić skrypt automatyzujący
płacisz, to ty jesteś towarem. Tak więc, jeżeli potrzebu- cały proces, który jest dostępny w ramach repozytorium
jesz tego typu rozwiązania, to warto przeznaczyć pewną Github (https://github.com/trailof bits/algo). Świetnie
sumę pieniędzy, aby mieć pewność, że nasza komunika- sprawdza się w tym, aby w szybki i prosty sposób po-
cja nie jest podsłuchiwana, a informacje o tym, kiedy łą- stawić serwer IPSec na posiadanym przez nas hostin-
czyliśmy się z serwerem VPN i jak wyglądała nasza dalsza gu, a nawet wygenerować gotowe pliki konfiguracyjne
aktywność, nie są przechowywane i sprzedawane dalej. dla naszych urządzeń. W moim przypadku doskonale
Firmy oferujące usługi serwerów VPN wyrastają jak sprawdza się w połączeniu z usługą Amazon Lightsail.
grzyby po deszczu i prześcigają się w zapewnieniach, jak
bardzo dbają o naszą prywatność. Bardzo często są one NA KONIEC…
zarejestrowane w egzotycznych miejscach oraz przeko- Korzystanie z VPN nie zwalnia nikogo z obowiązku
nują, że ich polityką jest brak logowania działań użyt- przestrzegania prawa. Jeżeli jedyną motywacją do uży-
kownika (tak zwane „no logs policy”). Warto wiedzieć, cia VPN jest ukrycie swojej tożsamości w celu wykonania
że historia już niejednokrotnie pokazała drugą stronę niedozwolonej czynności (na przykład użytkowania po-
medalu: w przypadku podejrzenia popełnienia prze- branej z Internetu nielegalnej kopii oprogramowania), to
stępstwa i zwrócenia się przez organy ścigania firmy te nie warto tego robić.
udostępniają jednak wiele informacji na temat swoich
klientów. Oznacza to, że często „no logs policy” to jedy- Łukasz Basa
nie chwyt marketingowy. Bezpiecznik, entuzjasta technologii, miłośnik alter-
Nie będziemy tu polecać żadnego konkretnego do- natywnych metod parzenia kawy.
stawcy. Jeżeli jesteś zainteresowany/a skorzystaniem
z takiej usługi, to z pewnością znajdziesz ich całą listę, KONTAKT@BEZPIECZNY.BLOG
HTTPS://BEZPIECZNY.BLOG
korzystając z wyszukiwarki. Pamiętaj tylko, że usługi wy-

!
Zapamiętaj Ćwicz w domu
օ VPN pozwala na nawiązanie zdalnego, szyfrowane- օ Poszukaj w Internecie informacji o usłu-
go połączenia z drugim komputerem. gach VPN. Porównaj je i zobacz, czym się one
charakteryzują.
օ VPN nie zapewnia anonimowości w Internecie.
օ Sprawdź, jak zmienił się twój adres IP po połą-
օ Nie korzystaj z darmowych serwerów VPN, bo mogą
czeniu z VPN.
okazać się bardziej niebezpieczne niż ich brak.

[ PPROGR
ROGR AMI STAJR . PL ] 69
PROGRAMISTYCZNE WYZWANIA

Konrad Jagaciak

Programistyczne wyzwania
Kolejna odsłona programistycznych wyzwań to nowe zadania „z haczykiem”, które można
rozwiązać na różne sposoby. Mają one zainspirować do samodzielnej pracy, ale też udzie-
lić wskazówek, które mogą ci w tym pomóc. Przeczytaj zadania i spróbuj je samodzielnie
rozwiązać, a dopiero potem przeczytaj do nich wskazówki.

SCRATCH: JAK LOSOWAĆ WYRAZY? ze słowami, spośród których jedno ma zostać wylosowa-
W programie Scratch znajdziemy bloczek pozwa- ne. Tworząc nową listę, możesz jej nadać nazwę Słowa.
lający na wygenerowanie liczby z podanego przez nas
zakresu. Bloczek losuj liczbę od 0 do 10 znajdziemy w
kategorii Wyrażenia.

Ilustracja 1. Bloczek do generowania liczb

Nie sposób jednak znaleźć bloku pozwalającego na wy-


losowanie wyrazu z podanej przez nas puli wyrazów.
Taki mechanizm musielibyśmy zbudować sami. Jest na
to kilka sposobów, a jednym z nich jest wykorzystanie
Ilustracja 3. Tworzenie nowej listy
list. W środowisku Scratch są one nieco ukryte. By z
nich skorzystać, należy wejść do kategorii Zmienne i Gdy w naszym projekcie jest utworzona lista, mamy do-
użyć przycisku Stwórz listę. stęp do nowych bloczków! Poprzez wykorzystywanie
bloczku dodaj obiekt do Słowa możemy dodawać nowe
słowa do listy, wpisując je w pole obiekt.

Ilustracja 4. Dodawania elementów do listy

Jednym z dostępnych bloczków dotyczących listy jest


element 1 z Słowa, który zwraca jedno ze słów znajdują-
cych się na liście.

Ilustracja 2. Kategoria „Zmienne”


Ilustracja 5. Bloczek zwracający element listy

Przykłady list z pewnością znasz z życia codziennego –


może to być lista obecności w szkole czy też lista zaku- Które słowo zostanie zwrócone? To zależy od tego, jaki
pów, sporządzana przed wyjściem do sklepu i zawierają- numer wpiszemy w miejscu 1. Elementy listy są ponu-
ca produkty, jakie chcemy kupić. My potrzebujemy listy merowane. Jeśli numer elementu listy, który ma zwrócić

70 [ 4 - 202 1 ]
Programistyczne wyzwania

bloczek, będzie wylosowany – będziemy mieć mecha- na... znajdującego się w kategorii Czujniki. Trybem, jaki
nizm zwracający wylosowane słowo. należy wybrać na bloczku, jest bez przeciągania.

Ilustracja 6. Zwracanie losowego elementu listy

Podając zakres losowania liczb. należy pamiętać o tym,


Ilustracja 8. Bloczek zmiany trybu przeciągania
by nie był on większy niż liczba elementów dodanych do
listy. Jeśli dodaliśmy do listy 5 słów – losujemy liczby od Co ważne, duszka nie będzie można przeciągać tylko
1 do 5. w trybie gry pełnoekranowej – przy testowaniu gry w
zmniejszonym oknie nadal będzie można go przeciągać
SCRATCH: JAK ZABLOKOWAĆ ręcznie.
OSZUKIWANIE W GRACH
W wielu grach stworzonych w programie Scratch
pojawia się motyw przejścia z jednego miejsca na sce-
Wyzwanie – wskazówka:
Jak dodawać do siebie bardzo duże liczby?
nie do innego – tak by unikać przeszkód. W tego typu
grach często łatwo jest oszukiwać – przeciągając duszka W wielu językach programowania tworząc zmienne do
myszką w inne miejsce. Tak mogłoby być w przypadku przechowywania liczb, określamy ich typ. Ma on wpływ
gry w min-igolfa, gdzie należy piłką trafić do dołka w jak na to, co może znaleźć się w zmiennej. I nie jest to tylko
wskazanie, że w zmiennej ma znaleźć się liczba całkowi-
najmniejszej liczbie uderzeń.
ta, tekst czy też ułamek – bardzo często wskazujemy też
na maksymalny zakres liczb, jakie mogą zmieścić się w
zmiennej. Python jest językiem dynamicznie typowa-
nym. To oznacza, że sam dopasowuje typ zmiennej, gdy
przypisujemy do niej wartość, a my sami nie musimy tego
typu wskazywać. Co więcej – nie musimy się też przejmo-
wać rozmiarem liczb przechowywanych w zmiennych.
Nic nie stoi na przeszkodzie, abyśmy w zmiennej zapisali
liczbę składającą się z setek cyfr! Chcesz dodać do siebie
dwie liczby pięciuset-cyfrowe? Żaden problem, skorzystaj
z Pythona! Na bardzo dużych liczbach możemy wykonywać
też inne matematyczne działania, nie tylko dodawanie.

Ilustracja 7. Gra mini-golf stworzona w programie


Scratch

Istnieje jednak możliwość zablokowania użytkowniko-


wi ręcznego przesuwania zarówno piłki, jak i dołka. Jeśli
Ilustracja 9. Dodawanie pięciuset-cyfrowych liczb
chcesz, by duszka nie dało się przesunąć, przeciągając w języku Python
go w inne miejsce, użyj bloczku ustaw tryb przeciągania

[ PROGR AMI STAJR . PL ] 71


3.14159

Michał Kremzer

Zagadki matematyczne dla dzieci w wieku 11+

1. Kupujemy n sztuk towaru w sklepie. Jaką cechę powin-


no spełniać n, byśmy mieli pewność, że w sumie zapła-
cimy całkowitą liczbę złotych, nawet jeśli nie znamy
ceny jednej sztuki towaru?

2. Liczba n jest ustaloną liczbą parzystą większą od 2. Po-


daj przykład liczb a, b, c, d, które są parami różne oraz
różne od 0 i z których dokładnie jedna jest liczbą cał-
kowitą, dokładnie jedna jest liczbą dodatnią oraz liczba
(a + b)(c + d) jest liczbą całkowitą i większą od n.

3. Podaj przykład liczby naturalnej o różnych cyfrach, któ-


ra jest większa od 100, ma wszystkie cyfry większe od 1
oraz dzieli się przez kwadrat każdej ze swoich cyfr.

4. O ile procent należy zmniejszyć liczbę dodatnią, aby


otrzymać liczbę do niej przeciwną?

5. Wyznacz najmniejszą liczbę naturalną n taką, że po


zmniejszeniu liczby dodatniej o n procent otrzymamy
liczbę ujemną.

72 [ 4 - 202 1 ]
Liczbę trzycyfrową zmniejszono o n% i otrzy-

6. mano liczbę jednocyfrową. Liczba n jest liczbą


naturalną dodatnią. Ile co najmniej może wy-
nosić n?

7. Liczby m i n są ustalonymi liczbami naturalnymi dodatnimi. Resz-


ta z dzielenia liczby m przez liczbę n jest równa 4. Ile wynosi
reszta z dzielenia liczby m + 1 przez liczbę n?

Podaj przykład liczb naturalnych dodatnich m i n, tak aby

8. reszta z dzielenia liczby m przez liczbę n była równa 1,


a reszta z dzielenia liczby m przez liczbę n + 1 była równ
a 18.

9. Wyznacz najmniejszą liczbę stucyfrową, która przy dziele-


niu przez 9 daje resztę 6.

10. Liczby a i b są liczbami naturalnymi dodatnimi. Liczba 2a


+ 4b dzieli się przez 7.Wyznacz resztę z dzielenia liczby
5a + 3b + 25 przez 7.

Rozwiązania:
10. 4.
9. 100...5 (98 zer między jedynką i piątką).
8. m = 37, n = 18.
7. 0 lub 5.
6. 91.
5. 101.
4. 200.
3. 432.
2. a = -0,25; b = -1,75; c = -0,5n – 1; d = 0,5.
1. n = 100m, m jest liczbą całkowitą nieujemną.

[ PROGR AMI STAJR . PL ] 73


WYDARZENIA I EDUKACJA

Aleksandra Zacharska

Lubisz programować?
Dołącz do codeweekowej społeczności!
Rozpoczynamy odliczanie – już niebawem rusza największe w Europie święto programo-
wania. Jak co roku dziesiątki tysięcy uczniów, rodzin, a nawet całych szkół ze wszystkich
stron świata przez dwa tygodnie będą programować w ramach CodeWeek. Warto do nich
dołączyć!

Z apamiętaj termin tegorocznego CodeWeek: to już


9–24 października 2021 r., a najlepiej od razu wpisz
te daty do kalendarza.
Nie ma wymogów dotyczących liczby uczestników
ani programu wydarzenia – chodzi o to, żeby wspólnie
programować i dobrze się bawić.

ŚWIĘTO PROGRAMOWANIA SUKCES 2020


Czym jest CodeWeek? Europejski Tydzień Kodowa- W Europejskim Tygodniu Kodowania jest też nieco…
nia to inicjatywa, w trakcie której – wspólnie z innymi zdrowej konkurencji. Wszystkie państwa ścigają się ze
krajami Unii Europejskiej (i nie tylko!) – celebrujemy sobą o to, które z nich zorganizuje najwięcej wydarzeń.
kreatyw­ność i współpracę oraz udowadniamy, że pro- CodeWeek to dziesiątki tysięcy inicjatyw, w których bie-
gramowanie jest dla wszystkich. W tym roku odbywa się rze udział kilka milionów osób z całego świata – w tym
już dziewiąta edycja CodeWeek. przeważająca część to szkoły i uczęszczający do nich
Europejski Tydzień Kodowania upowszechnia na- uczniowie oraz ich rodzice.
ukę programowania. Zadaniem uczestniczących w akcji Podczas #CodeWeek2020 po raz pierwszy w ośmio-
państw jest zorganizowanie możliwie największej liczby letniej historii Europejskiego Tygodnia Kodowania
wydarzeń związanych z promocją korzystania z nowych Polska nie tylko znalazła się na podium, ale też zajęła
technologii. pierwsze miejsce w tej rywalizacji! Programowali profe-
Idea jest prosta – każdy, kto chce się włączyć, może sjonaliści i amatorzy, uczniowie, pracownicy firm, grupy
zorganizować własne wydarzenie i zarejestrować je na znajomych, rodzice, przedstawiciele organizacji pozarzą-
stronie codeweek.eu/add. Organizatorzy, poza świetną dowych, a nawet przedszkolaki.
przygodą, otrzymają także specjalny certyfikat.
Jakie wydarzenia można zgłosić? Ogranicza cię tyl-
ko własna wyobraźnia, co więcej – w CodeWeek nie ma
złych pomysłów! Chodzi o inicjatywy, które pozwolą ra-

Ciekawostka
zem programować, ale też ćwiczyć logiczne myślenie,
rozwiązywać zagadki, organizować wirtualne zajęcia czy
gry.
Europejski Tydzień Kodowania to jedyny taki tydzień w roku,
Takim wydarzeniem może być wspólny klasowy (albo który trwa… dwa tygodnie! W tym roku CodeWeek świętuje-
koleżeński) projekt w Scratch, minhackathon, turniej ła- my w dniach 9–24 października. Swoje wydarzenia możesz
migłówek logicznych, lekcja informatyki, na której opo- jednak zgłaszać cały rok. Koniecznie poszukaj ich na mapie
wiesz swoim kolegom o CodeWeek, a nawet konkurs CodeWeek!
plastyczny związany z programowaniem i wiele innych…

76 [ 4 - 202 1 ]
WYDARZENIA I EDUKACJA

Polska od kilku lat konsekwentnie zwiększa liczbę » kurs „Programowanie w Scratch Junior z Klubem
zorganizowanych inicjatyw związanych z nauką pro- Młodego Programisty” – skierowany do tych wszyst-
gramowania. Ubiegłoroczny wynik przeszedł nasze naj- kich, którzy nie mieli jeszcze okazji spróbować swo-
śmielsze oczekiwania! Zajrzyj na gov.pl/koduj/codeweek ich sił w kodowaniu;
i obejrzyj filmowe podsumowanie „Polska zwycięzcą » kurs „Programowanie w Scratch 3.0 z Klubem Mło-
CodeWeek 2020”. dego Programisty” – na ten kurs zapraszamy przede
Czy twoja szkoła też jest częścią CodeWeek? Jeśli nie, wszystkim starszych uczniów szkół podstawowych
koniecznie zeskanuj kod QR i sprawdź, jak możesz do- i tych, którzy czują, że w Scratchu Juniorze progra-
łączyć do inicjatywy, a potem zaproś do zabawy swoich mować mogą nawet z zamkniętymi oczami. 😉
nauczycieli i rodziców.
W ciągu ośmiu spotkań nauczysz się tworzyć – najpierw
ZAINSPIRUJ SIĘ mniej, a później już nieco bardziej złożone – programy,
Jak zaangażować się w #CodeWeek2021? Nie ma tutaj a wszystko poprzez przygotowywanie krótkich animacji
ograniczeń wiekowych, terytorialnych czy jakichkolwiek i gier. Musisz tego spróbować! Na uważnych i wytrwa-
innych. CodeWeek może być początkiem fantastycznej łych uczestników czeka ponadto certyfikat. Kto wie,
przygody, a nawet nowej pasji – dla wszystkich! może okaże się przydatny w dalszym rozwoju?
Jak powinno wyglądać takie wydarzenie? Wszystko Co to ma jednak wspólnego z CodeWeek? Jeśli zachę-
zależy od twojego pomysłu. Ważne, aby rozwijało umie- cisz do udziału w kursie swoich kolegów i koleżanki (a może
jętności związane z programowaniem i logicznym my- też nauczyciela informatyki albo matematyki?), a następnie
śleniem oraz wykorzystaniem narzędzi cyfrowych. Do zarejestrujesz tę inicjatywę na codeweek.eu/add – stajesz
CodeWeek można też zgłosić lekcje informatyki, które się częścią codeweekowej społeczności!
odbywają się w twojej szkole.
Jeśli pierwszy raz słyszysz o Europejskim Tygo- DO DZIEŁA!
dniu Kodowania, koniecznie zajrzyj na oficjalną stronę Jeżeli masz jakiekolwiek pytania lub wątpliwości do-
codeweek.eu oraz na naszą – koduj.gov.pl. Dowiesz się tyczące Europejskiego Tygodnia Kodowania, jesteśmy
tam więcej o polskiej edycji i znajdziesz szereg inspi- do twojej dyspozycji: programowanie@mc.gov.pl. Zrobi-
racji. Zawsze możesz też napisać do biura CodeWeek: my wszystko, by pomóc.
programowanie@mc.gov.pl. Zaczynamy więc wielkie odliczanie i wkrótce widzimy
Szczególnie polecamy udział w kursach programo- się na Europejskim Tygodniu Kodowania. Bądź z nami!
wania w Scratch na platformie OSE IT Szkoła, w których
uczestniczy już kilka tysięcy osób! Wystarczy wejść na Aleksandra Zacharska
it-szkola.edu.pl i wyszukać: NASK, ambasadorka CodeWeek w Polsce

78 [ 4 - 202 1 ]
Rok przestępny, czyli jak stworzyć algorytm
sprawdzający w Scratchu i Pythonie?
uczniowie klas 90 min
VII-VIII

Justyna Klimczyk

ODNIESIENIE DO PODSTAWY PROGRAMOWEJ


Informatyka – klasy VII-VIII
I. Rozumienie, analizowanie i rozwiązywanie problemów. Uczeń:
4) rozwija znajomość algorytmów i wykonuje eksperymenty z algorytmami, korzystając z pomocy dy-
daktycznych lub dostępnego oprogramowania do demonstracji działania algorytmów;
5) prezentuje przykłady zastosowań informatyki w innych dziedzinach, w zakresie pojęć, obiektów
oraz algorytmów.
II. Programowanie i rozwiązywanie problemów z wykorzystaniem komputera i innych urządzeń cyfrow-
ych. Uczeń:
1) projektuje, tworzy i testuje programy w procesie rozwiązywania problemów. W programach sto-
suje: instrukcje wejścia/wyjścia, wyrażenia arytmetyczne i logiczne, instrukcje warunkowe, instrukcje
iteracyjne, funkcje oraz zmienne i tablice.

CELE ZAJĘĆ -- UCZEŃ MATERIAŁY


■ Potrafi określić, który rok jest rokiem przestępnym. ■ Karta pracy dla ucznia.
■ Dostrzega możliwość wykorzystania środowiska ■ https://programistajr.pl/karty-pracy-dla-nauczycieli/
programistycznego do rozwiązywania problemów
z innych dziedzin.
■ Tworzy w Scratchu skrypt służący do sprawdzania,
FORMY PRACY
czy dany rok jest rokiem przestępnym.
■ Wykład, dyskusja.
■ Tworzy w Pythonie program jako analogię skryptu
■ Instruktaż nauczyciela.
opracowanego w Scratchu.
■ Praca własna ucznia.
■ Potrafi wskazać inne problemy, w których omawiany
algorytm może być wykorzystany.
■ Rozbudowuje i udoskonala algorytmy omówione
podczas zajęć.

SCENARIUSZE ZAJĘĆ DLA NAUCZYCIELI


PRZEBIEG ZAJĘĆ
1. Czynności organizacyjne i przedstawienie uczniom celów lekcji (10 min).
Zajęcia powinniśmy rozpocząć od zadania uczniom kilku pytań:
■ Jaki rok nazywamy przestępnym?
■ Czy bieżący rok jest rokiem przestępnym?
■ Jak sprawdzić, czy dany rok był lub będzie przestępny?
2. Omówienie założeń projektu (10 min).
Podsumowaniem dyskusji powinno być określenie, w jaki sposób sprawdzić, czy dany rok jest przestępny, czy też nie.
Rok jest przestępny, jeśli: liczba go określająca dzieli się przez 4, ale nie dzieli się przez 100 lub dzieli się przez 400.
Zachodzi więc alternatywa: liczba dzieli się przez 4, ale nie dzieli się przez 100 lub liczba dzieli się przez 400.

3. Omówienie i stworzenie skryptu w Scratchu (25 min).


Należy zwrócić uwagę uczniów na to, aby:
■ podczas sprawdzania podzielności przez 4, 100 i 400 użyli bloku reszta z dzielenia. Reszta równa 0
oznacza, że liczba jest podzielna przez daną liczbę;
■ uważnie dobierali niezbędne bloki do zbudowania warunku w instrukcji jeżeli: nadrzędna będzie alter-
natywa (lub), a dopiero jednym z elementów tej alternatywy będzie koniunkcja (i);
■ zwrócili uwagę na to, że w Scratch nie ma operatora „różny”. Należy go zastąpić blokiem negacji.
Warto zwrócić uwagę uczniów, że w tym prostym zadaniu pojawia się kilka elementów logiki matematycznej
(koniunkcja, alternatywa, negacja), często wykorzystywanej podczas tworzenia algorytmów.
Link do projektu w Scratchu: https://scratch.mit.edu/projects/555147331

4. Stworzenie analogicznego programu w języku Python (20 min).


rok=int(input("Podaj rok: "))
if rok % 4 == 0 and rok % 100 != 0 or rok % 400 == 0:
print("Rok jest przestępny")
else:
print("Rok nie jest przestępny")

Przed rozpoczęciem tworzenia programu należy przypomnieć uczniom wykorzystywane w Pythonie operatory
porównania (==, =!), operatory logiczne (and, or) oraz operator arytmetyczny (%).
Należy zwrócić uwagę uczniów na to, że:
■ o ile w Scratchu mogliśmy obyć się bez zmiennej (wystarczy wykorzystać blok odpowiedź), o tyle w Pytho-
nie zmienna jest konieczna;
■ wcięcia odgrywają w Pythonie kluczową rolę.
5. Samodzielna praca ucznia (20 min).
Uczniowie pracują samodzielnie w oparciu o kartę pracy, udoskonalają skrypt. Nauczyciel wspiera uczniów
w rozwiązywaniu pojawiających się problemów dotyczących składni. Nie ingeruje w pomysł ucznia.
6. Podsumowanie zajęć i ewentualna ocena prac uczniów (5 min).

You might also like