 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
fedaYkin Mini JLI'ler
Anmeldedatum: 02.12.2002 Beiträge: 10 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 02.12.2002, 09:30 Titel: Grafikspeicher/Windows/Visual C++ |
|
|
hi, mein name ist tobias und ich komm aus österreich.
mein problem hat eigentlich nixhts mit direkter spieleprogrammierung zu tun, sondern mit meiner diplomarbeit, welche ich mit zwei klassenkollegen versuch zu realisieren .
unsere arbeit besteht aus 3 teilen: der hardware, der software, und der schnittstelle zwischen den beiden. ich bin für software verantwortlich. unser ziel ist es, einfache grafiken für blinde mit hilfe einer speziellen vorrichtung zu "visualisieren". die hardware will ich jetz nicht näher erklären aber ich will sagen, dass das ausgabe feld 7x7 felder gross ist.
folgendes brauche ich: wenn zb auf dem bildschirm eine einfache schwarze vertikale linie (ein pixel breit) auf weißem hintergrund zu sehen ist wird folgendes in binärem code in eine datei gespeichert, um dann eben wieder ausgegeben zu werden:
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
wenn die auflösung des bildschirms höher wird, werden dann auch dementsprechen mehrere pixel zu einem zusammengefasst. dunklere farben werden zu 1, helle zu 0.
das ganze soll in visual c++ von microsoft realisiert werden.
das problem ist, dass wir uns völlig neu einarbeiten müssen, was zum teil auch schon passiert ist, aber unser wissen reicht leider noch nicht um den ganzen code völlig allein zu schreiben.
meine frage: wie kann ich von visual c++ auf den windowsgrafikspeicher zugreiffen und gibt es bereits irgendwo quellcode dafür?
es ist wirklich sehr dringend
mfg |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 02.12.2002, 14:02 Titel: |
|
|
Was bitte ist "Windowsgrafikspeicher"? Meinst du virtuellen Speicher? Normalerweise:
Windows = Betriebssystem = Software
und
Grafikspeicher = Hardware _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
MAG Mini JLI'ler
Anmeldedatum: 21.11.2002 Beiträge: 15 Wohnort: Falkenrehde/Brandenburg/Deutschland Medaillen: Keine
|
Verfasst am: 02.12.2002, 15:51 Titel: |
|
|
Man Hazel, du scheinst das '='-Zeichen ja zu lieben!
Wie auch immer, zum Thema.
Meinst du vielleicht mit " wie kann ich von visual c++ auf den windowsgrafikspeicher zugreiffen " eventuell eine Grafikausgabe auf den Bildschirm?
Zum Beispiel über die Standartausgabefunktionen für Konsolenanwendungen.Dann kannst du es folgender Maßen machen:
Code: |
#include <iostream.h> // Lib for Standartausgabefunktionen des Betriebssystems
void main() // Hauptfunktion
{
char* string = "Hallo Welt!";
cout << "Jetzt folgt ein Text: " << string << endl; // Ausgabe von statischen Text und einer String-Variablen
return(0);
}
|
So macht man das Standartmäßig mit Schrift.Aber, da du Linien erwähntest, brauchst du wahrscheinlich die Win32 API.
Das sieht dann ungefähr so aus:
Code: |
#include <iostream.h>
#include <windows.h>
HWNDhwnd;
HINSTANCE hinst;
void Init();
void Main();
void Exit();
////==============
void Init()
{
// Initialisierungen
}
void Main()
{
// wie main() bei Konsolenanwendung
hDC = GetDC(hWnd);
MoveToEx(hDC,0,0,NULL);
LineTo(hDC,800,600); // Eine Linie Quer über den Bildschirm
ReleaseDC(hWnd,hDC);
}
void Exit()
{
// Freigabe von Objekten etc.
}
LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
{
switch(message)
{
case WM_DESTROY:
done = TRUE;
PostQuitMessage(0);
return 0;
break;
case WM_KEYDOWN:
switch(wparam)
{
case VK_ESCAPE:
PostMessage(hwnd,WM_CLOSE,0,0);
return 0;
break;
}
default:break;
}
return (DefWindowProc(hwnd,message,wparam,lparam));
}
int WINAPI WinMain(HINSTANCE hinst,HINSTANCE hprevinst,LPSTR lpcmdline,int ncmdshow)
{
WNDCLASSEXwinclass;
MSGmessage;
const charszclassname[] = "ProgrammKlasse";
DWORDloop_start_time;
winclass.cbSize= sizeof(WNDCLASSEX);
winclass.style= CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc= WindowProc;
winclass.cbClsExtra= 0;
winclass.cbWndExtra= 0;
winclass.hInstance= hinst;
winclass.hIcon= LoadIcon(NULL,IDI_APPLICATION);
winclass.hCursor= LoadCursor(NULL,IDC_ARROW);
winclass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
winclass.lpszClassName= szclassname;
winclass.lpszMenuName= NULL;
winclass.hIconSm= LoadIcon(NULL);
if(!RegisterClassEx(&winclass))
{
return 0;
}
if(!(hwnd = CreateWindowEx(NULL,szclassname,"TryGame 2002",WS_POPUPWINDOW | WS_VISIBLE,0,0,SCREEN_BREITE,SCREEN_HOEHE,NULL,NULL,hinst,NULL)))
{
return 0;
}
Init();
while(!done)
{
while(GetMessage(&message,NULL,0,0))
{
TranslateMessage(message);
DispatchMessage(message);
}
loop_start_time = GetTickCount();
Main();
while( (GetTickCount() - loop_start_time) < 40);
}
Exit();
return message.wParam;
}
|
Oder wie meintest du das?(Übrigens kannst du mit DirectX per Zeigern wirklich direkt auf die Grafikoberfläche zugreifen) |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 02.12.2002, 17:03 Titel: |
|
|
Du kannst dir ein Gerätekontext des Desktops besorgen. Mit diesem Kontext kannst du dann ein Bitmap erstellen, daß du beliebig weiter verarbeiten kannst. Der Kontext des Desktop muß allerdings sehr schnell wieder freigegeben werden, weil es sonst zu inkonsequenzen zwischen dem Desktopinhalt und dem Kontext kommt. Es ist zwar technisch sogar möglich, auf diesen Kontext Zeichenoperationen auszuführen, allerdings ist das ja weder dein Anliegen, noch besonders schön, in fremden Fenstern zu Zeichnen...
Mir fällt die bebötigte Funktion im Augenblick nicht ein, aber such in der MSDN mal nach Desktop und Kontext und DC...
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
fedaYkin Mini JLI'ler
Anmeldedatum: 02.12.2002 Beiträge: 10 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 03.12.2002, 10:20 Titel: |
|
|
irgendwie scheint mir hier keine antwort "richtig" zu sein... vielleicht kenn ich mich aber auch nur zu wenig aus.
ich meinte jedes pixel, das auf dem bildschirm wiedergegeben wird hat ha eine bestimmte farbe. bei einer standardaufläsung von 1024x768 hat man fast 800000 pixel am bildschirm, und jedes hat eine bestimmte farbe. ich wollte wissen, wie man die farbe eines bestimmten pixel, in dem fall der pixel auf dem der mauszeiger steht und die drum herum, erfahren kann (eben mit visual c++ 6.0). ich "zeichne" es noch mal auf -->
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 X 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
0 0 0 1 0 0 0
X stellt die mauszeigerspitze an, die einser die vertikale schwarze linie. links und rechts neben der linie ist es weiss, also stehen nullen da. das ist die form, in der ich die info mit dem programm das ich zu schreiben versuche, in einer datei abspeichern will. die wird dann weiterverarbeitet.
ich muss jetz einfach nur wissen, wo in der hardware gespeichert ist, des dieses smiley --> gelb ist und wie kann ich auf diese information zugreiffen?
ich find einfach nix was mit weierhelfen könnte ...  |
|
Nach oben |
|
 |
fedaYkin Mini JLI'ler
Anmeldedatum: 02.12.2002 Beiträge: 10 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 03.12.2002, 10:29 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: | Du kannst dir ein Gerätekontext des Desktops besorgen. Mit diesem Kontext kannst du dann ein Bitmap erstellen, daß du beliebig weiter verarbeiten kannst. Der Kontext des Desktop muß allerdings sehr schnell wieder freigegeben werden, weil es sonst zu inkonsequenzen zwischen dem Desktopinhalt und dem Kontext kommt. Es ist zwar technisch sogar möglich, auf diesen Kontext Zeichenoperationen auszuführen, allerdings ist das ja weder dein Anliegen, noch besonders schön, in fremden Fenstern zu Zeichnen...
Mir fällt die bebötigte Funktion im Augenblick nicht ein, aber such in der MSDN mal nach Desktop und Kontext und DC...
AFE-GmdG |
in einem anderen (englischen) forum hab ich eine ähnliche antwort erhalten, nur leider bin ich nicht so ein profi, als dass ich damit etwas konstruktives anfangen könnte :/ |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 03.12.2002, 12:06 Titel: |
|
|
Ich habe mal ein Beispielprogramm "Rotation" geschrieben, bei dem eine Bitmap gedreht wird. Dazu habe ich mir von einem Bitmap ein DC geben lassen, und die passenden farben ausgelesen. Die Technik ist die selbe, schau dir das Programm mal an:
Rotation
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
MAG Mini JLI'ler
Anmeldedatum: 21.11.2002 Beiträge: 15 Wohnort: Falkenrehde/Brandenburg/Deutschland Medaillen: Keine
|
Verfasst am: 03.12.2002, 14:26 Titel: |
|
|
Ach du willst also auf einzelne Pixel des Bildschirmspeichers zugreifen?
Na dann, nimm doch die Win32-API Funktion GetPixel():
Code: |
COLORREF GetPixel(
HDC hdc, // handle to device context
int XPos, // x-coordinate of pixel
int nYPos // y-coordinate of pixel
)
|
Zurückgegeben wird die Farbe des Pixels als RGB-Wert(deshalb auch der Rückgabetyp COLORREF!) |
|
Nach oben |
|
 |
fedaYkin Mini JLI'ler
Anmeldedatum: 02.12.2002 Beiträge: 10 Wohnort: Graz Medaillen: Keine
|
Verfasst am: 04.12.2002, 08:19 Titel: |
|
|
hey super, der befehl dürft mir weiterhelfen
gibts das jetz die koordinaten der maus wieder?
und wie schaut ein RGB wert aus?
mal schaun...
*up*
ich hab grad in der MSDN library gelesen, das es nur in dem spezifischen programmfenster funktioniert. kann man das auch auf den ganzen bildschirm ausdehnen? |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 04.12.2002, 11:39 Titel: |
|
|
Mit GetWindowDC(NULL); bekommt man das Fensterhandle des Desktops. Das Handle wendest du dann in Kombination mit der aktuellen Mausposition mit GetPixel() an und du hast die Farbinfo, die du haben willst.
COLORREF ist ein 32-Bit-Datentyp, der je 8 Bit für Rot, Grün und Blau definiert, die letzten 8 Bit sind unbelegt.
AFE-GmdG _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|