文档章节

5. SDL游戏开发:肢解“人民币“

一一无念
 一一无念
发布于 2012/11/06 12:59
字数 947
阅读 962
收藏 6

在上一篇文章里,我们做了一个“加法”把两张图片合成,费了好大功夫才搞定,要是用PS可快了,我说哥们,这没可比性!现在要做减法,就好比你工作是挣钱,你总得花钱吧!上大学的时候,有这么一苦逼事,全班男生集体赌博,凭借着过硬技术和良好的心态,竟然横扫,373张1毛的钞票进了裤袋,那上面要是毛爷爷该多好!可惜的是它抵不过半个毛爷爷。回过头继续上小学,今天任务就是把图片支解。

这样做的好处是,如果你要用很多图片时,不停加截图片是不是很烦,不停进行(文件)IO操作也有风险,所以就集成一张图片,这就是昨天加法,下面是做减法的时候,就是取出图片里的具体图形。

#include "SDL/SDL.h"
#include "SDL/SDL_image.h"
#include <string>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *dots = NULL;
SDL_Surface *screen = NULL;

//The event structure
SDL_Event event;

//The portions of the sprite map to be blitted 发现SDL_Rect了
SDL_Rect clip[ 4 ];

SDL_Surface *load_image( std::string filename )
{
    //The image that's loaded
    SDL_Surface* loadedImage = NULL;

    //The optimized surface that will be used
    SDL_Surface* optimizedImage = NULL;

    //Load the image
    loadedImage = IMG_Load( filename.c_str() );

    //If the image loaded
    if( loadedImage != NULL ){
        //Create an optimized surface
        optimizedImage = SDL_DisplayFormat( loadedImage );

        //Free the old surface
        SDL_FreeSurface( loadedImage );

        //If the surface was optimized
        if( optimizedImage != NULL ){
            //Color key surface 对比上篇的代码发现有什么改进没??
            SDL_SetColorKey( optimizedImage, SDL_SRCCOLORKEY, SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF ) );
        }
    }
    //Return the optimized surface
    return optimizedImage;
}

void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip = NULL )
{
    //Holds offsets
    SDL_Rect offset;

    //Get offsets
    offset.x = x;
    offset.y = y;

    //Blit
    SDL_BlitSurface( source, clip, destination, &offset );
}

bool init()
{
    //Initialize all SDL subsystems
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ) {
        return false;
    }

    //Set up the screen
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    //If there was an error in setting up the screen
    if( screen == NULL ){
        return false;
    }

    //Set the window caption
    SDL_WM_SetCaption( "Split the dots", NULL );

    //If everything initialized fine
    return true;
}

bool load_files()
{
    //Load the sprite map
    dots = load_image( "dots.png" );

    //If there was an problem loading the sprite map
    if( dots == NULL ){
        return false;
    }

    //If eveything loaded fine
    return true;
}

void clean_up()
{
    //释放图片内存
    SDL_FreeSurface( dots );

    //退出SDL
    SDL_Quit();
}

int main( int argc, char* args[] )
{
    //关闭标志
    bool quit = false;

    //初始化
    if( init() == false ) {
        return 1;
    }

    //Load the files
    if( load_files() == false ) {
        return 1;
    }
    /*取图像 */
    //Clip range for the top left  左上圆
    clip[ 0 ].x = 0;
    clip[ 0 ].y = 0;
    clip[ 0 ].w = 100;
    clip[ 0 ].h = 100;

    //Clip range for the top right 右上圆
    clip[ 1 ].x = 100;
    clip[ 1 ].y = 0;
    clip[ 1 ].w = 100;
    clip[ 1 ].h = 100;

    //Clip range for the bottom left 左下圆
    clip[ 2 ].x = 0;
    clip[ 2 ].y = 100;
    clip[ 2 ].w = 100;
    clip[ 2 ].h = 100;

    //Clip range for the bottom right 右下圆
    clip[ 3 ].x = 100;
    clip[ 3 ].y = 100;
    clip[ 3 ].w = 100;
    clip[ 3 ].h = 100;

    //先把整个窗口设为白色
    SDL_FillRect( screen, &screen->clip_rect, SDL_MapRGB( screen->format, 0xFF, 0xFF, 0xFF ) );

    //Apply the sprites to the screen 块移图片,把dots进行了分解块移
    apply_surface( 0, 0, dots, screen, &clip[ 0 ] );
    apply_surface( 540, 0, dots, screen, &clip[ 1 ] );
    apply_surface( 200, 200, dots, screen, &clip[ 2 ] );
    apply_surface( 540, 380, dots, screen, &clip[ 3 ] );

    //Update the screen
    if( SDL_Flip( screen ) == -1 ) {
        return 1;
    }

    //While the user hasn't quit
    while( quit == false ) {
        //While there's events to handle
        while( SDL_PollEvent( &event ) ) {
            //If the user has Xed out the window
            if( event.type == SDL_QUIT ) {
                //Quit the program
                quit = true;
            }
        }
    }
    clean_up();

    return 0;
}

   保存为sdl05.cpp  编译

g++ -o sdl05 sdl06.cpp -lSDL -lSDL_image 
./sdl05

有图片有真相

果真如此吧,这个用法非常有用,因为在人物设计时往往是非常用效的。而如从不纯色的背景里取某个景特时,上述方法是不可取的。 因为他用到了透明处理,进行RGB图像映射。

而且更应该关注的事,当我们把其它窗口从上面拖过去的时候已经没有变成黑色的背景的现象,什么原因,留给后面再说吧。文章标题言过其实,就当是搏个眼球,当然人民肯定是能支解的,毛爷爷会变成工家兵,不过有机会一定要要试试支解下人民币。

© 著作权归作者所有

一一无念
粉丝 58
博文 36
码字总数 18408
作品 0
长沙
私信 提问
加载中

评论(1)

红尘一人
红尘一人
持续关注ing。。。UP
6.SDL游戏开发:玩玩文字的游戏reading the fuck source code

TTF(TrueTypeFont)是一种字库名称。TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式。首先我们先看下win...

一一无念
2012/11/06
495
1
SDL农场游戏开发 1.环境搭建

由于我个人受到传统农场类游戏的熏陶,因此萌生出了开发一个类似于QQ农场的游戏。 本次游戏打着SDL的幌子(这么说自己真的好么),其实使用的是SDLEngine,它是我闲暇时模仿cocos2dx而写的一...

小牛_牛sky
2018/12/01
0
0
SDL的几个宽高概念讲解(文中有福利)

[图片上传中。。。(1)] 圈子朋友公众号福利: 「安卓干货铺」节后送书福利-感谢大家一直以来对我的支持! SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 ...

代码GG陆晓明
2017/10/28
0
0
1.SDL游戏开发:环境搭建与测试

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个...

一一无念
2012/11/05
2.7K
4
网易魔兽遭遇重金处罚 罚金约1.5—5亿人民币

知情人士披露,版署处罚网易的金额不及预期的高,处罚金额可能介于在1.5—5亿人民币之间。此前,国外券商MainFirst曾发表报告称, 如果网易不遵守版署通知要求,将停止魔兽的互联网接入服务,...

红薯
2010/01/07
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

观点 | 用 MySQL 数据库,到底会不会被“卡脖子”?

>作者:明溪源 **用 MySQL 数据库,到底会不会被“卡脖子”?** 在近期不明朗的贸易形势下,一些正在规划数据库选型、迁移的用户,纷纷询问我们对 MySQL 未来前景的看法。那么使用 MySQL 数据...

爱可生
27分钟前
10
0
千万级流量架构下的负载均衡解析

一、负载均衡 负载均衡算法 转发实现 二、集群下的 Session 管理 Sticky Session Session Replication Session Server 一、负载均衡 集群中的应用服务器(节点)通常被设计成无状态,用户可以...

李红欧巴
31分钟前
75
0
一元建站-基于函数计算 + wordpress 构建 serverless 网站

前言 本文旨在通过 快速部署一个 wordpress 网站到阿里云函数计算平台 这个示例来展示 serverless web 新的开发模式, 包括 FUN 工具一键初始化 NAS, 同步网站到 NAS, 一键部署等能力, 展现函...

阿里云官方博客
33分钟前
5
0
Spring Security 整合JWT(四)

一、前言 本篇文章将讲述Spring Security 简单整合JWT 处理认证授权 基本环境 spring-boot 2.1.8 mybatis-plus 2.2.0 mysql 数据库 maven项目 Spring Security入门学习可参考之前文章: Spri...

郑清
34分钟前
7
0
零基础怎么玩转可视化大屏?这个工具只需5步!

大屏可视化怎么这么火?领导天天要,业务人员、开发人员、IT页面师就得一块熬夜加班,要是不会做大屏,都不好意思说自己做报表、做IT。 也许有人会告诉你,可视化大屏可以用JS+Ecahrts编程实...

朕想上头条
36分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部