Gra wąż

A1
  • Rejestracja:około 6 lat
  • Ostatnio:30 dni
  • Lokalizacja:Polska
  • Postów:82
0

Witajcie

Ostatnio zrobiłem popularną grę węża :).

Pozdrawiam

Ps. Proszę o opinie i komentarze. Czy wam się podoba czy też nie :).


Nieoszlifowany diament
katakrowa
W czym to kompilowałeś? Lazarus czy Delphi i w jakich wersjach ?
Burdzi0
  • Rejestracja:prawie 9 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Futurama
  • Postów:887
3

Wrzuć kod na jakiegoś vcsa, ja w żadnym wypadku nie ściągnął bym nic wrzuconego w archiwum


Bite my shiny metal ass!
Life throws you an error code like that, you don't have the luxury of a ZnVja2luZw== pop-up explanation *Robię projekty studenckie, pisz priv ;) *
flowCRANE
Nie przesadzaj, źródła spokojnie można opakować w zwykły .zip i udostępnić – to w sumie standardowa procedura dzielenia się projektami na oficjalnym forum Free Pascala. No chyba że pakuje się do niego pliki wykonywalne, to wtedy lekko cuchnie podstępem. ;)
Burdzi0
@furious programming: być może, jestem nieufny, to już nie ten internet co kiedyś
TS
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 4 lata
  • Postów:394
1

Pascal i wcięcia na 5 spacji? Nonkonformista.

flowCRANE
Nie na pięć spacji. Zauważ jaki jest wzór – wcięcie jest wyrównane do słowa kluczowego z poprzedniej linijki. Im dłuższe słowo, tym większe wcięcie. Ochydne formatowanie, fuj… :/
PerlMonk
@furious programming: W każdym razie trochę mindfuck.
flowCRANE
Dla mnie spory mindfuck.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:9 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1
Kopiuj
procedure DrawingSnakeAndFood(wsp_x,wsp_y: integer);
var
   wi,wj: byte;
   point_x1,point_y1,point_x2,point_y2: integer;
   wl,wk: integer;
begin
     point_x1 := 0; point_y1 := 0;
     for wi := 1 to 10 do
        begin
             for wj := 1 to 10 do
                begin
                     point_y1 := wsp_y * (wi - 1);
                     point_y2 := point_y1 + wsp_y;
                     if wi in [2..3] then
                       begin
                            point_y2 := point_y2 - 1;
                            if wi = 3 then
                              point_y1 := point_y1 - 1
                       end
                     else
                         if wi in [4..6] then
                           begin
                                point_y1 := point_y1 - 1;
                                point_y2 := point_y2 - 1;
                                if wi = 6 then
                                  point_y2 := point_y2 - 1
                           end
                         else
                             if wi = 10 then
                               point_y1 := point_y1 - 3
                             else
                                 if wi in [7..9] then
                                   begin
                                        point_y1 := point_y1 - 2;
                                        point_y2 := point_y2 - 2;
                                        if wi = 9 then
                                          point_y2 := point_y2 - 1
                                   end;

                     point_x1 := wsp_x * (wj - 1);
                     point_x2 := point_x1 + wsp_x;

                     if wj in [6..10] then
                       begin
                            if wj = 6 then
                              point_x2 := point_x2 - 1
                            else
                                begin
                                     point_x1 := point_x1 - 1;
                                     point_x2 := point_x2 - 1
                                end
                       end;

                    if board[wi,wj] = 'X' then
                      begin
                           setcolor(4);
                           rectangle(point_x1,point_y1,point_x2,point_y2);
                           setcolor(10);
                           circle(point_x1 + (wsp_x div 2),point_y1 + (wsp_y div 2),wsp_y div 2);
                           putpixel(point_x1 + (wsp_x div 2),point_y1 + (wsp_y div 2),12)
                      end
                    else
                        if board[wi,wj] = '0' then
                          begin
                               setcolor(2);
                               rectangle(point_x1,point_y1,point_x2,point_y2);
                               setcolor(13);
                               circle(point_x1 + (wsp_x div 2),point_y1 + (wsp_y div 2),wsp_y div 2);
                               putpixel(point_x1 + (wsp_x div 2),point_y1 + (wsp_y div 2),11)
                          end
                end
        end
end;

Podoba mi się, Takie nieoczywiste


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
NS
Hahah padłem. Wygląda jak kod jakiejś biblioteki javascriptowej w pascalu.
katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
5

