Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.07.2017, 13:44   #1
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию SDL работа с окнами и текстом

Добрый день. Я читал документацию по SDL и не нашел как решить мои проблемы:
1) Мне нужно чтобы текст был по средине и в два рядка. Но у меня не вышло так сделать
Кусок кода моего:
Код:
SDL_Color textColor = { 255, 255, 255, 255 };
    SDL_Surface* gameSurface = TTF_RenderText_Solid(font, "Game\n" "Press Space to enter", textColor);
    
    SDL_Texture* gameTexture = SDL_CreateTextureFromSurface(renderer, gameSurface);
    SDL_Rect gameRect;
    gameRect.x = window.w/ 2 - gameRect.w / 2;
    gameRect.y = window.h / 2 - gameRect.h / 2;
    SDL_QueryTexture(marioTexture, nullptr, nullptr, &gameRect.w, &gameRect.h);
2) Мне нужно чтобы при нажатии ентер перерисовувалось мое окно. Посоветуйте, где можно про это почитать, я не нашел в документации.
dimaSlon вне форума Ответить с цитированием
Старый 19.07.2017, 14:15   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Можно вот так

PHP код:

SDL_Renderer 
*mRender NULL;

SDL_Color fontColor = { 255255255};
SDL_Texture *fontTexture;
SDL_Rect fontRect;
TTF_Font *font;
char fontBuff[512];

void get_text_and_rect(int32_t xint32_t ychar *textSDL_Rect *rect) {

    
SDL_Surface *surface TTF_RenderText_SolidfonttextfontColor );
    
fontTexture SDL_CreateTextureFromSurfacemRendersurface );

    
SDL_FreeSurface(surface);

    
rect->x;
    
rect->y;
    
rect->= (int32_t)surface->w;
    
rect->= (int32_t)surface->h;

    
SDL_RenderCopymRenderfontTextureNULLrect );

}

// --------------------------------------------------------------------
fontRect.5;
fontRect.= -10;

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

SDL_RenderPresentmRender );


// -------------------------------------------------------------------- 

Оно автоматом будет отрисовывать новыую стркоку под предидущей
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 19.07.2017, 14:23   #3
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Можно вот так

PHP код:

SDL_Renderer 
*mRender NULL;

SDL_Color fontColor = { 255255255};
SDL_Texture *fontTexture;
SDL_Rect fontRect;
TTF_Font *font;
char fontBuff[512];

void get_text_and_rect(int32_t xint32_t ychar *textSDL_Rect *rect) {

    
SDL_Surface *surface TTF_RenderText_SolidfonttextfontColor );
    
fontTexture SDL_CreateTextureFromSurfacemRendersurface );

    
SDL_FreeSurface(surface);

    
rect->x;
    
rect->y;
    
rect->= (int32_t)surface->w;
    
rect->= (int32_t)surface->h;

    
SDL_RenderCopymRenderfontTextureNULLrect );

}

// --------------------------------------------------------------------
fontRect.5;
fontRect.= -10;

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

sprintffontBuff"GROUND: [%d] COLLIDED: [%d]"GROUNDCOLLIDED );
get_text_and_rect(5fontRect.fontRect.hfontBuff, &fontRect );

SDL_RenderPresentmRender );



// -------------------------------------------------------------------- 

Оно автоматом будет отрисовывать новыую стркоку под предидущей
cпасибо, а как это сделать?
2) Мне нужно чтобы при нажатии ентер перерисовувалось мое окно. Посоветуйте, где можно про это почитать, я не нашел в документации.
dimaSlon вне форума Ответить с цитированием
Старый 19.07.2017, 14:24   #4
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

https://wiki.libsdl.org/


Туториалы https://wiki.libsdl.org/Tutorials
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 19.07.2017, 15:55   #5
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
я там не нашел(
dimaSlon вне форума Ответить с цитированием
Старый 19.07.2017, 16:26   #6
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Дак яж написал как вывести текст в 2 или хоть 10 рядов.

тебе осталось просто центрировать по горизонтали.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 19.07.2017, 16:32   #7
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Дак яж написал как вывести текст в 2 или хоть 10 рядов.

тебе осталось просто центрировать по горизонтали.
а нет) я это сделал
Код:
marioRect.x = 640 / 2 - marioRect.w / 2;
	marioRect.y = 480 / 2 - marioRect.h / 2;
