Baza tekstur problem

Baza tekstur problem
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:około 10 godzin
  • Postów:377
0

napisałem baze tekstur i nie działa ta wersja a jest dobre napisana

Kopiuj

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>

#define BITMAP_ID 0x4D42

unsigned char *LoadBitmapFile(char *filename,int &w,int &h)
{

	FILE *filePtr;							// wskačnik pozycji pliku
	BITMAPFILEHEADER	bitmapFileHeader;		// nag-ˇwek pliku
	BITMAPINFOHEADER	*bitmapInfoHeader;
	unsigned char		*bitmapImage;			// dane obrazu
	int					imageIdx = 0;		// licznik pikseli
	unsigned char		tempRGB;				// zmienna zamiany sk-adowych

	// otwiera plik w trybie "read binary"
	filePtr = fopen(filename, "rb");
	if (filePtr == NULL)
		return NULL;

	// wczytuje nag-ˇwek pliku
	fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
	
	// sprawdza, czy jest to plik formatu BMP
	if (bitmapFileHeader.bfType != BITMAP_ID)
	{
		fclose(filePtr);
		return NULL;
	}

	// wczytuje nag-ˇwek obrazu
	fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);

	// ustawia wskačnik pozycji pliku na pocz¦tku danych obrazu
	fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);

	// przydziela pami੠buforowi obrazu
	bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);

	// sprawdza, czy uda-o siŕ przydzieliŠ pamiŕŠ
	if (!bitmapImage)
	{
		free(bitmapImage);
		fclose(filePtr);
		return NULL;
	}

	// wczytuje dane obrazu
	fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);

	// sprawdza, czy dane zosta-y wczytane
	if (bitmapImage == NULL)
	{
		fclose(filePtr);
		return NULL;
	}

	// zamienia miejscami sk-adowe R i B 
	for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3)
	{
		tempRGB = bitmapImage[imageIdx];
		bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
		bitmapImage[imageIdx + 2] = tempRGB;
	}
	w=bitmapInfoHeader->biWidth;
	h=bitmapInfoHeader->biHeight;


	// zamyka plik i zwraca wskačnik bufora zawieraj¦cego wczytany obraz
	fclose(filePtr);
	return bitmapImage;
}

class Texture
{
public:
	unsigned char *data_image;
	int w,h;
	void Set(int x,int y,unsigned char *data)
	{
		w=x;
		h=y;
		data_image=data;
	}
	void Free()
	{
		w=0;
		h=0;
		delete data_image;
	}

};
Texture index[100];
class TextureBase
{
public:

	TextureBase();
	~TextureBase();
	int total;
	
	void Add(char *filename)
	{
		int w,h;
		unsigned char *bdata = LoadBitmapFile(filename,w,h);
		index[total].Set(w,h,bdata);
		total+=1;
		//delete bdata;
	}
	void unLoad()
	{
		for(int i=0;i<total;i+=1)
			index[i].Free();
		total=0;
	}
	void LoadFile(char *filename)
	{
		FILE * file;
		file = fopen(filename, "rb");
		int w,h;

		fread(&total,sizeof(total),1,file);
		for(int i=0;i<total;i+=1)
		{
			fread(&w,sizeof(w),1,file);
			fread(&h,sizeof(h),1,file);
			unsigned char *data=new unsigned char[w*h*3];
			fread(data,sizeof(unsigned char),w*h*3,file);
			index[i].Set(w,h,data);
		}
		fclose(file);

	}
	void SaveToFile(char *filename)
	{
		FILE * file;
		file = fopen(filename, "wb");

		fwrite(&total,4,1,file);
		for(int i=0;i<total;i+=1)
		{
			fwrite(&index[i].w,4,1,file);
			fwrite(&index[i].h,4,1,file);
			int s=index[i].w*index[i].h*3;
			fwrite(index[i].data_image,1,s,file);

		}
		fclose(file);
	}
};
TextureBase::TextureBase()
{
	total=0;
}
TextureBase::~TextureBase()
{
}

int main(int argc, char* argv[])
{
	TextureBase tb;
	tb.Add("1.bmp");
	tb.Add("2.bmp");

	tb.SaveToFile("basetexture.dat");
	//tb.unLoad();
	// tb.LoadFile("basetexture.dat");
	return 0;
}

