2016-08-08 3 views
0

На данный момент я обрабатывать камеры так:SDL/C++ камера готовится?

if (window.rightArrow) { 
      //player.addXPosition(PLAYER_SPEED); 
      if (player.getPosition().x > 400 - 50/2 && !cam.active) 
      { 
       cam.active = true; 
      } 
      if (cam.active && !blockedLeft) 
      { 
       rect.updateCameraLeft(PLAYER_SPEED); 
       enemyGrp.updateCameraLeft(PLAYER_SPEED); 
      } 
      else 
      { 
       player.addXPosition(PLAYER_SPEED); 
      } 

      //rect.updateCameraLeft(PLAYER_SPEED); 
     } 
     else if (window.leftArrow) 
     { 
      if(cam.active && !blockedRight) 
      { 
       rect.updateCameraRight(PLAYER_SPEED); 
       enemyGrp.updateCameraRight(PLAYER_SPEED); 
      } 
      else 
      { 
       player.subXPosition(PLAYER_SPEED); 
      } 

     //player.subXPosition(PLAYER_SPEED); 
      //rect.updateCameraRight(PLAYER_SPEED); 
     } 

Таким образом, если игрок больше 400 - «Игрок Размер», а затем включите камеру. Если камера активна, игрок dosnt перемещается. Каждый игровой объект вроде rects или enemygrp переместился в новую позицию.

Смещение всех остальных элементов привело к иллюзии перемещения.

Возможно, это лучший способ сделать это или это способ пойти на 2d игры?

Спасибо за любой ответ!

Рендер функции:

void Window::update(SDL_Rect* rects, int rectsSize, SDL_RectsConfig* config, SDL_Rect* pPositon, SDL_Rect* destPositon, SDL_Rect* weapons, int weaponSize, SDL_Rect* destWeapons, int destSize, SDL_Rect* enemys, SDL_Rect* destEnemys, int enemysSize) 
     { 
      SDL_SetRenderTarget(renderer, texture); 
      SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0x00); 

      SDL_RenderClear(renderer); 

      SDL_RenderCopy(renderer, background, NULL, NULL); 

      for (int i = 0; i < rectsSize; i++) 
      { 
       if (config[i].r != NULL && config[i].g != NULL && config[i].b != NULL) 
       { 
        SDL_RenderDrawRect(renderer, &rects[i]); 
        SDL_SetRenderDrawColor(renderer, config[i].r, config[i].g, config[i].b, config[i].a); 
        SDL_RenderFillRect(renderer, &rects[i]); 
       } 
       if (config[i].image != NULL && config[i].font == NULL) 
       { 
        SDL_RenderCopy(renderer, config[i].image, NULL, &rects[i]); 
       } 
       else if (config[i].image == NULL && config[i].font != NULL) 
       { 
        s << config[i].text; 
        surfaceMessage = TTF_RenderText_Solid(config[i].font, s.str().c_str(), {0, 0, 0}); // as TTF_RenderText_Solid could only be used on SDL_Surface then you have to create the surface first 
        if (surfaceMessage == NULL) 
        { 
         printf("Unable to render text surface! SDL_ttf Error: %s\n", TTF_GetError()); 
        } 
        Message = SDL_CreateTextureFromSurface(renderer, surfaceMessage); 

        SDL_RenderCopy(renderer, Message, NULL, &rects[i]); 
        SDL_FreeSurface(surfaceMessage); 
        SDL_DestroyTexture(Message); 
        s.str(""); 
        s.clear(); 
       } 
      } 

      /*SDL_RenderDrawRects(renderer, rects, rectsSize); 
      SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); 
      SDL_RenderFillRects(renderer, rects, rectsSize);*/ 

      //example render in picture in rects (this is clickeble) 
      if (weaponSize == destSize) { 
       for (int i = 0; i < weaponSize; i++) 
       { 
        SDL_RenderCopy(renderer, weaponSheet, &destWeapons[i], &weapons[i]); 
       } 
      }else 
      { 
       std::cout << "Error: the sizes from weaponSize and desSize need to be the same." << std::endl; 
      } 

      //SDL_RenderCopy(renderer, imgs, NULL, &rects[0]); 
      if (leftArrow || lastPressed == "SDLK_LEFT") { 
       SDL_RenderCopyEx(renderer, playerSheet, destPositon, pPositon, NULL, NULL, SDL_FLIP_HORIZONTAL); 
       SDL_RenderDrawRect(renderer, pPositon); 
      } 
      else { 
       SDL_RenderCopy(renderer, playerSheet, destPositon, pPositon); 
       SDL_RenderDrawRect(renderer, pPositon); 
      } 

      for (int i = 0; i < enemysSize; i++) 
      { 
       SDL_RenderCopy(renderer, enemySheet, &destEnemys[i], &enemys[i]); 
      } 
      //Render value 

      //Render Background 
      //SDL_RenderCopy(renderer, background, {}, &enemys[i]); 

      SDL_SetRenderTarget(renderer, NULL); 

      SDL_RenderCopy(renderer, texture, NULL, NULL); 
      SDL_RenderPresent(renderer); 
     } 
+0

Панорамные камеры обычно выполняются наоборот: объекты сохраняют свои реальные позиции в мировом пространстве и только при визуальном отображении смещения от камеры. – Quentin

+0

эй, да, это имеет смысл. Теперь мой вопрос: как я справляюсь с этим? Возникли проблемы с отображением только положения кулачка. У вас есть идея в SDL? Если вы можете помочь, я могу дать вам больше кода, тогда вы увидите, может быть, wath я имею в виду: P – ivorysmoker

+0

Функции рисования IIRC SDL не предназначены для интеграции камеры: они работают только на экране. Что вы можете сделать, это обернуть их внутри ваших собственных функций отображения, каждый из которых вызовет исходную функцию SDL, смещая координаты с глобальной позиции камеры. – Quentin

ответ

0

Я нашел это:

SDL_RenderSetViewport(renderer, &cam); 

я думаю, с этим я могу сделать камеру :) Без перемещения всех объектов.

+0

То есть для рисования * на * части экрана, а не * от * части мира. – Quentin

+0

черт возьми, теперь я вижу :( – ivorysmoker