я об втором вопросе: Мне нужно чтобы при нажатии ентер перерисовувалось мое окно. Посоветуйте, где можно про это почитать, я не нашел в документации.
dimaSlon вне форума Ответить с цитированием
Старый 19.07.2017, 17:11   #8
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Просто яж не вижу структуру программы.

Но если она имеет примерно классический вид / структуру. С главным циклом.
И при каждой / или не каждой итерации можно вызывать вот такую функциию.

PHP код:
http://programmersforum.ru/editpost.php?do=editpost&p=1691728
void PROCESS_EVENTS() {

    
// ------------------------------------------------------------
    
if ( SDL_PollEvent( &evt ) != ) { 

        
// https://wiki.libsdl.org/SDL_ScancodeAndKeycode?highlight=%28SDLK_UP%29

        
if ( evt.type == SDL_QUIT ) {
            
SDL_Log("SDL_QUIT!");

        } else if ( 
evt.type == SDL_KEYDOWN ) {

            switch ( 
evt.key.keysym.sym ) {
                case 
SDLK_LEFT:  break;
                case 
SDLK_UP:    break;
                case 
SDLK_RIGHT: break;
                case 
SDLK_DOWN:  break;
                case 
SDLK_SPACE: break;
                case 
SDLK_d:     break;

            }

        } else if ( 
evt.type == SDL_KEYUP ) {

            switch ( 
evt.key.keysym.sym ) {
                case 
SDLK_LEFT:   break;
                case 
SDLK_UP:     break;
                case 
SDLK_RIGHT:  break;
                case 
SDLK_DOWN:   break;
                case 
SDLK_SPACE:  break;
            }

        }

    }

    
// ------------------------------------------------------------


<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 19.07.2017, 17:41   #9
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Просто яж не вижу структуру программы.

Но если она имеет примерно классический вид / структуру. С главным циклом.
И при каждой / или не каждой итерации можно вызывать вот такую функциию.

PHP код:
http://programmersforum.ru/editpost.php?do=editpost&p=1691728
void PROCESS_EVENTS() {

    
// ------------------------------------------------------------
    
if ( SDL_PollEvent( &evt ) != ) { 

        
// https://wiki.libsdl.org/SDL_ScancodeAndKeycode?highlight=%28SDLK_UP%29

        
if ( evt.type == SDL_QUIT ) {
            
SDL_Log("SDL_QUIT!");

        } else if ( 
evt.type == SDL_KEYDOWN ) {

            switch ( 
evt.key.keysym.sym ) {
                case 
SDLK_LEFT:  break;
                case 
SDLK_UP:    break;
                case 
SDLK_RIGHT: break;
                case 
SDLK_DOWN:  break;
                case 
SDLK_SPACE: break;
                case 
SDLK_d:     break;

            }

        } else if ( 
evt.type == SDL_KEYUP ) {

            switch ( 
evt.key.keysym.sym ) {
                case 
SDLK_LEFT:   break;
                case 
SDLK_UP:     break;
                case 
SDLK_RIGHT:  break;
                case 
SDLK_DOWN:   break;
                case 
SDLK_SPACE:  break;
            }

        }

    }

    
// ------------------------------------------------------------


часть кода:
Код:
SDL_Event event;
	for (bool runGame = true; runGame; )
	{
		if (SDL_PollEvent(&event))
		{
			switch (event.type)
			{
				case SDL_QUIT:
				{
					runGame = false;
					break;
				}
				case SDL_KEYDOWN:
				{
					break;
				}
				case SDLK_KP_ENTER: 
				{
					SDL_Window* window = SDL_CreateWindow(
						"Mario by Pavlo Naichuk",
						SDL_WINDOWPOS_UNDEFINED,
						SDL_WINDOWPOS_UNDEFINED,
						640,
						480,
						SDL_WINDOW_OPENGL
					);


					if (window == nullptr)
					{
						SDL_Log("Unable to created window: %s", SDL_GetError());
						return 1;
					}

					SDL_Renderer* renderer = SDL_CreateRenderer(window, -1,
						SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);

				}
			}
			
		

		}
но оно не работает
dimaSlon вне форума Ответить с цитированием
Старый 19.07.2017, 17:41   #10
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Весь код:
Код:
#include <SDL.h>
#include <SDL_ttf.h>
#include <conio.h>



int main(int argc, char** argv)
{
	if (SDL_Init(SDL_INIT_VIDEO) != 0)
	{
		SDL_Log("Unable to initialize SDL: %s", SDL_GetError());
		return 1;
	}

	if (TTF_Init() != 0) 
	{
		SDL_Log("Unable to initialize TTF: %s", TTF_GetError());
		return 1;
	}

	SDL_Window* window = SDL_CreateWindow(
		"Mario by Pavlo Naichuk",                  
		SDL_WINDOWPOS_UNDEFINED,           
		SDL_WINDOWPOS_UNDEFINED,          
		640,                               
		480,                               
		SDL_WINDOW_OPENGL                  
	);


	if (window == nullptr) 
	{
		SDL_Log("Unable to created window: %s", SDL_GetError());
		return 1;
	}
	
	SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 
		SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);

	if (renderer == nullptr)
	{
		SDL_Log("Failed to create renderer: %s", SDL_GetError());
		return 1;
	}

	TTF_Font* font = TTF_OpenFont("Resources/Fonts/Arial.TTF", 40);
	if (font == nullptr) 
	{
		SDL_Log("Unable to create font: %s", TTF_GetError());
		return 1;
	}

	SDL_Color textColor = { 255, 255, 255, 255 };
	SDL_Surface* marioSurface = TTF_RenderText_Solid(font, "Mario  Press Space to enter", textColor);
	if (marioSurface == nullptr)
	{
		SDL_Log("Unable to create surface: %s", TTF_GetError());
		return 1;
	}

	SDL_Texture* marioTexture = SDL_CreateTextureFromSurface(renderer, marioSurface);
	if (marioTexture == nullptr)
	{
		SDL_Log("Unable to create texture: %s", TTF_GetError());
		return 1;
	}
	SDL_Rect marioRect;
	SDL_QueryTexture(marioTexture, nullptr, nullptr, &marioRect.w, &marioRect.h);
	marioRect.x = 640 / 2 - marioRect.w / 2;
	marioRect.y = 480 / 2 - marioRect.h / 2;

	SDL_Event event;
	for (bool runGame = true; runGame; )
	{
		if (SDL_PollEvent(&event))
		{
			switch (event.type)
			{
				case SDL_QUIT:
				{
					runGame = false;
					break;
				}
				case SDL_KEYDOWN:
				{
					break;
				}
				case SDLK_KP_ENTER: 
				{
					SDL_Window* window = SDL_CreateWindow(
						"Mario by Pavlo Naichuk",
						SDL_WINDOWPOS_UNDEFINED,
						SDL_WINDOWPOS_UNDEFINED,
						640,
						480,
						SDL_WINDOW_OPENGL
					);


					if (window == nullptr)
					{
						SDL_Log("Unable to created window: %s", SDL_GetError());
						return 1;
					}

					SDL_Renderer* renderer = SDL_CreateRenderer(window, -1,
						SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_TARGETTEXTURE);

				}
			}
			
		

		}

		SDL_SetRenderDrawColor(renderer, 0, 0, 255, 0);
		SDL_RenderClear(renderer);
		SDL_RenderCopy(renderer, marioTexture, nullptr, &marioRect);
		SDL_RenderPresent(renderer);
	}
	if (event.key.keysym.scancode != SDL_GetScancodeFromKey(event.key.keysym.sym))
		SDL_Log("Physical %s key acting as %s key",
			SDL_GetScancodeName(event.key.keysym.scancode),
			SDL_GetKeyName(event.key.keysym.sym));
	
	TTF_CloseFont(font);
	TTF_Quit();

	SDL_FreeSurface(marioSurface);
	SDL_DestroyRenderer(renderer);
	SDL_DestroyWindow(window);
	SDL_Quit();

	return 0;
}
dimaSlon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с чужими окнами D_E_N Win Api 2 28.11.2011 11:48
Работа с окнами Kazik Помощь студентам 4 22.01.2011 16:06
Работа с окнами RuVarez Общие вопросы Delphi 2 01.09.2010 16:14
Работа с окнами Vladya Помощь студентам 5 07.05.2010 21:22
работа с окнами Briz Общие вопросы Delphi 5 07.10.2007 22:20