teraz to samo ale w wydaniu z testami na OpenGl i działa a kurde kod przeklepałem na aplikacje konsoli cały dobrze i nie działa wersja konsolawa o to kod w wersji OpenGl działający

Kopiuj
#define WIN32_LEAN_AND_MEAN		// "odchudza" aplikację Windows


/*******************************************************************
*	Rozdział 8,  tekstury - przykład pierwszy 
*	Autor: Kevin Hawkins
*	Wyświetla obracający się sześcian pokryty teksturą.
********************************************************************/

////// Definicje
		// identyfikator formatu BMP

////// Pliki nagłówkowe
#include <windows.h>			// standardowy plik nagłówkowy Windows
#include <stdio.h> // plik nagłówkowy operacji wejścia i wyjścia
#include <stdlib.h>
#include <gl/gl.h>				// standardowy plik nagłówkowy OpenGL
#include <gl/glu.h>				// funkcje pomocnicze OpenGL

////// Zmienne globalne
HDC g_HDC;					// globalny kontekst urządzenia
bool fullScreen = false;			// true = tryb pełnoekranowy; 
//false = tryb okienkowy
bool keyPressed[256];			// tablica przyciśnięć klawiszy
float angle = 0.0f;				// kąt obrotu

////// Opis tekstury

unsigned int		idtexture;			// obiekt tekstury

#define BITMAP_ID 0x4D42
// LoadBitmapFile
// opis: ładuje mapę bitową z pliku i zwraca jej adres.
//       Wypełnia strukturę nagłówka.
//	 Nie obsługuje map 8-bitowych.

unsigned char *LoadBitmapFile(char *filename,int &w,int &h)
{

	FILE *filePtr;							// wskačnik pozycji pliku
	BITMAPFILEHEADER	bitmapFileHeader;		// nag-ˇwek pliku
	BITMAPINFOHEADER	*bitmapInfoHeader;
	unsigned char		*bitmapImage;			// dane obrazu
	int					imageIdx = 0;		// licznik pikseli
	unsigned char		tempRGB;				// zmienna zamiany sk-adowych

	// otwiera plik w trybie "read binary"
	filePtr = fopen(filename, "rb");
	if (filePtr == NULL)
		return NULL;

	// wczytuje nag-ˇwek pliku
	fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
	
	// sprawdza, czy jest to plik formatu BMP
	if (bitmapFileHeader.bfType != BITMAP_ID)
	{
		fclose(filePtr);
		return NULL;
	}

	// wczytuje nag-ˇwek obrazu
	fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);

	// ustawia wskačnik pozycji pliku na pocz¦tku danych obrazu
	fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);

	// przydziela pami੠buforowi obrazu
	bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);

	// sprawdza, czy uda-o siŕ przydzieliŠ pamiŕŠ
	if (!bitmapImage)
	{
		free(bitmapImage);
		fclose(filePtr);
		return NULL;
	}

	// wczytuje dane obrazu
	fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);

	// sprawdza, czy dane zosta-y wczytane
	if (bitmapImage == NULL)
	{
		fclose(filePtr);
		return NULL;
	}

	// zamienia miejscami sk-adowe R i B 
	for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3)
	{
		tempRGB = bitmapImage[imageIdx];
		bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
		bitmapImage[imageIdx + 2] = tempRGB;
	}
	w=bitmapInfoHeader->biWidth;
	h=bitmapInfoHeader->biHeight;


	// zamyka plik i zwraca wskačnik bufora zawieraj¦cego wczytany obraz
	fclose(filePtr);
	return bitmapImage;
}

class Texture
{
public:
	unsigned char *data_image;
	int w,h;
	void Set(int x,int y,unsigned char *data)
	{
		w=x;
		h=y;
		data_image=data;
	}
	void Free()
	{
		w=0;
		h=0;
		delete data_image;
	}

};
Texture index[100];
class TextureBase
{
public:

	TextureBase();
	~TextureBase();
	int total;
	
	void Add(char *filename)
	{
		int w,h;
		unsigned char *bdata = LoadBitmapFile(filename,w,h);
		index[total].Set(w,h,bdata);
		total+=1;
		//delete bdata;
	}
	void unLoad()
	{
		for(int i=0;i<total;i+=1)
			index[i].Free();
		total=0;
	}
	void LoadFile(char *filename)
	{
		FILE * file;
		file = fopen(filename, "rb");
		int w,h;

		fread(&total,sizeof(total),1,file);
		for(int i=0;i<total;i+=1)
		{
			fread(&w,sizeof(w),1,file);
			fread(&h,sizeof(h),1,file);
			unsigned char *data=new unsigned char[w*h*3];
			fread(data,sizeof(unsigned char),w*h*3,file);
			index[i].Set(w,h,data);
		}
		fclose(file);

	}
	void SaveToFile(char *filename)
	{
		FILE * file;
		file = fopen(filename, "wb");

		fwrite(&total,4,1,file);
		for(int i=0;i<total;i+=1)
		{
			fwrite(&index[i].w,4,1,file);
			fwrite(&index[i].h,4,1,file);
			int s=index[i].w*index[i].h*3;
			fwrite(index[i].data_image,1,s,file);

		}
		fclose(file);
	}
};
TextureBase::TextureBase()
{
	total=0;
}
TextureBase::~TextureBase()
{
}

// DrawTextureCube
// opis: rysuje sześcian w podanym położeniu

void DrawTextureCube(float xPos, float yPos, float zPos)
{
	glPushMatrix();
		glTranslatef(xPos, yPos, zPos);

		glBegin(GL_QUADS);	// przednia ťciana
			glTexCoord2f(0.0f, 0.0f); glVertex3f(0.5f, -0.5f, 0.5f);
			glTexCoord2f(1.0f, 0.0f); glVertex3f(0.5f, 0.5f, 0.5f);	
			glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.5f, 0.5f, 0.5f);
			glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.5f, -0.5f, 0.5f);
		glEnd();

	glPopMatrix();
}

// Initialize
// opis: inicjuje OpenGL
void Initialize()
{
	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);		// tło w czarnym kolorze

	glShadeModel(GL_SMOOTH);					// cieniowanie gładkie
	glEnable(GL_DEPTH_TEST);					// usuwanie ukrytych powierzchni
	glEnable(GL_CULL_FACE);						// brak obliczeń dla niewidocznych stron wielokątów
	glFrontFace(GL_CCW);						// niewidoczne strony posiadają porządek wierzchołków 
// przeciwny do kierunku ruchu wskazówek zegara

	glEnable(GL_TEXTURE_2D);					// włącza tekstury dwuwymiarowe
	
	TextureBase tb;
	tb.Add("1.bmp");
	tb.Add("2.bmp");
	// ładuje obraz tekstury
	//tb.SaveToFile("basetexture.dat");
	//tb.unLoad();
	//tb.LoadFile("basetexture.dat");

	glGenTextures(1, &idtexture);                  // tworzy obiekt tekstury
	glBindTexture(GL_TEXTURE_2D, idtexture);       // aktywuje obiekt tekstury

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


     // tworzy obraz tekstury
	int i=0;
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 	index[i].w,
		index[i].h, 0, GL_RGB, GL_UNSIGNED_BYTE, 	index[i].data_image);

}


// Render
// opis: rysuje scenę
void Render()
{
	// opróżnia bufor ekranu i bufor głębi
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);		

	glLoadIdentity();
	angle+=0.1;

	DrawTextureCube(0, 0, -5);		// rysuje sześcian pokryty teksturą



	glFlush();
	SwapBuffers(g_HDC);			// przełącza bufory
}

