Как мне сделать графику легко в современном Linux?
Вот пример программы на Си, которую можно было написать в старые времена:
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void main()
{
int gd=DETECT, gm;
initgraph(&gd, &gm, "c:\\turboc\\bgi");
circle(200,100,150);
getch();
closegraph();
}
Я думаю, что это был турбо C под MSDOS. Она дает вам рисунок на экране и может быть легко расширена для создания быстрой анимированной графики, например, найденной во взломах xscreensaver.
Как бы я написал эквивалент в gcc на Ubuntu? Это можно сделать на Java?
3 ответа
#include<X11/Xlib.h>
#include<stdlib.h>
/* gcc -std=gnu99 -o circle circle.c -lX11 */
int main (int argc, char *argv[])
{
/* connect to the X server and make a window */
Display *dpy = XOpenDisplay (getenv ("DISPLAY"));
Window w = XCreateSimpleWindow (dpy, DefaultRootWindow (dpy),
100, 100, 640, 480, 1,
BlackPixel (dpy, DefaultScreen (dpy)),
WhitePixel (dpy, DefaultScreen (dpy)));
/* raise it and wait */
XSelectInput (dpy, w, StructureNotifyMask);
XMapRaised (dpy, w);
for(XEvent e; ( e.type != MapNotify );
XWindowEvent (dpy, w, StructureNotifyMask, &e));
/* create a graphics context for drawing in the window */
GC g = XCreateGC (dpy, w, 0, NULL);
/* draw a circle */
XDrawArc(dpy,w,g,200,100,150,150,0,360*64);
XFlush(dpy);
/*wait for key press*/
XSelectInput (dpy, w, KeyReleaseMask);
for(XEvent e; ( e.type != KeyRelease );
XWindowEvent (dpy, w, KeyReleaseMask, &e));
/*clean up*/
XDestroyWindow( dpy, w );
XCloseDisplay (dpy);
}
Хорошо, несколько слов об основах:
- В приведенном вами примере используется библиотека с именем BGI - Borland Graphics Interface - очень старый материал эпохи MS DOS
- Сам GCC - просто компилятор - вы должны искать библиотеку, которая поддерживает рисование
- В Linux мы используем несколько GUI-инструментариев, но только Gtk и Qt актуальны в наши дни.
- Если вам нужна низкоуровневая графическая библиотека, вы можете посмотреть на Allegro ( http://alleg.sourceforge.net/) или SDL ( http://www.libsdl.org/).
А если серьезно, я думаю, что вы смотрите в неправильном направлении. Вы должны сосредоточиться на современном управляемом событиями GUI-программировании с использованием современных наборов инструментов (Gtk, Qt), современных языков (C++, C#, Java, Python и т. Д.) И OpenGL для "специальных эффектов".
Вы должны понимать, что в Linux графика обычно делается до X11 (возможно, Wayland может стать конкурентом в будущем).
Тогда вы должны использовать некоторые инструменты X11. Если вы хотите это в C, рассмотрите GTK или libSDL. Но если вы знаете C++, я бы порекомендовал Qt (читайте о его графических возможностях).
Вы можете найти несколько коротких примеров программ на Qt, Gtk или SDL примерно в сотне строк.
У Java есть хотя бы Swing.
Обратите внимание, что Linux по сути своей является многозадачной системой. Итак, вы хотите запустить несколько графических программ. Другими словами, вам нужно несколько окон (и менеджер окон или рабочего стола). Итак, вам нужен цикл обработки событий, и вам нужно позаботиться об измененных и / или перекрывающихся окнах. Следовательно, сложность намного больше, чем в дни TurboC прошлого века!
В качестве альтернативы рассмотрите возможность сделать ваше приложение специализированным HTTP-сервером (и кодируйте графику в HTML5), например, используя libonion в качестве библиотеки C-HTTP-сервера.