SDL历程:课程设计之精灵图

终于算是忙过去了一段时间,可以好好地写写总结了,这一周写了不少SDL方面的小项目;

下面就一一粘出来:

1.精灵图问题

/*  preDefine.h*/
#ifndef __PRE_DEFINE_H
#define __PRE_DEFINE_H     

#include <stdio.h>
#ifndef false
 #define false 0
#endif
#ifndef true
 #define true 1
#endif
#ifndef error
 #define error -1
#endif
#endif     

/* Global.h*/
#ifndef __GLOBAL_H
#define __GLOBAL_H     

#include <stdio.h>
#include <SDL.h>
#ifdef __cplusplus
extern "C"{
#endif
SDL_Surface *ObtainScreen(void);
void RegisterScreen(SDL_Surface *screen);
SDL_Surface *ObtainScreenImage(void);
void RegisterScreenImage(SDL_Surface *screen);
#ifdef __cplusplus
}
#endif
#endif     

/* Global.c*/
#include "Global.h"
static SDL_Surface *surf;
static SDL_Surface *surfImage;
SDL_Surface *ObtainScreen(void)
{
    return surf;
}
void RegisterScreen(SDL_Surface *screen)
{
    surf = screen;
}
SDL_Surface *ObtainScreenImage(void)
{
    return surfImage;
}
void RegisterScreenImage(SDL_Surface *screen)
{
    surfImage = screen;
}     

/* Surface.h*/
#ifndef __SUFACE_H
#define __SUFACE_H     

#include <SDL.h>
#include <SDL_gfxPrimitives.h>
#include <SDL_image.h>
#include <SDL_rotozoom.h>
#include <SDL_ttf.h>
#include <stdio.h>
#include "preDefine.h"
#include "Global.h"
#include "tslib.h"
typedef struct BtnInfo
{
    SDL_Rect rect;
    char *BtnTitle;
    int Flag;
}BtnInfo;
#ifdef __cplusplus
extern "C"{
#endif
//SDL初始化,
//成功返回true,失败返回false
int SDLInit();
//释放资源
//成功返回true,失败返回false
int freeSDL();
//初始化界面
//第一个参数为所要画按钮的坐标,第二个参数为按钮名字
//成功返回true,失败返回false
int DrawBtn(SDL_Rect myrect, char *Btntitle);
//描绘图案
//第一个参数为事件对象和按钮坐标,第二个参数为按钮名字,第三个参数为按钮弹起按下标记
//成功返回true,失败返回false
int Draw(SDL_Rect myrect, char *BtnTitle, int Flag);
//鼠标按下处理的事件
//参数为事件对象
//成功返回true,失败返回false
int OnMouseDown(SDL_Event event);
//鼠标弹起处理的事件
//参数为事件对象
//成功返回true,失败返回false
int OnMouseUp(SDL_Event event);
//事件处理
void *Event(void *junk);
//获取用户输入控制信息
void *getCtrlMessage(void *junk);
//比较触摸屏位置与哪个按钮向对应,返回值为生成按钮时的编号
int comparison(struct ts_sample, BtnInfo BtnArray[]);     

#ifdef __cplusplus
}
#endif     

#endif     

/*  Surface.c*/
#include "Surface.h"
BtnInfo BtnArray[10];
Uint32 BeginTicks, EndTicks;
static int PlayerStarts = 0;
static int PlayerIndex = 0;
SDL_Rect PRect;
static int BtnCount = 0;
static int STATE_EVENT = 4;
struct tsdev *ts;
struct ts_sample sample;
int SDLInit()
{
    SDL_Rect BRect = {0, 0, 32, 48};
    if(SDL_Init(SDL_INIT_VIDEO) < 0 || TTF_Init() < 0 )
    {
        printf("Init error\n");
        return false;
    }
    SDL_Surface *screen = SDL_SetVideoMode(640, 480, 16, SDL_SWSURFACE);
    if(!screen)
    {
        printf("Init video mode error\n");
        return false;
    }
    SDL_Surface *PlayerImage = SDL_LoadBMP("./player.bmp");
    if (PlayerImage == NULL)
    {
        fprintf(stderr, "Couldn't load player, %s\n", SDL_GetError());
        return error;
    }
    //读取第一个像素
    Uint8 key = *((Uint8 *)PlayerImage->pixels);
    //设置色键
    SDL_SetColorKey(PlayerImage, SDL_SRCCOLORKEY, key);     

    RegisterScreenImage(PlayerImage);     

    PRect.x = 0;    //初始化动画显示的图片。
    PRect.y = 0;
    PRect.w = 32;
    PRect.h = 48;
                //贴上测试用的表面
    if (SDL_BlitSurface(PlayerImage, &PRect, screen, &BRect) < 0)
    {
        fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError()); //看看提示吧
        return error;
    }
    RegisterScreen(screen);
    SDL_UpdateRects(screen,1,&screen->clip_rect);
    return true;
}     

