Moi
Mun ohjelma hakee nyt 64:n kohdan värikoodin yhdestä ikkunasta GetPixelillä ja se saattaa palauttaa vaikka "16774007" ja tuo koodi vaihtuu aika paljon jos värin sävy on yhtään muuttunut.. Mun pitäis vaan tietää että onko se väri ihan simppelisti vaan esim. punainen, vaaleansinen vai valkoinen?
Ku eikai sitä nyt näin kannata tehdä?? Tuntuu tyhmältä ja vie aikaa.
Public Function ConvertCol(Col As String)
Select Case Col
Case 1061359
ConvertCol = "puna"
Case 2771955
ConvertCol = "puna"
Case 8101119
ConvertCol = "puna"
Case 16772938
ConvertCol = "vsini"
Case 16774007
ConvertCol = "vsini"
End Select
End FunctionPura väri komponentteihinsa (RGB tai BRG riippuen onko big- vai small endian) ja tee sen pohjilta jonkinlainen valinta-algoritmi; esim. jos punainen komponentti on hallitsevin niin pikselin sävy on vahvasti punertava.
Joo tota mä mietenki mutta eikö siitä tule aika hidas kun joutuu muuntamaan ne kaikki erikseen rgb:ksi?
JussiR kirjoitti:
Joo tota mä mietenki mutta eikö siitä tule aika hidas kun joutuu muuntamaan ne kaikki erikseen rgb:ksi?
Nopeempi se on ku sun purkkaviritelmäsi.
Joo testasin ja hyvin se toimii :P
Tässä tämänhetkinen kokeilu:
Public Sub ConCol(col As Long, Ai As Long, Bi As Long)
r = col Mod 256
B = Int(col / 65536)
g = (col - (B * 65536) - r) / 256
If r > 145 And g < 35 And B < 15 Then
JewelCol(Ai, Bi) = "R"
ElseIf r > 200 And g > 200 And B > 200 Then
JewelCol(Ai, Bi) = "W"
ElseIf r < 50 And B > 120 Then
JewelCol(Ai, Bi) = "B"
ElseIf g > 200 And B > 200 Then
JewelCol(Ai, Bi) = "B"
End If
End SubJussiR kirjoitti:
r = col Mod 256 B = Int(col / 65536) g = (col - (B * 65536) - r) / 256
Itse tekisin näin:
r = col And 255 g = (col \ 256) And 255 b = col \ 65536
Onpas vaikeaa erottaa punainen ja oranssi toisistaan.. :S
Itselle tulisi äkkiseltään mieleen muuttaa RGB HSV:ksi, jolloin Huesta saisi suoraan haettua sävyn
Function Sävy(Color As Long) As String
Dim R As Integer, G As Integer, b As Integer
Dim MaxC As Integer, MinC As Integer
Dim H As Double, Dyn As Integer
R = Color And 255
G = (Color \ 256) And 255
b = Color \ 65536
If R > G Then MaxC = R: MinC = G Else MaxC = G: MinC = R
If b < MinC Then MinC = b
If b > MaxC Then MaxC = b
If MaxC = MinC Then
Sävy = "Harmaa, ei voi määrittää sävyä"
Exit Function
End If
Dyn = (MaxC - MinC)
If MaxC = R Then
H = (G - b) / Dyn * 60
If H < 0 Then H = H + 360
ElseIf MaxC = G Then
H = 120 + (b - R) / Dyn * 60
Else
H = 240 + (R - G) / Dyn * 60
End If
Select Case H
Case Is < 15, Is > 345
Sävy = "Punainen"
Case 15 To 45
Sävy = "Oranssi"
Case 45 To 75
Sävy = "Keltainen"
Case 75 To 105
Sävy = "Keltavihreä"
Case 105 To 135
Sävy = "Vihreä"
Case 135 To 165
Sävy = "Sinertävänvihreä"
Case 165 To 195
Sävy = "Syaani"
Case 195 To 225
Sävy = "Vihertävänsininen"
Case 225 To 255
Sävy = "Sininen"
Case 255 To 285
Sävy = "Sinivioletti"
Case 285 To 315
Sävy = "Violetti"
Case 315 To 345
Sävy = "Punavioletti"
End Select
End FunctionKiitos! Tuo näyttää sopivalta. Testaamaan->
Yritin tehdä tätä ohjelmaa myös C++:lla, mutta samat väriongelmat tuli..
EDIT: Ei onnistu tälläkään kertaa.. Tuokin luulee oranssia keltaiseksi ja toisinpäin. Ehkä olis aika lähettää ne värit tänne kuvana? :D
EDIT2: Eli tässä on peli mihin teen taas bottia. Siinä ei ole hiscore listaa eikä siitä voi voittaa mitään eli lähes huvikseni vaan teen.
http://www.popcap.com/webgames/bejeweled/flash/
Ja tässä on kuva missä näkyy mistä kohdasta mun VB-botti ne värit ottaa:
http://img186.imageshack.us/my.php?image=bjyi9.
Muuten olis botti C++:lla ja Visual Basicilla valmis, mutta värit sekoo.
Lähetän kohta mistä kohdasta C++ botti ottaa värit.
Sain nyt C++ version mun ohjelmasta toimimaan. Mutta jostain ihmeen syystä siitä tuli melkein 2 kertaa hitaampi kuin Visual Basic versiosta? :S Kumpikin toimii GetPixelillä.
Sleep komentoja ei ole turhissa kohdissa.
Jaa'a, aika huonosti oot C++-version tehny jos Visual Basic-versio on nopeempi ja kummatki käyttää samaa APIa :D Mut kuitenki, tee palvelus itselles ja kaikille muille äläkä käytä GetPixeliä, jos nopeudella on tippaakaan merkitystä. GetDIBits on paljon nopeempi ja parempi kun etitään suuremmalta alueelta värejä. Tarkemmin ottaen 3000 kertaa nopeempi verrattuna GetPixeliin, kun kävin koko näyttöni (1440x900) läpi.
edit. oho joo ois voinu kattoo ton kuvan. Käytä vaan GetPixeliä, paljon parempi tossa kun tarkistat vaan pari pikseliä sieltä täältä.
GetDIBits on vaikee käyttää.
Mut taisin löytää mikä tossa hidastaa. C++ versio ottaa sen hanskan mistä Getpixeli kattoo sitten tietyt pikseli näin "GetDC(0)" elikkäs koko ruudun kahva. Onko hitaampaa katsoa muutama tietty piste jos kahva on isompi? Kyseessä ei ole siis for looppi joka katsoo koko ruudun jokaisen pikselin..
Visual Basicilla tehty ottaa kahvan vain pelin ikkunasta jonka hwnd se tietää hiiren sijainnista WindowFromPoint APIlla.
Eli käyn katsomassa googlesta kuinka windowfrompointia käytetään C++:Ssa.
Mutta vastatkaa silti hidastaako tuo oikeesti mitään?
EDIT: OHO ei oo taas ollu If hallussa.. SIellä oli sellanen Sleep(3000) väärässä kohdassa..
Aihe on jo aika vanha, joten et voi enää vastata siihen.