复刻Space Invaders时,Invader Sprite无法横向排列的技术问题
解决Space Invaders中外星人精灵重叠的问题
嘿,我一眼就看到你代码里的关键问题了,先帮你拆解清楚:
首先看你给外星人X坐标赋值的逻辑——invaderArmy[index].xPos *= index;,结合结构体默认xPos=100的设定,咱们算一下每个外星人的实际X位置:
- index=0:100 * 0 = 0
- index=1:100 * 1 = 100
- index=2:100 * 2 = 200
...
这本身就不符合横向排列的需求,更别说如果你的Draw_And_Rotate_Sprite函数没正确用你传的X参数,那肯定会重叠。下面给你具体的修正方案:
第一步:修正X坐标的计算逻辑
你应该让每个外星人从指定起始位置开始,依次拉开「自身宽度+额外间距」的距离,确保不会重叠。比如:
// 起始X坐标,可根据你的游戏界面调整 int startX = 100; // 外星人之间的空隙,按需调整 int gap = 20; for (int index = 0; index < 5; index++) { // 核心:起始位置 + 索引*(宽度+间距) invaderArmy[index].xPos = startX + index * (invaderArmy[index].width + gap); // 注意:如果Draw函数需要Y坐标,记得也要传进去(你的原代码只传了X) Draw_And_Rotate_Sprite(invaderImage, invaderArmy[index].xPos, invaderArmy[index].yPos); }
第二步:排查绘制函数的问题
你说调试时X坐标已经修改,但精灵还是重叠,很大概率是Draw_And_Rotate_Sprite没正确使用你传入的X参数!比如函数内部硬编码了固定X值,或者参数接收逻辑有问题。一定要检查函数实现:
// 举个反例:如果函数是这样写的,传X也没用 void Draw_And_Rotate_Sprite(LPDIRECT3DTEXTURE9 img, int x = 100) { // 绘制时误用了默认值100,而非传入的x参数 }
顺带优化结构体初始化
你的构造函数里xPos; yPos;这两行完全没用,建议改成初始化列表的方式,避免出现未定义的随机值:
struct INVADER { int xPos; int yPos; int width; int height; D3DCOLOR color; // 明确初始化所有字段 INVADER() : xPos(100), yPos(50), width(64), height(64), color(D3DCOLOR_XRGB(255, 255, 255)) {} };
内容的提问来源于stack exchange,提问作者Patrick_Mc
相关产品推荐
相关产品推荐

