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 Function
Pura 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 Sub
JussiR 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 Function
Kiitos! 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.