A comunidade brasileira de desenvolvimento e programação de jogos.
Bem-vindo: Qui Jun 27, 2019 6:22 am

Todos os horários são GMT - 3 horas




Criar novo tópico Responder  [ 3 mensagens ] 
Autor Mensagem
 Título: Problemas
MensagemEnviado: Ter Fev 07, 2006 10:59 am 
Offline
Membro júnior

Registrado em: Seg Jan 30, 2006 4:16 pm
Mensagens: 24
Bom galera, eu queria em primeiro lugar agradecer a força que todos vocês estão dando dedicando e ajudando a este forum.

Ja tem 2 semanas que estou pesquisando como programar jogos e a 1 estou tentando programar o meu primeiro jogo, um jogo da velha. Estou usando bitmaps, e os sobrepondo, mas toda hora que há alguma alteração, seja do cursor ou seja do jogador executar uma ação, a tela inteira é varrida por meio de matriz e inteiramente atualizada. Gostaria de saber se preciso fazer a tela inteira após alguma alteraçaão em qualquer jogo ou se tem alguma maneira de só alterar o que precisa ser alterado. E outra, gostaria que se pudessem, olhassem o código, pois não estou conseguindo aplicar as texturas dos jogadores, as texturas estão "uploadeadas" nesse link no mega upload junto com o fonte e o projeto... Mesmo assim eu estou disponibilizando o código aqui memso... Aguardo...
Gostaria que fossem pacientes e tolerantes pois ainda estou aprendendo
http://www.megaupload.com/pt/?d=HKZA2TRO



Código
Código:
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <string>
#include <iostream>
#define m 3


// Criando ponteiros (Surfaces) para depois apontar para as figuras
SDL_Surface *background = NULL;
SDL_Surface *player1 = NULL;
SDL_Surface *player2 = NULL;
SDL_Surface *selection = NULL;
SDL_Surface *screen = NULL;

// Cria as coordenadas da selecao
int xpos=0, ypos=0;

// Cria as matrizes, 1 para Player1 e 2 para Player 2
int ocupado[m] [m];

// Cria as coordenadas de seleção
int selecaox = 0;
int selecaoy = 0;

// Cria a posição dos pixels do cursor
int cursorx;
int cursory;

// Cria o contador de objetos
int quantidadep1 = 0;
int quantidadep2 = 0;

// Função que transforma as imagens em padrão da tela
SDL_Surface *load_image( std::string filename )
{
    // Local temporário para imagens otimizadas carregadas
    SDL_Surface *loadedImage = NULL;
   
    // Ponteiro da imagem otimizada que será usado
    SDL_Surface *optimizedImage = NULL;
   
    // Carrega a imagem
    loadedImage = SDL_LoadBMP( filename.c_str() );
   
    // Confere se tudo deu certo
    if( loadedImage != NULL )
    {
        // Cria a imagem otimizada
        optimizedImage = SDL_DisplayFormat( loadedImage );
       
        // Libera o ponteiro anterior
        SDL_FreeSurface( loadedImage );
    }
   
    // Retorna a imagem ja otimizada
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface *source, SDL_Surface *destination )
{
    // Cria um retângulo temporário para armazenar as coordenadas
    SDL_Rect Offset;
   
    // Recebe as coordenadas do retângulo
    Offset.x = x;
    Offset.y = y;
   
    // Recorta a figura
    SDL_BlitSurface( source, NULL, destination, &Offset );
}

// Reinicia o Jogo
void reiniciaJogo ()
{   
    for( int x = m-m; x == m; x++ )
    {
        for( int y = m-m; y = m; y++ )
        {
            ocupado[x] [y] = 0;
        }
    }
    SDL_FreeSurface( player1 );
    SDL_FreeSurface( player2 );
    selecaox = 0;
    selecaoy = 0;
    quantidadep1 = 0;
    quantidadep2 = 0;
    cursorx = 98;
    cursory = 40;
    apply_surface( cursorx, cursory, selection, screen );
}

// Pinta a tela com as coordenadas dadas pela entrada  MUUUUDAR!!!
void drawScene(int xpos, int ypos)
{
    selection = load_image( "Selection.bmp" );
    apply_surface( cursorx, cursory, selection, screen );
}