Działa ale ...

  1. Strasznie miga. Niepotrzebnie przerysowujesz cały ekran. Czyścisz i rysujesz na nowo. Tak można robić ale tylko gdy grafikę buforujesz.
  2. Procedura rysowania planszy jest "kosmiczna". Widać, że to efekt końcowy zgadywania tak długo aż zadziała a nie przemyśleń jak ma to działać. Wystarczyła pojedyncza pętla bez wszelkich ifów ... rysująca węża na podstawie tablicy i 1 linijka rysująca jedzenie ( wywołanie procedury rys. jedzenie ). ( przecież i tak kasujesz obraz op każdym kroku ). Co jakby plansza była 1000x1000 wykonywałbyś te operacje if'y, pypisania itp ... milion razy na każdą klatkę?

Skoro już to napisałeś i działa to teraz przemyśl cały algorytm jeszcze raz i napisz ponownie ale tym razem poprawnie. Brawo za dobre chęci ale obecna wersja niestety nie zasługuje na pochwałę od strony planowania i samego kodu.
Jeśli będziesz miał pytania to pomogę.


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12165
3

Przy rysowaniu węża istotne jest odmalowywanie tylko tych fragmentów, które uległy zmianie – dotyczy to zarówno węża, jak i interfejsu (punktów, długości itp.). W przypadku konsolowych aplikacji jest to banalne, bo skasowanie bieżącego znaku i namalowanie nowego to po prostu namalowanie nowego – stary znika. Jeśli chodzi o węża, to przemalowuje się go tylko wtedy, gdy się poruszył, a jeśli się poruszył, to zamalowujesz jego ogon i malujesz głowę w nowym miejscu.

To tak w skrócie. I popraw te wcięcia, bo kod wygląda z nimi tragicznie! W Pascalu używa się wcięć dwuznakowych, we wszystkich konstrukcjach kodu. Są wyjątki, ale póki nie potrafisz formatować zwyczajnego kodu w praktycznie w ogóle, to zostawmy temat wyjątków na kiedyś indziej.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
TS
Odmalowywanie tylko miejsc, które się zmieniły jest problematyczne. Jak bawiłem się w pisanie gierek w WinAPI to szybko zacząłem stosować double-buffering. Efekt ten sam, tylko zużycie procesora skacze z 1% do 2%, ale co z tego :D
flowCRANE
Nie jest problematyczne – przynajmniej nie w przypadku węża. Wiem coś o tym, bo kilka lat temu takiego pisałem – co prawda w wersji znakowej (normalnie w konsoli), ale to wiele nie zmienia. :P
katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
2

Generalnie stosując pascal'ową bibliotekę graph / BGI tak należałoby zrobić ( rysowaćtylko zmiany ) bo w sumie nie ma innej możliwości - ale to z wielu powodów problematyczna metoda.. Z tego co pamiętam to w Graph.pas nie było obsługi buforowania aczkolwiek tego typu sztuczek już od lat się nie stosuje bo przekopiowanie bufora do pamięci 20 razy na sek. to czas właściwie pomijalny a metoda taka rozwiązuje wszelkie problemy z nachodzeniem się obiektów, kolorowym tłem ( np. obrazek ) i wiele innych...
Najbardziej podstawowe funkcje do rysowania wykorzystywane w WinApi to SetDIBitsToDevice + GetDC jak o nich poczytasz to będziesz miał solidną bazę do dalszych zabaw.
Funkcje wstępnie wyglądają strasznie ale w praktyce nie jest trudno.

W sumie całość sprowadza się do ( delphi / lazarus ):

Kopiuj

procedure Rysuj();
const

  maxBufferX = 1920 ;
  maxBufferY = 1080 ;

Type

  // Twój bufor ekranu jeden typ liniowy, drugi z dostępem do poszczególnych składowych kolorów.
  //
  TScreen = array [ 0 .. maxBufferX*maxBufferY ] of Dword ; // planujemy układ kolorów RGBA
  TScreenRGBA = Array [ 0 .. maxBufferX*maxBufferY ] of record 
    R, G, B, A :byte ;
  end ;

Var

  canvasHandle : HWND ;
  _bmpinf:TbitmapInfoHeader;
  _bmpin:TBITMAPINFO;
  _rgbq:array [0..0]of TRGBQUAD;
  
  Screen : TScreen ;
  ScreenRGBA : TScreenRGBA absolute Screen ; // absolute rzutuje obszar pamięci na Screen  
  
  x, y : integer ;

