游戏地图

rong007 2003-12-16 03:29:15
请问怎么样将一幅64*62的地图图片,可以放大来做地图的呀/????
我用下面的方法实现不了

#include "main.h"

LPDIRECTDRAW7 lpDD;//创建DDraw对像
LPDIRECTDRAWSURFACE7 lpDDSPrimary; //主表面
LPDIRECTDRAWSURFACE7 lpDDSBuffer;//后台缓存页
LPDIRECTDRAWSURFACE7 lpDDSBack;//离屏页
LPDIRECTDRAWSURFACE7 lpDDSTile;
LPDIRECTDRAWPALETTE lpDDSPal;//调色板对象
char szMsg1[]="我的测试游戏";
char szMsg2[]="好难";
Game *game;
RECT rect;
int Game::Init()
{

DDSURFACEDESC2 ddsd;
if(DirectDrawCreateEx(NULL,(void **)&lpDD,IID_IDirectDraw7,NULL) !=DD_OK)
return 0;//创建对象
if(lpDD->SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) !=DD_OK)
return 1;//设置控制级
if(lpDD->SetDisplayMode(640,480,8,0,0) !=DD_OK)
return 2;//设置显示模式
memset(&ddsd,0,sizeof(ddsd));
ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount=1;// 一个后台缓存
if(lpDD->CreateSurface(&ddsd,&lpDDSPrimary,NULL)!=DD_OK)
return 3;//创建主表面
ddsd.ddsCaps.dwCaps =DDSCAPS_BACKBUFFER;
if(lpDDSPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpDDSBuffer) !=DD_OK)
return 4;//创建后台缓存

ddsd.dwSize=sizeof(ddsd);
ddsd.dwFlags=DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps=DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth=1280;
ddsd.dwHeight=640;
if(lpDD->CreateSurface(&ddsd,&lpDDSBack,NULL) !=DD_OK)
return 5;//创建离屏页面
ddsd.dwWidth=64;
ddsd.dwHeight=62;
if(lpDD->CreateSurface(&ddsd,&lpDDSTile,NULL) !=DD_OK)
return 6;//图片离屏页面
return -1;
}

void Game::Refresh()
{
if(lpDD!=NULL)
{
if(lpDDSPrimary!=NULL)
{
lpDDSPrimary->Release();
lpDDSPrimary=NULL;
}
lpDD->Release();
lpDD=NULL;
}
}

Game::Game()
{

}
Game::~Game()
{

}

void Game::outext()
{
HDC hdc;
static int i = 0;

//后台缓冲表面上的操作

if ( lpDDSBuffer->GetDC(&hdc)==DD_OK ){

SetBkColor ( hdc, RGB(0+i,255-i,0+i) ) ;

SetTextColor ( hdc, RGB( 0+i,0+i,255-i) ) ;

TextOut ( hdc, 220, 200, szMsg1, lstrlen(szMsg1) ) ;

TextOut ( hdc, 280, 220, szMsg2, lstrlen(szMsg2) ) ;

lpDDSBuffer->ReleaseDC(hdc) ;
i+=10 ;

if ( i>255) i=0 ;

}

if (lpDDSPrimary->Flip(NULL,0)!=DD_OK)
{ //一经Flip,两个表面的指针互换!lpDDSPrimary指向后台表面,所以

game->Refresh(); //你就看到刚才在后台表面上写的字了,而lpDDSBack指向了原来的前台主表面

//把它掉到后台进行操作

}
}

void Game::outbmp()
{
//----------清除页面-----------------
DDBLTFX ddBltFx;
ddBltFx.dwSize=sizeof(DDBLTFX);
ddBltFx.dwFillPixel=0;
lpDDSBack->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
DDReLoadBitmap(lpDDSBack,"Tile.BMP");
DDSetColorKey(lpDDSBack,RGB(255,0,255));
//初始化背景
srand(GetTickCount());
int i,j;
for (i=0;i<20;i++)
for(j=0;j<20;j++)
{
int ran=rand()%2;
MakeRect(0,ran*31,64,ran*31+31);
lpDDSBack->BltFast(608-32*i+32*j,16*i+16*j,lpDDSTile,&rect,SrcKey);
}

/*
POINT curpos;
GetCursorPos(&curpos);
MakeRect(0,0,32,26);
*/
MakeRect(0,0,600,600);
game->Blt(0 ,0);
lpDDSPrimary->Flip(NULL,0);

}
void MakeRect(int left,int top,int right,int bottom)
{

rect.left=left;
rect.top=top;
rect.right=right;
rect.bottom=bottom;
}
void Game::Blt(int x,int y)
{
int rl,rt,tx1,tx2,ty1,ty2,tl,tt;

RECT rect2=rect;

rl=rect.left;
rt=rect.top;

if (rect.left>=1280)
goto noblt; //越界,不Blt
if (rect.top>=640)
goto noblt;
if (rect.right<=0)
goto noblt;
if (rect.bottom<=0)
goto noblt;

if (rect.left<0)
rect.left=0;
if (rect.top<0)
rect.top=0;
if (rect.right>1280)
rect.right=1280;
if (rect.bottom>640)
rect.bottom=640;

tx1=x+rect.left-rl;
ty1=y+rect.top-rt;
tx2=x+rect.right-rl;
ty2=y+rect.bottom-rt;

if (tx2<=0)
goto noblt;
if (ty2<=0)
goto noblt;
if (tx1>=640)
goto noblt;
if (ty1>=480)
goto noblt;

tl=tx1;
tt=ty1;

if (tx1<0)
tx1=0;
if (ty1<0)
ty1=0;
if (tx2>640)
tx2=640;
if (ty2>480)
ty2=480;

rl=rect.left;
rt=rect.top;

rect.left=tx1-tl+rl;
rect.top=ty1-tt+rt;
rect.right=tx2-tl+rl;
rect.bottom=ty2-tt+rt;

lpDDSBuffer->BltFast(tx1,ty1,lpDDSBack,&rect,SrcKey);
noblt:
rect2=rect;
}
...全文
43 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangdali 2003-12-23
  • 打赏
  • 举报
回复
64*64 扩到 640*480 都够戗,那有那么好的插值算法呀!!
剩剩力气吧!!
天堂里的死神 2003-12-22
  • 打赏
  • 举报
回复
是想把图片的一角放大是吗?
BLT可能利用的是把点简单扩大到一个方块,例如你要把一张图片放大为4倍,那么一个像素点就会被扩大为同样颜色的四个像素点,图片扩的越大,失真越厉害。
1 :利用photoshop等软件手动扩大地图那一角,这些软件会自己做插值运算。失真不会很严重(blt本身缩放就不快,最好能用一个满足需要的图片)。然后单独把这一角贴出来到地图需要位置的上层。但是,如果你需要的不是离散的大小,而是动态变更的大小,那就没办法了。
2 :自己写插值算法。
rong007 2003-12-21
  • 打赏
  • 举报
回复
const DWORD SrcKey=DDBLTFAST_SRCCOLORKEY|DDBLTFAST_WAIT;

我现在要的就是把全的一个角可以拉大而不会出现那些格子,
我现在放大时,那个图片变了,变得很难看,大是大了,
int Game::outbmp()
{
DDBLTFX ddBltFx;//填涂颜色
ddBltFx.dwSize=sizeof(DDBLTFX);
ddBltFx.dwFillPixel=0;
lpDDSTile->Blt(NULL,NULL,NULL,DDBLT_WAIT|DDBLT_COLORFILL,&ddBltFx);
DDReLoadBitmap(lpDDSTile,"Tile.BMP");
DDSetColorKey(lpDDSTile,RGB(255,0,255));
MakeRect(0,0,100,100);
RECT rect2;
rect2.left=0;
rect2.top=0;
rect2.right=320;
rect2.bottom=320;
//lpDDSBuffer->BltFast(0,0,lpDDSTile,&rect,SrcKey);
lpDDSBuffer->Blt(&rect,lpDDSTile,NULL,DDBLT_WAIT|DDBLTFAST_SRCCOLORKEY,NULL);
lpDDSPrimary->Flip(NULL,0);
return 1;
}
我用BTL的也不行呀

火云洞红孩儿 2003-12-20
  • 打赏
  • 举报
回复
可惜你不用DX8的特性,一个函数就搞定

HRESULT CDisplay::CreateSurfaceFromBitmap( CSurface** ppSurface,
TCHAR* strBMP,
DWORD dwDesiredWidth,
DWORD dwDesiredHeight )
{
HRESULT hr;
HBITMAP hBMP = NULL;
BITMAP bmp;
DDSURFACEDESC2 ddsd;

if( m_pDD == NULL || strBMP == NULL || ppSurface == NULL )
return E_INVALIDARG;

*ppSurface = NULL;

// Try to load the bitmap as a resource, if that fails, try it as a file
hBMP = (HBITMAP) LoadImage( GetModuleHandle(NULL), strBMP,
IMAGE_BITMAP, dwDesiredWidth, dwDesiredHeight,
LR_CREATEDIBSECTION );
if( hBMP == NULL )
{
hBMP = (HBITMAP) LoadImage( NULL, strBMP,
IMAGE_BITMAP, dwDesiredWidth, dwDesiredHeight,
LR_LOADFROMFILE | LR_CREATEDIBSECTION );
if( hBMP == NULL )
return E_FAIL;
}

// Get size of the bitmap
GetObject( hBMP, sizeof(bmp), &bmp );

// Create a DirectDrawSurface for this bitmap
ZeroMemory( &ddsd, sizeof(ddsd) );
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
ddsd.dwWidth = bmp.bmWidth;
ddsd.dwHeight = bmp.bmHeight;

(*ppSurface) = new CSurface();
if( FAILED( hr = (*ppSurface)->Create( m_pDD, &ddsd ) ) )
{
delete (*ppSurface);
return hr;
}

// Draw the bitmap on this surface
if( FAILED( hr = (*ppSurface)->DrawBitmap( hBMP, 0, 0, 0, 0 ) ) )
{
DeleteObject( hBMP );
return hr;
}

DeleteObject( hBMP );

return S_OK;
}
CHINACFC 2003-12-20
  • 打赏
  • 举报
回复
是把64*62的地图图片放大整个做一幅地图,还是把它当一个地图元素,或者把它分成几个地图元素?
你的做不了是图根本不显示,还是显示不正确.
这么大一段代码放上来没多少人会看的,把问题描述清楚了.
看你outbmp()函数写的应该是把这幅图上下等分成两个地图元素.
lpDDSBack->BltFast(608-32*i+32*j,16*i+16*j,lpDDSTile,&rect,SrcKey);里的SrcKey是什么?
我记得最后的参数应该是全大写的,
也许是我记错了.回去看看在说吧.

8,324

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