STM32学习笔记十八:WS2812制作像素游戏屏-飞行射击游戏(8)探索游戏多样性,范围伤害模式

本文介绍了在STM32开发的飞行射击游戏中,敌机EnemyT2和BossEnemyT3的高级攻击策略,如瞄准射击和散弹+追踪导弹,以及玩家角色的新攻击方式,如子弹、炸弹和激光的加入,包括碰撞检测和效果展示。作者还提到了使用Bresenham算法绘制圆形和优化代码效率的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 前面我们的攻击手段比较单一,虽然已经分出了 EnemyT1 / EnemyT2 / EnemyT3, 但里面还是基本一样的。这回,我们尝试实现一些新的攻击方法,实现一些新的算法。

1、前面我们小飞机EnemyT1 的攻击方式是垂直向下发射子弹。

那么大飞机EnemyT2的攻击手段就更高级一些,我们让它能够瞄准玩家射击。

大飞机EnemyT2发射子弹是EnemyT2类的私有方法,想要让他能够瞄准玩家,就要知道玩家在哪里。还记得前面我们做的数据仓库么。这回用上了。

我们修改EnemyT2的createBulletObject函数:

void EnemyT2::createBulletObject(PlaneObject_t *target) {
	BulletObject_t *but1 = new BulletObject_t();
	but1->x = baseInfo.x - PlaneXYScale;
	but1->y = baseInfo.y + PlaneXYScale * 2;
	but1->visiable = 1;

	int sum = abs(target->x - but1->x) + abs(target->y - but1->y);

	but1->speedX = 300 * (target->x - but1->x) / sum;
	but1->speedY = 300 * (target->y - but1->y) / sum;

	getRainbowColor(&but1->color, 200);
	ListPushBack(enemyBulletList, (LTDataType) but1);
}

uint8_t EnemyT2::tick(uint32_t t) {
	。。。
	if (fireTimer.tick(t)) {
		if (((PlaneObject_t*) DataBulk::GetInstance()->data1)->visiable)
			createBulletObject((PlaneObject_t*) DataBulk::GetInstance()->data1);
		if (((PlaneObject_t*) DataBulk::GetInstance()->data2)->visiable)
			createBulletObject((PlaneObject_t*) DataBulk::GetInstance()->data2);
	}

    。。。
}

注意确定子弹方向的算法:

    int sum = abs(target->x - but1->x) + abs(target->y - but1->y);

    but1->speedX = 300 * (target->x - but1->x) / sum;
    but1->speedY = 300 * (target->y - but1->y) / sum;

300是子弹速度。

简单通过相似三角形来确定方向和速度,不是很精确,但也足够用了。如果要精确的话,需要用三角函数算分速度,太复杂,没必要。

2、Boss肯定要更强大,我们要让他同时向多个方向发射散弹,同时发射一颗能追踪的导弹。

先给他发射散弹:

void EnemyT3::createBulletObject(int speedX) {
	PlaneObject_t *but1 = new PlaneObject_t();
	but1->x = baseInfo.x - PlaneXYScale * 2;
	but1->y = baseInfo.y + PlaneXYScale;
	but1->speedX = speedX;
	but1->speedY = 300 - abs(speedX);
	but1->visiable = 1;
	but1->color = 0xe01000;
	ListPushBack(enemyBulletList, (LTDataType) but1);
}

uint8_t EnemyT3::tick(uint32_t t) {
	animationStoryBoard->tick(t);
	if (fireTimer.tick(t)) {
		createBulletObject(-120);
		createBulletObject(-70);
		createBulletObject(-30);
		createBulletObject(0);
		createBulletObject(30);
		createBulletObject(70);
		createBulletObject(120);
	}
	for (ListNode *node = animationList->next; node != animationList; node =
			node->next) {
		if (((Animation*) node->data)->isValid) {
			((Animation*) node->data)->tick(t);
		}
	}
	return 0;
}

追踪导弹不是直线运动,所以要单独一个链表 enemyRocketList,单独的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vvind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值