Ponto V!

Home OpenGL Criando uma janela SDL
Vinícius Godoy de Mendonça
Criando uma janela SDLImprimir
Escrito por Vinícius Godoy de Mendonça

Antes de entrarmos no código usando a SDL, vamos entender um pouco de seus conceitos. A SDL (Simple Directmedia Layer) é uma biblioteca multiplataforma criada para facilitar a construção de aplicações envolvendo multimídia. A biblioteca é formada de diversos subsistemas, que fornecem serviços para manipulação de vídeo, imagens, eventos, temporização, threads e sockets. Nesse artigo, vamos ver como criar uma janela, onde nosso jogo irá rodar.

Subsistemas da SDL

Antes de irmos para o código da janela, vamos detalhar cada um dos subsistemas oferecidos pela SDL:

  • Inicialização e finalização: É normal que questionemos o sistema operacional a respeito dos recursos que temos disponíveis para nossos jogos. A SDL simplifica esse processo ao fornecer uma rotina chamada SDL_Init, capaz de inicializar cada módulo específico a ser utilizado. Ela mesmo pergunta ao sistema operacional se os recursos necessários estão ou não disponíveis e nos retorna um código de erro simples de ser tratado;
  • Manipulação do vídeo: A SDL permite que trabalhemos numa janela pixel-a-pixel ou utilizando OpenGL. Este blog trabalhará com a segunda opção. Ela fornece uma maneira fácil e multiplataforma de criarmos a janela do jogo, ou iniciarmos o modo fullscreen. Também facilita a integração com o hardware;
  • Manipulação de imagens: A SDL fornece mecanismos para carregar imagens e manipula-las pixel-a-pixel. O formato suportado nativamente é o .bmp, mas com a biblioteca SDL_Image também podemos carregar a maior parte dos formatos padrão, incluindo .jpg, .gif e .png, com ou sem canal alpha;
  • Mecanismo de eventos: A SDL fornece um mecanismo de eventos simples para tratar diversas formas de entrada do usuário: isso inclui: eventos na janela, ou movimentação com mouse, teclado e joystick;
  • Efeitos sonoros: Um de seus subsistemas fornece módulos para trabalhar com sons nos formados .mid, .mod e .wav. Adicionalmente a SDL_Mixer ainda suporta diversos outros formatos, incluindo .mp3 e .ogg;
  • Temporização: A temporização é essencial em qualquer aplicação multimídia. Com ela conseguimos criar jogos que rodem na mesma velocidade, seja em computadores lentos ou mais rápidos.
  • Acesso a redes: A SDL permite a inicialização e o uso de sockets de maneira simples, facilitando a criação de jogos em rede através do pacote adicional SDL_Net;
  • Multi-threading: Permite disparar múltiplas linhas de execução e criar blocos de sincronização de maneira multiplataforma.

O main

Para construir uma aplicação de janelas é necessário criar um bloco main dependente do ambiente escolhido. No caso do windows, criaríamos o WinMain da seguinte forma:

int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE  hinstPrev, LPSTR lpCmdLine, int nCmdShow)
Usando a SDL não precisamos nos preocupar com isso. Ela é quem toma conta de fazer as chamadas específicas. Então, para nós, resta apenas a tarefa de declarar um main padrão, com o seguinte formato:
int main(int argc, char* argv[])

Embora o C++ forneça outras alternativas para a assinatura do main, essa forma é obrigatória para se usar a SDL. Se você realmente precisar usar o WinMain, consulte o arquivo /src/main/win32/SDL_main.c para ver como a SDL deve ser inicializada. Isso é um tema avançado e, para os exemplos desse portal, isso não será necessário.

Inicialização e finalização

Cada módulo da SDL deve ser inicializado com o comando SDL_Init antes que possa ser utilizado. O comando recebe um argumento inteiro, que é composto utilizando o operador OU binário | com as seguintes flags:

  • SDL_INIT_VIDEO: Inicializa o subsistema de vídeo;
  • SDL_INIT_TIMER: Inicializa o subsistema de temporização;
  • SDL_INIT_AUDIO: Inicializa o subsistema de som;
  • SDL_INIT_JOYSTICK: Inicializa o subsistema de joystick;
  • SDL_INIT_CDROM: Inicializa o subsistema de cdrom;