// Atualiza o cursor
void atualizaCursor(int xpos, int ypos)
{
    cursorx = cursorx+xpos;
    cursory = cursory+ypos;
    drawScene( xpos, ypos );
}
// Pinta player 1
void pintap1(int x, int y )
{
    player1 = load_image( "Player1.bmp" );
    if( x == 0 )
    {
        if( y == 0 )
        {
            apply_surface( 88, 30, player1, screen );
        }
        if( y == 1 )
        {
            apply_surface( 88, 131, player1, screen );
        }
        if( y == 2 )
        {
            apply_surface( 88, 232, player1, screen );
        }
       
    }
    if( x == 1 )
    {
        if( y == 0 )
        {
            apply_surface( 189, 30, player1, screen );
        }
        if( y == 1 )
        {
            apply_surface( 189, 131, player1, screen );
        }
        if( y == 2 )
        {
            apply_surface( 189, 232, player1, screen );
        }
       
    }
    if( x == 2 )
    {
        if( y == 0 )
        {
            apply_surface( 290, 30, player1, screen );
        }
        if( y == 1 )
        {
            apply_surface( 290, 131, player1, screen );
        }
        if( y == 2 )
        {
            apply_surface( 290, 232, player1, screen );
        }
       
    }
}       

// Pinta player 2
void pintap2(int x, int y )
{
    player2 = load_image( "Player2.bmp" );
    if( x == 0 )
    {
        if( y == 0 )
        {
            apply_surface( 88, 30, player2, screen );
        }
        if( y == 1 )
        {
            apply_surface( 88, 131, player2, screen );
        }
        if( y == 2 )
        {
            apply_surface( 88, 232, player2, screen );
        }
       
    }
    if( x == 1 )
    {
        if( y == 0 )
        {
            apply_surface( 189, 30, player2, screen );
        }
        if( y == 1 )
        {
            apply_surface( 189, 131, player2, screen );
        }
        if( y == 2 )
        {
            apply_surface( 189, 232, player2, screen );
        }
       
    }
    if( x == 2 )
    {
        if( y == 0 )
        {
            apply_surface( 290, 30, player2, screen );
        }
        if( y == 1 )
        {
            apply_surface( 290, 131, player2, screen );
        }
        if( y == 2 )
        {
            apply_surface( 290, 232, player2, screen );
        }
       
    }
}
// Vasculha a matriz para pintar mediante a função drawScene
void vasculhaMatriz()
{
    // Carrega as imagens
    background = load_image( "Background.bmp" );
   
    // Aplica o fundo na tela
    apply_surface( 0, 0, background, screen );
       
    for( int x = m-m; x == m-1; x++ )
    {
        for( int y = m-m; y == m-1; y++ )
        {
            if( ocupado[x] [y] == 0 )
            {
                break;
            }
            if( ocupado[x] [y] == 1 )
            {
                pintap1( x, y );
            }
            if( ocupado[x] [y] == 2 )
            {
                pintap2( x, y );
            }
        }
    }
}

// Pinta mesmo!!
void drawPlayer1()
{
    if( ocupado[selecaox] [selecaoy] == 0 )
    {
        ocupado[selecaox] [selecaoy] = 1;
    }
}

void drawPlayer2()
{
    if( ocupado[selecaox] [selecaoy] == 0 )
    {
        ocupado[selecaox] [selecaoy] = 2;
    }
}

