Skocz do zawartości
Dusik

Przesunięcie bitowe?, dodanie przezroczystości

Rekomendowane odpowiedzi

Mam taki problem i nie potrafie sobie z nim poradzić. Za pomocą komendy chce pobierać od gracza kolor w formacie RGB
bez przezroczystości po pobraniu ustawić mu ten kolor jako kolor nicku ale wcześniej narzucić kolorowi przezroczystość FF (255)
Próbowałem to zrealizować za pomocą przesunęcia bitowego lecz bity są przesuwane za pomocą zer np. [ FF0000 << 8 ] = FF0000[00]
I gracz jest niewidzialny na radarze. Dąże do tego że gracz wpisze np. FF0000 a kolor zostanie ustawiony FF0000FF (0xFF0000FF)
Przychodzi mi do głowy nagacja ale w systemie hex chyba nie da rady bo jak [!00 > FF] !0 nie równa się przecież 255 tylko 1...
Prosiłbym o pomoc.

CMD:color(playerid,cmdtext[])
{
	new color;
	if(sscanf(cmdtext,"x",color))
	{
	    SendClientMessage(playerid,-1,"/color [RRGGBB]");
		return 1;
	}
	
	color = color << 8;
	
	new str[32];
	format(str,32,"[DEC: %d HEX: %x]",color,color);
	SendClientMessage(playerid,-1,str);
	SetPlayerColor(playerid, color);
	return 1;
}

 

Edytowane przez Dusik

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Początkowo pomyślałem, czemu by nie zamienić wartości heksadecymalnej podanej przez gracza na ciąg znaków i poprzez formata dodać do niej dodatkową (potrzebną dla określenia przeźroczystości) końcową wartość, a następnie zamienić kompletną liczbę na postać decymalną dzieląc string na pojedyncze znaki i wyliczając to matematycznie, no ale niestety cały misterny plan w pi#@u, ponieważ na koniec ukazały się ograniczenia tego języka..

XNBs6fG.png

prawdę mówiąc tylko to przyszło mi do głowy, może jest jakiś prostszy sposób o którym nie wiem.. ale może to, co napisałem w jakiś sposób komukolwiek, jakkolwiek pomoże.

Pozdrawiam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jakie kombinacje, bo walnę xD

 

new custom_color, s[9] = "AFAFAF";
format(s, _, "%sCC", inputtext);
sscanf(s, "x", custom_color);
SetPlayerColor(playerid, custom_color);

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No i proszę, wiedziałem, że da się prościej :D Czasem po 6 nad ranem trzeba pójść po prostu spać, a nie brać się za wymyślanie drugiego koła na nowo :) Dobra robota, chłopaki!

Edytowane przez Tupac

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
12 godzin temu, Dusik napisał:

Mam taki problem i nie potrafie sobie z nim poradzić. Za pomocą komendy chce pobierać od gracza kolor w formacie RGB
bez przezroczystości po pobraniu ustawić mu ten kolor jako kolor nicku ale wcześniej narzucić kolorowi przezroczystość FF (255)
(...) Dąże do tego że gracz wpisze np. FF0000 a kolor zostanie ustawiony FF0000FF (0xFF0000FF)
(...)

 

4 godziny temu, bocian941 napisał:

@up overkill hardo :P

    new color = 0xABCDEF;
    printf("%x %x", color, color << 8 | 0xFF);

 

[09:05:23] ABCDEF ABCDEFFF

Można też tak:

new color= 0x00336699;
color= (color << 8) & 0x000000FF; // 0x33669900 & 0x000000FF


A żeby było życiowo to... co jeśli gracz jest już niewidzialny na radarze (np jest na arenie albo na jakimś evencie) i jest mu zmieniany kolor (tj na kolor ze stałą widocznością)? Jak był niewidoczny to stanie się wówczas widoczny, a żeby tego uniknąć proponuję:

CMD: color(playerid, cmdtext[])
{
  new color;
  if (sscanf(cmdtext, "x", color)) return SendClientMessage(playerid, -1, "/color [RRGGBB]");
	
  color= (color << 8) & (GetPlayerColor(playerid) & 0x000000FF);
  SetPlayerColor(playerid, color);

  return 1;
}

wówczas zmieni się jedynie kolor dla gracza, a jego widoczność na radarze pozostanie bez zmian.

Edytowane przez PrzMas

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@przemas

   color = 0xABCDEF;
   color= (color << 8) & (0xFFAABBCC & 0x000000FF); // 0xFFAABBCC zamiast GPC(id)

print 0

 

btw
#define ShiftRGBToRGBA(%0,%1) (((%0) << 8) | (%1))

= kod podany przeze mnie

Edytowane przez bocian941

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
3 minuty temu, bocian941 napisał:

@przemas

   color = 0xABCDEF;
   color= (color << 8) & (0xFFAABBCC & 0x000000FF); // 0xFFAABBCC zamiast GPC(id)

print 0

 

btw
#define ShiftRGBToRGBA(%0,%1) (((%0) << 8) | (%1))

= kod podany przeze mnie

co ty ćpasz jak include jest już od miesięcy i napisany przeze mnie 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Oczywiście nie zrozumiałeś tego co napisałem, mam na myśli, że podałem to samo rozwiązanie a nie to, że jestem autorem twojego inc..

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Teraz, bocian941 napisał:

Oczywiście nie zrozumiałeś tego co napisałem, mam na myśli, że podałem to samo rozwiązanie a nie to, że jestem autorem twojego inc..

Wiesz jak zobaczyłem post Tupac to mi się rzygać zachciało xD

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×