Beispiel #1
0
    /**
     * Create a CoreEngine. The default window settings are 60 FPS,
     * windowed mode with dimensions 640x480. A CoreEngine instance is
     * passive insofar as enforcing these settings - it is a
     * placeholder for the information. It is the job of an
     * intermediate os layer to query these settings and apply them,
     * or update them with correct values if the default ones are
     * incorrect.
     */
    CoreEngine::CoreEngine(){
      for (int i = 0; i < ENGINE_MAX_EVENT_TYPES; i += 1){
	events[i].reserve(ENGINE_INIT_EVENTS_STACK);
      }
		
		
      // Window Properties
      setWindowDimensions(640, 480);
      setWindowFullscreen(0);
      setClearBuffer(1);
      setWindowFps(60);
		    
      // Initialize member pointers
      camera = NULL;
      view = NULL;

      // Initialize Fps members
      last_render_time = elapsed_time_in_milliseconds();
      frame_count = 0;
    }
Beispiel #2
0
void getGameScreenDimensions(HWND game, HWND overlay, screen_dimensions_t *dimensions)
{
    RECT clientRect;
    POINT clientTopLeft = { .x = 0, .y = 0 };
    GetClientRect(game, &clientRect);
    ClientToScreen(game, &clientTopLeft);
    int newLeftX = (int)clientTopLeft.x;
    int newTopY = (int)clientTopLeft.y;
    int newWidth = (int)clientRect.right;
    int newHeight = (int)clientRect.bottom;
    int newXOffset = 0, newYOffset = 0;

    // has the game window position and/or size changed since we last checked?
    bool changedPosition, changedSize, enlarged;
    changedPosition = (dimensions->leftX != newLeftX || dimensions->topY != newTopY);
    changedSize = (dimensions->width != newWidth || dimensions->height != newHeight);
    enlarged = (changedSize && (newWidth > dimensions->width || newHeight > dimensions->height));

    if (!changedPosition && !changedSize) {
        return;
    }
    dimensions->leftX = newLeftX;
    dimensions->topY = newTopY;

    dimensions->width = newWidth;
    dimensions->height = newHeight;
    double dblWidth = (double)newWidth;
    double dblHeight = (double)newHeight;
    dimensions->aspect = dblWidth / dblHeight;

    switch (dimensions->aspectMode)
    {
    case AM_FIXED:
    case AM_STRETCH:
        dimensions->xScale = dblWidth / dimensions->basicWidthAsDouble;
        dimensions->yScale = dblHeight / dimensions->basicHeightAsDouble;
        dimensions->leftOffset = 0;
        dimensions->topOffset = 0;
        break;
    case AM_PILLARBOX:
        newXOffset = setScreenOffsetsPillarboxed(dimensions, dblWidth, dblHeight);
        break;
    case AM_LETTERBOX:
        newYOffset = setScreenOffsetsLetterboxed(dimensions, dblWidth, dblHeight);
        break;
    case AM_WINDOW_FRAME:
        if (dimensions->aspect < dimensions->basicAspect)
        {
            newYOffset = setScreenOffsetsLetterboxed(dimensions, dblWidth, dblHeight);
        }
        else
        {
            newXOffset = setScreenOffsetsPillarboxed(dimensions, dblWidth, dblHeight);
        }
        break;
    default:
        printf("Encountered invalid aspect mode.");
        exit(EXIT_FAILURE);
    }

    if (!enlarged)
    {
        RECT fullscreenRect = { .right = (LONG)screenWidth, .bottom = (LONG)screenHeight };
        IDirect3DDevice9_SetScissorRect(d3dDevice, &fullscreenRect);
        IDirect3DDevice9_Clear(d3dDevice, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 0, 0), 1.0f, 0);
    }
    setWindowDimensions(dimensions, newXOffset, newYOffset);
    MoveWindow(overlay,
               newLeftX + newXOffset, newTopY + newYOffset,
               (int)screenWidth, (int)screenHeight,
               true);
}