Skocz do zawartości

S-TRIP


Compi

Rekomendowane odpowiedzi

s_trip.png


Opis: S-TRIP to egzotyczny (dla innojęzykowców) język programowania. Póki co służy mojej klasie za cheat w odrabianiu lekcji z programowania, gdyż ma wbudowany translator na język Pascal. Implementacja załączona w pliku. Tworzy normalnie pliki exe. Jednak działa tylko prawidłowo pod Win XP.
Na Win 7 nie kompiluje :(

Mam nadzieję, że nadejdzie jakiś Feedback z waszej strony, ponieważ chcę go rozwijać.
(Hasło do archiwum to zse2011)
Download:
Runtime Library
UPDATE 1.2.0.1a STABLE (Używać z wersją 1.1.3)
-Obsługa polskich znaków w plikach EXE
-Operator := został zamieniony na ->
-Dodano zmienną globalną #DATA#, która przechowuje informacje o dacie kompilacji


Waga:251KB

Autorzy: Daniel Mazur

Screeny:

0.jpg
1.jpg
2.jpg
3.jpg

Known Bugs
1.Nawet gdy kod jest prawidłowy, podczas kompilacji może pojawić się błąd. Spróbujcie dać kilkakrotnie 'Kompiluj'.
2.Czasami w łańcuchach znaków może się zmienić tekst więc nie polecam korzystania z nich, lub pisanie tylko znakami alfanumerycznymi (bez polskich dialektów) lub małymi. Jest problem związany z dodanym prze zemnie (How to write this?) translatorem na pascala.
3.W okienku z implementacją mogą wystąpić stare komendy.

Kolejny Bug-fix w wersji 1.2
Odnośnik do komentarza
Udostępnij na innych stronach

https://gmclan.org/up3899_4_patch.html

 

Wrzucić do folderu ze S-TRIPEM

 

@EDIT:

 

Known Bugs

1.Nawet gdy kod jest prawidłowy, podczas kompilacji może pojawić się błąd. Spróbujcie dać kilkakrotnie 'Kompiluj'.

2.Czasami w łańcuchach znaków może się zmienić tekst więc nie polecam korzystania z nich, lub pisanie tylko znakami alfanumerycznymi (bez polskich dialektów) lub małymi. Jest problem związany z dodanym prze zemnie (How to write this?) translatorem na pascala.

3.W okienku z implementacją mogą wystąpić stare komendy.

 

Kolejny Bug-fix w wersji 1.2

Odnośnik do komentarza
Udostępnij na innych stronach

UPDATE 1.2.0.1a STABLE

-Obsługa polskich znaków w plikach EXE

-Operator := został zamieniony na ->

-Dodano zmienną globalną #DATA#, która przechowuje informacje o dacie kompilacji

 

 

Sito Eratostenesa:

GML
#S-TRIP#

liczba,n:#LICZBA;

t:#TABLICA[1..500] >> #BAJT; /*Zmienne z Sita */

#START#

 

PISZ('Witaj świecie!');

PAUZA;

 

 

 

 

 

 

strip->0;

PISZ('Program powstał w S-TRIP');

PISZ(#DATA#);

DLA n->1 DO 500 RÓB t[n]->0;

DLA liczba->2 DO ZAOKRĄGL(sqrt(500)) RÓB

JEŻELI t[liczba]=0 WTEDY DLA n->2 DO 500 DIV liczba RÓB t[liczba*n]->1;

DLA n->2 DO 500 RÓB

#JEŻELI t[n]=0 WTEDY PISZ(n);

#STOP#

Odnośnik do komentarza
Udostępnij na innych stronach

  • 3 miesiące temu...

Obsługa OpenGL dodana!

 

Z wersją 2.0 zostanie dodane IDE + obsługa WinAPI i OpenGL.

Na razie pracuję nad minimalizacją kodu, tak, aby funckję były jak GMLu.

Zastanawiam się jeszcze nad możliwością sprzedawania tego programu, oczywiście w późniejszych wersjach.

 

Kod na wyrenderowanie białego kwadrata w S-TRIPIE:

GML
#OPENGL#

 

STAŁA

#%%ext%%#WND_TITLE = 'S-TRIP OpenGL';

#%%ext%%#FPS_TIMER = 1;

#%%ext%%#FPS_INTERVAL = 1000;

 

ZMIENNE

#%%ext%%#h_Wnd : HWND;

#%%ext%%#h_DC : HDC;

#%%ext%%#h_RC : HGLRC;

keys : #TABLICA[0..255] >> #LOGICZNA;

FPSCount : #LICZBA = 0;

ElapsedTime : #LICZBA;

 

 

 

 

FUNKCJA_EXT IntToStr(Num : #LICZBA) : #ZNAKI;

{

Str(Num, ZWRÓĆ);

};

 

 

FUNKCJA glDraw();

{

glClearColor(0.0, 0.0, 0.0, 0.0);

glLoadIdentity();

glClear(GL_COLOR_BUFFER_BIT);

 

glTranslatef(0.0,0.0,-3.0);

 

glColor3f(1.0, 1.0, 1.0);

glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

gl{(GL_POLYGON);

glVertex2f(-0.5, -0.5);

glVertex2f(-0.5, 0.5);

glVertex2f(0.5, 0.5);

glVertex2f(0.5, -0.5);

glEnd();

 

};

 

 

 

FUNKCJA glInit();

{

glClearColor(0.0, 0.0, 0.0, 0.0);

};

 

 

FUNKCJA glResizeWnd(Width, Height : #LICZBA);

{

 

 

JEŻELI (Height = 0) WTEDY

Height -> 1;

glViewport(0, 0, Width, Height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(45.0, Width/Height, 1.0, 100.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

};

 

 

FUNKCJA ProcessKeys;

{

 

};

 

 

FUNKCJA_EXT WndProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LZWRÓĆ; stdcall;

{

PRZYPADEK (Msg) >>

WM_CREATE:

{

 

};

WM_CLOSE:

{

PostQuitMessage(0);

ZWRÓĆ -> 0

};

WM_KEYDOWN:

{

keys[wParam] -> PRAWDA;

ZWRÓĆ -> 0;

};

WM_KEYUP:

{

keys[wParam] -> FAŁSZ;

ZWRÓĆ -> 0;

};

WM_SIZE:

{

glResizeWnd(LOWORD(lParam),HIWORD(lParam));

ZWRÓĆ -> 0;

};

WM_TIMER :

{

JEŻELI wParam = FPS_TIMER WTEDY

{

FPSCount ->Round(FPSCount * 1000/FPS_INTERVAL);

SetwindowText(h_Wnd, PChar(WND_TITLE + ' [' + intToStr(FPSCount) + ' FPS]'));

FPSCount -> 0;

ZWRÓĆ -> 0;

};

};

ALBO

ZWRÓĆ -> DefwindowProc(hWnd, Msg, wParam, lParam);

};

};

 

 

FUNKCJA glKillWnd(Fullscreen : #LOGICZNA);

{

JEŻELI Fullscreen WTEDY

{

ChangeDisplaySettings(devmode(nil^), 0);

ShowCursor(PRAWDA);

};

 

JEŻELI (NIE wglMakeCurrent(h_DC, 0)) WTEDY

MessageBox(0, 'Release of DC and RC failed!', 'Error', MB_OK LUB MB_ICONERROR);

 

 

JEŻELI (NIE wglDeleteContext(h_RC)) WTEDY

{

MessageBox(0, 'Release of rendering context failed!', 'Error', MB_OK LUB MB_ICONERROR);

h_RC -> 0;

};

 

JEŻELI ((h_DC > 0) and (ReleaseDC(h_Wnd, h_DC) = 0)) WTEDY

{

MessageBox(0, 'Release >> device context failed!', 'Error', MB_OK LUB MB_ICONERROR);

h_DC -> 0;

};

 

JEŻELI ((h_Wnd <> 0) and (NIE Destroywindow(h_Wnd))) WTEDY

{

MessageBox(0, 'Unable to destroy window!', 'Error', MB_OK LUB MB_ICONERROR);

h_Wnd -> 0;

};

 

JEŻELI (NIE UnRegisterClass('OpenGL', hInstance)) WTEDY

{

MessageBox(0, 'Unable to unregister window class!', 'Error', MB_OK LUB MB_ICONERROR);

hInstance -> 0;

};

};

 

 

FUNKCJA_EXT glCreateWnd(Width, Height : #LICZBA; Fullscreen : #LOGICZNA; PixelDepth : #LICZBA) : #LOGICZNA;

ZMIENNE

wndClass : TWndClass;

dwStyle : ##dword##;

dwExStyle : ##dword##;

dmScreenSettings : DEVMODE;

PixelFormat : GLuint;

h_Instance : HINST;

pfd : TPIXELFORMATDESCRIPTOR;

{

h_Instance -> GetModuleHandle(nil);

ZeroMemory(@wndClass, SizeOf(wndClass));

 

RAZEM Z wndClass RÓB

{

style -> CS_HREDRAW LUB

CS_VREDRAW LUB

CS_OWNDC;

lpfnWndProc -> @WndProc;

hInstance -> h_Instance;

hCursor -> LoadCursor(0, IDC_ARROW);

lpszClassName -> 'OpenGL';

};

 

JEŻELI (RegisterClass(wndClass) = 0) WTEDY

{

MessageBox(0, 'Failed to register the window class!', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

JEŻELI Fullscreen WTEDY

{

ZeroMemory(@dmScreenSettings, SizeOf(dmScreenSettings));

RAZEM Z dmScreenSettings RÓB {

dmSize -> SizeOf(dmScreenSettings);

dmPelsWidth -> Width;

dmPelsHeight -> Height;

dmBitsPerPel -> PixelDepth;

dmFields -> DM_PELSWIDTH LUB DM_PELSHEIGHT LUB DM_BITSPERPEL;

};

 

 

JEŻELI (ChangeDisplaySettings(dmScreenSettings, CDS_FULLSCREEN) = DISP_CHANGE_FAILED) WTEDY

{

MessageBox(0, 'Unable to switch to fullscreen!', 'Error', MB_OK LUB MB_ICONERROR);

Fullscreen -> FAŁSZ;

};

};

 

 

JEŻELI (Fullscreen) WTEDY

{

dwStyle -> WS_POPUP LUB

WS_CLIPCHILDREN

LUB WS_CLIPSIBLINGS;

dwExStyle -> WS_EX_APPwindow;

ShowCursor(FAŁSZ);

}

ALBO

{

dwStyle -> WS_OVERLAPPEDwindow LUB

WS_CLIPCHILDREN LUB

WS_CLIPSIBLINGS;

dwExStyle -> WS_EX_APPwindow LUB

WS_EX_windowEDGE;

};

 

 

h_Wnd -> CreateWindowEx(dwExStyle,

'OpenGL',

WND_TITLE,

dwStyle,

0, 0,

Width, Height,

0,

0,

h_Instance,

nil);

JEŻELI h_Wnd = 0 WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to create window!', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

h_DC -> GetDC(h_Wnd);

JEŻELI (h_DC = 0) WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to get a device context!', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

RAZEM Z pfd RÓB

{

nSize -> SizeOf(TPIXELFORMATDESCRIPTOR);

nVersion -> 1;

dwFlags -> PFD_DRAW_TO_window

LUB PFD_SUPPORT_OPENGL

LUB PFD_RÓBUBLEBUFFER;

iPixelType -> PFD_TYPE_RGBA;

cColorBits -> PixelDepth;

cRedBits -> 0;

cRedShJEŻELIt -> 0;

cGreenBits -> 0;

cGreenShJEŻELIt -> 0;

cBlueBits -> 0;

cBlueShJEŻELIt -> 0;

cAlphaBits -> 0;

cAlphaShJEŻELIt -> 0;

cAccumBits -> 0;

cAccumRedBits -> 0;

cAccumGreenBits -> 0;

cAccumBlueBits -> 0;

cAccumAlphaBits -> 0;

cDepthBits -> 16;

cStencilBits -> 0;

cAuxBuffers -> 0;

iLayerType -> PFD_MAIN_PLANE;

bReserved -> 0;

dwLayerMask -> 0;

dwVisibleMask -> 0;

dwDamageMask -> 0;

};

 

 

PixelFormat -> ChoosePixelFormat(h_DC, @pfd);

JEŻELI (PixelFormat = 0) WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to find a suitable pixel format', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

JEŻELI (NIE SetPixelFormat(h_DC, PixelFormat, @pfd)) WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to set the pixel format', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

h_RC -> wglCreateContext(h_DC);

JEŻELI (h_RC = 0) WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to create an OpenGL r}ering context', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

JEŻELI (NIE wglMakeCurrent(h_DC, h_RC)) WTEDY

{

glKillWnd(Fullscreen);

MessageBox(0, 'Unable to activate OpenGL rendering context', 'Error', MB_OK LUB MB_ICONERROR);

ZWRÓĆ -> FAŁSZ;

STOP;

};

 

 

SetTimer(h_Wnd, FPS_TIMER, FPS_INTERVAL, nil);

 

 

ShowWindow(h_Wnd, SW_SHOW);

SetForegroundwindow(h_Wnd);

SetFocus(h_Wnd);

 

glResizeWnd(Width, Height);

glInit();

 

ZWRÓĆ -> PRAWDA;

};

 

 

 

FUNKCJA_EXT #$$WinAPI$$S-TRIP$$# : #LICZBA; stdcall;

ZMIENNE

msg : ##msg##;

finished : #LOGICZNA;

DemoStart, LastTime : ##dword##;

{

finished -> FAŁSZ;

 

 

JEŻELI NIE glCreateWnd(800, 600, FAŁSZ, 32) WTEDY

{

ZWRÓĆ -> 0;

STOP;

};

 

DemoStart -> DAJ CZAS();

 

 

PÓKI NIE finished RÓB

{

JEŻELI (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) WTEDY

{

JEŻELI (msg.message = WM_QUIT) WTEDY

finished -> PRAWDA

ALBO

{

TranslateMessage(msg);

DispatchMessage(msg);

};

}

ALBO

{

Inc(FPSCount);

 

LastTime ->ElapsedTime;

ElapsedTime ->DAJ CZAS() - DemoStart;

ElapsedTime ->(LastTime + ElapsedTime) DIV 2;

glDraw();

SwapBuffers(h_DC);

 

JEŻELI (keys[KL_ESC]) WTEDY

finished -> PRAWDA

ALBO

ProcessKeys;

};

};

glKillWnd(FAŁSZ);

ZWRÓĆ -> msg.wParam;

};

 

#START#

#%%ext%%#WinMain( hInstance, hPrevInst, CmdLine, CmdShow );

#STOP#

Odnośnik do komentarza
Udostępnij na innych stronach

Kod na wyrenderowanie białego kwadrata w GML-u:

draw_set_color(c_white)

draw_rectangle(x,y,x+100,y+100,0)

Daj funkcję wyboru języka (żeby zamiast "PÓKI NIE finished RÓB" było "WHILE NOT finished DO"), wbuduj w język wbudowane funkcje do rysowania i co najważniejsze - rozplanuj tak ten Twój język, żeby był co najmniej tak łatwy w użyciu, co GML. Potem możesz mówić o sprzedaży.

Odnośnik do komentarza
Udostępnij na innych stronach

Dodałem taki bajer:

 

Wszystkie funkcje są wbudowane i linkowane jako lib podczas kompilacji.

W edytorze można korzystać z OpenGL w taki sposób

 

GML
#S-TRIP#

index1 : sprite;

#OPENGL#

#START#

index1 -> sprite('.\gfx\spr1.gif');

#OGL

RYSUJ SPRITE(index1, 1,1);

OGL#

#STOP#

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...