QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 686|回复: 3

又一个SDL的问题!

[复制链接]
发表于 2004-5-21 23:21:51 | 显示全部楼层 |阅读模式
下面是我的测试程序,当我把象素位由32改为24时!
它显示的是不再是一个矩形,而是一条竖线!
不知道是什么原因?
谢谢指导!
( draw_pixel() 是我从www.libsdl.org上取下来的程序,只做了一点点修改)


#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<errno.h>
#include<sys/types.h>
#include"SDL/SDL.h"
               
int err_exit(const char* str);
void draw_pixel(SDL_Surface *screen,int x,int y, Uint8 R, Uint8 G, Uint8 B);

int main(int argc,char* argv[]){
        int i,j;
        SDL_Surface* screen;
        SDL_Rect src,dest;
       
        if(SDL_Init(SDL_INIT_VIDEO)==-1)  //initializes the SDL
                err_exit(SDL_GetError());
        atexit(SDL_Quit);

        screen=SDL_SetVideoMode(800,600,32,0);
        if(screen==NULL)
                err_exit(SDL_GetError());
       
        if ( SDL_MUSTLOCK(screen) ) {
                if ( SDL_LockSurface(screen) < 0 ) {
                        err_exit(SDL_GetError());
                }
        }

        for(i=0;i<50;i++){
                for(j=0;j<50;j++){
                        draw_pixel(screen,j+50,i+50,0,255,0);
                }
        }

        if ( SDL_MUSTLOCK(screen) ) {
                SDL_UnlockSurface(screen);
        }       
        SDL_UpdateRect(screen,50,50,100,100);
        SDL_Delay(5000);
        return 0;       

}




void draw_pixel(SDL_Surface *screen,int x,int y, Uint8 R, Uint8 G, Uint8 B)
{
    Uint32 color = SDL_MapRGB(screen->format, R, G, B);

    switch (screen->format->BytesPerPixel) {
        case 1: {
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *bufp = color;
        }
        break;

        case 2: {
            Uint16 *bufp;

            bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x;
            *bufp = color;
        }
        break;

        case 3: {
            Uint8 *bufp;

            bufp = (Uint8 *)screen->pixels + y*screen->pitch + x;
            *(bufp+screen->format->Rshift/ = R;
            *(bufp+screen->format->Gshift/ = G;
            *(bufp+screen->format->Bshift/ = B;
        }
        break;

        case 4: {
            Uint32 *bufp;

            bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x;
            *bufp = color;
        }
        break;
    }
}

int  err_exit(const char* str){
        fprintf(stderr,"%s",str);
        if(errno!=0)
                fprintf(stderr,":%d",errno);
        exit(1);
}
发表于 2004-5-22 02:11:32 | 显示全部楼层
在SDL的相关头文件中提到应尽量避免使用24位颜色深度(使用32位或16位吧),因为这种模式可以是需要特殊转换因为显示速度是最慢的,而且显卡对此支持亦不够好。
回复

使用道具 举报

发表于 2004-5-22 11:55:22 | 显示全部楼层
用16位吧,我们肉眼是很难分辨16位色彩以上的分别,
而且16位不用调色板,速度最快
回复

使用道具 举报

 楼主| 发表于 2004-5-22 12:07:06 | 显示全部楼层
谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 06:43 , Processed in 0.038044 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表