// funkcja określająca format pikseli
void SetupPixelFormat(HDC hDC)
{
	int nPixelFormat;					// indeks formatu pikseli

	static PIXELFORMATDESCRIPTOR pfd = {
		sizeof(PIXELFORMATDESCRIPTOR),	// rozmiar struktury
		1,								// domyślna wersja
		PFD_DRAW_TO_WINDOW |			// grafika w oknie
		PFD_SUPPORT_OPENGL |			// grafika OpenGL 
		PFD_DOUBLEBUFFER,				// podwójne buforowanie
		PFD_TYPE_RGBA,					// tryb kolorów RGBA 
		32,								// 32-bitowy opis kolorów
		0, 0, 0, 0, 0, 0,				// nie specyfikuje bitów kolorów
		0,								// bez buforu alfa
		0,								// nie specyfikuje bitu przesunięcia
		0,								// bez bufora akumulacji
		0, 0, 0, 0,						// ignoruje bity akumulacji
		128,								// 16-bit bufor z
		0,								// bez bufora powielania
		0,								// bez buforów pomocniczych
		PFD_MAIN_PLANE,					// główna płaszczyzna rysowania
		0,								// zarezerwowane
		0, 0, 0 };						// ignoruje maski warstw

	nPixelFormat = ChoosePixelFormat(hDC, &pfd);	// wybiera najbardziej zgodny format pikseli 

	SetPixelFormat(hDC, nPixelFormat, &pfd);		// określa format pikseli dla danego kontekstu urządzenia
}

// procedura okienkowa
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static HGLRC hRC;					// kontekst tworzenia grafiki
	static HDC hDC;						// kontekst urządzenia
	int width, height;					// szerokość i wysokość okna

	switch(message)
	{
		case WM_CREATE:					// okno jest tworzone

			hDC = GetDC(hwnd);			// pobiera kontekst urządzenia dla okna
			g_HDC = hDC;
			SetupPixelFormat(hDC);		// wywołuje funkcję określającą format pikseli

         // tworzy kontekst tworzenia grafiki i czyni go bieżącym
			hRC = wglCreateContext(hDC);
			wglMakeCurrent(hDC, hRC);

			return 0;
			break;

		case WM_CLOSE:					// okno jest zamykane

			// deaktywuje bieżący kontekst tworzenia grafiki i usuwa go
			wglMakeCurrent(hDC, NULL);
			wglDeleteContext(hRC);

			// wstawia komunikat WM_QUIT do kolejki
			PostQuitMessage(0);

			return 0;
			break;

		case WM_SIZE:
			height = HIWORD(lParam);		// pobiera nowe rozmiary okna
			width = LOWORD(lParam);

			if (height==0)					// unika dzielenia przez 0
			{
				height=1;					
			}

			glViewport(0, 0, width, height);	// reset the viewport to new dimensions
			glMatrixMode(GL_PROJECTION);		// set projection matrix current matrix
			glLoadIdentity();					// reset projection matrix

			// wyznacza proporcje obrazu
			gluPerspective(54.0f,(GLfloat)width/(GLfloat)height,1.0f,10.0f);

			glMatrixMode(GL_MODELVIEW);				// wybiera macierz modelowania
			glLoadIdentity();						// resetuje macierz modelowania

			return 0;
			break;

			case WM_MOUSEMOVE:

		//x=LOWORD( lParam );
		//y=HIWORD( lParam );
		//ReleaseDC( hwnd, hDC );
		
		return 0;
			break;

		case WM_KEYDOWN:					// użytkownik nacisnął klawisz?
			keyPressed[wParam] = true;
			return 0;
			break;

		case WM_KEYUP:
			keyPressed[wParam] = false;
			return 0;
			break;

		default:
			break;
	}

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