int main( int argc, char *args[] )
{
    Uint8 *keys;
    bool finalizar=false;
    SDL_Event evento;
   
    // Inicializa todos os recursos de Hardware
    if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 )
    {
        printf("Incapaz de iniciar os recursos");
        return 1;
    }
   
    // Define as propriedades da tela Tela
    screen = SDL_SetVideoMode(
        492,
        365,
        32,
        SDL_SWSURFACE
    );
   
    // Define o Título da janela
    SDL_WM_SetCaption( "Jogo da Velha by Jungle Boy", NULL );
   
    // Carrega as imagens
    background = load_image( "Background.bmp" );
    player1 = load_image( "Player1.bmp" );
    player2 = load_image( "Player2.bmp" );
    selection = load_image( "Selection.bmp" );
   
    // Aplica o fundo na tela
    apply_surface( 0, 0, background, screen );
       
   
    reiniciaJogo();
    while( !finalizar )
    {
        while( SDL_PollEvent( &evento ) )
        {
            if( evento.type==SDL_KEYDOWN )
            {
                if ( evento.key.keysym.sym == SDLK_ESCAPE ) {finalizar=true;}
                keys = SDL_GetKeyState(NULL);
                    if ( keys[SDLK_UP] )
                    {
                        if( selecaoy != 0 )
                        {
                            selecaoy--;
                            vasculhaMatriz();
                            atualizaCursor( 0, -101 );
                            SDL_Flip( screen );
                        }
                    }
                    if ( keys[SDLK_DOWN] )
                    {
                        if( selecaoy != 2 )
                        {
                            selecaoy++;
                            vasculhaMatriz();
                            atualizaCursor( 0, 101 );
                            SDL_Flip( screen );
                        }
                    }
                    if ( keys[SDLK_RIGHT] )
                    {
                        if( selecaox != 2 )
                        {
                            selecaox++;
                            vasculhaMatriz();
                            atualizaCursor( 101, 0 );
                            SDL_Flip( screen );
                        }
                    }
                    if ( keys[SDLK_LEFT] )
                     {
                        if( selecaox != 0 )
                        {
                            selecaox--;
                            vasculhaMatriz();
                            atualizaCursor( -101, 0 );
                            SDL_Flip( screen );
                        }
                    }
                    if ( keys[SDLK_SPACE] )
                    {
                        if( quantidadep1+quantidadep2 == 5 )
                        {
                            break;
                        }
                        else{
                        if( (quantidadep1+quantidadep2) %2 == 1 )
                        {
                            drawPlayer2();
                            vasculhaMatriz();
                            SDL_Flip( screen );
                            quantidadep2++;
                        }
                        else{
                            drawPlayer1();
                            vasculhaMatriz();
                            SDL_Flip( screen );
                            quantidadep1++;
                            }
                        }
                    }       
            }
        }
    }
   
    //Free the images
    SDL_FreeSurface( background );
    SDL_FreeSurface( player1 );
    SDL_FreeSurface( player2 );
    SDL_FreeSurface( selection );
   
    //Quit SDL
    SDL_Quit();
    return 0;   
}




Voltar ao topo
 Perfil  
 
 Título:
MensagemEnviado: Ter Fev 07, 2006 11:42 am 
Offline
Membro avançado
Avatar do usuário

Registrado em: Dom Jan 01, 2006 9:07 pm
Mensagens: 250
Cada vez que você alterar alguma coisa na telka você vai ter que redesenhar a tela inteira, porém você não precisa atualiza-la inteira. Para atualizar apenas a area alterada use SDL_UpdateRect(). Essa função recebe 4 coordenadas (x,y,w,h) que representam a area a ser atualizada. Use essa funcao no lugar de SDL_Flip().

Quanto ao outro problema, vou dar uma olhada no seu código pra ver se eu acho o problema, depois eu posto.


Voltar ao topo
 Perfil  
 
 Título: Re: Problemas
MensagemEnviado: Qua Mar 13, 2019 6:47 am 
Offline
Membro novo
Avatar do usuário

Registrado em: Ter Fev 19, 2019 7:16 pm
Mensagens: 5
Localização: Brasil - PE
Eu não uso a SDL 1. Mas sempre verifica se as condições para desenhar as texturas desejadas estão sendo chamadas, pode usar uma função de print no console. Seguindo se as chamadas estão sendo feitas corretamente verifique a função de desenho, e, não recarregue uma imagem mais de uma vez isso acumula memória a não ser que saiba muito bem o que está fazendo. A maioria dos jogos tem a função de update e draw sendo chamadas constantemente em um loop infinito, assim todos os objetos e cenas são atualizadas independente de uma ação do jogo ou jogador, mas tem um custo de processamento maior. Outra vantagem de atualizar sempre a tela é que quando minimizada a janela, e depois entrar em uso da mesma novamente, vai está atualizada ao invés de toda escura ou com cores aleatórias.

_________________
DWS
https://gundam7463.itch.io/


Voltar ao topo
 Perfil  
 
Exibir mensagens anteriores:  Ordenar por  
Criar novo tópico Responder  [ 3 mensagens ] 

Todos os horários são GMT - 3 horas


Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes


Enviar mensagens: Proibido
Responder mensagens: Proibido
Editar mensagens: Proibido
Excluir mensagens: Proibido
Enviar anexos: Proibido

Ir para:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzido por: Suporte phpBB