2016-08-08 6 views
0

Im Moment ich mit der Kamera wie folgt aus:SDL/C++ Kamera andere Wege?

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); 
     } 

Also, wenn der Spieler mehr als 400 - „Der Spieler Size“ dann Kamera zu aktivieren. Wenn die Kamera aktiv ist, bewegt sich der Spieler nicht. Jedes Spielobjekt wie Rekruten oder gegnerische Einheiten wurde in eine neue Position verschoben.

Durch Verschiebung aller anderen Elemente erzeugt eine Bewegung Illusion.

Vielleicht mehr Weg dies zu tun oder ist das der Weg für 2d Spiele gehen?

Danke für jede Antwort!

Funktion Render:

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

Schwenken Kameras sind in der Regel umgekehrt: Objekte behalten ihre realen Welt-Raum-Positionen, und nur bei der Anzeige der Offset von der Kamera wird visuell angewendet. – Quentin

+0

Hey, ja, das macht mehr Sinn. Jetzt ist meine Frage, wie ich damit umgehe? Probleme beim Rendern nur der Nockenposition. Hast du irgendeine Idee in SDL? Wenn du helfen kannst, kann ich dir mehr Code geben, dann siehst du vielleicht, was ich meine: P – ivorysmoker

+0

IIRC SDLs Zeichenfunktionen sind nicht dafür gedacht, eine Kamera zu integrieren: sie arbeiten nur im Bildschirm. Sie können sie in Ihre eigenen Anzeigefunktionen einfügen, die jeweils die ursprüngliche SDL-Funktion aufrufen, während die Koordinaten von einer globalen Kameraposition verschoben werden. – Quentin

Antwort

0

ich diese gefunden haben:

SDL_RenderSetViewport(renderer, &cam); 

i mit, dass denke ich kann die Kamera tun :) Ohne alle Objekte zu bewegen.

+0

Das ist zum Zeichnen * zu * einem Teil des Bildschirms, nicht * von * einem Teil der Welt. – Quentin

+0

verdammt ja, jetzt sehe ich es :( – ivorysmoker