Zaloguj się by uzyskać pełen dostęp. Nie masz jeszcze konta? Założ je już teraz w kilka sekund.

Wysłany: 2017-11-30, 19:28


marcin778

Krytyk serwerów MTA






Wiek: 24
Na forum: 4149 dni
Posty: 2268
Nick w MP: Marcineg

Piwa: 4662

Respekt: 1436,8
Respekt: 1436,8

Witam!
Pewnie jak wiecie od jakiego? czasu w wolnych chwilach pisz? poradniki od podstaw po ci??sze tematy. Zastanawia?em si? nad now? "seri?" poradnik?w, generalnie "Matematyka w lua" oraz "Fizyka w lua" - Poradniki te polega? b?d? na rzeczach typowo matematycznych czy te? fizycznych a ma na celu to u?atwi? zrozumienie funkcji matematycznych czy te? fizycznych z cz??ci czwartej poradnik?w "Lua kurs lekcja". Aby sprawdzi? czy to ma jakikolwiek sens robienia poruszymy dzi? jeden temat, matematyka a konkretnie skalowanie element?w gui czy te? dxDraw (nie jest to traktowane jako element, aczkolwiek pozwol? sobie to tak nazwa?.) Je?li nie zwr?ci to zbytnio uwagi no to nast?pnych cz??ci nie b?dzie i tyle. Dajcie zna? czy ma to sens i czy tworzy? to dalej.

Wprowadzenie

Nie przed?u?aj?c, jak wiadomo mamy do dyspozycji bardzo dobry "guieditor", za pomoc? kt?rego mo?emy wiele pro?ciej tworzy? nasze gui ni? mieliby?my robi? to r?cznie. ?w guieditor ma opcj? skalowania "relative" czyli relatywnego, aby by?o to pod ka?d? rozdzielczo??. Jak wiadomo w przypadku element?w gui dzia?a to prawie, ?e doskonale, aczkolwiek w przypadku dxDraw nie do ko?ca si? to sprawdza. Czasem wyskalowane guieditorem dxDraw wygl?da r??nie na r??nych rozdzielczo?ciach, cho? w praktyce wz?r liczenia jest prawie, ?e identyczny.

Wz?r
Wz?r na skalowanie jest nast?puj?cy:

x*(gX/rX)
y*(gY/rY)
Gdzie
Kod:


x - pozycja z osi X naszego elementu
y - pozycja z osi Y naszego elementu
gX - rozdzielczo?? gracza z osi X (szeroko??)
gY - rozdzielczo?? gracza z osi Y (wysoko??)
rX - rozdzielczo?? na kt?rej by?o robione dane gui z osi X (szeroko??)
rY - rozdzielczo?? na kt?rej by?o robione dane gui z osi Y (wysoko??)
Czyli w lua zrobimy sobie to np tak

local sx,sy guiGetScreenSize() -- pobieramy rozdzielczo?? gracza kt?ry widzi gui
local px,py = (sx/1024),(sy/768) -- dzielimy rozdzielczo?? gracza kt?ry widzi gui przez rozdzielczo?? na kt?rej by?o robione gui.

dxDrawRectangle(100*px,200*py,100*px,200*py)
Je?li robili?my gui na rozdzielczo?ci 1024x768 no to takie parametry podajemy, je?li robili?my gui na rozdzielczo?ci np 800x600 to dzielimy przez 800 i 600. Kr?tko m?wi?c, dzielimy rozdzielczo?? gracza przez rozdzielczo?? na kt?rej robili?my gui.

Praktyka, liczymy.
Zrobi?em sobie przyk?adowe rectangle na pozycji 346,580,670,203 - s? to zmy?lone pozycje. Robi?em to powiedzmy na rozdzielczo?ci 1024x768. No to liczymy, obecnie nasz kod wygl?da tak.

addEventHandler("onClientRender",root,function()
      dxDrawRectangle(346,580,670,203)
end)


Po przeliczeniach

local sx,sy guiGetScreenSize()
local px,py = (sx/1024),(sy/768)

addEventHandler("onClientRender",root,function()
    dxDrawRectangle(346*px,580*py,670*px,203*py)
end)
Tak wygl?da nasz kod po przeliczeniach. Podczas tworzenia tego rectangle w editorze robi?em to na rozdzielczo?ci 1024x768 tak wi?c przez tak? dziel? rozdzielczo?? gracza. Wszystko robimy tak samo, elementy CEGUI r?wnie? mo?emy tak skalowa?. Natomiast w przypadku
Więcej informacji znajdziesz w Wikipedii MTA:

dxDrawText
wypada podzieli? jeszcze skal? tekstu przez szeroko?? (px). Tak wi?c nasz nie wyskalowany tekst

 addEventHandler("onClientRender",root,function()
    dxDrawText("abcdf",350,590,640,158,tocolor(255,255,255,255),1.0)
end)
Nie dodaj? pozosta?ych argument?w bo s? one nam nie potrzebne teraz. Skalujemy

local sx,sy guiGetScreenSize()
local px,py = (sx/1024),(sy/768)

 addEventHandler("onClientRender",root,function()
   dxDrawText("abcdf",350*px,590*py,640*px,158*py,tocolor(255,255,255,255),1.0*px)
end)
No i wyskalowane.

Wa?ne (Pseudo regu?ka) - Zapami?taj!
Jak wiadomo, s? rzeczy o kt?rych musimy pami?ta?.

1. Dzielimy zawsze rozdzielczo?? gracza przez rozdzielczo?? robienia (xgracza/xrobienia), (ygracza/yrobienia) - Nie odwrotnie
local sx,sy guiGetScreenSize()
local px,py = (1024/sx), (768/sy)
Poniewa? wtedy b?d? zupe?nie inne wyniki przez co gui nam si? nie wyskaluje.

2. Mno?ymy parametry przez odpowiednie wyniki. Czyli x*wynikx dzielenia, y*wyniky dzielenia, szerokosc*wynikx dzielenia, wysokosc*wyniky dzielenia.

3. W tekstach wypada mno?y? skal? naszego tekstu. Je?li to robimy to mno?ymy j? przez wynik x dzielenia (px).

4. Najlepiej tworzy? gui na najmniejszej rozdzielczo?ci (640x480) - aczkolwiek Nie jest to konieczne.

Wz?r


x*(gX/rX)
y*(gY/rY)
Gdzie:

Kod:


x - pozycja z osi X naszego elementu
y - pozycja z osi Y naszego elementu
gX - rozdzielczo?? gracza z osi X (szeroko??)
gY - rozdzielczo?? gracza z osi Y (wysoko??)
rX - rozdzielczo?? na kt?rej by?o robione dane gui z osi X (szeroko??)
rY - rozdzielczo?? na kt?rej by?o robione dane gui z osi Y (wysoko??)


?eby nie by?o jakich? nie jasno?ci ja wszystko dzieli?em przez 1024 i 768 gdy? u?ywam takiej rozdzielczo?ci, Wy dzielicie przez swoj?.

Skalowanie od?rodkowe
Skalowanie od?rodkowe, z tego co mi wiadomo do?? ma?o znany spos?b ale z tego co wiem to jest dobry a nawet podobno najlepszy na mta je?li chodzi o dok?adno??.
Pozycja jest doskonale i idealnie wyskalowana, natomiast rozmiar jest inny i nale?a?oby go r?wnie? skalowa? nie koniecznie ju? od?rodkowo (mo?na u?y? tego normalnego sposobu)
Wz?r na skalowanie od?rodkowe:

x/min(2,fH/gX)
Gdzie
Kod:


x - pozycja z osi X naszego elementu,
min - funkcja matematyczna minimum (math.min)
2 - minimalna wartosc (dla wlasnego dobra nie doswiadczone osoby nie powinny tego zmieniac)
fH - x fullhd (1920)
gX - rozdzielczosc X gracza (szerokosc)
Przyklad


local sx,sy guiGetScreenSize()
local zoom 1
local fh 1920
if sx fh then
 zoom math.min(2,fh/sx)
end

addEventHandler("onClientRender",root,function()
   dxDrawRectangle(346/zoom,580/zoom,670/zoom,203/zoom)
end)
Dzielimy x,y,w,h przez zoom (zmienna od math.min).

Przydatne linki

Uk?ad wsp??rz?dnych (o? X,Y): https://pl.wikipedia.org/wiki/Uk?ad_wsp??rz?dnych