A sdl ainda possui os seguintes flags especiais:

  • SDL_INIT_EVERYTHING: Uma maneira rápida de inicializar todos os subsistemas acima.
  • SDL_INIT_NOPARACHUTE: A inicialização “sem paraquedas” faz com que a SDL ignore todas as mensagens de erros críticos do sistema. Embora seja curioso, não utilizaremos esse flag.
  • SDL_INIT_EVENTTHREAD: Não documentado. Também não é necessário utiliza-lo.

Tipicamente, um jogo grande irá fazer a inicialização com SDL_INIT_EVERYTHING. Para os primeiros exemplos, podemos inicializar os subsistemas apenas de timer e vídeo, como no exemplo abaixo:

SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);

Os módulos são finalizados através da função SDL_Quit. Você pode simplificar o seu código e colocar a SDL_Quit como parâmetro na função atexit(), assim ela será chamada sempre que o comando exit for dado. A declaração fica assim:

atexit(SDL_Quit);

Abrindo uma janela com a SDL

Uma vez que o módulo de vídeo está no ar, o próximo passo é definir qual é o modo de vídeo que utilizaremos para a aplicação. A função que permite que façamos isso é a SDL_SetVideoMode e seus parâmetros são: largura, altura, número de bits por pixel (também chamado de bpp ou depth) e, novamente, um inteiro com flags. As mais importantes e comumente usadas são:

  • SDL_SWSURFACE: Indica que queremos criar uma janela que não dependa de hardware de aceleração de vídeo;
  • SDL_HWSURFACE: Indica que precisamos de uma janela com aceleração de vídeo. Essa flag pode ser passada em conjunto com a anterior para suportarmos os dois modos;
  • SDL_ANYFORMAT: Quando o número de bits-por-pixel não é suportado, a SDL tenta emula-lo. Passando essa flag, você informa a SDL que você não se incomoda se ela simplesmente usar o número suportado no lugar;
  • SDL_DOUBLEBUF: Ativa o double-buffering e page-flipping. Esse recurso só estará completamente disponível se a SDL estiver usando uma superfície de hardware, criada ao passar também a flag SDL_HWSURFACE. Caso contrário, a SDL não fará o page-flipping.
  • SDL_NOFRAME: Retira a decoração da tela (barra de título, botões, etc).
  • SDL_FULLSCREEN: Inicializa em tela cheia. A altura e largura passadas nos parâmetros anteriores se referirão a resolução da tela. Se a resolução não puder ser atingida, a SDL utilizará uma resolução menor mais próxima da desejada, mas a janela ficará centralizada numa tela preta. Essa flag ativa automaticamente a SDL_NOFRAME;
  • SDL_OPENGL: Inicializa a janela com OpenGL;

A função SDL_SetVideoMode retorna um ponteiro para a superfície de desenho da tela, do tipo SDL_Surface. Na SDL, qualquer elemento que possa ser desenhado ou receber desenhos é chamado de superfície (surface).

Que tal colocar tudo isso junto num único programa?

#include "SDL.h"

#include <stdexcept>
#include <iostream>

SDL_Surface* window;

void setup(int width, int height, int bpp, bool fullscreen)
{
    //Inicializamos o subsistema de video.
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
        throw std::runtime_error(SDL_GetError());

    //Definimos as flags.
    int flags = SDL_SWSURFACE;
    if (fullscreen)
        flags = flags | SDL_FULLSCREEN;

    //Tentamos criar a janela
    window = SDL_SetVideoMode(width, height, bpp, flags);

    //Sem sucesso? Lançamos uma exceção com o erro.
    if (window == NULL)
        throw std::runtime_error(SDL_GetError());

    //Configuramos a função de finalização da SDL
    atexit (SDL_Quit);
}

/** Espera o usuário pressionar o x da janela. */
void processEvents()
{
    SDL_Event event;

    while (SDL_PollEvent(&event) != 0)
    {
        switch (event.type)
        {
            case SDL_QUIT:
                exit(0); //Fechamos a apliação
                break;
        }
    }
}