// tutaj zaczyna się wykonywanie aplikacji Windows
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	WNDCLASSEX windowClass;		// klasa okna
	HWND	   hwnd;			// uchwyt okna
	MSG		   msg;				// komunikat
	bool	   done;			// znacznik zakończenia aplikacji
	DWORD	   dwExStyle;						// rozszerzony styl okna
	DWORD	   dwStyle;						// styl okna
	RECT	   windowRect;

	// zmienne pomocnicze
	int width = 1600;
	int height = 900;
	int bits = 32;

	fullScreen = true;

	windowRect.left=(long)0;						// struktura określająca rozmiary okna
	windowRect.right=(long)width;					
	windowRect.top=(long)0;						
	windowRect.bottom=(long)height;					

	// definicja 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);	// domyślna ikona
	windowClass.hCursor			= LoadCursor(NULL, IDC_ARROW);		// domyślny kursor
	windowClass.hbrBackground	= NULL;								// bez tła
	windowClass.lpszMenuName	= NULL;								// bez menu
	windowClass.lpszClassName	= "MojaKlasa";
	windowClass.hIconSm			= LoadIcon(NULL, IDI_WINLOGO);		// logo Windows

	// rejestruje klasę okna
	if (!RegisterClassEx(&windowClass))
		return 0;

	if (fullScreen)								// tryb pełnoekranowy?
	{
		DEVMODE dmScreenSettings;					// tryb urządzenia
		memset(&dmScreenSettings,0,sizeof(dmScreenSettings));
		dmScreenSettings.dmSize = sizeof(dmScreenSettings);	
		dmScreenSettings.dmPelsWidth = width;			// szerokość ekranu
		dmScreenSettings.dmPelsHeight = height;			// wysokość ekranu
		dmScreenSettings.dmBitsPerPel = bits;				// bitów na piksel
		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;

		// 
		if (ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
		{
			// przełączenie trybu nie powiodło się, z powrotem tryb okienkowy
			MessageBox(NULL, "Przełączenie trybu wyswietlania nie powiodło się", NULL, MB_OK);
			fullScreen=FALSE;	
		}
	}

	if (fullScreen)								// tryb pełnoekranowy?
	{
		dwExStyle=WS_EX_APPWINDOW;					// rozszerzony styl okna
		dwStyle=WS_POPUP;						// styl okna
		//ShowCursor(FALSE);						// ukrywa kursor myszy
	}
	else
	{
		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			// definicja klasy okna
		dwStyle=WS_OVERLAPPEDWINDOW;					// styl okna
	}

	AdjustWindowRectEx(&windowRect, dwStyle, FALSE, dwExStyle);		// koryguje rozmiar okna

	// tworzy okno
	hwnd = CreateWindowEx(NULL,									// styl rozszerzony
						  "MojaKlasa",							// nazwa klasy
						  "Tekstury, przykład pierwszy: obracający się sześcian",		// app name
						  dwStyle | WS_CLIPCHILDREN |
						  WS_CLIPSIBLINGS,
						  0, 0,								// współrzędne x,y
						  windowRect.right - windowRect.left,
						  windowRect.bottom - windowRect.top, // szerokość, wysokość
						  NULL,									// uchwyt okna nadrzędnego
						  NULL,									// uchwyt menu
						  hInstance,							// instancja aplikacji
						  NULL);								// no extra params

	// sprawdza, czy utworzenie okna nie powiodło się (wtedy wartość hwnd równa NULL)
	if (!hwnd)
		return 0;

	ShowWindow(hwnd, SW_SHOW);			// wyświetla okno
	UpdateWindow(hwnd);					// aktualizuje okno

	done = false;						// inicjuje zmienną warunku pętli
	Initialize();						// inicjuje OpenGL

	// pętla przetwarzania komunikatów
	while (!done)
	{
		PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);

		if (msg.message == WM_QUIT)		// aplikacja otrzymała komunikat WM_QUIT?
		{
			done = true;				// jeśli tak, to kończy działanie
		}
		else
		{
			if (keyPressed[VK_ESCAPE])
				done = true;
			else
			{
				Render();

				TranslateMessage(&msg);		// tłumaczy komunikat i umieszcza go w kolejce
				DispatchMessage(&msg);
			}
		}
	}

	

	if (fullScreen)
	{
		ChangeDisplaySettings(NULL,0);					// przywraca pulpit
		ShowCursor(TRUE);						// i wskaźnik myszy
	}

	return msg.wParam;
}

to są dwie wersje z tym samym systemem pierwsza wersja konsolowa a druga na opengl i wersja konsolowa nie działa

edytowany 2x, ostatnio: wilkwielki
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:około 10 godzin
  • Postów:377
0

g++ tak samo , konsolowa nie działa a wersja z OpenGl działa co jest grane?

wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:około 10 godzin
  • Postów:377
0

juz mam znowu te tablice dynamiczne moja literówka i tutaj był błąd, wersja poprawna:

Kopiuj
void Set(int x,int y,unsigned char *data)
	{
		w=x;
		h=y;
		data_image=new unsigned char[w*h*3];
		data_image=data;
	}
wilkwielki
  • Rejestracja:ponad rok
  • Ostatnio:około 10 godzin
  • Postów:377
0

temat zmkniety

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)