- [NEW] F1, F2 i F3 per al zoom i fullscreen
- [NEW] [tools/scredit.lua] C per a borrar pantalla en el caracter seleccionar, F per a flood fill
This commit is contained in:
@@ -53,6 +53,7 @@ SDL_Window *mini_win;
|
|||||||
SDL_Renderer *mini_ren;
|
SDL_Renderer *mini_ren;
|
||||||
SDL_Texture *mini_bak = NULL;
|
SDL_Texture *mini_bak = NULL;
|
||||||
uint8_t window_zoom = 2;
|
uint8_t window_zoom = 2;
|
||||||
|
bool window_fullscreen = false;
|
||||||
uint16_t window_width = BASE_WINDOW_WIDTH * window_zoom;
|
uint16_t window_width = BASE_WINDOW_WIDTH * window_zoom;
|
||||||
uint16_t window_height = BASE_WINDOW_HEIGHT * window_zoom;
|
uint16_t window_height = BASE_WINDOW_HEIGHT * window_zoom;
|
||||||
uint16_t window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
uint16_t window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
||||||
@@ -212,27 +213,55 @@ void romcpy() {
|
|||||||
|
|
||||||
void debug_set_prompt();
|
void debug_set_prompt();
|
||||||
|
|
||||||
void applyZoom(SDL_Window* win, int zoom, int baseW, int baseH)
|
void applyZoom(int zoom)
|
||||||
{
|
{
|
||||||
|
if (zoom < 1) return;
|
||||||
|
|
||||||
|
const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay());
|
||||||
|
if ( (BASE_WINDOW_WIDTH*zoom > dm->w) || (BASE_WINDOW_HEIGHT*zoom > dm->h) ) return;
|
||||||
|
|
||||||
|
window_zoom = zoom;
|
||||||
|
|
||||||
// 1. Tamaño actual
|
// 1. Tamaño actual
|
||||||
int oldW, oldH;
|
int oldW, oldH;
|
||||||
SDL_GetWindowSize(win, &oldW, &oldH);
|
SDL_GetWindowSize(mini_win, &oldW, &oldH);
|
||||||
|
|
||||||
// 2. Posición actual
|
// 2. Posición actual
|
||||||
int oldX, oldY;
|
int oldX, oldY;
|
||||||
SDL_GetWindowPosition(win, &oldX, &oldY);
|
SDL_GetWindowPosition(mini_win, &oldX, &oldY);
|
||||||
|
|
||||||
// 3. Nuevo tamaño
|
// 3. Nuevo tamaño
|
||||||
int newW = baseW * zoom;
|
window_width = BASE_WINDOW_WIDTH * window_zoom;
|
||||||
int newH = baseH * zoom;
|
window_height = BASE_WINDOW_HEIGHT * window_zoom;
|
||||||
|
window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
||||||
|
window_vborder = (window_height - screen_height*8*window_zoom) / 2;
|
||||||
|
|
||||||
// 4. Calcular nueva posición para mantener el centro
|
// 4. Calcular nueva posición para mantener el centro
|
||||||
int newX = SDL_max(0, oldX - (newW - oldW) / 2);
|
int newX = SDL_max(0, oldX - (window_width - oldW) / 2);
|
||||||
int newY = SDL_max(0, oldY - (newH - oldH) / 2);
|
int newY = SDL_max(0, oldY - (window_height - oldH) / 2);
|
||||||
|
|
||||||
// 5. Aplicar
|
// 5. Aplicar
|
||||||
SDL_SetWindowSize(win, newW, newH);
|
SDL_SetWindowSize(mini_win, window_width, window_height);
|
||||||
SDL_SetWindowPosition(win, newX, newY);
|
SDL_SetWindowPosition(mini_win, newX, newY);
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyFullScreen() {
|
||||||
|
if (window_fullscreen) {
|
||||||
|
window_fullscreen = false;
|
||||||
|
SDL_SetWindowFullscreen(mini_win, window_fullscreen);
|
||||||
|
applyZoom(window_zoom);
|
||||||
|
} else {
|
||||||
|
window_fullscreen = true;
|
||||||
|
const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay());
|
||||||
|
int max_w_zoom = dm->w / (screen_width*8);
|
||||||
|
int max_h_zoom = dm->h / (screen_height*8);
|
||||||
|
int max_window_zoom = SDL_min(max_w_zoom, max_h_zoom);
|
||||||
|
window_width = dm->w;
|
||||||
|
window_height = dm->h;
|
||||||
|
window_hborder = (window_width - screen_width*8*max_window_zoom) / 2;
|
||||||
|
window_vborder = (window_height - screen_height*8*max_window_zoom) / 2;
|
||||||
|
SDL_SetWindowFullscreen(mini_win, window_fullscreen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc,char*argv[]) {
|
int main(int argc,char*argv[]) {
|
||||||
@@ -292,36 +321,11 @@ int main(int argc,char*argv[]) {
|
|||||||
}
|
}
|
||||||
if (mini_eve.type == SDL_EVENT_KEY_DOWN) {
|
if (mini_eve.type == SDL_EVENT_KEY_DOWN) {
|
||||||
if (mini_eve.key.scancode == SDL_SCANCODE_F1) {
|
if (mini_eve.key.scancode == SDL_SCANCODE_F1) {
|
||||||
if (window_zoom>1) {
|
applyZoom(window_zoom-1);
|
||||||
window_zoom--;
|
|
||||||
window_width = BASE_WINDOW_WIDTH * window_zoom;
|
|
||||||
window_height = BASE_WINDOW_HEIGHT * window_zoom;
|
|
||||||
window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
|
||||||
window_vborder = (window_height - screen_height*8*window_zoom) / 2;
|
|
||||||
|
|
||||||
applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT);
|
|
||||||
}
|
|
||||||
} else if (mini_eve.key.scancode == SDL_SCANCODE_F2) {
|
} else if (mini_eve.key.scancode == SDL_SCANCODE_F2) {
|
||||||
const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay());
|
applyZoom(window_zoom+1);
|
||||||
if ( (BASE_WINDOW_WIDTH*(window_zoom+1) <= dm->w) && (BASE_WINDOW_HEIGHT*(window_zoom+1) <= dm->h) ) {
|
|
||||||
window_zoom++;
|
|
||||||
window_width = BASE_WINDOW_WIDTH * window_zoom;
|
|
||||||
window_height = BASE_WINDOW_HEIGHT * window_zoom;
|
|
||||||
window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
|
||||||
window_vborder = (window_height - screen_height*8*window_zoom) / 2;
|
|
||||||
applyZoom(mini_win, window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT);
|
|
||||||
}
|
|
||||||
} else if (mini_eve.key.scancode == SDL_SCANCODE_F3) {
|
} else if (mini_eve.key.scancode == SDL_SCANCODE_F3) {
|
||||||
const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay());
|
applyFullScreen();
|
||||||
int max_w_zoom = dm->w / (screen_width*8);
|
|
||||||
int max_h_zoom = dm->h / (screen_height*8);
|
|
||||||
int max_window_zoom = SDL_min(max_w_zoom, max_h_zoom);
|
|
||||||
window_width = BASE_WINDOW_WIDTH * max_window_zoom;
|
|
||||||
window_height = BASE_WINDOW_HEIGHT * max_window_zoom;
|
|
||||||
window_hborder = (window_width - screen_width*8*window_zoom) / 2;
|
|
||||||
window_vborder = (window_height - screen_height*8*window_zoom) / 2;
|
|
||||||
applyZoom(mini_win, max_window_zoom, BASE_WINDOW_WIDTH, BASE_WINDOW_HEIGHT);
|
|
||||||
|
|
||||||
} else if ((mini_eve.key.scancode == SDL_SCANCODE_ESCAPE) && (mini_eve.key.mod & SDL_KMOD_LCTRL) ) {
|
} else if ((mini_eve.key.scancode == SDL_SCANCODE_ESCAPE) && (mini_eve.key.mod & SDL_KMOD_LCTRL) ) {
|
||||||
if (lua_is_playing()) {
|
if (lua_is_playing()) {
|
||||||
lua_pause();
|
lua_pause();
|
||||||
@@ -355,8 +359,8 @@ int main(int argc,char*argv[]) {
|
|||||||
float mx, my;
|
float mx, my;
|
||||||
mouse_buttons = SDL_GetMouseState(&mx, &my);
|
mouse_buttons = SDL_GetMouseState(&mx, &my);
|
||||||
if (mx>=window_hborder && my>=window_vborder && mx<(window_width-window_hborder) && my<(window_height-window_vborder)) {
|
if (mx>=window_hborder && my>=window_vborder && mx<(window_width-window_hborder) && my<(window_height-window_vborder)) {
|
||||||
mouse_x = (mx-window_hborder) / ((window_width-window_hborder)/screen_width);
|
mouse_x = (mx-window_hborder) / ((window_width-window_hborder*2)/screen_width);
|
||||||
mouse_y = (my-window_vborder) / ((window_height-window_vborder)/screen_height);
|
mouse_y = (my-window_vborder) / ((window_height-window_vborder*2)/screen_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lua_is_playing()) {
|
if (lua_is_playing()) {
|
||||||
|
|||||||
@@ -437,7 +437,7 @@ const char boot[] =
|
|||||||
"ink(1) print('G A M E',8,16)"
|
"ink(1) print('G A M E',8,16)"
|
||||||
"ink(4) print('S Y S T E M',20,16)"
|
"ink(4) print('S Y S T E M',20,16)"
|
||||||
"ink(7) print('mini',9,8)"
|
"ink(7) print('mini',9,8)"
|
||||||
"ink(8) print('v0.7.8',34,29)"
|
"ink(8) print('v0.7.9',34,29)"
|
||||||
"w=time() "
|
"w=time() "
|
||||||
"end "
|
"end "
|
||||||
"function update()"
|
"function update()"
|
||||||
|
|||||||
@@ -69,6 +69,50 @@ function update_picker()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local W, H = 40, 30
|
||||||
|
|
||||||
|
function flood_fill(x, y)
|
||||||
|
-- índice inicial
|
||||||
|
local idx0 = x + y * W
|
||||||
|
local target_chr = map[idx0]
|
||||||
|
local target_col = col[idx0]
|
||||||
|
|
||||||
|
-- Si ya está pintado con lo que queremos, no hacemos nada
|
||||||
|
if target_chr == sel_chr and target_col == sel_col then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pila para DFS iterativo
|
||||||
|
local stack = {}
|
||||||
|
local sp = 1
|
||||||
|
stack[sp] = {x = x, y = y}
|
||||||
|
|
||||||
|
while sp > 0 do
|
||||||
|
local p = stack[sp]
|
||||||
|
sp = sp - 1
|
||||||
|
|
||||||
|
local px, py = p.x, p.y
|
||||||
|
|
||||||
|
-- Comprobación de límites
|
||||||
|
if px >= 0 and px < W and py >= 0 and py < H then
|
||||||
|
local idx = px + py * W
|
||||||
|
|
||||||
|
-- ¿Coincide con el color original?
|
||||||
|
if map[idx] == target_chr and col[idx] == target_col then
|
||||||
|
-- Pintar
|
||||||
|
map[idx] = sel_chr
|
||||||
|
col[idx] = sel_col
|
||||||
|
|
||||||
|
-- Añadir vecinos
|
||||||
|
sp = sp + 1; stack[sp] = {x = px+1, y = py}
|
||||||
|
sp = sp + 1; stack[sp] = {x = px-1, y = py}
|
||||||
|
sp = sp + 1; stack[sp] = {x = px, y = py+1}
|
||||||
|
sp = sp + 1; stack[sp] = {x = px, y = py-1}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function draw_map()
|
function draw_map()
|
||||||
for i=0,1199 do
|
for i=0,1199 do
|
||||||
poke(i, map[i])
|
poke(i, map[i])
|
||||||
@@ -107,5 +151,14 @@ function draw_map()
|
|||||||
col[i] = peek(1200+i)
|
col[i] = peek(1200+i)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif btn(KEY_C) then
|
||||||
|
for y=0,29 do
|
||||||
|
for x=0,39 do
|
||||||
|
map[x+y*40] = sel_chr
|
||||||
|
col[x+y*40] = sel_col
|
||||||
|
end
|
||||||
|
end
|
||||||
|
elseif btn(KEY_F) then
|
||||||
|
flood_fill(mousex(),mousey())
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user