int main(int argc,char* argv[])
{
    try
    {
        setup(640, 480, 8, false); //Faz a mágica acontecer

        while (true)
            processEvents();
    }
    catch (std::exception &e)
    {
        std::cout << "Error: " << e.what();
        exit(1);
    }
}

Rodando esse exemplo, você deve ver uma janelinha abrindo na tela. Não se preocupe com o processamento de eventos por enquanto. Ele foi usado aqui apenas para que você conseguisse ver a janela (caso contrário, ela fecharia logo que abrisse). No próximo artigo, configurar a janela para uso com OpenGL. No futuro, organizaremos tudo numa classe, para reutilizarmos em qualquer jogo que quisermos.

Veja também


Comentários (52)
  • Jose  - Legal
    avatar

    Legal, seu tuto.

    Esperando um sobre animação de sprite com SDL.

    Estou meio confuso com isso. :whistle:

  • Vinícius Godoy de Mendonça  - SDL
    avatar

    Putz, a idéia é seguir com OpenGL a partir daqui.

    Mas procure dar uma olhada no artigo do Paulo chamado [url=http://www.pontov.com.br/site/index.php?option=com_content&view=a rticle&id=113:animacao-baseada-em-tempo&catid=51:programacao&Itemid=65 ]Animação Baseada em Tempo[/url].

    Vai te ajudar bastante. :)

  • Lucas Gerhard  - Muito bacana
    avatar

    Buenas,

    Muito bacana esse artigo, conseguiu ser direto e didático. Estou começando estudos sobre openGL. Pena que não consegui fazer funcionar utilizando DevC++ (windows), espero ter mais sorte no Linux hoje a noite.

    Parabéns pelo artigo...

  • Vinícius Godoy de Mendonça
    avatar

    Sorte sua não ter conseguido fazer funcionar no DevCpp. É uma IDE antiga, ultrapassada.

    Por isso faço tanta questão de frisar que você não deve utiliza-la para nenhum desenvolvimento mais moderno em Windows.

    Use o Code::Blocks. Ele já vem com uma versão atual do MinGW instalado. Temos um tutorial aqui exclusivo para ele: Ponto V! - Um ambiente para criar jogos com a SDL e a OpenGL

  • Lucas Gerhard
    avatar

    Opa, instalei o Code::blocks seguindo o tutorial e funcionou perfeitamente (isso que dá não ver a seta indicando que tem mais um artigo). Só te peço pra dar uma olhada na linha 17 onde tu ta comparando duas variáveis ao invés de estar atribuindo o valor, no mais tudo funcionou que é uma beleza.

    :woohoo:

    té...

  • Vinícius Godoy de Mendonça
    avatar

    Não era para ser um !=, nem uma atribuição e sim um |=

    Vou corrigir ali em cima deixando o código mais explícito.

  • Lucas Gerhard
    avatar

    A bom... Belezura então, valeu pela ajuda. Já to desinstalando o DevCpp e instalando o Code::Blocks.

    B)

  • Fabiano Vasconcelos  - Erros de segmentação que não fazem sentido
    avatar

    Olá, Vinícius!

    Em primeiro lugar, parabéns pelo belo trabalho. Tanto a você, quanto ao Bruno. Este é realmente um portal profissional.

    Em seguida eu queria tirar uma dúvida: na minha IDE (NetBeans), esta linha,

    throw std::runtime_error(SDL_GetError());

    que aparece duas vezes dá erro. A observação que aparece no lado esquerdo é: "Impossível resolver o identificador runtime_error". O mesmo acontece com SDL_Surface.
    Já a saída do compilador é:

    "/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
    make[1]: Entrando no diretório `/home/jent/projects/RiverAssault/rassault'
    "/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/rassault
    make[2]: Entrando no diretório `/home/jent/projects/RiverAssault/rassault'
    mkdir -p dist/Debug/GNU-Linux-x86
    g++ -lSDL -o dist/Debug/GNU-Linux-x86/rassault build/Debug/GNU-Linux-x86/main.o
    /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
    collect2: ld returned 1 exit status
    make[2]: ** [dist/Debug/GNU-Linux-x86/rassault] Erro 1
    make[1]: ** [.build-conf] Erro 2
    make: ** [.build-impl] Erro 2
    make[2]: Saindo do diretório `/home/jent/projects/RiverAssault/rassault'
    make[1]: Saindo do diretório `/home/jent/projects/RiverAssault/rassault'

    O que pode estar ocorrendo?

    Grande abraço! ;)

  • Vinícius Godoy de Mendonça  - SDL
    avatar

    Oi.
    Você configurou corretamente a SDL no seu projeto?

    É necessário baixar e instalar a SDL: http://www.libsdl.org/download-1.2.php

    Se você já fez isso, então pode ser algum erro de configuração do seu arquivo de projeto. Eu realmente não sei configurar no netbeans, minhas principais IDEs para desenvolvimento C++ são o Code::Blocks e o Visual.

  • Fabiano Vasconcelos
    avatar

    Cara, baixar os pacotes eu baixei. Deve ser alguma flag que estaria faltando no g++. :(
    Vou verificar isso aqui.

  • Vinícius Godoy de Mendonça
    avatar

    Certifique-se também que a extensão do seu arquivo é .cpp e não .c

  • Fabiano Vasconcelos
    avatar

    Descobri!!!

    É um erro peculiar e que deve ser resgistrado aqui, pois é muito sutil e eu não achei solução em português:
    http://lists.libsdl.org/pipermail/sdl-libsdl.org/2007-March/060279.htm l

    Em suma, como já está de madrugada, usei mesmo o tradutor lixão do google. Não estou em condições de traduzir:

    "Você está ciente do fato de que a SDL define uma macro para embrulhar a principal função?
    Ele espera int main (argc argv []) como seus argumentos (com a possível exceção
    de usar nomes de variáveis diferentes para os parâmetros passados). Se você tentar int
    main () ou int main (void) ou void main () ou qualquer coisa que não inclui o
    argumentos passados na linha de comando, ele não vai funcionar.

    Além disso, como uma dica para futuros problemas relacionados com o Linux é que o Linux utiliza
    arquivos caso sensível assim # include vai funcionar se você tem o seu
    cabeçalhos no diretório SDL usando letras maiúsculas. Se você usar minúsculas que
    não vai funcionar."

    Ou seja, a função deve ser main() e com os parâmetros padrão. O resto deve ser declarado a parte.
    Por hoje é só! ;)

    Um abraço e boa semana! :D

  • Vinícius Godoy de Mendonça
    avatar

    Por isso escrevi no artigo:
    Ela é quem toma conta de fazer as chamadas específicas. Então, para nós, resta apenas a tarefa de declarar um main padrão, com o seguinte formato:

    E, no parágrafo seguinte:
    Embora o C++ forneça outras alternativas para a assinatura do main, essa é a forma recomendada pela SDL.

    Outras formas de main são admitidas. Em todo caso, vou alterar ali o texto para dar mais destaque.

  • Bruno Crivelari Sanches
    avatar

    Oficialmente a função main pode ter dois formatos:
    void main(void)

    ou

    int main(int, char **);

    Qual usar depende da sua necessidade, mas como o Vini comentou a SDL impõe restrições.

  • Anônimo
    avatar

    Cara, eu nem me dei conta do seu texto na íntegra. Ontem eu não tava muito bem da cabeça, hehehehheheh...
    De qualquer maneira, esse é um detalhe muito importante que deve importunar uma parcela considerável de programadores iniciantes. Bom saber que agora existe solução em português. Se vocês puderem colocar destaque maior nessa parte, será um grande diferencial.

    Muita paz a todos!

  • Fernanda Scheidt  - pequeno problema, posso ter feito algo errado???
    avatar

    :0

    Ola Vinicius,

    Comecei hoje a seguir seu tuto passo a passo, incusive na troca do dev pelo codeblock, mas ao compilar esse codigo da janela ele deu um erro na linha 60, com os "}" e só compilou quando eu removi os "" e ficou só a chave "}".

    posso ter feito algo de errado???

    :unsure:

  • Vinícius Godoy de Mendonça
    avatar

    Você fez certo. Não sei pq esse editor insiste em colocar essas coisas. Já retirei umas 4 ou 5 vezes do artigo.

  • Fabiano Vasconcelos  - Explicação
    avatar

    Amigos, vocês poderiam me explicar as linhas 16 e 17? Não entendi principalmente as atribuições lá.

    Obrigado e boa semana!

  • Vinícius Godoy de Mendonça
    avatar

    Bom, a linha 16 não tem o que explicar. Só está testando se a variável fullscreen, passada como parâmetro, é true.

    A linha 17, sim, é um pouco mais complicada. Os valores da variável flags são definidos na forma de um mapa de bits. Aquele comando combina os bits da variável flags, com os bits dos valores passados por parâmetro.

    Dê uma lida nesse tópico do GUJ, onde esse tema é explicado com detalhes: http://www.guj.com.br/java/207435-mapa-de-bits-alguem-se-habilita-#105 3869

  • Victor  - Ajuda.
    avatar

    Olá. Você tem um tutorial ensinando a instalar e configurar OpenGL e SDL no Linux Ubuntu e no Code::Blocks? Que eu já cansei de só ver tutoriais que não funcionam.

    Usando as configurações padrões, ou eu uso SDL ou OpenGL em um projeto, nunca consegui usar os 2......

  • Vinícius Godoy de Mendonça
    avatar

    O que você quer dizer com "usar os dois"? Quando a OpenGL está ligada, não é possível dar usar comandos de pintura da SDL, a OpenGL irá substituir totalmente o mecanismo de render. Ou seja, esqueça os comandos de BlitSurface.

    A configuração que proponho neste tutorial e no próximo, ensinam a abrir uma janela SDL com a OpenGL como renderer. Você ainda poderá usar o mecanismo de eventos, sons, os loaders de imagem, da SDL, mas a pintura terá que ser feita usando OpenGL.

  • Victor
    avatar

    Então. Mas isso de usar os 2, foi erro de expressão meu.

    Se eu vou no CB e crio um SDL project, eu só consigo usar SDL, se eu crio um OpenGL, só uso o OpenGL, caso contrário, ele diz "arquivo ou diretório não encontrado". Se tratando de programação, só 2 coisas que eu odeio. Configurar essas coisas, os tutoriais raramente funcionam e buscar tutoriais/documentação para aprender.

  • Vinícius Godoy de Mendonça
    avatar

    Siga o tutorial sobre criação de ambientes à risca:
    http://www.pontov.com.br/site/index.php/opengl/137-criando-um-ambiente -para-jogos-com-sdlopengl

    Com ele você configura um projeto do zero, sem usar os wizards do Code::Blocks. Entenda os passos necessários e você poderá reproduzir no Linux.

    Eu sou extremamente contra Wizards, principalmente no C++. Ali, se você não conhece o ambiente, você se ferra.

  • Victor
    avatar

    Bom, eu encontrei uma série de problemas caso fosse "adaptar" isso.

    1º, não sei o equivalente as variáveis de ambiente no Linux.

    2 ª, não sei onde fica um programa após instala-lo pelo terminal ou por um pacote.

    Acho melhor continuar procurando tutoriais e esperando que pelo menos um funcione, ou esperar ter a disciplina de compiladores na faculdade, ai eu vou entender como um compilador funciona.

  • Bruno Crivelari Sanches
    avatar
    Citou:
    1º, não sei o equivalente as variáveis de ambiente no Linux.

    Existem, só não sei onde fica uma gui para editar elas. Provavelmente por linha de comando é mais simples.

    Citou:
    esperar ter a disciplina de compiladores na faculdade, ai eu vou entender como um compilador funciona.

    Mas não vai entender como usar um compilador C ou C++, na disciplina não vão explicar isso, vão explicar as teorias e técnicas para compilação, não como usar um compilador já existente.

    T+

  • Bruno Crivelari Sanches
    avatar
    Citou:
    Configurar essas coisas, os tutoriais raramente funcionam e buscar tutoriais/documentação para aprender.

    Por isso que muitas vezes é melhor entender como tudo funciona ao invés de apenas seguir uma receita de bolo. Pode parecer complicado, mas o processo de usar essas libs é bem intuitivo para quem sabe como a compilação de um programa C ou C++ funciona.

    Configurar SDL ou OpenGL é como configurar qualquer biblioteca para se usar com um programa C/C++: dizer ao compilador onde estão os arquivos de include, dizer ao linker onde estão os arquivos de biblioteca.

    Sugiro dar uma lida:

    Compilacao de Programas C/C++

    E também: Como usar bibliotecas C/C++

    T+

  • Koolen  - Instalação efetuada com sucesso! Mas não rodou o a
    avatar

    Boa tarde, já faz alguns meses que estou na pesquisa de qual linguagem trabalhar para o desenvolvimento de games. Sou programador a 18 anos em linguagens desktop, web, scripts, etc.

    Esta de parabens seu post de instalação, tudo ok!

    Pergunta seguinte, neste post aqui em cima, vc ofereceu um código exemplo, eu não tenho muita noção da funcionaldiade do c e tbm prefiro perguntar do que pesquisar.

    Meu código deu um erro, que deve ser de referencia o seguinte:
    stdexcept: No suc file or directory

    Nunca tinha instalado o CodeBlocks, segui seu procedimentos até aqui e parei neste ponto, gostaria de saber se fiz algo de errado ou faltou algum detalhe no processo.

    Agradeço sua atenção!

  • Koolen
    avatar

    Encontrei o problema.
    Realmennte erro de noob.
    1° Tenho que usar a opção "File -> New Project -> Console Application"
    2° Adicionar todas as configurações novamente ao projeto

    Então sempre faço isso, não tem como manter essas configurações por padrão. Existe a possibilidade de manter como padrão igual o delphi ou visual studio fazem? Tipo pra adicionar automaticamente em todos os novos projetos.

    Valeu, to gostando do code::block
    bacana.

  • Vinícius Godoy de Mendonça
    avatar

    Olá Koolen.

    Existe sim, você pode configurar as opções em Settings->Compiler&Debugger. Eu não gosto muito de deixar a configuração na IDE, prefiro sempre definir por projeto.

    Uma das coisas que faço é ter um projeto em branco, já configurado e só dou copy&paste nele quando preciso montar um ambiente novo.


    Se você já está adaptado ao Visual, use-o. A única coisa que muda é que você deverá incluir um include antes do include do gl.h

  • Rafael Vieira Braga  - Dúvida
    avatar

    Olá,

    primeiro de tudo, parabéns, não só pelo site mas pela sua ajuda e suporte a comunidade de programadores. Agora a minha dúvida.
    Instalei o code::blocks, tudo direitinho conforme seu tutorial. Depis baixei o SDL e suas features(mixer,image e tbm o net), configurei o compilador(directories e Linker), tudo conforme vc foi explicando. Porém, na hora de compilar o projeto(básico mesmo) ele dá os seguintes erros:
    no linker:
    Linking console executable: bin\Debug\CivilWar.exe
    C:\Program Files (x86)\CodeBlocks\MinGW\bin\ld.exe: cannot find -lsdl_mixer.dll
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 0 warnings

    no console:

    ld.exe||cannot find -lsdl_mixer.dll|
    ||=== Build finished: 1 errors, 0 warnings ===|


  • Vinícius Godoy de Mendonça
    avatar

    Oi.

    Creio que nas configurações, em "link libraries" você só deva deixar SDL_Mixer e não SDL_Mixer.dll

    []s,

    Vini

  • Rafael
    avatar

    Não deu certo... porém, percebi que nas pastas "lib", dos SDL_*, não tem o ".a". Será que esqueci algo? Só fiz descompactar as pastas, depois colar as DLL's na pasta DLL(que está na variável de ambiente PATH)... Não sei mais o que pensar....

  • Vinícius Godoy de Mendonça
    avatar

    Você baixou as versões devel para mingw32?

    Cuidado para não baixar os redistributables (sem ser o devel). Eu mesmo vivo baixando errado por engano.

  • Rafael  - Pronto, deu certo !!
    avatar

    Ahhhh. viajei... :P
    Tinha esquecido de configurar o caminho para as "includes" e "libs" das features do SDL... quanta noobice... mas é assim mesmo, a gente aprende com os erros. Mais uma vez, obrigado e parabéns pelo site.

  • Vinícius Godoy de Mendonça
    avatar

    Acontece. :)

  • Rafael  - Denovo...
    avatar

    Malz ai pela pertubação...
    agoratá dando esse erro:

    C:\DevJogos\CivilWar\CivilWar\main.cpp||In function `void setup(int, int, int, bool)':|
    C:\DevJogos\CivilWar\CivilWar\main.cpp|10|error: `runtime_error' is not a member of `std'|
    C:\DevJogos\CivilWar\CivilWar\main.cpp|18|error: `runtime_error' is not a member of `std'|
    ||=== Build finished: 2 errors, 0 warnings ===|

    obs.: Só fiz copiar e colar do exemplo acima...

  • Rafael  - Denovo e denovo...
    avatar

    Tá rodando, mas tá dando um erro... tá entrnado no catch da main(return(1)); O q pode ser?

  • Vinícius Godoy de Mendonça
    avatar

    Qual erro tá dando? Aquele ali em cima?

  • Rafael
    avatar

    O erro de lá foi burrice minha, não copiei as includes, ai digitei e esqueci da stdexcept, ai coloquei e não deu mais erro. Só que agora, no runtime, não aparece a janelinha normal, aparece só uma dizendo:
    "
    Process returned 1 (0x1) execution time : 0.030s
    Press any key to continue
    "
    ou eja, tá entrnaod no catch da função main....
    Não sei o porquê disso.

  • Rafael  - A janela apareceu....
    avatar

    Pronto, não sei o que é. Parece até que o IDE tem medo de vc, quando mando a pergunta, ele funciona logo depois... sei não viu, isso que é moral kkkkkkkkkkkkkkkkk.
    Só fiz copiar tudo denovo, compilei, rodei e apareceu a janelinha que eu disse e depois, a janelinha configurada...
    Vlw, pela rapidez nas respostas... :)
    []'s

  • Vinícius Godoy de Mendonça
    avatar

    Provavelmente faltava era um "Rebuild all". :)
    Ou o meu olhar assassino mesmo. hehehehe

    []s e bons estudos! :)
    Qualquer dúvida é só perguntar.


    E obrigado pelos elogios em relação ao site. Trabalhamos duro pra ter sempre inserção de conteúdo, e temos um critério mínimo de qualidade, assim garantimos que você só lê material de primeira.

    Nada de gambi ou de tutoriais "copy&paste" sem explicações nesse site aqui. ;)

  • Fabiano Vasconcelos
    avatar

    Olá, amigos!

    Se possível, eu gostaria de uma explicação mais detalhada sobre o código:

    //Definimos as flags.
    int flags = SDL_SWSURFACE;
    if (fullscreen)
    flags = flags | SDL_FULLSCREEN;

    Deu pra perceber que SDL_SWSUFACE é um inteiro, mas não deu pra entender porque esse inteiro está sendo atribuído a flags e porque estas flags estão sendo definidas.
    O que faz exatamente a última linha?

    Obrigado.

  • Vinícius Godoy de Mendonça  - Mapas de bits
    avatar

    Olá Fabiano.

    Usar um único inteiro para representar um conjunto de flags é um truque bastante comum em programação C.

    Digamos que você tenha 3 valores booleanos e queira combina-los. Você poderia criar três constantes, assim:
    int VALOR1 = 1; //001 em binário
    int VALOR2 = 2; //010 em binário
    int VALOR3 = 4; //100 em binário

    Agora, alguém que quisesse usar ao mesmo tempo o VALOR1 e o VALOR3 poderia faze-lo assim:
    int flags = VALOR1 | VALOR3;

    Essa operação faz um OU, bit a bit. Ou seja, se um bit de um número contiver 0 e o outro 1, o resultado será 1. Caso contrário, o valor naquele bit será 0.
    Portanto:
    001
    100 |
    --------
    101


    A SDL utiliza essa técnica, pois há um conjunto de flags que podem ser definidas na inicialização. O comando
    flags = flags | SDL_FULLSCREEN;

    está simplesmente adicionado a flag fullscreen ao conjunto de flags já existente (no caso, a SDL_SWSURFACE).

    Para uma explicação detalhada, veja também:
    http://www.guj.com.br/java/207435-mapa-de-bits-alguem-se-habilita-#105 3869

  • Fabiano Vasconcelos
    avatar

    Nem precisa de explicação mais detalhada. Foi de bom tamanho!
    Muito obrigado pela ajuda, Vinny!
    Mais sucesso! B)

  • Vinícius Godoy de Mendonça
    avatar

    Eu vi que já haviam te explicado bastante lá na cppbrasil também. ;)

  • Cleiton P.  - AJUDA NO C++
    avatar

    POW VENHO DESENVOLVENDO UM PROJETO NO DEV C++.. BEM ESTOU COM O PROJETO PRONTO, SÓ QUANDO COMPILO, APARECE ESSES ERROS:
    c:\program files (x86)\dev-cpp\mingw32\mingw32\bin\ld.exe cannot open output file Projeto questao 4 lista 02.exe: Permission denied
    C:\Program Files (x86)\Dev-Cpp\collect2.exe [Error] ld returned 1 exit status
    25 C:\Program Files (x86)\Dev-Cpp\Makefile.win recipe for target '"Projeto' failed

    ALGUEM PODE ME AJUDAR?? QUALQUER COISA MEU EMAIL ESTÁ AI

    AGRADECIDO
    :(

  • Vinícius Godoy
    avatar

    Oi. Primeiramente, não use o DevCpp. Ele é totalmente obsoleto. Prefira o MS Visual Studio ou o QT Creator.

    Esse problema geralmente ocorre quando você esqueceu a janela do programa aberta em uma execução anterior. Para compilar, certifique-se que seu programa esteja fechado.

    Ou então, quando sua pasta não tem permissão de escrita (o que não deve ser o caso).

  • raul
    avatar

    salvou teu comentário ! haha

  • Anônimo  - ERRO
    avatar

    Estou usando o visual Studio 2012 e não estou conseguindo. Ta dando esse erro:

    >LINK : fatal error LNK1561: entry point must be defined

  • Jefferson  - Erro antes de abrir a janela da SDL
    avatar

    Olá

    Eu configurei o ambiente certinho, o código compila e tudo mais, entretanto, no momento de abrir a janela, ocorre um erro em tempo de execução.

    View image

    O que poderia ser?

  • Rodrigo A  - Não deu certo
    avatar

    Será que em pleno 2015 você ainda responderia uma dúvida minha?

    Eu baixei a versão SDL 2 para MinGW, mas os arquivos que vem não começam com lib e nem tem extensão .a
    Aqui fala que eles são arquivos .lib mesmo.

    Mas o problema nem é esse.
    O ld.exe (que imagino que seja o linker) dá o erro "cannot find -lSDL2.dll"
    E se eu tentar tirar o .dll lá naquela aba do "linker options", o linker para de funcionar quando tá compilando o projeto.

    Já tentei instalar glut antes e também dava errado em todo tutorial que eu ia.
    Acho que preciso de algum tutorial que explique exatamente o que quer dizer cada coisa. Ou melhor, preciso aprendera mexer no CodeBlocks mesmo.

    Obrigado pela atenção.

  • Gustavo Alvez  - Erro
    avatar

    Quando eu tentei rodar o exemplo apareceu o seguinte erro:

    ||=== Build: Debug in LetSgl (compiler: GNU GCC Compiler) ===|
    C:\Devjogos\cProjects\LetSgl\main.cpp|7|error: 'SDL_Fullscreen' does not name a type|
    C:\Devjogos\cProjects\LetSgl\main.cpp||In function 'void setup(int, int, int, bool)':|
    C:\Devjogos\cProjects\LetSgl\main.cpp|19|error: 'SDL_FULLSCREEN' was not declared in this scope|
    C:\Devjogos\cProjects\LetSgl\main.cpp|22|error: 'SDL_SetVideoMode' was not declared in this scope|
    C:\Devjogos\cProjects\LetSgl\main.cpp|29|error: 'atexit' was not declared in this scope|
    C:\Devjogos\cProjects\LetSgl\main.cpp||In function 'void processEvents()':|
    C:\Devjogos\cProjects\LetSgl\main.cpp|42|error: 'exit' was not declared in this scope|
    C:\Devjogos\cProjects\LetSgl\main.cpp||In function 'int SDL_main(int, char**)':|
    C:\Devjogos\cProjects\LetSgl\main.cpp|60|error: 'exit' was not declared in this scope|
    C:\Devjogos\cProjects\LetSgl\main.cpp|62|warning: control reaches end of non-void function [-Wreturn-type]|
    ||=== Build failed: 6 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter