2013年8月19日星期一(demo7_16,色彩旋转)
来源:互联网 发布:linux系统配置ip地址 编辑:程序博客网 时间:2024/05/20 14:23
这一节也并不难,上周在另外一个机子上调试过了,原理是以相邻的色彩项或者寄存器的集合作为参数,然后以循环的方式移动它们的一种处理,这样使物体看起来像在移动,或者模拟流水。
我觉得原理很重要,从色彩color[c1]旋转到色彩color[c2];
Temp = color[c1];
For( int index = c1; index < c2; index ++ )
Color[c1] = color[c1+1];
Color[index] = temp;
设定一个函数
int Rotate_Colors( int start_index, int end_index )
{
int colors = end_index - start_index;
PALETTEENTRY work_pal[MAX_COLORS_PALETTE];
lpddpal->GetEntries( 0, start_index, colors, work_pal );
lpddpal->SetEntries( 0, start_index + 1,colors - 1, work_pal );
lpddpal->SetEntries( 0, start_index, 1, & work_pal[colors - 1] );
lpddpal->GetEntries( 0, 0, MAX_COLORS_PALETTE, palette );
return ( 1 );
}
在game_init()中,加载位图兵设置调色板,
{
。。。。。。
// load the 8-bit image
if (!Load_Bitmap_File(&bitmap,"waterfall8.bmp"))
return(0);
// load it's palette into directdraw
if (FAILED(lpddpal->SetEntries(0,0,MAX_COLORS_PALETTE,bitmap.palette)))
return(0);
// clean the surface
DDraw_Fill_Surface(lpddsprimary,0);
}
在Game_Main()中,旋转133至143的调色板项。
{
。。。。。。。。。。。
Rotate_Colors( 133, 143 );
}
下一步根据DEMO编写C++引擎,
加入一个成员函数
int Rotate_Colors(int start_index, int end_index );
成员变量的实现如下:
int DDRAW_Interface::Rotate_Colors(int start_index, int end_index )
{
int colors = end_index - start_index;
PALETTEENTRY work_pal[MAX_COLORS_PALETTE];
m_lpddpal->GetEntries( 0, start_index, colors, work_pal );
m_lpddpal->SetEntries( 0, start_index + 1,colors - 1, work_pal );
m_lpddpal->SetEntries( 0, start_index, 1, & work_pal[colors - 1] );
m_lpddpal->GetEntries( 0, 0, MAX_COLORS_PALETTE, palette );
return ( 1 );
}
在game_main()中
int Game_Main(void *parms = NULL,int num_parms = 0)
{
// this is the main loop of the game, do all your processing
// here
// make sure this isn't executed again
if (window_closed)
return(0);
// for now test if user is hitting ESC and send WM_CLOSE
if (KEYDOWN(VK_ESCAPE))
{
PostMessage(main_window_handle,WM_CLOSE,0,0);
window_closed = 1;
} // end if
ddraw->DDraw_Lock_Primary_Surface();
// get video pointer to primary surfce
UCHAR *primary_buffer = (UCHAR *)ddraw->getPrimarybuffer();
// test if memory is linear
if (ddraw->getPrimarylpitch() == SCREEN_WIDTH)
{
// copy memory from double buffer to primary buffer
memcpy((void *)primary_buffer, (void *)bitmap.buffer, SCREEN_WIDTH*SCREEN_HEIGHT);
} // end if
else
{ // non-linear
// make copy of source and destination addresses
UCHAR *dest_ptr = primary_buffer;
UCHAR *src_ptr = bitmap.buffer;
// memory is non-linear, copy line by line
for (int y=0; y < SCREEN_HEIGHT; y++)
{
// copy line
memcpy((void *)dest_ptr, (void *)src_ptr, SCREEN_WIDTH);
// advance pointers to next line
dest_ptr+=ddraw->getPrimarylpitch();
src_ptr +=SCREEN_WIDTH;
} // end for
} // end else
ddraw->DDraw_Unlock_Primary_Surface();
// animate the lights
ddraw->Rotate_Colors( 133, 143 );
// wait a sec
Sleep(33);
// do nothing -- look at pretty picture
// return success or failure or your own return code here
return(1);
} // end Game_Main
在game_init()中
int Game_Init(void *parms = NULL,int num_parms = 0)
{
// this is called once after the initial window is created and
// before the main event loop is entered, do all your initialization
// here
// load the 8-bit image
if (!ddraw->Load_Bitmap_File(&bitmap,"waterfall8.bmp"))
return(0);
// load it's palette into directdraw
if (FAILED(ddraw->getlpddpal()->SetEntries(0,0,MAX_COLORS_PALETTE,bitmap.palette)))
return(0);
// return success or failure or your own return code here
return(1);
}
/////////////////////////////////////////////////////////////
结果OK。
现在,再查看下T3DLIB中的东西。把调色板的几个其它函数加上去吧。
//改变调色板某一颜色
int DDRAW_Interface::Set_Palette_Entry(int color_index, LPPALETTEENTRY color )
{
m_lpddpal->SetEntries( 0, color_index, 1, color );
memcpy( & palette[color_index], color, sizeof( PALETTEENTRY ) );
return ( 1 );
}
//从当前调色板获得一个调色板项
int DDRAW_Interface::Get_Palette_Entry(int color_index, LPPALETTEENTRY color )
{
memcpy( color, & palette[color_index], sizeof( PALETTEENTRY ) );
}
//将发送的调色板数据保存在磁盘中的一个ASCII文件中。
int DDRAW_Interface::Save_Palette_To_File(char * filename, LPPALETTEENTRY palette )
{
FILE * fp_file;
if( ( fp_file = fopen( filename,"w" ) ) == NULL )
return ( 0 );
for( int index = 0; index < MAX_COLORS_PALETTE; index++ )
{
fprintf( fp_file, "\n%d %d %d %d", palette[index].peRed,
palette[index].peGreen,
palette[index].peBlue,
palette[index].peFlags );
}
fclose( fp_file );
return ( 1 );
}
//将硬件调色板扫描到sav_palette中,一边进行操作或将它保存到磁盘
int DDRAW_Interface::Set_Palette( LPPALETTEENTRY sav_palette )
{
memcpy( sav_palette, palette, MAX_COLORS_PALETTE * sizeof( PALETTEENTRY ) );
return ( 1 );
}
,OK,调色板的弄完了,先到这里吧。
- 2013年8月19日星期一(demo7_16,色彩旋转)
- 2013年9月2日星期一(8-4,平移和旋转)
- 2013年8月27日星期一(DEMO7-19窗口的裁剪等)
- 2011年12月19日 星期一(oracle读书笔记)
- 2013年9月16日星期一(DEMO8_8,多边形)
- 2010年4月19日星期一
- 2013年9月23日星期一
- 2009年8月10日---星期一
- 2017年8月7日 星期一
- 2017年8月14日 星期一
- 2017年8月21日 星期一
- 8月23日(星期一)
- 2013年1月7日 星期一 GTD 稳
- 2011年12月5日星期一(oracle读书笔记)
- 2011年12月26日 星期一(oracle读书笔记)
- 星期一(8月10日)广州-北京
- 2013年8月11日星期日(7。15 色彩动画)
- 2010年4月19日(新公司入职,第三周星期一)
- hdu 4322 (费用流,巧妙建图)
- 排序合集
- 程序员编程艺术 第一章笔记
- 1.Oracle10g安装
- android的 camera显示时,摄像头自动旋转90度的问题解决
- 2013年8月19日星期一(demo7_16,色彩旋转)
- PHP奇趣笔试试题一则
- 怎么构造字体文件
- OpenCV裁剪图片并保存
- 好的Java 框架应该具备七大特点
- POJ 3533 Light Switching Game
- php 模拟斗地主发牌简单易懂
- protected的一些功能
- [leetcode] Binary Tree Level Order Traversal