?? mario.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 + -