begin

  //
  // Inicjujemy niezbędne struktury opisujące parametry bufora obrazu
  //
  
  canvasHandle := [HWND] ; // Tu przypisać HWND okna w którym rysujemy.
  
  _bmpinf.bisize:=sizeof(_bmpinf);
  _bmpinf.biwidth:=MaxX;
  _bmpinf.biheight:=MaxY;
  _bmpinf.biplanes:=1;
  _bmpinf.bibitcount:=32;
  _bmpinf.bicompression:=0;
  _bmpinf.bisizeimage:=0;
  _bmpinf.biXpelspermeter:=0;
  _bmpinf.biYpelspermeter:=0;
  _bmpinf.biclrused:=0;
  _bmpinf.biclrimportant:=0;
  _rgbq[0].rgbblue:=1;
  _rgbq[0].rgbgreen:=2;
  _rgbq[0].rgbred:=3;
  _rgbq[0].rgbreserved:=0;
  _bmpin.bmiheader:=_bmpinf;
  _bmpin.bmicolors[0]:=_rgbq[0];
  
  // 
  // Tutaj rysujesz cokolwiek w bufrze ...
  // np. wypełnienie losowymi odcieniami czerwonego
  //
  
  for x := 0 to maxBufferX - 1 do  
  for y := 0 to maxBufferY - 1 do
  begin
    ScreenRGBA [ x + maxBufferX * Y ].R = random(255) ;
  end;
  
  
  
  //
  // Wyrzucasz na ekran / do okna.
  //

  SetDIBitsToDevice( GetDc ( canvasHandle ), 0, 0 ,maxBufferX, maxBufferY, 0, 0, 0, maxBufferY, @Screen[0], _bmpin,DIB_RGB_COLORS ) ;

end;

czyli właśnie kopiowanie zawartości bufora na ekran ... Niestety wszystko rysować trzeba samemu lub użyć jakiejś biblioteki.


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
edytowany 4x, ostatnio: flowCRANE
katakrowa
  • Rejestracja:około 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
1

W załączniku przygotowałem Ci przykładowy program gotowy do kompilacji w Lazarus.

screenshot-20200916200129.png


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
edytowany 1x, ostatnio: katakrowa
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12165
0

Standardowe wykorzystanie tylnego bufora to nie jest jedyny sposób na przyspieszenie renderowania. W poważniejszych projektach bazujących na FCL i LCL (np. mój Deep Platformer lub ostatnio Richtris), można spokojnie korzystać z natywnego GDI+ i wydajność jest całkiem niezła (tym bardziej w porównaniu do Linuchów) i tam bitmapy jako bufory sprawdzają się super.

Tutaj problemem jest to, że rysowanie odbywa się bezpośrednio na docelowym płótnie (obojętne na którym). Ten problem można rozwiązać poprzez zamalowanie ”nieważnego” kafla zwykłym Rectangle i namalowanie go od nowa. Taki sposób i tak znacząco przyspieszy proces renderowania, dzięki czemu nic nie będzie migać. Oczywiście o ile gra bazuje na tabelarycznie zbudowanej planszy i wężu przesuwającym się o cały kafel (a nie o piksel/kilka pikseli w każdej klatce).

W każdym razie zawsze da się zrobić lepiej niż malować wszystko od nowa. ;)


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
A1
  • Rejestracja:około 6 lat
  • Ostatnio:30 dni
  • Lokalizacja:Polska
  • Postów:82
0

Poprawiłem zgodnie z sugestiami :).


Nieoszlifowany diament
A1
Program napisany i skompilowany w Free Pascalu.
A1
Plik rar zawiera plik wykonywalny exe w celu pokazania efektu końcowego. gdyż nie każdy ma kompilator free pascala i tym samym nie może zboczyć wyniku.
A1
  • Rejestracja:około 6 lat
  • Ostatnio:30 dni
  • Lokalizacja:Polska
  • Postów:82
0

Do snake dodałem stronę tytułową umożliwiającą wybór długości węża na początku gry.


Nieoszlifowany diament
Zobacz pozostałe 8 komentarzy
TS
Po co miałbym pisać grę, która była zakodzona milion razy?
PerlMonk
@tsz: Po co masz się podcierać, skoro następnego dnia znów się zesrasz?
A1
@tsz chciałem rzucić Ci wyzwanie :). Tylko tyle :). Challenge są teraz modne :).
TS
@Adept123: nawet się zastanawiam czy by nie napisać węża w jakimś dziwnym języku jako kata :D Ale nie o to mi chodziło, czemu Pascal?
flowCRANE
„Moje wątpliwości dotyczą pisania takich rzeczy w niemal wymarłej technologii.” – @tsz, nie siej fermentu. Pascal nie jest wymarłą technologią i daleko mu do tego stanu. Jest Delphi, jest Lazarus i jest Oxygene – cały czas rozwijane i cały czas używane technologie, przyciągające z roku na rok coraz więcej deweloperów.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12165
2

Nie chcę Cię dobić @Adept123, bo wiadomo że każdy się uczy itd., ale z przykrością stwierdzam, że produkujesz paskudny kod. Paskudny pod względem wizualnym (czytelność jest tragiczna), jak również pod względem algorytmicznym i struktur danych. Łamiesz wszelkie możliwe wytyczne związane z formatowaniem kodu, używasz najróżniejszych przestarzałych technik, a nawet wykorzystujesz iście starożytne własności języka.

Pracujesz na pececie z DOS-em, że używasz krótkich nazw, w dodatku tylko dużymi literami? Mamy 2020 rok, w Lazarusie możesz używać długich nazw plików, a także stosować przestrzenie nazw (kropki wewnątrz nazwy modułu), dzięki czemu łatwiej zarządzać plikami projektu. Poza tym podzieliłeś projekt na dwa moduły w sumie bez żadnej potrzeby – nieco ponad 300 linijek kodu może istnieć w jednym module.

Pierwszy problem to formatowanie kodu, co od razu odpycha:

  • wcięcia są nieregularnej głębokości – w Pascalu obowiązują wcięcia w rozmiarze dwóch spacji,
  • nie stosujesz pustych linii pomiędzy procedurami i do oddzielania niezwiązanych logicznie ze sobą bloków kodu,
  • niektóre słowa kluczowe piszesz dużą literą, choć w Pascalu zawsze wszystkie słowa kluczowe pisze się małymi literami,
  • używasz nic nie mówiących identyfikatorów dla zmiennych, w dodatku w notacji przeznaczonej dla języka C,
  • nazywasz argumenty procedur tak samo jak zmienne, przez co nie da się ich odróżnić od zmiennych, bez zaglądnięcia do nagłówka procedury (lub skorzystania z podpowiedzi edytora kodu), w dodatku wybierasz nazwy kolidujące z wbudowanymi funkcjami (np. Length),
  • piszesz po kilka instrukcji w jednej linijce, co potwornie komplikuje analizę kodu,
  • nazywasz procedury w zły sposób – nazwa każdej procedury powinna się zaczynać od czasownika w najprostszej formie, a nie od rzeczownika.
  • pomijasz znak średnika w każdej ostatniej instrukcji, przez komplikujesz kod i utrudniasz sobie jego pisanie.

Druga rzecz to struktura kodu:

  • używasz kupy zmiennych globalnych, zamiast przekazywanych w parametrze procedur zmiennych lokalnych,
  • tworzysz bardzo długie i wszystko robiące procedury, zamiast pisać więcej krótkich procedur odpowiadających tylko za jedną czynność,
  • piszesz bardzo długie i złożone instrukcje warunkowe, znów robiące wiele rzeczy,
  • piszesz kod proceduralnie, choć znacznie krócej, szybciej i wygodniej jest pisać kod obiektowy (olać, jeśli po prostu uczysz się pisać kod niskopoziomowo – to też ważna umiejętność),
  • porównujesz zmienne logiczne z wartościami True/False w instrukcjach warunkowych, co jest niespotykane/dziwne,
  • nie stosujesz skróconego zapisu inkrementacji (operator += i temu podobne), który jest przecież natywny dla FPC,
  • tworzysz kilka jednoargumentowych warunków zamiast jednego wieloargumentowego (wydłużasz kod).

To tak ogólnie. Jeśli chcesz wiedzieć jak formatować kod, przeczytaj artykuł Object Pascal Style Guide – są pokazane liczne przykłady co robić i czego nie robić. Co do technicznych aspektów to cóż – kursów i tutoriali w sieci mnóstwo, więc jest co czytać.

Nie zniechęcaj się – po prostu przełknij powyższe i zastosuj się do tego, a gwarantuję, że z biegiem czasu będziesz pisał coraz lepszy i coraz ładniejszy kod, który łatwo będzie utrzymywać i łatwo analizować przez osobny postronne.


PS: jeśli publikujesz źródła, to nie wrzucaj osobnych modułów, a po prostu wszystkie pliki projektu, bez pliku wykonywalnego, binarek i kopii zapasowych (zwykle znajdują się w katalogu lib), oraz bez pliku z zapisem sesji (rozszerzenie .lps). Kompletne źródła projektu to plik z rozszerzeniem .lps, wszystkie .pp lub .pas (zależy których używasz) oraz ew. grafiki, dźwięki, pliki konfiguracyjne i inne, bez których program nie będzie działał poprawnie.

Jak jesteś zbyt leniwy na ręczne kopiowanie przed archiwizacją, to skorzystaj z opcji w Lazarusie – w głównym menu kliknij w Project i wybierz opcję Publish project.... Będziesz mógł albo tylko stworzyć kopię plików projektu, albo dodatkowo spakować je do archiwum. Tylko czytaj to co jest napisanie w komunikatach podczas publikowania.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
A1
  • Rejestracja:około 6 lat
  • Ostatnio:30 dni
  • Lokalizacja:Polska
  • Postów:82
0

Małe zmiany w kodzie.


Nieoszlifowany diament
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)