📄 main.c
字号:
// *******************************************************//// NAME : main.c// PROJECT : HRD// DESCRIPTION : // DATE : 2002-11-28// BY : 陈晋波// // *******************************************************#include <vmgp.h> #include <vstream.h>#include "res.h"#define red 1 //定义红色#define blue 2 //定义兰色#define blank 3 //定义黑色int down=0; //是否选中0:未选,1:选中.int id=8,id1=0,id2=0; //被激活的人物编号id,可移动的方向id1,id2.int ticktime=200; //延时时间.单位微秒.int activeNum[6*3]={100,0,0, 100,0,0, 100,0,0, 100,0,0, 100,0,0, 100,0,0 }; //可活动的人物,:是否可以活动,:活动方向1,:活动方向2. int ball[12*9]={1, 1, 0, 0,3,0,0,0,0, 2, 1,16, 0,4,0,0,0,0, 3, 1,48, 0,3,0,0,0,0, 4, 1, 0,32,1,0,0,0,0, 5, 1,16,32,2,0,0,0,0, 6, 1,48,32,1,0,0,0,0, 7, 1, 0,48,3,0,0,0,0, 8, 1,16,48,1,0,0,1,0, 9, 1,32,48,1,0,0,1,0, 10,1,48,48,3,0,0,0,0, 11,0,16,64,1,0,0,0,0, 12,0,32,64,1,0,0,0,0};////id,存在,x,y,类型,c上,C左,c下,c右。int map[5*4]={1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1,1,1, 1,0,0,1}; //地图标识,1:存在,0:为空.//uint8_t *Splash,*Ball[10]; //定义图片变量,数组.int initDrawSprites(void);int32_t LoadRes(uint16_t res_id,uint16_t dst_size,uint8_t**ptrDest);int32_t LoadPackedRes(uint16_t res_id,uint16_t dst_size,uint8_t**ptrDest);void drawrect(int16_t x0,int16_t y0,int16_t x1,int16_t y1, int color,int16_t h);void engine(int32_t key);void activeselect(int16_t a,int16_t b);//激活a,取消激活bvoid direct(void);void change(void);void moveball(int direct,int index);void sleep(int nTime);void newgame(void);void textout(int x,int y,char *s);int menu(void);int success(void);void DrawObject(int x,int y,int i);// *******************************************// 调入压缩图片,并解压. // res_id :资源中的图片编号,// dst_size :该图片的尺寸,// **ptrDest :程序中的图片变量.// *******************************************int32_t LoadPackedRes(uint16_t res_id,uint16_t dst_size,uint8_t**ptrDest){ int32_t handle,size; handle = vResOpen(NULL,res_id); *ptrDest = vNewPtr(dst_size); size = vDecompress(NULL, *ptrDest, handle, 1024); vStreamClose(handle); return size;}// *******************************************// 调入精灵图片,并解压.// res_id :资源中的图片编号,// dst_size :该图片的尺寸,// **ptrDest :程序中的图片变量.// *******************************************int32_t LoadRes(uint16_t res_id,uint16_t dst_size,uint8_t**ptrDest){ int32_t handle,size; handle = vResOpen(NULL,res_id); // Open the resource *ptrDest = vNewPtr(dst_size); // Allocate memory for the resource size = vResRead(handle, *ptrDest,dst_size); // Read resource to memory vResClose(handle); // Close the resource return size;}// *******************************************// 初始化游戏引擎.// 1 :调入图片 ,// 2 :描绘所有精灵,// 3 :被激活对象赋初值.// *******************************************int initDrawSprites(void){ int i,key; /*LoadRes(SPLASH ,SPLASH_SIZE ,&Splash); // Load the compressed Splash screen (sprite) LoadRes(BALL1,BALL1_SIZE,&Ball[0]); // Load the ball sprite LoadRes(BALL2,BALL2_SIZE,&Ball[1]); // Load the ball sprite LoadRes(BALL3,BALL3_SIZE,&Ball[2]); // Load the ball sprite LoadRes(BALL4,BALL4_SIZE,&Ball[3]); // Load the ball sprite LoadRes(BALL5,BALL5_SIZE,&Ball[4]); // Load the ball sprite LoadRes(BALL6,BALL6_SIZE,&Ball[5]); // Load the ball sprite LoadRes(BALL7,BALL7_SIZE,&Ball[6]); // Load the ball sprite LoadRes(BALL8,BALL8_SIZE,&Ball[7]); // Load the ball sprite LoadRes(BALL9,BALL9_SIZE,&Ball[8]); // Load the ball sprite LoadRes(BALL10,BALL10_SIZE,&Ball[9]); // Load the ball sprite LoadRes(BALL11,BALL11_SIZE,&Ball[10]); // Load the ball sprite*/ vSetTransferMode(MODE_BLOCK); // set transfer mode to block (non transperent) vDrawObject(0,0,&SPLASH); // draw the splashscreen to the "backbuffer" vFlipScreen(1); // draw the "backbuffer" to the screen while(1) { key = vGetButtonData(); if(key==KEY_ENTER) break; } vClearScreen(vRGB(0,0,0)); // Clear the "backbuffer" with black vSetTransferMode(MODE_TRANS); // set transfermode to transperent i=0; DrawObject(0,0,11); while(i<10) { DrawObject(ball[i*9+2],ball[i*9+3],i); i++; } DrawObject(64,0,10); activeselect(id,id); vFlipScreen(1); // draw the "backbuffer" to the screen// vDisposePtr(SPLASH);// return memory allocated for splash screen i=0; /*while(i<10) { vDisposePtr("BALL"+i); i++; }*/ return 1;}void DrawObject(int x,int y,int i){ if(i==0) vDrawObject(x,y,&BALL1); if(i==1) vDrawObject(x,y,&BALL2); if(i==2) vDrawObject(x,y,&BALL3); if(i==3) vDrawObject(x,y,&BALL4); if(i==4) vDrawObject(x,y,&BALL5); if(i==5) vDrawObject(x,y,&BALL6); if(i==6) vDrawObject(x,y,&BALL7); if(i==7) vDrawObject(x,y,&BALL8); if(i==8) vDrawObject(x,y,&BALL9); if(i==9) vDrawObject(x,y,&BALL10); if(i==10) vDrawObject(x,y,&BALL11); if(i==11) vDrawObject(x,y,&BALL12);}// *******************************************// 游戏引擎.// key :键盘值.// *******************************************void engine(int32_t key){ int i=0,j=0; direct(); //判断所有精灵的可移动方向. //判断没有激活时的移动情况. if(down==0) { while(i<6)//循环激活各个可激活的对象。 { if(activeNum[i*3]==id) { if(activeNum[(i+1)*3]!=100) { id=activeNum[(i+1)*3]; id1=activeNum[(i+1)*3+1]; id2=activeNum[(i+1)*3+2]; activeselect(id,activeNum[i*3]); } else { id=activeNum[0]; id1=activeNum[1]; id2=activeNum[2]; activeselect(id,activeNum[i*3]); } break; } i++; } i=0; } //判断激活后的移动情况. if(down==1) { switch(key) { case KEY_LEFT: if(id1==4||id2==4) { moveball(4,id); if(ball[id*9+4]==1) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-1]=1; } if(ball[id*9+4]==2) { map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-1]=1; } if(ball[id*9+4]==3) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-1]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16-1]=1; } if(ball[id*9+4]==4) { map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-1]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16-1]=1; } ball[id*9+2]=ball[id*9+2]-16; } break; case KEY_RIGHT: if(id1==2||id2==2) { moveball(2,id); if(ball[id*9+4]==1) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=1; } if(ball[id*9+4]==2) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+2]=1; } if(ball[id*9+4]==3) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+1]=1; } if(ball[id*9+4]==4) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+2]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+2]=1; } ball[id*9+2]=ball[id*9+2]+16; } break; case KEY_UP: if(id1==1||id2==1) { moveball(1,id); if(ball[id*9+4]==1) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-4]=1; } if(ball[id*9+4]==2) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4-4+ball[id*9+2]/16]=1; map[ball[id*9+3]/16*4-4+ball[id*9+2]/16+1]=1; } if(ball[id*9+4]==3) { map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16-4]=1; } if(ball[id*9+4]==4) { map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4-4+ball[id*9+2]/16]=1; map[ball[id*9+3]/16*4-4+ball[id*9+2]/16+1]=1; } ball[id*9+3]=ball[id*9+3]-16; } break; case KEY_DOWN: if(id1==3||id2==3) { moveball(3,id); if(ball[id*9+4]==1) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+4]=1; } if(ball[id*9+4]==2) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+1]=1; } if(ball[id*9+4]==3) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+4]=1; } if(ball[id*9+4]==4) { map[ball[id*9+3]/16*4+ball[id*9+2]/16]=0; map[ball[id*9+3]/16*4+ball[id*9+2]/16+1]=0; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+4]=1; map[ball[id*9+3]/16*4+4+ball[id*9+2]/16+4+1]=1; } ball[id*9+3]=ball[id*9+3]+16; } break; } change();//移动后精灵的坐标变化处理. activeselect(id,id);//激活精灵. }}// **************************************************// 绘制一个矩形.// x0 :起点横坐标,// y0 :起点纵坐标,// x1 :终点横坐标,// y1 :终点纵坐标,// color :颜色,// h :画笔宽度.// **************************************************void drawrect(int16_t x0,int16_t y0,int16_t x1,int16_t y1, int color,int16_t h){ int16_t i=0; vSetForeColor(color); // vSetForeColor(vRGB(255,0,0)); while(i<=(h-1)) { vDrawLine(x0+i,y0+i,x1-i,y0+i); vDrawLine(x1-i,y0+i,x1-i,y1-i); vDrawLine(x1-i,y1-i,x0+i,y1-i); vDrawLine(x0+i,y1-i,x0+i,y0+i); i++; } vSetForeColor(0);}// **************************************************// 激活选择的精灵.// a :精灵的编号,激活.// b :精灵的编号,取消激活.// **************************************************void activeselect(int16_t a,int16_t b){ if(ball[b*9+4]==1) drawrect(ball[b*9+2],ball[b*9+3],ball[b*9+2]+16,ball[b*9+3]+16,blank,1); //setcolor=12,setactivecolor=15 if(ball[b*9+4]==2) drawrect(ball[b*9+2],ball[b*9+3],ball[b*9+2]+32,ball[b*9+3]+16,blank,1); //setcolor=12,setactivecolor=15 if(ball[b*9+4]==3) drawrect(ball[b*9+2],ball[b*9+3],ball[b*9+2]+16,ball[b*9+3]+32,blank,1); //setcolor=12,setactivecolor=15 if(ball[b*9+4]==4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -