游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4339|回复: 11

2d滚屏游戏的精灵绘制???

[复制链接]

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-6-18 23:34:00 | 显示全部楼层 |阅读模式
请教前悲们:

在做2D滚屏游戏时,往往把精灵分为可见和不可见,然后把可见的精灵绘制到后备缓冲区中 再翻页(??:可能是这样),
可是有些精灵位图是一部分可见,而另一部分不可见(在屏幕边缘上)。
像这种情况应该采用哪种方法绘制呢?
谢谢!!!  

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-6-19 11:49:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

你引擎中的Blit需要支持裁减功能
这是我引擎中的代码,写得烂,只说明可以这样做

//********根据源位图的长宽裁减一个矩形*******
//Width,Height:源位图的长宽
//pRect:源位图的矩形区域的指针,数据将会被修整
//返回值:如果矩形不存在了,说明不用绘制,返回false
//*******************************************
inline bool CheckSrcRect(int Width,int Height,RECT *pRect)
{
        //超过下限
        if( Height < pRect->bottom )
                pRect->bottom = Height;
        if( Height < pRect->top )
                pRect->top = Height;
        //超过右限
        if( Width < pRect->right )
                pRect->right = Width;
        if( Width < pRect->left )
                pRect->left = Width;
        //超过上限
        if( pRect->top < 0 )
                pRect->top = 0;
        if( pRect->bottom < 0 )
                pRect->bottom = 0;
        //超过左限
        if( pRect->left < 0 )
                pRect->left = 0;
        if( pRect->right < 0 )
                pRect->right = 0;

        //如果矩形的面积为0了
        if (pRect->left==pRect->right ||
                pRect->top ==pRect->bottom)
                return false;
        return true;
}

//*****根据目标位图的长宽,以及起始位置和源位图的矩形区域来对矩形区域进行裁减*******
//x,y:目标位图中的起始位置的引用,可能会被此函数修改
//destW,destH:目标位图的长,宽
//pRect:源位图的矩形区域的指针,数据会被修整
//返回值:如果矩形不存在了,说明不用绘制,返回false
//**********************************************************************************
inline bool CheckDestRect(int &x,int &y,int destW,int destH,RECT *pRect)
{
        if(x<0)
                {//超出目标位图的左边
            if((-x)>(pRect->right-pRect->left))
                return false;//完全超出目标位图的左边
                        pRect->left=pRect->left-x;
            x=0;
        }
        if(x>(destW-(pRect->right-pRect->left)) )
                {
            //超出目标位图的右边
            if(x>destW)
                return false;//完全超出目标位图的右边
            else
                pRect->right=destW+pRect->left-x-1;
        }
        if(y<0)
                {//超出目标位图的上边
            if((-y)>(pRect->bottom-pRect->top))
                return false;//完全超出目标位图的上边
            pRect->top=pRect->top-y;
            y=0;
        }
        if(y>(destH-(pRect->bottom-pRect->top)) )
                {//超出目标位图的底边
            if(y>destH)
                return false;//完全超出目标位图的底边
            else
                pRect->bottom=destH+pRect->top-y-1;
        }
                return true;
}

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-6-19 12:59:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

不想自己写裁减代码的话,用Clipper吧!

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-6-19 18:50:00 | 显示全部楼层

谢谢你们的帮助!

谢谢 LoLitter 提供的代码!我理解了,你写得很好!谢谢!!

william9527前辈说的裁剪器不知在D3D9 中Surface上是否支持呢??

10

主题

95

帖子

95

积分

注册会员

Rank: 2

积分
95
QQ
发表于 2006-6-20 12:08:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

总觉得剪裁器是DDraw专有的吧,而且剪裁器比较影响速度,一般只在窗口模式下给主表面使用一个

14

主题

61

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2006-6-20 12:14:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

用D3D把,全自动而且高效~

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-6-20 13:39:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

如果使用的是DDRAW中的surface的话,一个方法就是自己编写裁减代码,2楼已经提供了代码,再有就是可以参考《windows游戏大师技巧》里面的裁减代码。如果是D3d9的话,用sprite比较方便。

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2006-6-20 19:25:00 | 显示全部楼层

Re:再问一个问题?

在使用 Tile 拼接地图时,假设整个地图为  3200 * 700(像素)。
是应该在游戏初使化时一下子分配一个 3200 * 700 大的内存表面,然后在场景刷新时将要显示的场景块一下子传送到翻页表面呢??

还是在游戏运行中跟椐当前的场景动态的使用 Tile 拼接到翻页表面呢(假设800 * 600)?

很抱谦!我的问题很罗嗦也很幼致!
我以前用Qbasic 做过一些小动画和小游戏,由于当时没有书和网络,所以在实现上都是一个苯办法,现在用VC 还得学很多基本的东西。

肯请前辈们多多指教,谢谢!!!

8

主题

310

帖子

311

积分

中级会员

Rank: 3Rank: 3

积分
311
QQ
发表于 2006-6-20 20:27:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

如果是Tile 拼接地图的话,只要在内存里存储tile属性数组,并不要游戏初使化时一下子分配一个 3200 * 700 大的内存表面.

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2006-6-21 14:38:00 | 显示全部楼层

Re:2d滚屏游戏的精灵绘制???

一下子分配一块大的显存表面,有些显卡可能不支持,所以把地图分成大小一致的一些Tile还是很好的方法。建议你看看《windows游戏大师技巧》,里面讲的很详细。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-24 19:19

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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