 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 22.08.2002, 17:29 Titel: Collorkeys |
|
|
Die Frage ist ein bisschen peinlich ...
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 |
|
 |
Gast
|
Verfasst am: 22.08.2002, 17:32 Titel: |
|
|
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
|
Verfasst am: 22.08.2002, 18:19 Titel: |
|
|
Ä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 |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 22.08.2002, 18:58 Titel: |
|
|
Oh, stimmt das hab ich total vergessen ...
Danke! |
|
Nach oben |
|
 |
Gast
|
Verfasst am: 22.08.2002, 19:27 Titel: |
|
|
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


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 22.08.2002, 22:25 Titel: |
|
|
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 |
|
 |
DaN00b JLI'ler

Anmeldedatum: 10.08.2002 Beiträge: 159
Medaillen: Keine
|
Verfasst am: 23.08.2002, 08:29 Titel: |
|
|
ja das war genau die einzigste funktion vom buch die ich bisher noch net verstanden hab
naja bin se aber auch so gut wie übergangen _________________ Carpe Diem - Seize the day - Nütze den Tag! |
|
Nach oben |
|
 |
Hasenfuß Senior JLI'ler

Alter: 37 Anmeldedatum: 20.08.2002 Beiträge: 291
Medaillen: Keine
|
Verfasst am: 23.08.2002, 09:00 Titel: |
|
|
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 |
|
 |
Michael JLI'ler
Anmeldedatum: 20.07.2002 Beiträge: 173 Wohnort: Münster / NRW Medaillen: Keine
|
Verfasst am: 23.08.2002, 09:33 Titel: |
|
|
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  |
|
Nach oben |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 11:17 Titel: |
|
|
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 |
|
 |
_Hasenfuß Gast
|
Verfasst am: 23.08.2002, 12:25 Titel: |
|
|
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. 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


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 14:15 Titel: |
|
|
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 |
|
 |
DaN00b JLI'ler

Anmeldedatum: 10.08.2002 Beiträge: 159
Medaillen: Keine
|
Verfasst am: 23.08.2002, 17:43 Titel: |
|
|
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 |
|
 |
AFE-GmdG JLI MVP


Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 23.08.2002, 18:00 Titel: |
|
|
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 |
|
 |
DaN00b JLI'ler

Anmeldedatum: 10.08.2002 Beiträge: 159
Medaillen: Keine
|
Verfasst am: 24.08.2002, 10:01 Titel: |
|
|
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  _________________ Carpe Diem - Seize the day - Nütze den Tag! |
|
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
|