int freeSDL()
{
    SDL_Quit();
    return true;
}     

int DrawBtn(SDL_Rect myrect, char *Btntitle)
{
    TTF_Font * font = TTF_OpenFont("simfang.ttf", 20);
    SDL_Color color = {255, 255, 255};
    SDL_Rect temprect;
    SDL_Surface *screen  = ObtainScreen();
    if(!screen)
        return ;
    SDL_FillRect(screen, &myrect, 0x9eabff);
    hlineRGBA(screen, myrect.x, myrect.x + myrect.w, myrect.y, 0xff, 0xff, 0xff, 0xff);
    vlineRGBA(screen, myrect.x, myrect.y, myrect.y + myrect.h, 0xff, 0xff, 0xff, 0xff);
    hlineRGBA(screen, myrect.x + 1, myrect.x + myrect.w - 1, myrect.y + myrect.h - 1, 0x00, 0x00, 0x00, 0xff);
    vlineRGBA(screen, myrect.x + myrect.w - 1, myrect.y + 1, myrect.y + myrect.h - 1, 0x00, 0x00, 0x00, 0xff);
    SDL_Surface *text = TTF_RenderUTF8_Solid(font, Btntitle, color);
    temprect.x = myrect.x + 5;
    temprect.y = myrect.y + 10;
    temprect.w = myrect.w - 10;
    temprect.h = myrect.h - 20;
    SDL_BlitSurface(text, 0, screen, &temprect);
    RegisterScreen(screen);
    SDL_UpdateRect(screen, myrect.x, myrect.y, myrect.w, myrect.h);
    //每增加一个Btn就将其按钮信息保存在全局变量之中
    BtnArray[BtnCount].rect = myrect;
    BtnArray[BtnCount].BtnTitle = (char *)malloc(sizeof(char)*(strlen(Btntitle)+1));
    strcpy(BtnArray[BtnCount].BtnTitle, Btntitle);
    BtnArray[BtnCount].Flag = true;
    BtnCount++;
    TTF_CloseFont(font);
    return true;
}     

int Draw(SDL_Rect myrect, char *BtnTitle, int Flag)
{
    SDL_Rect temprect;
    TTF_Font * font = TTF_OpenFont("simfang.ttf", 20);
    SDL_Color color = {255, 255, 255};
    SDL_Surface *screen  = ObtainScreen();
    if(!screen)
        return ;
    SDL_FillRect(screen,&myrect,0x9eabff);     

    if(Flag)
    {
        hlineRGBA(screen,myrect.x,myrect.x + myrect.w,myrect.y,0xff,0xff,0xff,0xff);
        vlineRGBA(screen,myrect.x,myrect.y,myrect.y + myrect.h,0xff,0xff,0xff,0xff);     

        hlineRGBA(screen,myrect.x + 1,myrect.x + myrect.w - 1,myrect.y + myrect.h - 1,0x00,0x00,0x00,0xff);
        vlineRGBA(screen,myrect.x + myrect.w - 1,myrect.y + 1,myrect.y + myrect.h - 1,0x00,0x00,0x00,0xff);     

        SDL_Surface *text = TTF_RenderUTF8_Solid(font, BtnTitle, color);     

        temprect.x = myrect.x + 5;
        temprect.y = myrect.y + 10;
        temprect.w = myrect.w - 10;
        temprect.h = myrect.h - 20;
        SDL_BlitSurface(text, 0, screen, &temprect);
    }
    else
    {
        hlineRGBA(screen,myrect.x,myrect.x + myrect.w,myrect.y,0x00,0x00,0x00,0xff);
        vlineRGBA(screen,myrect.x,myrect.y,myrect.y + myrect.h,0x00,0x00,0x00,0xff);     

        hlineRGBA(screen,myrect.x + 1,myrect.x + myrect.w - 1,myrect.y + myrect.h - 1,0xff,0xff,0xff,0xff);
        vlineRGBA(screen,myrect.x + myrect.w - 1,myrect.y + 1,myrect.y + myrect.h - 1,0xff,0xff,0xff,0xff);     

        SDL_Surface *text = TTF_RenderUTF8_Solid(font, BtnTitle, color);
        temprect.x = myrect.x + 7;
        temprect.y = myrect.y + 13;
        temprect.w = myrect.w - 10;
        temprect.h = myrect.h - 20;
        SDL_BlitSurface(text, 0, screen, &temprect);
    }
    SDL_UpdateRect(screen,myrect.x,myrect.y,myrect.w,myrect.h);
    return true;
}     

int OnMouseDown(SDL_Event event)
{
        if(STATE_EVENT == 4)
            return false;
        PlayerStarts = STATE_EVENT+1;
        BtnArray[STATE_EVENT].Flag = false;
        Draw(BtnArray[STATE_EVENT].rect, BtnArray[STATE_EVENT].BtnTitle, BtnArray[STATE_EVENT].Flag);
        return true;
}     

int OnMouseUp(SDL_Event event)
{     

        if(STATE_EVENT == 4)
            return false;
        PlayerStarts = 0;        

        BtnArray[STATE_EVENT].Flag = true;
        Draw(BtnArray[STATE_EVENT].rect, BtnArray[STATE_EVENT].BtnTitle, BtnArray[STATE_EVENT].Flag);     

        return true;     

}     

void *Event(void *junk)
{
    SDL_Surface *screen  = ObtainScreen();
    SDL_Rect BRect = {0, 0, 32, 48};
    BeginTicks = SDL_GetTicks();
    while(true)
    {     

        SDL_MouseButtonEvent event;
        SDL_Event event1 ;     

        if(sample.pressure)
        {
            event.type = SDL_MOUSEBUTTONDOWN;
            event.state = SDL_PRESSED;
        }
        else
        {
            event.type = SDL_MOUSEBUTTONUP;
            event.state = SDL_RELEASED;
        }
        event.x = sample.x;
        event.y = sample.y;     

        event.which = 0;
        event.button = 0;     

        event1.button = event ;
        SDL_PushEvent(&event1);     

        SDL_Event event2;
        SDL_WaitEvent(&event2);
        SDL_Delay(50);
        switch(event2.type)
        {
            case SDL_MOUSEBUTTONDOWN:
                OnMouseDown(event2);
                break;
            case SDL_MOUSEBUTTONUP:
                OnMouseUp(event2);
                break;
            case SDL_QUIT:
                goto Exit;
                break;     

        }     

        EndTicks = SDL_GetTicks();//运用定时器     

                            //到了50MS
        BeginTicks = EndTicks;
        SDL_FillRect(screen, &BRect, 0); //清除以前的图片。     

        if(PlayerStarts)
        {
            switch (PlayerStarts)
            {
                case 1: //向上移动。
                    if((BRect.y - 5) > 0)
                    {
                        BRect.y -= 5;
                    }     

                    else
                    {
                        BRect.y = 0;    //设置位置在顶部。
                    }
                    PRect.x = PlayerIndex * 32; //使用序号计算该显示那个动画图片
                    PRect.y = 144;      //向上的图组     

                    PlayerIndex ++;     //动画序号加1
                    if(PlayerIndex > 2)
                        PlayerIndex = 0; //循环显示动画
                break;
                case 2:
                    if((BRect.y + BRect.h + 5) < screen->h)
                    {
                        BRect.y += 5;
                    }
                    else
                    {
                        BRect.y = screen->h - BRect.h;
                    }
                    PRect.x = PlayerIndex * 32;
                    PRect.y = 0;
                    PlayerIndex ++;
                    if(PlayerIndex > 2)
                        PlayerIndex = 0;
                    break;
                case 3:
                    if((BRect.x - 5) > 0)
                    {
                        BRect.x -= 5;
                    }
                    else
                    {
                        BRect.x = 0;
                    }
                    PRect.x = PlayerIndex * 32;
                    PRect.y = 48;
                    PlayerIndex ++;
                    if (PlayerIndex > 2)
                        PlayerIndex = 0;
                break;
                case 4:
                    if((BRect.x + BRect.w + 5) < screen->w)
                    {
                        BRect.x += 5;
                    }
                    else
                    {
                        BRect.x = screen->w - BRect.w;
                    }
                    PRect.x = PlayerIndex * 32;
                    PRect.y = 96;
                    PlayerIndex ++;
                    if(PlayerIndex > 2)
                        PlayerIndex = 0;
                break;
            }
            }
            SDL_Surface *PlayerImage  = ObtainScreenImage();     

            if(SDL_BlitSurface(PlayerImage, &PRect, screen, &BRect) < 0)
            {
                fprintf(stderr, "BlitSurface error : %s\n", SDL_GetError());
                return NULL;
            }     

        SDL_Flip(screen);
    }
Exit:
    freeSDL();
}     

int comparison(struct ts_sample sample, BtnInfo BtnArray[])
{
    int i = 0;
    for(; i < BtnCount; i++)
    {
        if((sample.x >= BtnArray[i].rect.x && sample.x <= (BtnArray[i].rect.x+BtnArray[i].rect.w)) &&
                (sample.y >= BtnArray[i].rect.y && sample.y <= (BtnArray[i].rect.y+BtnArray[i].rect.h)))
            return i;
    }     

}     

/*线程t_c,用于拾取用户操作命令*/
void *getCtrlMessage(void *junk)
{
    int fangdou_flag = 1;   //防抖标志。1:处理触摸点信息许可 ,0:处理触摸点信息禁止
    int choice;     

   ts = ts_open("/dev/event1", 0);
    if(!ts)
    {
        printf("open device error!\n");
        return NULL;
    }
    if(ts_config(ts))
    {
        perror("ts_config\n");
        return NULL;
    }     

    for(;;)
    {     

        if(ts_read(ts , &sample, 1))
        {
                /*只处理第一个触摸点信息*/
            if((sample.pressure) && (fangdou_flag == 1))
            {     

                choice = comparison(sample, BtnArray);
                switch(choice)
                {
                    case 0:
                        STATE_EVENT = 0;
                        break;
                    case 1:
                        STATE_EVENT = 1;
                        break;
                    case 2:
                        STATE_EVENT = 2;
                        break;
                    case 3:
                        STATE_EVENT = 3;
                        break;
                    default:
                        STATE_EVENT = 4;
                        break;
                }     

               fangdou_flag = 0;    //防止处理那些由于抖动所产生触摸点信息     

            }     

            if(sample.pressure == 0)
                fangdou_flag = 1;
        }
    }
                /*关闭触摸屏设备文件*/
    ts_close(ts);
}
/*main.c*/
#include "Surface.h"
#include <pthread.h>     

int main(int argc, char *argv[])
{
    pthread_t t_a;
    pthread_t t_b;
    SDL_Rect myrect = {290, 385, 60, 40};
    SDL_Rect myrect1 = {290, 435, 60, 40};
    SDL_Rect myrect2 = {220, 435, 60, 40};
    SDL_Rect myrect3 = {360, 435, 60, 40};
    SDLInit();     

    DrawBtn(myrect, "上");
    DrawBtn(myrect1, "下");
    DrawBtn(myrect2, "左");
    DrawBtn(myrect3, "右");
    SDL_ShowCursor(0);     

    pthread_create(&t_a, NULL, Event, (void *)NULL);
    pthread_create(&t_b, NULL, getCtrlMessage, (void *)NULL);
    pthread_join(t_a, NULL);         

    freeSDL();
    return 0;
}

本文出自 “驿落黄昏” 博客,请务必保留此出处http://yiluohuanghun.blog.51cto.com/3407300/863971

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, sdl
, event
, 插件gcc和sdl
, sdl初学问题
, screen
, sdl设计
event.x
,以便于您获取更多的相关知识。

时间: 2024-12-03 17:23:33

SDL历程:课程设计之精灵图的相关文章

基础-JAVA课程设计实数计算器求指导思路

问题描述 JAVA课程设计实数计算器求指导思路 [问题描述]运用面向对象程序设计知识,利用Java语言设计和实现一个复数计算器.要求具备如下主要功能: (1)建立实数类.复数类 (2)实现实数.复数信息的初始化 (3)实现实数的加.减.乘.除.自增.自减.求平方.二次方根等操作 (4)实现复数的加.减.乘.除.取模.求平方.求共轭复数.求单个复数的向量角.求两个复数的夹角等运算 (5)实现实数.复数信息的输出 在实现过程中,需利用面向对象程序设计理论的基础知识,充分体现出Java语言关于类.继承

C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类

问题描述 C++课程设计老师说我没有用到类 求指教这段代码要怎么修改加上类 #include #include #include using namespace std; const double pi = 3.14159265; const double e = 2.718281828459; const int SIZE = 1000; typedef struct node//为了处理符号而建立的链表(如: 1+(-2)) { char data; node *next; }node; t

数据库课程设计具体要怎么做

问题描述 数据库课程设计具体要怎么做 数据库课程设计具体要怎么做,准确地说是用SQLserver写语句建表等等时要怎么做 解决方案 数据库课程设计数据库课程设计数据库课程设计 解决方案二: 找一本sql语句的教材,先了解sql语句的用法,然后多动手写一些. 解决方案三: http://www.w3school.com.cn/sql/index.asp 各种基础学习 解决方案四: 百度,搜SQLserver简单建表语句

Java小例子:图书馆课程设计

用 Java 模拟一个图书馆.包括创建图书.创建读者.借书.还书.列出所有图书. 列出所有读者.列出已借出的图书.列出过期未还的图书等功能.每个读者最多只能借 3 本书,每个书最多只能借 3 个星期,超过就算过期. 下面是一个命令行下的实现.这个例子的主要目的是向初学者展示内部类的好处. Command 及其子类都是 LibrarySimulator 的内部类.它们可以无阻碍的访问 LibrarySimulator 的成员.使用内部类,而不是大量的 if-else,让程序更容易扩展. 01.im

c语言课程设计总结心得大全

c语言课程设计心得体会范文一: 课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,单片机已经成为当今计算机应用中空前活跃的领域, 在生活中可以说得是无处不在.因此作为二十一世纪的大学来说掌握单片机的开发技术是十分重要的. 回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从选题到定稿,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固

java 课程设计 投票统计

问题描述 java 课程设计 投票统计 课程设计,照着书做也不会,能不能就是给一个完整的代码,一次就可以编译执行,功能就是点一下哪个人的头像,那个人的票数就增加一个,然后点显示得票数就能显示三个人的票数 解决方案 Java 小例子:图书馆课程设计Java 小例子:图书馆课程设计 解决方案二: 先Mark一下我也想知道这个怎么解决最近在学IO

java ee-软件工程课程设计!!!求指导

问题描述 软件工程课程设计!!!求指导 使用java,jsp ,数据库,ajax,等等技术,开发一款电子商务平台,能够进行正常的运转,不要求最先进的技术,但要完成最基本的需求.. 解决方案 http://www.jb51.net/books/292002.html 解决方案二: 这种系统一般用mvc三层结构比较好做

叶子结点-二叉树的c++编程,我们做课程设计

问题描述 二叉树的c++编程,我们做课程设计 二叉树的前序,中序,后序遍历,求叶子结点,结点个数,和深度的编程 解决方案 用MatLAB做电路课程设计教你做课程设计! 解决方案二: http://www.cnblogs.com/elleniou/archive/2012/05/03/2480042.html

系统-数据库课程设计 在线等

问题描述 数据库课程设计 在线等 一.设计内容与设计要求1.设计内容:针对具体的问题,完成从系统的需求分析.数据库的概念设计.数据库的逻辑设计,到数据库实现等设计过程,最终实现一个较为完整的反映应用需求的数据库系统.下面是各个设计阶段的具体内容.⒈ 系统需求分析画出系统的数据流图,写出较为详细的数据字典.⒉ 数据库的概念设计画出局部E-R图和全局E-R图.⒊ 数据库的逻辑设计将概念设计阶段产生的全局概念模式(E-R图)转换成初始的关系模式.对关系模式进行规范化处理.根据设计所要求的规范级别,逐一