Jak prosi?em, pozostawcie po sobie ?lad czy jest to jakkolwiek przydatne czy mo?e jednak takie duperele powinny znajdowa? si? w "Lua kurs lekcja..." . Chyba wszystko wyt?umaczy?em, w razie jakich? b??d?w prosz? o komentarz to je poprawi?.

Podpis
Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- dawniej
Ostatnio zmieniony przez marcin778 2017-11-30, 22:49, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 6 piw(a):
STOPseba, SylvekHTG, Iglaszty, Kuksss, MaciekSteal, Xyrusek
Wysłany: 2017-11-30, 21:23


_Haze

Peace Yo!






Wiek: 24
Na forum: 4184 dni
Posty: 1648
Nick w MP: Haze

Piwa: 2628

Respekt: 1020
Respekt: 1020

Skalowanie tym sposobem s?abo dzia?a na FullHD. Proponuje skalowa? od?rodkowo :P

Komentarz marcin778 dodany 2017-11-30, 22:37Zapomniałem o tym sposobie, już edytuję.
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-11-30, 22:52


marcin778

Krytyk serwerów MTA






Wiek: 24
Na forum: 4149 dni
Posty: 2268
Nick w MP: Marcineg

Piwa: 4662

Respekt: 1436,8
Respekt: 1436,8

@Aktualizacja, dodano metod? skalowania od?rodkowego.

Podpis
Moje prace: https://www.youtube.com/c...MuaWGHPp1mhlGnw

-- obecnie
-- obecnie
-- dawniej
-- dawniej
-- dawniej
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-02, 22:17


STOPseba

Emeryt na scenie MTA






Wiek: 25
Na forum: 3771 dni
Posty: 448
Nick w MP: STOPseba

Piwa: 5014

Respekt: 576,3
Respekt: 576,3

Elegancki poradnik osoby zainteresowane na pewno co? z niego wyci?gn? :)

Podpis



Kontakt
Discord: STOPseba#7603
STOPseba na fejsie
Messenger


Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-03, 00:14


Eitho







Wiek: 24
Na forum: 3489 dni
Posty: 330
Nick w MP: Eitho

Piwa: 746

Respekt: 256,5
Respekt: 256,5Respekt: 256,5Respekt: 256,5

A co zrobi?, ?eby poprawnie wy?wietla?o si? na innych proporcjach ekranu (4:3)?

Najpierw robi?em przez zaznaczenie Relative w guieditorze, p??niej przez ten pierwszy wz?r u g?ry, ale i tak na innych proporcjach ni? 16:9 nie wy?wietla si? prawid?owo.

Link do tematu: http://gtao.pl/gui-liczni...la-vt116549.htm

Podpis
good old days :]
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-03, 01:07


_Haze

Peace Yo!






Wiek: 24
Na forum: 4184 dni
Posty: 1648
Nick w MP: Haze

Piwa: 2628

Respekt: 1020
Respekt: 1020

dawid2632, pierwszy spos?b nie dzia?a na fullhd. Relative jest zawsze dobry, chyba ?e dodajesz do niego jak?? warto?? absolutn?, wtedy b?dzie ?le. Skalowanie od?rodkowe dzia?a zawsze w 100 na 100 przypadkach.

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 2 piw(a):
marcin778, Eitho
Wysłany: 2017-12-08, 22:06


Eitho







Wiek: 24
Na forum: 3489 dni
Posty: 330
Nick w MP: Eitho

Piwa: 746

Respekt: 256,5
Respekt: 256,5Respekt: 256,5Respekt: 256,5

A jak ustali? te wsp??rz?dne?
Cytat:

dxDrawRectangle(346/zoom,580/zoom,670/zoom,203/zoom)


Zaznaczy?em absolute w guieditorze, skopiowa?em, wklei?em, doda?em "/zoom", ale wywala grafik? w ca?kiem innym miejscu :/

Podpis
good old days :]
Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-10, 10:16


SylvekHTG







Wiek: 26
Na forum: 3886 dni
Posty: 56
Nick w MP: Sylvek

Piwa: 124

Respekt: 165,8
Respekt: 165,8Respekt: 165,8

Ciekawy poradnik. Mo?na te? doda?, ?e w przypadku w?asnej czcionki skalowanie tekstu nie przyniesie odpowiednich rezultat?w i tekst b?dzie si? rozmazywa?, lepiej wtedy operowa? na samym rozmiarze czcionki.

