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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2017, 22:02   #21
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

нужно было писать
Код:
case SDLK_ENTER:
dimaSlon вне форума Ответить с цитированием
Старый 23.07.2017, 12:36   #22
dimaSlon
Форумчанин
 
Регистрация: 24.06.2017
Сообщений: 160
По умолчанию

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Попробуйте

везде поставить

Код:
printf("0\n");
потом

Код:
printf("1\n");
и так далее, что бы понять что вообще отрабатывает а что нет .

Именно при обработке событий.


Вот как-нить, так

Код:
void PROCESS_EVENTS() {

    SDL_Log(" => 0!");
    printf(" => 0\n");
    // ------------------------------------------------------------
    if ( SDL_PollEvent( &evt ) != 0 ) { 

        SDL_Log(" => 1!");
        printf(" => 1\n");

        if ( evt.type == SDL_QUIT ) {
            SDL_Log(" => 2!");
            printf(" => 2\n");

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

            SDL_Log(" => 3!");
            printf(" => 3\n");
            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 ) {

            SDL_Log(" => 4!");
            printf(" => 4\n");
            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 SDL_KEYDOWN:
				{
					switch (event.key.keysym.sym)
					{
						case SDLK_SPACE:
						{
							TTFFontPointer marTextFont(TTF_OpenFont("Resources/Fonts/Arial.TTF", 5), TTF_CloseFont);
							if (marTextFont == nullptr)
							{
								SDL_Log("Unable to create font: %s", TTF_GetError());
								return 1;
							}

							SDL_Color textColor = { 255, 255, 255, 255 };

							SDLSurfacePointer marTextSurface(TTF_RenderText_Solid(marTextFont.get(), "Mario", textColor), SDL_FreeSurface);
							if (marTextSurface == nullptr)
							{
								SDL_Log("Unable to create surface: %s", TTF_GetError());
								return 1;
							}
							SDLTexturePointer marTextTexture(SDL_CreateTextureFromSurface(renderer.get(), marTextSurface.get()), SDL_DestroyTexture);

							if (marTextTexture == nullptr)
							{
								SDL_Log("Unable to create texture: %s", TTF_GetError());
								return 1;
							}
							SDL_Rect marTextRect;
							SDL_QueryTexture(marTextTexture.get(), nullptr, nullptr, &marTextRect.w, &marTextRect.h);
							marTextRect.x = 10;
							marTextRect.y = 10;
						}
					}
					break;
				}
dimaSlon вне форума Ответить с цитированием
Старый 23.07.2017, 14:15   #23
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

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

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
Дак работают события или нет ?
При нажатии на пробел появляется вправа сверху надпись и сразу пропадает, но текст который до этого был так и остается. Поэтому у меня вопрос:
1) как удалить текст который при старте пишется.
2) КАк сделать так чтобы текст после нажатии пробела оставался?
Мой код:
Код:
for (bool runGame = true; runGame; )
	{
		if (SDL_PollEvent(&event))
		{
			switch (event.type)
			{
				case SDL_QUIT:
				{
					runGame = false;
					break;
				}
				case SDL_KEYDOWN:
				{
					switch (event.key.keysym.sym)
					{
						case SDLK_SPACE:
						{
							TTFFontPointer marTextFont(TTF_OpenFont("Resources/Fonts/Arial.TTF", 5), TTF_CloseFont);
							if (marTextFont == nullptr)
							{
								SDL_Log("Unable to create font: %s", TTF_GetError());
								return 1;
							}

							SDL_Color textColor = { 255, 255, 255, 255 };

							SDLSurfacePointer marTextSurface(TTF_RenderText_Solid(marTextFont.get(), "Mario", textColor), SDL_FreeSurface);
							if (marTextSurface == nullptr)
							{
								SDL_Log("Unable to create surface: %s", TTF_GetError());
								return 1;
							}
							SDLTexturePointer marTextTexture(SDL_CreateTextureFromSurface(renderer.get(), marTextSurface.get()), SDL_DestroyTexture);

							if (marTextTexture == nullptr)
							{
								SDL_Log("Unable to create texture: %s", TTF_GetError());
								return 1;
							}
							SDL_Rect marTextRect;
							SDL_QueryTexture(marTextTexture.get(), nullptr, nullptr, &marTextRect.w, &marTextRect.h);
							marTextRect.x = 10;
							marTextRect.y = 10;
							SDL_RenderCopy(renderer.get(), marTextTexture.get(), nullptr, &marTextRect);
						}

					}
					SDL_SetRenderDrawColor(renderer.get(), 0, 0, 255, 0);
					SDL_RenderPresent(renderer.get());
					break;
				}
			}
		}

		SDL_SetRenderDrawColor(renderer.get(), 0, 0, 255, 0);
		SDL_RenderClear(renderer.get());
		SDL_RenderCopy(renderer.get(), marioTextTexture.get(), nullptr, &marioTextRect);
		SDL_RenderCopy(renderer.get(), enterTextTexture.get(), nullptr, &enterTextRect);
		SDL_RenderPresent(renderer.get());
dimaSlon вне форума Ответить с цитированием
Старый 23.07.2017, 17:01   #25
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

каждый раз нужно перерисовывать все что нужно показать на экране.

Воткогда идет речь о FPS, к примеу FPS > 32, это значит что 32 раза в секунду,все стирается и перерисовывается.

Надеюсь так будет более понятно

Код:
#include "platformer.h"
/*

"platformer.h" >>>

#ifndef _PLATFORMER_
#define _PLATFORMER_

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <math.h>
#include <string.h>

#include <SDL.h>
#include <SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_mixer.h>

...

<<<
*/

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

SDL_Event evt;
SDL_Window *window = NULL;
SDL_Renderer *mRender = NULL;
SDL_Surface *tmp_surface = NULL;


long time_s, time_e, time_res;

uint16_t allow_run, FPS;

int main() {

    if ( init_sys() ) allow_run = 1;

    time_res = time_s  = time_e = get_millis();

    // -------------------------------------------
    // Это основной цикл

    while ( allow_run ) {

        // Очищаем
        SDL_RenderClear(mRender);

        // Выставляем главный цвет фона
        SDL_SetRenderDrawColor(mRender, 0, 0, 0, 0);

        // Считываем все события
        PROCESS_EVENTS();

        // Отрисовываем все текстуры,
        SDL_RenderCopy( mRender, mSky_A.tex, NULL, &mSky_A.pos );
        SDL_RenderCopy( mRender, mSky_B.tex, NULL, &mSky_B.pos );

        SDL_RenderCopy( mRender, mGnd_A.tex, NULL, &mGnd_A.pos );
        SDL_RenderCopy( mRender, mGnd_B.tex, NULL, &mGnd_B.pos );

        // Заполняем буфер нужным текстом
        sprintf( fontBuff, "GROUND: [%d] COLLIDED: [%d]", GROUND, COLLIDED );
        // Отрисовываем текст из буфера "fontBuff" ( функцию я уже приводил )
        DRAW_TEXT();

        // https://wiki.libsdl.org/SDL_RenderPresent
        // Показываем / Отрисовываем все что есть
        SDL_RenderPresent( mRender );

        // Контроль FPS ( ограничитель )
        time_res = get_millis() - time_s;
        if ( time_res < FPS ) {
            SDL_Delay( FPS - time_res );

        }

    }

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

}

int32_t init_sys() {

    //SDL_SysWMinfo sysWMinfo;

    // /usr/share/fonts/truetype/freefont/...
    // FreeMonoBoldOblique.ttf ,FreeMonoBold.ttf ,FreeMonoOblique.ttf ,FreeMono.ttf ,FreeSansBoldOblique.ttf ,FreeSansBold.ttf ,FreeSansOblique.ttf ,FreeSans.ttf ,FreeSerifBoldItalic.ttf ,FreeSerifBold.ttf ,FreeSerifItalic.ttf ,FreeSerif.ttf

    TTF_Init();
    font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeMono.ttf", 18);

    if (font == NULL) {
        printf("Could not create font: %s\n", SDL_GetError());
        return 0;
    }

    if ( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) { // SDL_Init(SDL_INIT_VIDEO);
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        return 0;
    }

    window = SDL_CreateWindow( "An SDL2 window", W_ML, W_MT, W_W, W_H, SDL_WINDOW_RESIZABLE);

    if (window == NULL) {
        printf("Could not create window: %s\n", SDL_GetError());
        return 0;
    }

    /* surface = SDL_GetWindowSurface( window );
    if (surface == NULL) {
        printf("Could not create surface: %s\n", SDL_GetError());
        return 0;
    } */

    mRender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if ( mRender == NULL ) {
        printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
        return 0;

    }

    SDL_SetRenderDrawColor(mRender, 0, 0, 0, 255);
    return 1;

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

Цитата:
Сообщение от pompiduskus Посмотреть сообщение
каждый раз нужно перерисовывать все что нужно показать на экране.

Воткогда идет речь о FPS, к примеу FPS > 32, это значит что 32 раза в секунду,все стирается и перерисовывается.

Надеюсь так будет более понятно

Код:
#include "platformer.h"
/*

"platformer.h" >>>

#ifndef _PLATFORMER_
#define _PLATFORMER_

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <math.h>
#include <string.h>

#include <SDL.h>
#include <SDL_image.h>
#include <SDL2/SDL_ttf.h>
#include <SDL2/SDL_mixer.h>

...

<<<
*/

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

SDL_Event evt;
SDL_Window *window = NULL;
SDL_Renderer *mRender = NULL;
SDL_Surface *tmp_surface = NULL;


long time_s, time_e, time_res;

uint16_t allow_run, FPS;

int main() {

    if ( init_sys() ) allow_run = 1;

    time_res = time_s  = time_e = get_millis();

    // -------------------------------------------
    // Это основной цикл

    while ( allow_run ) {

        // Очищаем
        SDL_RenderClear(mRender);

        // Выставляем главный цвет фона
        SDL_SetRenderDrawColor(mRender, 0, 0, 0, 0);

        // Считываем все события
        PROCESS_EVENTS();

        // Отрисовываем все текстуры,
        SDL_RenderCopy( mRender, mSky_A.tex, NULL, &mSky_A.pos );
        SDL_RenderCopy( mRender, mSky_B.tex, NULL, &mSky_B.pos );

        SDL_RenderCopy( mRender, mGnd_A.tex, NULL, &mGnd_A.pos );
        SDL_RenderCopy( mRender, mGnd_B.tex, NULL, &mGnd_B.pos );

        // Заполняем буфер нужным текстом
        sprintf( fontBuff, "GROUND: [%d] COLLIDED: [%d]", GROUND, COLLIDED );
        // Отрисовываем текст из буфера "fontBuff" ( функцию я уже приводил )
        DRAW_TEXT();

        // https://wiki.libsdl.org/SDL_RenderPresent
        // Показываем / Отрисовываем все что есть
        SDL_RenderPresent( mRender );

        // Контроль FPS ( ограничитель )
        time_res = get_millis() - time_s;
        if ( time_res < FPS ) {
            SDL_Delay( FPS - time_res );

        }

    }

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

}

int32_t init_sys() {

    //SDL_SysWMinfo sysWMinfo;

    // /usr/share/fonts/truetype/freefont/...
    // FreeMonoBoldOblique.ttf ,FreeMonoBold.ttf ,FreeMonoOblique.ttf ,FreeMono.ttf ,FreeSansBoldOblique.ttf ,FreeSansBold.ttf ,FreeSansOblique.ttf ,FreeSans.ttf ,FreeSerifBoldItalic.ttf ,FreeSerifBold.ttf ,FreeSerifItalic.ttf ,FreeSerif.ttf

    TTF_Init();
    font = TTF_OpenFont("/usr/share/fonts/truetype/freefont/FreeMono.ttf", 18);

    if (font == NULL) {
        printf("Could not create font: %s\n", SDL_GetError());
        return 0;
    }

    if ( SDL_Init( SDL_INIT_EVERYTHING ) < 0 ) { // SDL_Init(SDL_INIT_VIDEO);
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        return 0;
    }

    window = SDL_CreateWindow( "An SDL2 window", W_ML, W_MT, W_W, W_H, SDL_WINDOW_RESIZABLE);

    if (window == NULL) {
        printf("Could not create window: %s\n", SDL_GetError());
        return 0;
    }

    /* surface = SDL_GetWindowSurface( window );
    if (surface == NULL) {
        printf("Could not create surface: %s\n", SDL_GetError());
        return 0;
    } */

    mRender = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    if ( mRender == NULL ) {
        printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
        return 0;

    }

    SDL_SetRenderDrawColor(mRender, 0, 0, 0, 255);
    return 1;

}
я же тоже дулаю
Код:
SDL_RenderCopy(renderer.get(), marTextTexture.get(), nullptr, &marTextRect);
но я так понял не там где нужно, но я создаю значения и когда я рендерсопи делаю за case оно пишет что не найдено значения.
я думаю так нужно, но как я уже говорил переменые неизвестные((
Код:
switch (event.key.keysym.sym)
					{
						case SDLK_SPACE:
						{
							----------------------код
							
						}
					}
					SDL_SetRenderDrawColor(renderer.get(), 0, 0, 255, 0);
					SDL_RenderClear(renderer.get());
					SDL_RenderCopy(renderer.get(), marTextTexture.get(), nullptr, &marTextRect);
					SDL_RenderCopy(renderer.get(), scoreTextTexture.get(), nullptr, &scoreTextRect);
					SDL_RenderCopy(renderer.get(), timeTextTexture.get(), nullptr, &timeTextRect);
					SDL_RenderCopy(renderer.get(), remainingTextTexture.get(), nullptr, &remainingTextRect);
					SDL_RenderPresent(renderer.get());
					
				}

Последний раз редактировалось dimaSlon; 23.07.2017 в 17:58.
dimaSlon вне форума Ответить с цитированием
Старый 23.07.2017, 23:23   #27
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Возьми готовый пример каконить. Убедись что он у тебя компилится, запускается и отрбатывает как ожидается.

А дальше изменяй, смотри.
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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