Nie jestem autorem rozwiązania. Jeśli napisałem wątek w złym miejscu to proszę o jego przeniesienie (przepraszam za ewentualny problem). Pomyślałem, że jeśli ktoś będzie chciał znaleźć takie rozwiązanie to ułatwieniem będzie to jak ktoś to napisze po polsku.
Wszystko tak na prawdę znalazłem tutaj:
https://steamcommunity.com/app/220700/d ... 165438369/
Jednakże, żeby wątek nie był zbyt pusty to pomogę tworząc mini tutorial.
Uwaga!! Nie jestem znawcą i nie znam się tak dobrze na skryptach w RPG Makerach.
Przykładowe zastosowanie:
- mniejsze ryzyko wypalenia się pikseli w ekranach plazmowych (wiem że to brzmi jak absurd, ale coś jednak w tym jest)
- czysta estetyka
- bo ktoś tak chce
Pierwszy krok polega na ustawieniu gry w rozdzielczości panoramicznej.
Drugi krok polega na ustawieniu trybu pełnoekranowego, tak aby było dopełnienie do brzegów ekranu (jeśli ktoś ma monitor w proporcjach 4:3 to powinien mieć paski na górze i na dole ekranu).
1. Tworzymy nowy skrypt pod Materials np. o nazwie
RozdzielczoscPanoramiczna (albo ktoś sobie wymyśli ładniejszą nazwę :> ) i wpisujemy ten kod:
Trzeba przy tym mieć jedno na uwadze, a mianowicie to, że nasz ekran tytułowy musi być pod to przygotowany. Ślę wam screena z przykładem złego przystosowania się pod to.
Dlatego przez to, muszę tą grafikę od nowa zrobić w proporcach 16:9
2. Myk, który zrobi nam ładny fullscreen. Polega to na tym, że się na ślepo skopiuje kod ze strony, która jest podana w tej stronie, którą podałem wyżej (chodzi mi o to:
http://forums.rpgmakerweb.com/index.php ... ullscreen/ ). Tam jest link
http://pastebin.com/raw/kc1hzBek z kodem.
Tworzymy nowy skrypt w Materials o nazwie np. FullscreenPlus (lub jak ktoś woli to inną nazwę wpisze) i tam wklejamy kod z tej stronki:
http://pastebin.com/raw/kc1hzBek (Fullscreen++ v2.2 for VX and VXace by Zeus81), ale jak ktoś chce to skopiowałem ten kod tutaj:
Kod: Zaznacz cały
# Fullscreen++ v2.2 for VX and VXace by Zeus81
# Free for non commercial and commercial use
# Licence : http://creativecommons.org/licenses/by-sa/3.0/
# Contact : zeusex81@gmail.com
# (fr) Manuel d'utilisation : http://pastebin.com/raw.php?i=1TQfMnVJ
# (en) User Guide : http://pastebin.com/raw.php?i=EgnWt9ur
$imported ||= {}
$imported[:Zeus_Fullscreen] = __FILE__
class << Graphics
Disable_VX_Fullscreen = false
CreateWindowEx = Win32API.new('user32' , 'CreateWindowEx' , 'ippiiiiiiiii', 'i')
GetClientRect = Win32API.new('user32' , 'GetClientRect' , 'ip' , 'i')
GetDC = Win32API.new('user32' , 'GetDC' , 'i' , 'i')
GetSystemMetrics = Win32API.new('user32' , 'GetSystemMetrics' , 'i' , 'i')
GetWindowRect = Win32API.new('user32' , 'GetWindowRect' , 'ip' , 'i')
FillRect = Win32API.new('user32' , 'FillRect' , 'ipi' , 'i')
FindWindow = Win32API.new('user32' , 'FindWindow' , 'pp' , 'i')
ReleaseDC = Win32API.new('user32' , 'ReleaseDC' , 'ii' , 'i')
SendInput = Win32API.new('user32' , 'SendInput' , 'ipi' , 'i')
SetWindowLong = Win32API.new('user32' , 'SetWindowLong' , 'iii' , 'i')
SetWindowPos = Win32API.new('user32' , 'SetWindowPos' , 'iiiiiii' , 'i')
ShowWindow = Win32API.new('user32' , 'ShowWindow' , 'ii' , 'i')
SystemParametersInfo = Win32API.new('user32' , 'SystemParametersInfo' , 'iipi' , 'i')
UpdateWindow = Win32API.new('user32' , 'UpdateWindow' , 'i' , 'i')
GetPrivateProfileString = Win32API.new('kernel32', 'GetPrivateProfileString' , 'ppppip' , 'i')
WritePrivateProfileString = Win32API.new('kernel32', 'WritePrivateProfileString', 'pppp' , 'i')
CreateSolidBrush = Win32API.new('gdi32' , 'CreateSolidBrush' , 'i' , 'i')
DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i')
unless method_defined?(:zeus_fullscreen_update)
HWND = FindWindow.call('RGSS Player', 0)
BackHWND = CreateWindowEx.call(0x08000008, 'Static', '', 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0)
alias zeus_fullscreen_resize_screen resize_screen
alias zeus_fullscreen_update update
end
private
def initialize_fullscreen_rects
@borders_size ||= borders_size
@fullscreen_rect ||= screen_rect
@workarea_rect ||= workarea_rect
end
def borders_size
GetWindowRect.call(HWND, wrect = [0, 0, 0, 0].pack('l4'))
GetClientRect.call(HWND, crect = [0, 0, 0, 0].pack('l4'))
wrect, crect = wrect.unpack('l4'), crect.unpack('l4')
Rect.new(0, 0, wrect[2]-wrect[0]-crect[2], wrect[3]-wrect[1]-crect[3])
end
def screen_rect
Rect.new(0, 0, GetSystemMetrics.call(0), GetSystemMetrics.call(1))
end
def workarea_rect
SystemParametersInfo.call(0x30, 0, rect = [0, 0, 0, 0].pack('l4'), 0)
rect = rect.unpack('l4')
Rect.new(rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1])
end
def hide_borders() SetWindowLong.call(HWND, -16, 0x14000000) end
def show_borders() SetWindowLong.call(HWND, -16, 0x14CA0000) end
def hide_back() ShowWindow.call(BackHWND, 0) end
def show_back
ShowWindow.call(BackHWND, 3)
UpdateWindow.call(BackHWND)
dc = GetDC.call(BackHWND)
rect = [0, 0, @fullscreen_rect.width, @fullscreen_rect.height].pack('l4')
brush = CreateSolidBrush.call(0)
FillRect.call(dc, rect, brush)
ReleaseDC.call(BackHWND, dc)
DeleteObject.call(brush)
end
def resize_window(w, h)
if @fullscreen
x, y, z = (@fullscreen_rect.width-w)/2, (@fullscreen_rect.height-h)/2, -1
else
w += @borders_size.width
h += @borders_size.height
x = @workarea_rect.x + (@workarea_rect.width - w) / 2
y = @workarea_rect.y + (@workarea_rect.height - h) / 2
z = -2
end
SetWindowPos.call(HWND, z, x, y, w, h, 0)
end
def release_alt
inputs = [1,18,2, 1,164,2, 1,165,2].pack('LSx2Lx16'*3)
SendInput.call(3, inputs, 28)
end
public
def load_fullscreen_settings
buffer = [].pack('x256')
section = 'Fullscreen++'
filename = './Game.ini'
get_option = Proc.new do |key, default_value|
l = GetPrivateProfileString.call(section, key, default_value, buffer, buffer.size, filename)
buffer[0, l]
end
@fullscreen = get_option.call('Fullscreen' , '0') == '1'
@fullscreen_ratio = get_option.call('FullscreenRatio', '0').to_i
@windowed_ratio = get_option.call('WindowedRatio' , '1').to_i
toggle_vx_fullscreen if Disable_VX_Fullscreen and vx_fullscreen?
fullscreen? ? fullscreen_mode : windowed_mode
end
def save_fullscreen_settings
section = 'Fullscreen++'
filename = './Game.ini'
set_option = Proc.new do |key, value|
WritePrivateProfileString.call(section, key, value.to_s, filename)
end
set_option.call('Fullscreen' , @fullscreen ? '1' : '0')
set_option.call('FullscreenRatio', @fullscreen_ratio)
set_option.call('WindowedRatio' , @windowed_ratio)
end
def fullscreen?
@fullscreen or vx_fullscreen?
end
def vx_fullscreen?
rect = screen_rect
rect.width == 640 and rect.height == 480
end
def toggle_fullscreen
fullscreen? ? windowed_mode : fullscreen_mode
end
def toggle_vx_fullscreen
windowed_mode if @fullscreen and !vx_fullscreen?
inputs = [1,18,0, 1,13,0, 1,13,2, 1,18,2].pack('LSx2Lx16'*4)
SendInput.call(4, inputs, 28)
zeus_fullscreen_update
self.ratio += 0 # refresh window size
end
def vx_fullscreen_mode
return if vx_fullscreen?
toggle_vx_fullscreen
end
def fullscreen_mode
return if vx_fullscreen?
initialize_fullscreen_rects
show_back
hide_borders
@fullscreen = true
self.ratio += 0 # refresh window size
end
def windowed_mode
toggle_vx_fullscreen if vx_fullscreen?
initialize_fullscreen_rects
hide_back
show_borders
@fullscreen = false
self.ratio += 0 # refresh window size
end
def toggle_ratio
return if vx_fullscreen?
self.ratio += 1
end
def ratio
return 1 if vx_fullscreen?
@fullscreen ? @fullscreen_ratio : @windowed_ratio
end
def ratio=(r)
return if vx_fullscreen?
initialize_fullscreen_rects
r = 0 if r < 0
if @fullscreen
@fullscreen_ratio = r
w_max, h_max = @fullscreen_rect.width, @fullscreen_rect.height
else
@windowed_ratio = r
w_max = @workarea_rect.width - @borders_size.width
h_max = @workarea_rect.height - @borders_size.height
end
if r == 0
w, h = w_max, w_max * height / width
h, w = h_max, h_max * width / height if h > h_max
else
w, h = width * r, height * r
return self.ratio = 0 if w > w_max or h > h_max
end
resize_window(w, h)
save_fullscreen_settings
end
def update
release_alt if Disable_VX_Fullscreen and Input.trigger?(Input::ALT)
zeus_fullscreen_update
toggle_fullscreen if Input.trigger?(Input::F5)
toggle_ratio if Input.trigger?(Input::F6)
end
def resize_screen(width, height)
zeus_fullscreen_resize_screen(width, height)
self.ratio += 0 # refresh window size
end
end
Graphics.load_fullscreen_settings
Gra na małym ekranie wygląda tak:
Czas na objaśnienie działania skryptu, czyli jak go się używa:
F5 - Pełny ekran / okienko
F6 - Rozciągnięcie / pomniejszenie okienka (działa to tak jak na poniższym screenie w spoilerze)
Alt + Enter działa tak jak wcześniej z tym wyjątkiem że może powodować błędy jak wcześniej da się pełny ekran za pomocą F5.
Po wciśnięciu F5 i późniejszym wciśnięciu F6 gra w trybie pełnoekranowym pomniejsza się, ale nadal zostaje tryb pełnoekranowy. Wygląda to jak granie w okienku z tą różnicą że dookoła jest czarny ekran.
Nie wiem czy to rozwiązanie działa na innych wersjach RM.
Proszę znawców o analizę tego co tutaj napisałem. Jeśli jest lepsze rozwiązanie to chętnie wyedytuję ten post.
To rozwiązanie działa na twierdzowej wersji.
@EDIT
Ogólnie rzecz biorąc to trzeba wszystkie grafiki pod tą rozdzielczość z pierwszego kroku przystosować. Troszkę zabawy z tym jest, ale jak ktoś lubi to życzę miłej zabawy! :)