OPengl robot pomoc z kodem.

OPengl robot pomoc z kodem.
SP
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 7 lat
  • Postów:1
0

Witam!
Dopiero zaczynam swoją przygodę z programowaniem i potrzebuję takiej drobnej pomocy.
Mógłby ktoś mi pomóc przerobić głowę robota na czajnik?
Korzystałem z gotowej funkcji glutSolidTeapot ale nie do końca mi to wychodziło.
Byłbym bardzo wdzięczny za pomoc.

Kopiuj
#include <Windows.h>
#include <GL\glew.h>
#include <GL\freeglut.h>


using namespace std;

HDC g_HDC;
float angle = 0.0f;
float legAngle[2] = { 0.0f, 0.0f };
float armAngle[2] = { 0.0f, 0.0f };
bool fullScreen = false;

/*      Funkcja:       DrawCube
Cel:        Rysuje kwadraty.
*/

void DrawCube(float xPos, float yPos, float zPos)
{
	glPushMatrix();
	glBegin(GL_POLYGON);
	//glutSolidTeapot();
	/*      Górna twarz*/
	glVertex3f(0.0f, 0.0f, 0.0f);
	glVertex3f(0.0f, 0.0f, -1.0f);
	glVertex3f(-1.0f, 0.0f, -1.0f);
	glVertex3f(-1.0f, 0.0f, 0.0f);

	/*      Przód twarzy*/
	glVertex3f(0.0f, 0.0f, 0.0f);
	glVertex3f(-1.0f, 0.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);
	glVertex3f(0.0f, -1.0f, 0.0f);

	/*      Prawy profil*/
	glVertex3f(0.0f, 0.0f, 0.0f);
	glVertex3f(0.0f, -1.0f, 0.0f);
	glVertex3f(0.0f, -1.0f, -1.0f);
	glVertex3f(0.0f, 0.0f, -1.0f);

	/*      Lewy profil*/
	glVertex3f(-1.0f, 0.0f, 0.0f);
	glVertex3f(-1.0f, 0.0f, -1.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);

	/*      Dół*/
	glVertex3f(0.0f, 0.0f, 0.0f);
	glVertex3f(0.0f, -1.0f, -1.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	glVertex3f(-1.0f, -1.0f, 0.0f);

	/*      Tył*/
	glVertex3f(0.0f, 0.0f, 0.0f);
	glVertex3f(-1.0f, 0.0f, -1.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	glVertex3f(0.0f, -1.0f, -1.0f);

	glEnd();
	glPopMatrix();
}

/*      Funcja:       DrawArm
Cel:        Rysuje ramię
*/

void DrawArm(float xPos, float yPos, float zPos)
{
	glPushMatrix();

	/*      Ustawia czerwony kolor*/
	glColor3f(1.0f, 0.0f, 0.0f);
	glTranslatef(xPos, yPos, zPos);

	/*      Tworzy kostkę 1 x 4 x 1 */
	glScalef(1.0f, 4.0f, 1.0f);
	DrawCube(0.0f, 0.0f, 0.0f);

	glPopMatrix();
}

/*      Function:       DrawHead
Purpose:        Rysuje głowę
*/

void DrawHead(float xPos, float yPos, float zPos) // float zPos
{
	glPushMatrix();

	/*      Ustawia biał kolor*/
	glColor3f(1.0f, 1.0f, 1.0f);
	glTranslatef(xPos, yPos, zPos);

	/*      Tworzy kostkę 2 x 2 x 2 */
	glScalef(2.0f, 2.0f, 2.0f);
	DrawCube(0.0f, 0.0f, 0.0f);
	
	glPopMatrix();
}

/*      Function:       DrawTorso
Purpose:        Rysuję tłów
*/

void DrawTorso(float xPos, float yPos, float zPos)
{
	glPushMatrix();

	/*      Ustawia kolor niebieski*/
	glColor3f(0.0f, 0.0f, 1.0f);
	glTranslatef(xPos, yPos, zPos);

	/*      Tworzy kostkę 3 x 5 x 1 */
	glScalef(3.0f, 5.0f, 1.0f); //351
	DrawCube(0.0f, 0.0f, 0.0f);

	glPopMatrix();
}

/*      Function:       DrawLeg
Purpose:        Rysję nogi
*/

void DrawLeg(float xPos, float yPos, float zPos)
{
	glPushMatrix();

	/*      Ustawia kolor żółty*/
	glColor3f(1.0f, 1.0f, 0.0f);
	glTranslatef(xPos, yPos, zPos);

	/*      Tworzy kostke 1 x 5 x 1 */
	glScalef(1.0f, 5.0f, 1.0f);
	DrawCube(0.0f, 0.0f, 0.0f);

	glPopMatrix();
}

/*      Funcja:       DrawRobot
Cel:        Rysuje całego robota
*/

void DrawRobot(float xPos, float yPos, float zPos)
{
	/*      Zmienne kończyn robota.
	True znaczy, że noga jest w przodzie,
	False znaczy, że noga robota jest w tyle.
	*/
	static bool leg1 = true;
	static bool leg2 = false;
	static bool arm1 = true;
	static bool arm2 = false;

	glPushMatrix();

	/*      Rysuje robota w wyznaczonych współrzędnych.
	*/
	glTranslatef(xPos, yPos, zPos);

	/*      Te trzy linie rysują różne części naszego robota.
	*/
	//glutSolidTeapot(1);
	DrawHead(1.0f, 2.0f, 0.0f);
	DrawTorso(1.5f, 0.0f, 0.0f);
	glPushMatrix();


	/*      Jeśli ręka robota rusza się w przód zwiększamy kąt;
	W innym przypadku zmniejszamy kąt.
	*/
	if (arm1)
	{
		armAngle[0] = armAngle[0] + 1.0f;
	}
	else
	{
		armAngle[0] = armAngle[0] - 1.0f;
	}

	/*      Kiedy ręka osiąga maksymalne wychylenie w jedną strone,
	to chcemy, żeby poruszała się w drugą stronę.
	*/
	if (armAngle[0] >= 15.0f)
	{
		arm1 = false;
	}
	if (armAngle[0] <= 15.0f)
	{
		arm1 = true;
	}


	/*      Oddzielamy rękę od tłowia.
	Tworzymy efekt poruszania się.
	*/

	glTranslatef(0.0f, -0.5f, 0.0f);
	glRotatef(armAngle[0], 1.0f, 0.0f, 0.0f);
	DrawArm(2.5f, 0.0f, -0.5f);

	glPopMatrix();

	glPushMatrix();


	/*      Kiedy ręka osiąga maksymalne wychylenie w jedną strone,
	to chcemy, żeby poruszała się w drugą stronę.
	*/
	if (arm2)
	{
		armAngle[1] = armAngle[1] + 1.0f;
	}
	else
	{
		armAngle[1] = armAngle[1] - 1.0f;
	}

	/*       Oddzielamy rękę od tłowia.
	Tworzymy efekt poruszania się.
	*/
	glTranslatef(0.0f, -0.5f, 0.0f);
	glRotatef(armAngle[1], 1.0f, 0.0f, 0.0f);
	DrawArm(-1.5f, 0.0f, -0.5f);

	glPopMatrix();

	/*      Obracamy nogę w zależności od położenia ciała.
	*/
	glPushMatrix();

	/*      Jeśli noga porusza się do przodu to zwiększamy kąt,
	jeśli nie to zmniejszamy.
	*/
	if (leg1)
	{
		legAngle[0] = legAngle[0] + 1.0f;
	}
	else
	{
		legAngle[0] = legAngle[0] - 1.0f;
	}

	/*      Kiedy noga osiąga maksymalne wychylenie w jedną strone,
	to chcemy, żeby poruszała się w drugą stronę.
	*/
	if (legAngle[0] >= 15.0f)
	{
		leg1 = false;
	}
	if (legAngle[0] <= -15.0f)
	{
		leg1 = true;
	}


	/*       Oddzielamy nogę od tłowia.
	Tworzymy efekt poruszania się.
	*/
	glTranslatef(0.0f, -0.5f, 0.0f);
	glRotatef(legAngle[0], 1.0f, 0.0f, 0.0f);


	/*      Czas narysować nogę :)
	*/
	DrawLeg(-0.5f, -5.0f, -0.5f);

	glPopMatrix();

	/*      Tak samo jak wyżej, dla lewej nogi.
	*/
	glPushMatrix();

	/*      Jeśli noga porusza się do przodu to zwiększamy kąt,
	jeśli nie to zmniejszamy.
	*/
	if (leg2)
	{
		legAngle[1] = legAngle[1] + 1.0f;
	}
	else
	{
		legAngle[1] = legAngle[1] - 1.0f;
	}

	/*       Kiedy noga osiąga maksymalne wychylenie w jedną strone,
	to chcemy, żeby poruszała się w drugą stronę.
	*/
	if (legAngle[1] >= 15.0f)
	{
		leg2 = false;
	}
	if (legAngle[1] <= -15.0f)
	{
		leg2 = true;
	}

	/*       Oddzielamy nogę od tłowia.
	Tworzymy efekt poruszania się.
	*/
	glTranslatef(0.0f, -0.5f, 0.0f);
	glRotatef(legAngle[1], 1.0f, 0.0f, 0.0f);
	DrawLeg(1.5f, -5.0f, -0.5f);

	glPopMatrix();

	glPopMatrix();

}


/*      Funcja:       Render
Cel:        Będzie renderować :)
*/
void Render()
{
	/*      Włącza destowanie głębi.
	*/
	glEnable(GL_DEPTH_TEST);

	/*      To nasze renderowanie, czyści ekran na czarno, czyści kolor i głębię
	i resetuje macierz widokową(modelu).
	*/
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glLoadIdentity();

	/*      Zwiększenie obrotów licznika kąta
	*/
	angle = angle + 1.0f;

	/*      Reset, kiedy osiągneliśmy koło
	*/
	if (angle >= 360.0f)
	{
		angle = 0.0f;
	}

	glPushMatrix();
	glLoadIdentity();

	/*      Rusz z 0,0,-30 , obraca robota na osi y, rysuj robota, i wyświetl aktualną macierz.
	*/
	glTranslatef(0.0f, 0.0f, -30.0f);
	glRotatef(angle, 0.0f, 1.0f, 0.0f);
	DrawRobot(0.0f, 0.0f, 0.0f);
	glPopMatrix();

	glFlush();

	/*     Przywraca buffer do tła.
	*/
	SwapBuffers(g_HDC);
}

/*      Funcja:       SetupPixelFormat
Cel:        Funkcja ta będzie odpowiedzialna
ustalania formatu dla piksela kontekstu urządzenia.
*/
void SetupPixelFormat(HDC hDC)
{
	/*      Format pixela index.
	*/
	int nPixelFormat;

	static PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),          //Rozmiar struktury
		1,                                      //Wersja domyślna
		PFD_DRAW_TO_WINDOW |                    //Wsparcie rysowania okna
		PFD_SUPPORT_OPENGL |                    //Wsparcie opengl
		PFD_DOUBLEBUFFER,                       //Wsparcie dla podwójnego bufforowania
		PFD_TYPE_RGBA,                          //RGBA tryb koloru
		32,                                     //32 bitowy tryb koloru
		0, 0, 0, 0, 0, 0,                       //Ignoruj bity koloru.
		0,                                      //Brak alpha buffera
		0,                                      //Ignoruj bit zmiany
		0,                                      //Brak buffera gromadzenia
		0, 0, 0, 0,                             //Ignoruje buffer gromadzenia
		16,                                     //16 bitowy rozmiar z-buffera
		0,                                      //Brak szablonu buffera
		0,                                      //Brak aux buffera
		PFD_MAIN_PLANE,                         //Główna płaszczyzna rysująca
		0,                                      //Odwrócony
		0, 0, 0 };                              //Ignoruje warsty masek.

	/*      Wybiera najlepiej pasujący format*/
	nPixelFormat = ChoosePixelFormat(hDC, &pfd);

	/*      Ustawia pixel format dla kontekstu urządzenia*/
	SetPixelFormat(hDC, nPixelFormat, &pfd);
}