Postaw piwo autorowi tego posta
 

 
Wysłany: 2017-12-10, 11:34


Brzysiek

Skrypter pralek






Wiek: 27
Na forum: 5198 dni
Posty: 488
Nick w MP: Brzysiek

Piwa: 1034

Respekt: 360
Respekt: 360Respekt: 360Respekt: 360Respekt: 360

Bez urazy, ale jestem zdania, ?e je?li kto? nie ma wiedzy na dany temat to nie powinien pr?bowa? dzieli? si? ni? z innymi. Skalowanie relatywne ju? mas? lat na scenie jest klepane.

Cytat:

Skalowanie od?rodkowe

To nie dzia?a tak, ?e kto? we?mie sobie pozycj? z guieditora, wklepie /zoom i ?miga. Co to jest w og?le za termin xD? Dobrego interfejsu nie zrobi si? w guieditorze. Na scen? ten spos?b wprowadzi? l0nger, nauczy? par? os?b i si? rozesz?o, ale niekt?rzy w og?le nie rozumiej? sensu jak z tego korzysta?.

By cokolwiek skalowa?, najpierw trzeba nauczy? si? pozycjonowa? interfejs.

screenW guiGetScreenSize()
-- lewa strona ekranu 
x koordy -- od lewej do po?owy ekranu 

-- ?rodek ekranu 
x screenW/-- do ?rodkowania element?w

-- od prawej strony ekranu 
x screenW koordy -- od prawej strony ekranu


Za???my, ?e robimy obrazek w prawym g?rnym rogu ekranu.

local widthheight 300200 
local xscreenW-width-100height+100

Uzyskujemy spoko efekt. 100 to dodatkowy odst?p dla estetyczno?ci.
Po co teraz wymy?lono zoom? Na rozdzielczo?ci 800x600 ten obrazek zajmie 1/3 ekranu, a na rozdzielczo?ci 1920x1080 b?dzie ma?y i ustronny.
Kalkulacj? przedstawion? tutaj wymy?li?em rok temu, bo l0nger dopasowywa? zoom r?cznie.
Za?o?enie jest takie, ?e im mniejsza rozdzielczo?? od projektowanej (np. od 1920) tym wi?ksze zmniejszenie obrazka.


SWSH guiGetScreenSize()

local baseX 1920 -- rozdzielczo?? bazowa Xna kt?rej opieramy interfejsPowy?ej tej rozdzielczo?ci interfejs b?dzie zbyt ma?y.
local zoom 1 
local minZoom -- maksymalne zmniejszenie interfejsu (tutajdwukrotne)
if SW baseX then -- je?li rozdzielczo?? mojego ekranu jest mniejsza nibazowastopniowo zwi?kszamy zmniejszenie interfejsu
    zoom math.min(minZoombaseX/SW)
end 


Przewag? takiego sposobu jest to, ?e nie jest zale?ny od formatu obrazu i nie jest skalowany w g?r?, tylko w d??: strata jako?ci jest znacznie mniejsza.
Co otrzymujemy?

local widthheight 300/zoom200/zoom 
local xscreenW-width-100/zoomheight+100/zoom

Interfejs teraz b?dzie stopniowo zmniejsza? si? od rozdzielczo?ci Full HD.
Je?li kto? nadal nie rozumie o co z tym chodzi, niech pozostanie przy skalowaniu relatywnym i zaczeka na rozw?j swojej wiedzy - wtedy zrozumie si? pewne rzeczy :P

Postaw piwo autorowi tego posta
 

 
Więcej szczegółów
Wystawiono 7 piw(a):
Eitho, Qwertick, Byl3mTu, psychol., Emm, Mikołajj, Kacperiusz
Tagi: matematyka :: lua
Anonymous





Na forum: 245 dni
Posty: 1



Anonymous Koniecznie zajrzyj na:






Skocz do:  
Wyświetl posty z ostatnich:   
GTAONLINE.PL » JĘZYKI PROGRAMOWANIA » LUA » Poradniki do LUA Ten temat jest zablokowany bez możliwości zmiany postów lub pisania odpowiedzi

Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Dodaj temat do Ulubionych
Wersja do druku