#include #include #include "pocketpy.h" #include "raylib.h" using namespace std; const int virtualScreenWidth = 360; const int virtualScreenHeight = 203; const int initialScale = 3; int startupScreenWidth = virtualScreenWidth * initialScale; int startupScreenHeight = virtualScreenHeight * initialScale; int screenWidth = startupScreenWidth; int screenHeight = startupScreenHeight; Rectangle virtualScreenBounds; Vector2 origin; Color ColorFromHex(int hexValue) { // Extract red, green, blue, and alpha components from the hexadecimal value int r = (hexValue >> 16) & 0xFF; int g = (hexValue >> 8) & 0xFF; int b = hexValue & 0xFF; // Normalize the color components to the range [0, 1] float rf = static_cast(r) / 255.0f; float gf = static_cast(g) / 255.0f; float bf = static_cast(b) / 255.0f; // Create and return the color return ColorFromNormalized({ rf, gf, bf, 1.0f }); // Alpha is set to 1.0 (fully opaque) } void calculateBounds() { float ar = (float)virtualScreenWidth / (float)virtualScreenHeight; float nar = (float)screenWidth / (float)screenHeight; if(nar > ar) { virtualScreenBounds.height = screenHeight; virtualScreenBounds.width = virtualScreenBounds.height * ar; origin.x = -(screenWidth / 2.0f - (virtualScreenBounds.width / 2.0f)); origin.y = 0; }else { virtualScreenBounds.width = screenWidth; virtualScreenBounds.height = virtualScreenBounds.width / ar; origin.x = 0; origin.y = -(screenHeight / 2.0f - (virtualScreenBounds.height / 2.0f)); } } int mouseX(){ int x = GetMouseX(); float adjX = x + origin.x; return adjX / virtualScreenBounds.width * virtualScreenWidth; } int mouseY(){ int y = GetMouseY(); float adjY = y + origin.y; return adjY / virtualScreenBounds.height * virtualScreenHeight; } int main() { SetTraceLogLevel(LOG_ERROR); bool flip = false; SetConfigFlags(FLAG_WINDOW_RESIZABLE); InitWindow(startupScreenWidth, startupScreenHeight, "test"); SetTargetFPS(60); RenderTexture2D virtualScreen = LoadRenderTexture(virtualScreenWidth, virtualScreenHeight); Rectangle sourceRec = { 0.0f, 0.0f, (float)virtualScreen.texture.width, -(float)virtualScreen.texture.height }; calculateBounds(); pkpy::VM* vm = new pkpy::VM(); Texture2D logo = LoadTexture("resources/img.png"); Texture2D mouse = LoadTexture("resources/mouse.png"); // Load palette vector palette; ifstream paletteFile("resources/palette2.hex"); string line; if(paletteFile.is_open()){ while(getline(paletteFile, line)){ palette.push_back(ColorFromHex(stoi(line, nullptr, 16))); } paletteFile.close(); } try { pkpy::CodeObject_ code = vm->compile("return 'test'", "main.py", pkpy::EXEC_MODE, false); pkpy::PyObject* obj = vm->_exec(code, vm->_main); pkpy::Str& str = pkpy::py_cast(vm, obj); }catch (pkpy::Exception e) { } HideCursor(); while(!WindowShouldClose()) { if (IsWindowResized() && !IsWindowFullscreen()) { screenWidth = GetScreenWidth(); screenHeight = GetScreenHeight(); calculateBounds(); } if (IsKeyPressed(KEY_F)) { if(IsWindowFullscreen()){ ToggleFullscreen(); SetWindowSize(startupScreenWidth, startupScreenHeight); screenWidth = startupScreenWidth; screenHeight = startupScreenHeight; }else{ int monitor = GetCurrentMonitor(); SetWindowSize(GetMonitorWidth(monitor), GetMonitorHeight(monitor)); screenWidth = GetMonitorWidth(monitor); screenHeight = GetMonitorHeight(monitor); ToggleFullscreen(); } calculateBounds(); }else if(IsKeyPressed(KEY_I)){ flip = !flip; } BeginTextureMode(virtualScreen); ClearBackground(palette[1]); DrawText(("Hello World " + to_string(GetFPS()) + " FPS").c_str(), 5, 5, 5, RAYWHITE); DrawTexture(logo, 80 + cos(GetTime()) * (virtualScreenHeight / 4), (virtualScreenHeight / 2) + sin(GetTime()) * (virtualScreenHeight / 4) - 29, WHITE); DrawLineBezier((Vector2){80, 20}, (Vector2){virtualScreenWidth - 5, virtualScreenHeight - 5}, 1, GREEN); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 15, palette[31]); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 13, palette[28]); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 11, palette[16]); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 9, palette[15]); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 7, palette[51]); DrawCircle(virtualScreenWidth / 2, virtualScreenHeight / 2, 5, palette[47]); DrawRectangle(3, 19, 33, 33, BLACK); for (int i = 0; i < 8; ++i) { for (int j = 0; j < 8; ++j) { DrawRectangle(4 + i * 4, 20 + j * 4, 3, 3, palette[i + j * 8]); } } DrawTexture(mouse, mouseX(), mouseY(), WHITE); DrawText(to_string(mouseX()).c_str(), 2, 70, 5, palette[37]); DrawText(to_string(mouseY()).c_str(), 2, 78, 5, palette[27]); EndTextureMode(); if(flip){ // Get texture data Image img = LoadImageFromTexture(virtualScreen.texture); Color* pixels = LoadImageColors(img); // Modify pixel data for (int y = 0; y < img.height; y++) { for (int x = 0; x < img.width; x++) { // Example: Invert colors Color pixel = pixels[y * img.width + x]; pixels[y * img.width + x] = { (unsigned char)(255 - pixel.g), (unsigned char)(255 - pixel.r), (unsigned char)(255 - pixel.b), pixel.a }; } } // Update texture with modified data UpdateTexture(virtualScreen.texture, pixels); } BeginDrawing(); ClearBackground(BLACK); DrawTexturePro(virtualScreen.texture, sourceRec, virtualScreenBounds, origin, 0.0f, WHITE); EndDrawing(); } CloseWindow(); delete vm; return 0; }