/*      Windows Event Procedure Handler
*/
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	/*      Rendering i  zmienne kontekst urządzenia
	są tutaj ustawiane.
	*/
	static HGLRC hRC;
	static HDC hDC;

	/*      Szerokość i wysokość dla okna robota wyświetlana jest w.
	*/
	int width, height;

	switch (message)
	{
	case WM_CREATE: //Utworzyliśmy okno

		hDC = GetDC(hwnd);  //Pobiera aktualne windows kontekst urządzenia
		g_HDC = hDC;
		SetupPixelFormat(hDC); //Wywołuje naszę funkcję pixel format

		/*      Tworzy rendering kontekstu i robi je aktualnym
		*/
		hRC = wglCreateContext(hDC);
		wglMakeCurrent(hDC, hRC);

		return 0;
		break;

	case WM_CLOSE:  //Okno zostało zamknięte

		/*      Odznacza rendering kontekst u usuwa je*/
		wglMakeCurrent(hDC, NULL);
		wglDeleteContext(hRC);

		/*      Wysyła wiadomość wyjdź do kolejki.*/
		PostQuitMessage(0);

		return 0;
		break;

	case WM_SIZE:

		/*      Odzyskuje szerokość i wysokość*/
		height = HIWORD(lParam);
		width = LOWORD(lParam);

		/*      Nie chcesz chyba dzielić przez zero? :)*/
		if (height == 0)
		{
			height = 1;
		}

		/*      Zresetować rzutnię do nowych wymiarów*/
		glViewport(0, 0, width, height);

		/*      Ustawia aktualną macierz do wyświetlania*/
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity(); //Resetuję wyświetlanie macierzy

		/*      Obliczamy współczynnik okna.
		*/
		gluPerspective(54.0f, (GLfloat)width / (GLfloat)height, 1.0f, 1000.0f);

		glMatrixMode(GL_MODELVIEW); //Ustawia macierz modelview
		glLoadIdentity(); //Resetuję macierz modelview 

		return 0;
		break;

	default:

		break;
	}

	return (DefWindowProc(hwnd, message, wParam, lParam));
}

