JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Collorkeys

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 22.08.2002, 18:29    Titel: Collorkeys Antworten mit Zitat

Die Frage ist ein bisschen peinlich Embarassed ...
aber wie muss ich bei Colorkeys oder anderen Sachen den Farbwert angeben? Wie lautet zum beispiel der Wert für Rot, Gruen oder Blau?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Gast









BeitragVerfasst am: 22.08.2002, 18:32    Titel: Antworten mit Zitat

Das ist nicht peinlich - ich habe den Wert für andere Farben auch nie rausbekommen...
Nach oben
Sören
JLI Master Trainee



Anmeldedatum: 26.07.2002
Beiträge: 647
Wohnort: Bonn
Medaillen: Keine

BeitragVerfasst am: 22.08.2002, 19:19    Titel: Antworten mit Zitat

Ähm du kannst doch einfach das RGB Makro verwenden, oder?
Also zB RGB(0,0,0), dass wäre Schwarz!
Dabei stehen die Werte für Rot,Grün,Blau!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 22.08.2002, 19:58    Titel: Antworten mit Zitat

Oh, stimmt das hab ich total vergessen ...
Danke!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Gast









BeitragVerfasst am: 22.08.2002, 20:27    Titel: Antworten mit Zitat

Hmmm, dachte ich hätte das auch mal so versucht, und es hätte nicht geklappt, aber ich kann mich natürlich auch irren...
Nach oben
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 22.08.2002, 23:25    Titel: Antworten mit Zitat

Solange es sich bei DirectX (Draw oder 3D) um einen 32-Bit-Farbmodus handelt, kannst du die Farbe auch Hexadezimal angeben:
0x00000000 steht für schwarz
0x00FFFFFF steht für weiß
0x00FF0000 steht für rot0x0000FF00 steht für grün
0x000000FF steht für blau.

usw.

Im 16-Bit-Modus muß man eine Umrechnung vornehmen, die je nach verwendeten 16-Bit-Modus (5-6-5 oder 5-5-5) etwas anders ist.
Informationen dazu und Funktionen gibt es aber im Buch...

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DaN00b
JLI'ler



Anmeldedatum: 10.08.2002
Beiträge: 159

Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 09:29    Titel: Antworten mit Zitat

ja das war genau die einzigste funktion vom buch die ich bisher noch net verstanden hab Sad

naja bin se aber auch so gut wie übergangen
_________________
Carpe Diem - Seize the day - Nütze den Tag!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Hasenfuß
Senior JLI'ler


Alter: 36
Anmeldedatum: 20.08.2002
Beiträge: 291

Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 10:00    Titel: Antworten mit Zitat

Genau die hab ich auch nie kapiert! Besonders ham mich die Operatoren ">>=" und "?" irritiert. Kann mir des einer mal erklären?
Hier nochmal der Code der Funktion:
Code:
 
void DeterminePixelFormat(LPDIRECTDRAWSURFACE7 lpDDSurface)
{
    // Pixelformat bestimmen
    DDPIXELFORMAT ddpf;
    ddpf.dwSize = sizeof(ddpf);
    lpDDSurface->GetPixelFormat(&ddpf);

    // Werte für Rot bestimmen   
    while(0 == (ddpf.dwRBitMask & 1))
    {
    ddpf.dwRBitMask >>= 1;
    PosRed++;
    }
    ShiftRed = (ddpf.dwRBitMask == 31) ? 3 : 2;

    // Werte für Grün bestimmen
    while(0 == (ddpf.dwGBitMask & 1))
    {
    ddpf.dwGBitMask >>= 1;
    PosGreen++;
    }
    ShiftGreen = (ddpf.dwGBitMask == 31) ? 3 : 2;   

    // Maske für blau beginnt immer bei 0
    PosBlue = 0;
    ShiftBlue = (ddpf.dwBBitMask == 31) ? 3 : 2;     
}


PS: Die Funktion CalcColor hab ich auch nich ganz gecheckt aber ich denk mal, dass die nich mehr so schwer is wenn ich die hier verstanden hab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Michael
JLI'ler



Anmeldedatum: 20.07.2002
Beiträge: 173
Wohnort: Münster / NRW
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 10:33    Titel: Antworten mit Zitat

Ich versuchs mal.
Zum Fragezeichen: Das ist so eine Art if-Bedingung:
(a > b) ? a = 4 : a = 3;
In der Klammer steht die Bedingung die erfüllt sein soll. Das Fragezeichen signalisiert den Vergleich. Wenn die Bedingung 'true' ist, wird die Anweisung vor dem Doppelpunkt ausgeführt, wenn sie 'false' ist, die danach.

Zu >> und << und so: Das sind sog. Bitoperatoren. Jede Zahl im Computer ist ja aus 1 und 0 aufgebaut. << verschiebt sämtliche Stellen links, >> nach rechts. Beispiel:

Nehmen wir die Zahl 10110 (dezimal 22). 10110 << 2 bedeutet, diese zahl um zwei stellen nach links zu schieben, also ist das ergebnis 1011000 oder dezimal 88. Entsprechend bedeutet 10110 >> 2, um 2 stellen nach rechts zu schieben, man erhält also 101 oder dezimal 5.

Wenn das nicht verstanden wurde, nochmal nachfragen!
_________________
Es geht auch ohne Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 12:17    Titel: Antworten mit Zitat

Sehr richtig.
Der Vorteil einer Fragezeichen-If-Bedingung ist, daß man den in eine Berechnung mit einbauen kann:

Code:

int i=0;
while(1) {
  i=i+(i==10)?-10:1;
}

bedeutet nichts weiter als:
Code:

int i=0;
while(1) {
  if(i==10) {
    i=0;
  } else {
    i++;
  }
}

Man kann also das ?-Operant in andere Formulierungen umsetzen, was aber in der Regel mehr Programmieraufwand bedeutet, und auch längeren Code produziert, da der Compiler ein ? wesentlich besser optimieren kann.

Mit dem >> und << (Shift-Operator) habe ich selbst so meine Probleme. Technisch gesehen stimmt es zwar, das es eine Zahl um eine anzahl bits nach rechts bzw. links schiebt, aber gerade bei der Anwendung dieser Funktion bin ich schon des öfteren auf (mir unerklärliche) Probleme gestoßen. Wahrscheinlich lag es in der Regel an den Prioritäten der Operationszeichen... (Stichpunkt: Punkt-vor-Strich-Rechnung)

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
_Hasenfuß
Gast








BeitragVerfasst am: 23.08.2002, 13:25    Titel: Antworten mit Zitat

Oh mann! Jetzt bin ich an nem anderen Computer, meld mich an und steh auch als derzeit online da, bin aber immer noch Gast und kann mich nur Einloggen und nich Aus.

Na egal!

Danke jetzt hab ich des endlich mal verstanden.Very Happy Aber isses eigentlich wichtig, des ganze Zeug zu verstehen, oder reichts, wenn ich den Sinn von den beiden Funktionen(DeterminePixel und CalcColor) verstanden hab?
Nach oben
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 15:15    Titel: Antworten mit Zitat

Die Kunst des Programmierens besteht darin, eine Fremdsprache zu lernen. Das bedeutet in der Regel: Anwenden, anwenden und nochmals anwenden... Wie man einen Satz ausspricht, ist in der Regel egal, man kann verblümt sprechen, abgehackt und kurz oder sehr wissenschaftlich. Das läßt sich so auch auf eine Programmiersprache, in diesem Fall C++, übertragen. Wie ein Programm geschrieben ist, kann selbst bei gleicher Funktionalität ganz anders sein. Als Programmierer muß man in der Regel nur wissen, wo man Infos zur API findet, der Rest ist sprechen / programmieren...

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DaN00b
JLI'ler



Anmeldedatum: 10.08.2002
Beiträge: 159

Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 18:43    Titel: Antworten mit Zitat

hab mir jetzt die funktion auch mal genauer angeschaut und noch eine frage dazu:

eigentlich kann ja nur des shiftgreen entweder 3 der 2 sein normal
weil egal ob der 5:6:5 oder der 5:5:5 16-bit modus rot und blau sind immer 5 bit also könnte man ja normal shiftred und shiftblue gleich den wert 3 übergeben oder?
_________________
Carpe Diem - Seize the day - Nütze den Tag!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 44
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 23.08.2002, 19:00    Titel: Antworten mit Zitat

Nicht ganz, da der gesamtwert der Farbe eine einzige 16-Bit-Variable ist, und daher nur einzelne Bits angepast (verändert) werden dürfen, je nach aktuellem Farbwert...

Bei 5-6-5 ist der 16-Bit-Wert ja folgendermaßen aufgebaut:

rrrrrggggggbbbbb (r für rot, g für grün und b für blau...)

Die Farbwerte Rot, Grün und Blau werden der Funktion als BYTES übergeben, wenn ich mich nicht ganz täusche (Hab das Buch gerade nicht zur Hand)
Der maximale Wert eines BYTE ist ja 255, oder in Binärdarstellung 11111111.
Von diesen Wert werden nun bei Rot und Blau die letzten 3 Bits gestrichen, bei Grün nur die letzten 2 Bits.
Und diese (gekürzten) Bitwerte werden nun aneinandergehängt, also werden Rot und Grün erneut verschoben, Nämlich nach Links.
Rot um 6+5 Bits, Grün um 5 Bits.
Man kann im Übrigen nicht gleich Rot um 2 Byte nach Links verschieben, da dabei nicht die abzuschneidenden Bits ausgeblendet werden, und weil ROT nur ein 8-Bit-Wert ist, also würden die ersten 8 Bits im Nirvana verschwinden. Rot müsste in diesem Falle erst auf eine 16-Bit-Variable kopiert werden...

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DaN00b
JLI'ler



Anmeldedatum: 10.08.2002
Beiträge: 159

Medaillen: Keine

BeitragVerfasst am: 24.08.2002, 11:01    Titel: Antworten mit Zitat

ja aber das ändert nichts an der tatsache das shiftred und shiftblue immer 3 ist und daher gleich bei der initialisierung auf 3 gesetzt werden können

weil egal welcher 16-bit modus hat rot und blau immer 5 bits und dann müssen von dem byte wie du schon gesagt hast immer 3 bits abgeschnitten werden

hier nochmal der code ich kommentier mal was ich mein ^^
Code:

int ShiftRed   = 0; //kann gleich mit 3 initialisiert werden
int ShiftGreen = 0;
int ShiftBlue  = 0; //auch mit 3 initialisieren
int PosRed     = 0;
int PosGreen   = 0;
int PosBlue    = 0;

// das Pixelformat bestimmen
void DeterminePixelFormat(LPDIRECTDRAWSURFACE7 lpDDSurface)
{
    // Pixelformat bestimmen
    DDPIXELFORMAT ddpf;
    ddpf.dwSize = sizeof(ddpf);
    lpDDSurface->GetPixelFormat(&ddpf);

    // Werte für Rot bestimmen   
    while(0 == (ddpf.dwRBitMask & 1))
    {
    ddpf.dwRBitMask >>= 1;
    PosRed++;
    }
    ShiftRed = (ddpf.dwRBitMask == 31) ? 3 : 2; //sinnlos da immer 3

    // Werte für Grün bestimmen
    while(0 == (ddpf.dwGBitMask & 1))
    {
    ddpf.dwGBitMask >>= 1;
    PosGreen++;
    }
    ShiftGreen = (ddpf.dwGBitMask == 31) ? 3 : 2;   

    // Maske für blau beginnt immer bei 0
    PosBlue = 0;
    ShiftBlue = (ddpf.dwBBitMask == 31) ? 3 : 2; //ebenfall sinnlos     
}


das man die Pos-Werte sich berechnen lassen muss und das man bevor man nach links verschiebt zuerst die zu viele bits abschneidet ist mir dabei schon klar Wink
_________________
Carpe Diem - Seize the day - Nütze den Tag!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum