INESTABLE
- Canvi de comp
This commit is contained in:
@@ -9,6 +9,9 @@
|
||||
#include <string>
|
||||
#include <SDL3/SDL.h>
|
||||
|
||||
#define BASE_WINDOW_WIDTH 360
|
||||
#define BASE_WINDOW_HEIGHT 280
|
||||
|
||||
#define swap(a, b) {auto tmp=a;a=b;b=tmp;}
|
||||
|
||||
#define AUDIO_NONE 0
|
||||
@@ -34,10 +37,6 @@ uint8_t *char_screen = NULL;
|
||||
uint8_t *color_screen = NULL;
|
||||
uint8_t screen_width = 40;
|
||||
uint8_t screen_height = 30;
|
||||
int v_screen_w = 640;
|
||||
int v_screen_h = 480;
|
||||
uint8_t hborder = 40;
|
||||
uint8_t vborder = 40;
|
||||
uint8_t current_color = 0x1e;
|
||||
uint8_t current_border = 0;
|
||||
uint8_t current_mode = 1;
|
||||
@@ -53,6 +52,12 @@ uint8_t cursor_y = 0;
|
||||
SDL_Window *mini_win;
|
||||
SDL_Renderer *mini_ren;
|
||||
SDL_Texture *mini_bak = NULL;
|
||||
uint8_t window_zoom = 2;
|
||||
uint16_t window_width = BASE_WINDOW_WIDTH * 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_vborder = (window_height - screen_height*8*window_zoom) / 2;
|
||||
|
||||
Uint32 *pixels;
|
||||
int pitch;
|
||||
Uint32 counter=0;
|
||||
@@ -78,8 +83,6 @@ const char* get_filename() {
|
||||
void reinit() {
|
||||
if (mini_bak != NULL) SDL_DestroyTexture(mini_bak);
|
||||
counter=0;
|
||||
hborder = vborder = 40;
|
||||
v_screen_w = 640; v_screen_h = 480;
|
||||
switch (current_mode) {
|
||||
case 0:
|
||||
screen_width = 80;
|
||||
@@ -90,8 +93,6 @@ void reinit() {
|
||||
cursor_y = 0;
|
||||
char_screen = &mem[0];
|
||||
color_screen = &mem[1200];
|
||||
//SDL_RenderSetLogicalSize(mini_ren, 640, 480);
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 240);
|
||||
break;
|
||||
case 1:
|
||||
screen_width = 40;
|
||||
@@ -102,8 +103,6 @@ void reinit() {
|
||||
cursor_y = 0;
|
||||
char_screen = &mem[0];
|
||||
color_screen = &mem[1200];
|
||||
//SDL_RenderSetLogicalSize(mini_ren, 320, 240);
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 320, 240);
|
||||
break;
|
||||
case 2:
|
||||
screen_width = 20;
|
||||
@@ -114,14 +113,8 @@ void reinit() {
|
||||
cursor_y = 0;
|
||||
char_screen = &mem[0];
|
||||
color_screen = &mem[300];
|
||||
//SDL_RenderSetLogicalSize(mini_ren, 160, 120);
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 160, 120);
|
||||
break;
|
||||
case 3:
|
||||
hborder = 104;
|
||||
vborder = 88;
|
||||
v_screen_w = 512;
|
||||
v_screen_h = 384;
|
||||
screen_width = 32;
|
||||
screen_height = 24;
|
||||
current_color = 0x07;
|
||||
@@ -130,8 +123,6 @@ void reinit() {
|
||||
cursor_y = 0;
|
||||
char_screen = &mem[0];
|
||||
color_screen = &mem[768];
|
||||
//SDL_RenderSetLogicalSize(mini_ren, 640, 480);
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 256, 192);
|
||||
break;
|
||||
case 4:
|
||||
screen_width = 80;
|
||||
@@ -142,10 +133,14 @@ void reinit() {
|
||||
cursor_y = 0;
|
||||
char_screen = &mem[0];
|
||||
color_screen = &mem[0x1200];
|
||||
//SDL_RenderSetLogicalSize(mini_ren, 640, 480);
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 640, 240);
|
||||
break;
|
||||
}
|
||||
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;
|
||||
|
||||
mini_bak = SDL_CreateTexture(mini_ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, screen_width*8, screen_height*8);
|
||||
SDL_SetTextureScaleMode(mini_bak, SDL_SCALEMODE_NEAREST);
|
||||
}
|
||||
|
||||
@@ -217,6 +212,29 @@ void romcpy() {
|
||||
|
||||
void debug_set_prompt();
|
||||
|
||||
void applyZoom(SDL_Window* win, int zoom, int baseW, int baseH)
|
||||
{
|
||||
// 1. Tamaño actual
|
||||
int oldW, oldH;
|
||||
SDL_GetWindowSize(win, &oldW, &oldH);
|
||||
|
||||
// 2. Posición actual
|
||||
int oldX, oldY;
|
||||
SDL_GetWindowPosition(win, &oldX, &oldY);
|
||||
|
||||
// 3. Nuevo tamaño
|
||||
int newW = baseW * zoom;
|
||||
int newH = baseH * zoom;
|
||||
|
||||
// 4. Calcular nueva posición para mantener el centro
|
||||
int newX = SDL_max(0, oldX - (newW - oldW) / 2);
|
||||
int newY = SDL_max(0, oldY - (newH - oldH) / 2);
|
||||
|
||||
// 5. Aplicar
|
||||
SDL_SetWindowSize(win, newW, newH);
|
||||
SDL_SetWindowPosition(win, newX, newY);
|
||||
}
|
||||
|
||||
int main(int argc,char*argv[]) {
|
||||
bool skip_bios = false;
|
||||
SDL_strlcpy(lua_filename, "game.lua", 9);
|
||||
@@ -230,7 +248,7 @@ int main(int argc,char*argv[]) {
|
||||
//[TODEL]for (int i=0; i<debug_total_size;++i) debug_text[i] = 32;
|
||||
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_EVENTS);
|
||||
mini_win = SDL_CreateWindow(window_title, 640+80, 480+80, 0);
|
||||
mini_win = SDL_CreateWindow(window_title, window_width, window_height, 0);
|
||||
mini_ren = SDL_CreateRenderer(mini_win, NULL);
|
||||
SDL_SetRenderVSync(mini_ren, 1);
|
||||
bool exit = false;
|
||||
@@ -273,7 +291,38 @@ int main(int argc,char*argv[]) {
|
||||
load(dropped_filedir);
|
||||
}
|
||||
if (mini_eve.type == SDL_EVENT_KEY_DOWN) {
|
||||
if ((mini_eve.key.scancode == SDL_SCANCODE_ESCAPE) && (mini_eve.key.mod & SDL_KMOD_LCTRL) ) {
|
||||
if (mini_eve.key.scancode == SDL_SCANCODE_F1) {
|
||||
if (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) {
|
||||
const SDL_DisplayMode *dm = SDL_GetDesktopDisplayMode(SDL_GetPrimaryDisplay());
|
||||
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) {
|
||||
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 = 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) ) {
|
||||
if (lua_is_playing()) {
|
||||
lua_pause();
|
||||
//lua_quit();
|
||||
@@ -305,9 +354,9 @@ int main(int argc,char*argv[]) {
|
||||
keys = SDL_GetKeyboardState(NULL);
|
||||
float mx, my;
|
||||
mouse_buttons = SDL_GetMouseState(&mx, &my);
|
||||
if (mx>=hborder && my>=vborder && mx<(v_screen_w+hborder) && my<(v_screen_h+vborder)) {
|
||||
mouse_x = (mx-hborder) / (v_screen_w/screen_width);
|
||||
mouse_y = (my-vborder) / (v_screen_h/screen_height);
|
||||
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_y = (my-window_vborder) / ((window_height-window_vborder)/screen_height);
|
||||
}
|
||||
|
||||
if (lua_is_playing()) {
|
||||
@@ -382,7 +431,7 @@ int main(int argc,char*argv[]) {
|
||||
SDL_SetRenderDrawColor(mini_ren, (palette[current_border] >> 16)&0xff, (palette[current_border] >> 8)&0xff, palette[current_border]&0xff, 0);
|
||||
//SDL_SetRenderDrawColor(mini_ren, 255, 0, 0, 0);
|
||||
SDL_RenderClear(mini_ren);
|
||||
SDL_FRect rect = {(float)hborder, (float)vborder, (float)v_screen_w, (float)v_screen_h};
|
||||
SDL_FRect rect = {(float)window_hborder, (float)window_vborder, (float)(window_width-window_hborder*2), (float)(window_height-window_vborder*2)};
|
||||
SDL_RenderTexture(mini_ren, mini_bak, NULL, &rect);
|
||||
//SDL_RenderCopy(mini_ren, mini_bak, NULL, NULL);
|
||||
SDL_RenderPresent(mini_ren);
|
||||
|
||||
Reference in New Issue
Block a user