⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo.cpp

📁 ldraw_DOS游戏开发包
💻 CPP
字号:
// 空战摸拟源程序,林伟 1999年7月30日
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <mem.h>
#include <time.h>
#include <math.h>

#include <lsys.h>
#include <ldraw.h>
#include <lkey.h>
#pragma library("lsys.lib")
#pragma library("ldraw.lib")
#pragma library("lkey.lib")

#define  MAX_STAR   80
#define  MAX_OBJ    30
#define  MAXX (GModeData.LEN-1)
#define  MAXY (GModeData.WID-1)
typedef unsigned long ulong;
LSURFACE layer;
MIDI    *midi;

char *fly_pic; // keys[0..100] 键盘上各键的状态
// 键盘码
char GameStart();
struct TStars { int x,y,v; } Stars[MAX_STAR];
struct TObj { int mode,type,index,next,x,y; } Objs[MAX_OBJ];
long GameScore=0;

void copyright()
{ printf("Game Over. your score %ld\n",GameScore);
  printf("Thank you for play it, if you have any question please call me\n");
  printf("(0871)7167710 or lwwind@yeah.net, Lin Wei\n");

}
int  random(int x)
{ ulong t,time;
  _disable();
  outp(0x43,0); t=inp(0x40);
  t+=(inp(0x40)<<8); t=0xffff^t;
  _enable(); // (not t) + (clock()<<16)
  time=(clock()<<16)+t;
  return (time%x);
}
void main()
{ int i;
  RGB pal[256];
  lt_install_timer();
  lmMidiInit(MIDI_AUTO);
  lkInitKey();
  midi=lmLoadMidi("demo2.mid",0);

  fly_pic=lrPicFile("demo.pcx",0,pal);
  if (!fly_pic) { printf("read demo.pcx error\n"); return; }
  for (i=0;i<MAX_STAR;i++) { Stars[i].x=random(320); Stars[i].y=-20+random(250);
    Stars[i].v=1; if (i<MAX_STAR/3) Stars[i].v++; } // 星空初始化
  for (i=0;i<MAX_OBJ;i++) Objs[i].mode=0; // 物体初始化

  lInitGraph(SVGA_320X200);
  lCreateSurface(GModeData.LEN,GModeData.WID,&layer,NULL,LSM_MEMORY);
  lActiveSurface(&layer);

  GameStart();

  delete fly_pic;
  lDeleteSurface(&layer);
  lkRestKey();
  lCloseGraph();
  lmMidiRest();
  lt_remove_timer();
}
////////////////////////////////////////////////////////////////////////
void drawfire(int x,int y) // 画出激光
{ int i,j;
  lsetColor(9);
  lline(x+3+8,y-6,x+3+8,y+5);
  lline(x-5+7,y-6,x-5+7,y+5);
}
void show()
{ char text[80]="STAR WAR";
  static int flag=1;
  lsetColor(7);
  louttextxy(MAXX/2-strlen(text)*4,10,text);
  sprintf(text,"SCORE: %d",GameScore);
  lsetColor(7);
  louttextxy(0,MAXY-20,text); // 到一定的时间显示分数
  if (flag>0) lOutToScr(&layer,0,0,0,0,MAXX,MAXY);
  lClearSurface(&layer,0);
  flag*=(-1);
}
void pimage(short x,short y,char *buf,int mode)
{ short len,wid;
  int j=0,inc=1,i;
  lgetSize(&len,&wid,buf);
  if (mode==1) j=wid-1,inc=-1;
  for (i=0;i<wid;i++,j+=inc) lScanLine2(x,y+i,len,buf+4+j*len);
}
////////////////////////////////////////////////////////////////////////
unsigned long timepass; // 游戏进行的时间
int  GameOver, Sound=0;
int  fly_x=160,fly_y,fly_flag=1,fire_flag=1;
void drivers(); // 事件引擎
void control(); // 对象控制(事件处理)
int  AllocObj() // 分配空余对象
{ int i=0;
  while (i<MAX_OBJ&&Objs[i].mode) i++;
  if (i>=MAX_OBJ) i=MAX_OBJ-1;
  return i;
}
int  CheckHit(int x1,int y1,int x2,int y2,int r) // 检查碰撞
{ if (abs(x1-x2)<=r&&abs(y1-y2)<=r) return 1;
  return 0;
}
char *texts[10]={
  "USE ARROW KEYS TO MOVE",
  "CTRL TO FIRE",
  "ESC TO QUIT"
};

char GameStart()
{ int i, start;
  timepass=0;
  lmMidiPlay(midi,1);
  lActiveSurface(NULL);
  lsetColor(2);
  for (i=0;i<3;i++) louttextxy(MAXX/2-4*strlen(texts[i]),MAXY/3+i*14,texts[i]);
  lActiveSurface(&layer);
  delay(4000);
  fly_y=MAXY*3/4;
  while (!GameOver)
   { while (lt_clock(0)-start<=1193181/70); start=lt_clock(0); // 等待
     timepass++; // 1.时间基数++
     control();  // 2.事件处理
     drivers();  // 3.事件引擎
     show();     // 4.显示
     if (--Sound<=0) nosound(); // 声音处理
     if (lKeyOn(KEY_ESC)) GameOver=1;
   } sound(105); delay(700); nosound();
  lmStopMidi();
  return 1;
}
void control() // 游戏事件处理
{ int i,j,x,y, ok;
  for (i=0;i<MAX_STAR;i++) { Stars[i].y+=Stars[i].v; // 星星处理
    if (Stars[i].y>MAXY) { Stars[i].x=random(320); Stars[i].y=-random(60); }
    if (Stars[i].v==1) lpixel(Stars[i].x,Stars[i].y,23);
      else lpixel(Stars[i].x,Stars[i].y,28);
  }
  for (i=0;i<MAX_OBJ;i++) // 对象处理
   { x=Objs[i].x; y=Objs[i].y; ok=1;
     switch (Objs[i].mode)
      { case 1: if (Objs[i].index==0) { switch (Objs[i].type)
	/*敌人*/ { case 0: if (!random(30)) Objs[i].type=1; break; // 3种状态
		   case 1: if (x<fly_x) x++; if (x>fly_x) x--; 
			   if (!random(40)) Objs[i].type=2; break; 
		   case 2:
		   default:if (!random(3)) y+=3;
			   break;
		 } if (CheckHit(x,y,fly_x,fly_y,15)) fly_flag=0; // 与主角相撞
		   pimage(x,y,fly_pic,0);
		}
		if (Objs[i].index) // 被击中
		   { if ((Objs[i].index&3)==0) pimage(x,y,fly_pic,0);
		     if (++Objs[i].index>50) Objs[i].mode=0;
		   }
		y++; if (y>MAXY) Objs[i].mode=0; // 对象清除
		break;
	case 2: y-=4; if (y<-20) Objs[i].mode=0; drawfire(x,y);
	/*激光*/for (j=0;j<MAX_OBJ;j++) // 检查与敌机相碰
		if (Objs[j].mode==1&&CheckHit(x,y,Objs[j].x,Objs[j].y,15)&&
		    !Objs[j].index&&ok)
		 { Objs[j].index=1; ok=0; Objs[i].mode=0;
		   sound(220); Sound=10; GameScore+=10;

		 }
		break;
      }
     Objs[i].x=x; Objs[i].y=y;
   }
  if (lKeyOn(KEY_UP))  if (--fly_y<0) fly_y=0; // 主角控制
  if (lKeyOn(KEY_DOWN)) if (++fly_y>MAXY) fly_y=MAXY;
  if (lKeyOn(KEY_LEFT)) if (--fly_x<0) fly_x=0;
  if (lKeyOn(KEY_RIGHT)) if (++fly_x>319) fly_x=319;
  if (lKeyOn(KEY_CTRL)&&fire_flag==1) {
     i=AllocObj(); Objs[i].x=fly_x,
     Objs[i].y=fly_y-10, Objs[i].mode=2;
     fire_flag=0;
  }
  if (!lKeyOn(KEY_CTRL)) fire_flag=1;
  pimage(fly_x,fly_y,fly_pic,1);
  if (!fly_flag) GameOver=1;
}
void drivers()
{ if (random(30)==0)
    { int i=AllocObj(); Objs[i].x=random(320); Objs[i].y=-random(20);
      Objs[i].mode=1; Objs[i].type=Objs[i].index=0;
      if (!random(20)) Objs[i].type=2;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -