На данный момент я обрабатывать камеры так: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);
}
Панорамные камеры обычно выполняются наоборот: объекты сохраняют свои реальные позиции в мировом пространстве и только при визуальном отображении смещения от камеры. – Quentin
эй, да, это имеет смысл. Теперь мой вопрос: как я справляюсь с этим? Возникли проблемы с отображением только положения кулачка. У вас есть идея в SDL? Если вы можете помочь, я могу дать вам больше кода, тогда вы увидите, может быть, wath я имею в виду: P – ivorysmoker
Функции рисования IIRC SDL не предназначены для интеграции камеры: они работают только на экране. Что вы можете сделать, это обернуть их внутри ваших собственных функций отображения, каждый из которых вызовет исходную функцию SDL, смещая координаты с глобальной позиции камеры. – Quentin