Archiv verlassen und diese Seite im Standarddesign anzeigen : SDL Libary in der Konsole verwenden
DanDanger
17-03-2002, 01:17
Hallo,
ich möchte ein Programm schreiben, das "Freihändig" irgendwelche Formen auf dem Bildschirm zeichnet (wie man es z.B. mit den 'Canvas'-Objekten in QT und GTK machen kann) und dafür die SDL-Lib's benutzen. Auf der Zielplattform läuft SuSE 7.3 Pro., allerdings ohne X-Server (also nur im Runlevel 3).
Meine Frage: Funktionieren die SDL-Lib's auch im Konsolenmodus.
Wie gesagt, das Proggi soll nichts tolles können, nur "Freihändig" auf dem Bildschirm Zeichnen.
Neugierige Grüsse
DanDanger
anda_skoa
17-03-2002, 13:00
SDL kann verschieden Backends benutzen.
Ich glaube auch SVGALIB für Grafik ohne X.
Ciao,
_
DanDanger
17-03-2002, 14:00
Danke,
wie soll denn das genau gehen ??
Kennst du irgendwelche Tutorials oder ähnliches über die SDL-Libs (auf der Offiziellen Homepage dreht sich alles um X Programme) ???
Neugierige Grüsse
DanDanger
tkortkamp
17-03-2002, 14:47
Hi!
Also SDL funktioniert auch mit dem Framebuffer-Devices, mit DirectFB, SVGALIB, GGI usw. Du schreibst deine SDL Programme genauso wie du es unter X machen würdest. Evtl. müsstest du SDL mit z.B. Framebuffersupport neukompilieren. Eine Einführung zu SDL findest du hier (http://www.libsdl.org/intro.de/toc.html).
c ya,
Tobias
tkortkamp
17-03-2002, 15:16
So hab mich mal kurz hingesetzt und dieses kleine Programm geschrieben. Damit kann man einzelne Pixel auf den Bildschirm zeichnen, wenn man die Maustaste gedrückt hält. Kann man bestimmt noch anpassen um auch ganze linien zeichnen zu können ;)
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
/*An Framebuffer-Auflösung anpassen!*/
#define WIDTH 800
#define HEIGHT 600
#define BPP 32
/*Funktion kopiert von: http://cone3d.gamedev.net/cgi-bin/index.pl?page=tutorials/gfxsdl/tut1 */
void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B)
{
Uint32 color = SDL_MapRGB(screen->format, R, G, B);
switch (screen->format->BytesPerPixel)
{
case 1: // Assuming 8-bpp
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
*bufp = color;
}
break;
case 2: // Probably 15-bpp or 16-bpp
{
Uint16 *bufp;
bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
*bufp = color;
}
break;
case 3: // Slow 24-bpp mode, usually not used
{
Uint8 *bufp;
bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3;
if(SDL_BYTEORDER == SDL_LIL_ENDIAN)
{
bufp[0] = color;
bufp[1] = color >> 8;
bufp[2] = color >> 16;
} else {
bufp[2] = color;
bufp[1] = color >> 8;
bufp[0] = color >> 16;
}
}
break;
case 4: // Probably 32-bpp
{
Uint32 *bufp;
bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
*bufp = color;
}
break;
}
}
int main(int argc, char *argv[])
{
int done=0, draw = 0;
SDL_Surface *screen;
if (SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0)
{
printf("Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(WIDTH,HEIGHT,BPP,SDL_HWSURFACE|SD L_DOUBLEBUF);
if(screen == NULL)
{
printf("Unable to set 800x600 video: %s\n", SDL_GetError());
exit(1);
}
while(done == 0)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_QUIT:
done = 1;
break;
case SDL_KEYDOWN:
if(event.key.keysym.sym == SDLK_ESCAPE) done = 1;
break;
case SDL_MOUSEMOTION:
if(draw==1)
DrawPixel(screen, event.button.x, event.button.y, 255, 255, 255);
break;
case SDL_MOUSEBUTTONDOWN:
draw = 1;
break;
case SDL_MOUSEBUTTONUP:
draw = 0;
break;
default:
break;
}
}
SDL_Flip(screen);
}
return 0;
}
c ya,
Tobias
DanDanger
17-03-2002, 16:44
Vielen Dank :-)
Daran kann ich mich Orientieren :-))
Ihr seid SUPER !!!
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.