自己控制一个hero 然后人物走动会使得地图滚动,然后在屏幕上的怪物也随着地图的滚动而消失。就比如赛车超车了 被超的会落后到屏幕后面不见。贴上代码
lass Hero{
public:
int hero_x,hero_y,hero_vx,hero_vy,move_face,hero_face,step ;
Hero();
void run();
};
class Enemy{
public:
int enemy_x,enemy_y,enemy_vx,enemy_vy,face,step,life,lenght;
Enemy();
void enemy_move();
};
class Rollback
{
public: int rollback_x,rollback_vx;
Rollback();
void roll();
};
Hero Jianxiake;
Enemy Enemy[4];
Rollback rollback;
/////////////////////////////////////// 人物的动作 /////////////////////////////////////////////////
Hero::Hero()
{
hero_x=210,hero_y=370,hero_vy=0,hero_vx=0,hero_face=0;
}
void Hero::run()
{
hero_x=hero_x+hero_vx;
hero_y=hero_y+hero_vy;
step++;
if (hero_vy==0&&hero_vx==0)
{
BufDC.TransparentBlt(hero_x,hero_y,56,91,&ManDC,(step%7)*56,hero_face*91,56,91,0x000000);
}
else
BufDC.TransparentBlt(hero_x,hero_y,67,91,&MoveDC,(step%7)*67,move_face*91,67,91,0x000000);
}
///////////////////////////////////////人物动作////////////////////////////////////////////////////
//////////////////////////////////////背景滚动//////////////////////////////////////////////////////
Rollback::Rollback(){
rollback_x=0,rollback_vx=0;
}
void Rollback::roll()
{
rollback_x=rollback_x+rollback_vx;
if(Jianxiake.hero_x+67>400)
{
Jianxiake.hero_vx=0;
rollback_vx=10;
}
BufDC.BitBlt(0,0,1024,760,&BackDC,rollback_x,0,SRCCOPY);
}
//////////////////////////////////////////////背景滚动////////////////////////////////////////////////////
//////////////////////////////////////怪物动作////////////////////////////////////////////////////
Enemy ::Enemy(){
enemy_x=600,enemy_y=370;
lenght=3;
life=1;
face=rand()%4;
switch(face)
{
case 0:
enemy_vx=lenght;
enemy_vy=0;
break;
case 1:
enemy_vx=-lenght;
enemy_vy=0;
break;
case 2:
enemy_vx=lenght;
enemy_vy=-lenght;
break;
case 3:
enemy_vy=-lenght;
enemy_vx=-lenght;
break;
}
}
void Enemy::enemy_move(){
enemy_x+=enemy_vx;
enemy_y+=enemy_vy;
int q;
if (enemy_x<0)
{
enemy_vx=lenght;
//srand(time(0));
q=rand()%3;
switch(q)
{
case 0:
enemy_vy=-lenght;
face=2;
break;
case 1:
enemy_vy=lenght;
face=0;
break;
case 2:
enemy_vy=0;
face=0;
break;
}
}
if (enemy_x>900-20)
{
enemy_vx=-lenght;
//srand(time(0));
q= rand()%3;
switch(q)
{
case 0:
enemy_vy=-lenght;
face=3;
break;
case 1:
enemy_vy=lenght;
face=1;
break;
case 2:
enemy_vy=0;
face=1;
break;
}
}
if (enemy_y>500)
{
enemy_vy=-lenght;
//srand(time(0));
q= rand()%3;
switch(q)
{
case 0:
enemy_vx=-lenght;
face=3;
break;
case 1:
enemy_vx=lenght;
face=2;
break;
case 2:
enemy_vx=0;
face=2;
break;
}
}
if (enemy_y<240)
{
enemy_vy=lenght;
//srand(time(0));
q= rand()%3;
switch(q)
{
case 0:
enemy_vx=-lenght;
face=1;
break;
case 1:
enemy_vx=lenght;
face=0;
break;
case 2:
enemy_vx=0;
face=0;
break;
}
}
step++;
BufDC.TransparentBlt(enemy_x+rollback.rollback_vx,enemy_y,204,176,&EnemyDC,(step%4)*204,face*176,204,176,0xffffff);
}
该回答引用ChatGPT-3.5
要实现怪物跟着地图滚动消失的效果,你可以在每次绘制怪物的时候,判断怪物是否在屏幕范围内。如果怪物超出屏幕范围,则不绘制该怪物。
在你的代码中,可以在Enemy::enemy_move()
函数中添加以下逻辑来实现该效果:
void Enemy::enemy_move() {
enemy_x += enemy_vx;
enemy_y += enemy_vy;
int q;
// 判断怪物是否在屏幕范围内
if (enemy_x + rollback.rollback_vx < -204 || enemy_x + rollback.rollback_vx > 1024 || enemy_y < 0 || enemy_y > 760) {
return; // 不绘制该怪物
}
// 绘制怪物
step++;
BufDC.TransparentBlt(enemy_x + rollback.rollback_vx, enemy_y, 204, 176, &EnemyDC, (step % 4) * 204, face * 176, 204, 176, 0xffffff);
}
在这段代码中,我们通过判断怪物的位置是否超出屏幕范围来决定是否绘制怪物。如果怪物的x坐标加上地图滚动的偏移量小于-204或大于1024,或者怪物的y坐标小于0或大于760,就不进行绘制。
这样,当地图滚动时,超出屏幕范围的怪物就会消失了。记得在其他地方调用Enemy::enemy_move()
来更新怪物的位置和绘制。