int APIENTRY WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR     lpCmdLine,
	int       nCmdShow)
{
	WNDCLASSEX windowClass; //klasa window
	HWND    hwnd;                   //Obługa okna
	MSG             msg;                    //wiadomość
	bool    done;                   //Informuje o ukończeniu
	DWORD   dwExStyle;              //Roszerzony styl okna
	DWORD   dwStyle;                //Styl okna
	RECT    windowRect;

	/*      Screen/atrybuty wyświetlania*/
	int width = 800;
	int height = 600;
	int bits = 32;

	windowRect.left = (long)0;               //Ustaw lewą wartość na 0
	windowRect.right = (long)width;  //Ustawą prawą wartość dla porządanej szerokości
	windowRect.top = (long)0;                //Ustaw górną wartość na 0
	windowRect.bottom = (long)height;//Ustawą dolną wartość dla porządanej wysokość

	/*      Wypełnij strukturę klasy okna.*/
	windowClass.cbSize = sizeof(WNDCLASSEX);
	windowClass.style = CS_HREDRAW | CS_VREDRAW;
	windowClass.lpfnWndProc = WndProc;
	windowClass.cbClsExtra = 0;
	windowClass.cbWndExtra = 0;
	windowClass.hInstance = hInstance;
	windowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	windowClass.hbrBackground = NULL;
	windowClass.lpszMenuName = NULL;
	windowClass.lpszClassName = "MyClass";
	windowClass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

	/*      Zarejestruj klasę okno*/
	if (!RegisterClassEx(&windowClass))
	{
		return 0;
	}

	/*      Sprawdź czy pełny ekran jest włączony*/
	if (fullScreen)
	{
		DEVMODE dmScreenSettings;
		memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));
		dmScreenSettings.dmSize = sizeof(dmScreenSettings);
		dmScreenSettings.dmPelsWidth = width;   //Szerokość ekranu
		dmScreenSettings.dmPelsHeight = height; //Wysokość ekranu
		dmScreenSettings.dmBitsPerPel = bits;   //bity na pixele
		dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;

		if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN !=
			DISP_CHANGE_SUCCESSFUL))
		{
			/*      Ustawianie trybu wyświetlania nieudane, zamień na okienkowy*/
			MessageBox(NULL, "Display mode failed", NULL, MB_OK);
			fullScreen = false;
		}
	}

	/*      Sprawdź czy pełny ekran jest ciągle właczony*/
	if (fullScreen)
	{
		dwExStyle = WS_EX_APPWINDOW;    //Roszerzony styl okna
		dwStyle = WS_POPUP;                             //Styl okna
		ShowCursor(FALSE);                              //Mouse pointer(klikacz)
	}

	else
	{
		dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; //Roszerzony styl okna
		dwStyle = WS_OVERLAPPEDWINDOW;                                  //Styl okna
	}

	AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);

	/*      Rejestracja klasy, tworze okno*/
	hwnd = CreateWindowEx(NULL, "MyClass",  //Nazwa klasy
		"OpenGL Robot",       //Nazwa aplikacji
		dwStyle |
		WS_CLIPCHILDREN |
		WS_CLIPSIBLINGS,
		0, 0,                         //współrzędne x y
		windowRect.right - windowRect.left,
		windowRect.bottom - windowRect.top,//szerokość, wysokość
		NULL,                 //Uchwyt źródła
		NULL,                 //Uchwyt menu
		hInstance,    //Wystąpienie aplikacji
		NULL);                //no xtra params

	/*      Sprawdź czy tworzenie okna powiodło się (hwnd = null ?)*/
	if (!hwnd)
	{
		return 0;
	}

	ShowWindow(hwnd, SW_SHOW);      //Wyświetla okno
	UpdateWindow(hwnd);                     //Aktualizuje okno

	done = false;   //Inicjalizuje zmienną warunkową pętli

	/*      Główne przesłanie pętli*/
	while (!done)
	{
		PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

		if (msg.message == WM_QUIT)     //Otrzymaliśmy wiadomość wyjścia?
		{
			done = true;
		}

		else
		{
			Render();
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
	}

	if (fullScreen)
	{
		ChangeDisplaySettings(NULL, 0);
		ShowCursor(TRUE);
	}

	return msg.wParam;

}

 
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)