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

📄 mario.cpp

📁 超级玛丽游戏源码
💻 CPP
字号:
#include <dos.h>
#include <stdlib.h>
#include <mem.h>
#include <stdio.h>
#include <conio.h>
#include <alloc.h>
#include <io.h>
#include "engine.h"
#include "pcx.h"
#include "key.h"
#include "mario.h"



MARIO mario;
WORLD world;
BITMAP *BackScreen;

void LoadMap(char fn[])
{
  FILE *MapFile;
  char c;
  int x=0,y=0;
  if((MapFile=fopen(fn,"rb"))==NULL)exit(1);
  while((c=fgetc(MapFile))!=EOF)
  {
    if(c=='\n')
    {
      y++;
      x=0;
    }
    else
    {
      world.BackGround[x++][y]=c;
    }
  }
  fclose(MapFile);
}

void ShowMap(BITMAP *screen,int x)
{
 int i,j,start,start_x;
 char data;
 start=x/16;
 start_x=x%16;
 clean_bitmap(screen,16);
 for(j=0;j<14;j++)
   for(i=0;i<21;i++)
   {
     data=world.BackGround[i+start][j];
     if(data>='a'&&data<='z')
       blit(screen,world.block[2][data-'a'],i*16-start_x,j*16-16,0,0,16,16);
     if(data>='A'&&data<='Z')
       blit_mask(screen,world.block[8][data-'A'],i*16-start_x,j*16-16,0,0,16,16);
   }
}


void move()
{
 mario.curr_frame=mario.mario[0];
 if(mario.x_speed>0)
 {
   mario.delay++;
   mario.curr_frame=mario.mario[mario.frame];
   if(!(mario.delay%4))
   {
     mario.frame++;
     if(mario.frame>3)mario.frame=1;
//     mario.curr_frame=mario.mario[mario.frame];
   }
   mario.x+=mario.x_speed;
   if(world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+2]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+2]>'a'
     ||world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+1]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+1]>'a')
   mario.x-=mario.x_speed;
   if(mario.x>100)
   {
      mario.x-=mario.x_speed;
      world.screen_x+=mario.x_speed;

   }
 }
// if(mario.y_speed<0)
// mario.y+=mario.y_speed;
 if(mario.x_speed<0)
 {
   mario.delay++;
   mario.curr_frame=mario.mario[mario.frame];
   if(!(mario.delay%4))
   {
     mario.frame++;
     if(mario.frame>3)mario.frame=1;
   }
   mario.x+=mario.x_speed;
   if(world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+2]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+2]>'a'
     ||world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+1]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+1]>'a')
   mario.x-=mario.x_speed;
   if(mario.x<0)
   {
     mario.x=0;
//     -=mario.x_speed;
     world.screen_x+=mario.x_speed;
   }
 }

 mario.y_speed+=G;
 if(!mario.land)
   mario.curr_frame=mario.mario[6];
 if(mario.y_speed>0)
 {
   mario.Y+=mario.y_speed;
   mario.y=mario.Y>>3;
   if(world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+2]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+2]>'a'
     ||world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+2]<'z'
     &&world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+2]>'a')
   {
     //mario.Y-=mario.y_speed;
    // mario.y=mario.Y>>3;
     mario.Y=mario.Y/16*16-1;
     mario.y=mario.y/16*16-1;
     mario.y_speed=0;
     mario.land=1;
   }
   mario.top=1;
 }

 if(mario.y_speed<0)
 {
   mario.top=0;
   mario.Y+=mario.y_speed;
   mario.y=mario.Y>>3;
   if(world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+1]<'z'
      &&world.BackGround[(world.screen_x+mario.x)/16][mario.y/16+1]>'a'
      ||world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+1]<'z'
      &&world.BackGround[(world.screen_x+mario.x)/16+1][mario.y/16+1]>'a')
   {
    // mario.Y=mario.Y/16*16;
   //  mario.y=mario.y/16*16;
     mario.y_speed=-mario.y_speed;
     if(!mario.jump)mario.y_speed=0;
   }
 }
}


void key_read()
{
  mario.jump=0;
  int x_move=0;
  if(key[RIGHT])
  {
   //mario.dir|=DIR_RIGHT;
   mario.x_speed++;
   if(mario.x_speed>2)
     mario.x_speed=2;
   x_move=1;
  }

 /*if(key[UP])
    mario.y_speed-=3;
   */

 if(key[LEFT])
 {
  // mario.dir|=DIR_LEFT;
   mario.x_speed--;
   if(mario.x_speed<-2)
     mario.x_speed=-2;
   x_move=1;
 }

 if(key[CTRL])
   mario.x_speed<<=1;

 if(key[ALT])
 {
    mario.jump=1;
    if(mario.land)
    {
      mario.y_speed=V0;
     mario.land=0;
    }
    else if(!mario.top)// if(mario.jump)
    {
      mario.y_speed+=V1;
    }
 }

 if(!x_move)
 {
  if(mario.x_speed>0)
    mario.x_speed--;
  if(mario.x_speed<0)
    mario.x_speed++;
 }
}




void main()
{
 BITMAP *resource;
 int i;
 int x,y;

 world.screen_x=0;
 mario.x=20;
 mario.y=150;
 mario.Y=150*8;
 mario.jump=0;
 mario.land=1;
 mario.frame=1;
 mario.delay=0;
 mario.x_speed=0;
 mario.y_speed=0;

 set_video_mode(320,200);
 BackScreen=creat_bitmap(320,200);
 resource=LoadPcxFile("smb.pcx");
 blit(screen,resource,0,0,0,0,resource->w,resource->h);
 getch( );

 for(y=0;y<9;y++)
 {
  for(x=0;x<18;x++)
  {
   world.block[y][x]=creat_bitmap(16,16);
   blit(world.block[y][x],resource,0,0,17*x+1,17*y+1,16,16);
  }
 }
 clean_bitmap(screen,1);
 getch( );

 for(y=0;y<7;y++)
  mario.mario[y]=world.block[5][y];
 y=0;

 LoadMap("level001.dat");

 x=0;
 clean_bitmap(screen,0);

  old_handler1=getvect(0x9);
  old_handler2=getvect(0x1c);
  for (i=0;i<128;i++)
    key[i]=0;

    setvect(0x9,key_handler);
  setvect(0x1c,time_handler);

 mario.curr_frame=mario.mario[1];
 while(!key[ESC])
 {
 ShowMap(BackScreen,world.screen_x);
 key_read();
 move();
 blit_mask(BackScreen,mario.curr_frame,mario.x,mario.y,0,0,16,16);
 wait_vsync();
 blit(screen,BackScreen,8,0,16,0,BackScreen->w-16,BackScreen->h);
 }
 set_text_mode();
 setvect(0x9,old_handler1);
 setvect(0x1c,old_handler2);
}








⌨️ 快捷键说明

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