我在C语言中对SDL相当陌生,但我写了一个简单的游戏,其中一个角色必须达到一个等级的末尾,并在途中避免出现坏的星星。如果他撞上一颗星星,他就会死。也有好的明星,他可以收集和获得积分。
我已经建立了我的积分系统,所以现在当他击中一个好的明星,他应该得到一分。然而,当他击中一颗星星时,他实际上得到了很多分数,只要他是在触摸星星,我不想这样。我认为所发生的事情是因为恒星在运动,他与恒星摩擦,他移动的每一个像素都是一个新的碰撞,所以他每次碰撞得到一个点。理想情况下,他应该每颗星只得到1分。
所以我有两个问题: 1)我需要弄清楚如何做到这一点,这样当他击中一颗星星时,他只能得到1分。2)既然他应该‘收集’星星,我想让他收集星星时消失。
所以这类似于大多数这类游戏,玩家收集一些东西,它消失了,他们得到了一个分数。
编辑:
这是我做的结构:
typedef struct {
int x, y, w, h, baseX, baseY, mode;
float phase;
} Goodstar;
然后,我在另一个结构中引用了它,如下所示:
Goodstar goodStars[GOOD_STARS];
SDL_Texture *goodStar;
[GOOD_STARS]
等于100。
下面是我的碰撞检测代码:
// Check for collision with good stars
for (int i = 0; i < GOOD_STARS; i++) {
if (collide2d(game->man.x, game->man.y, game->goodStars[i].x, game->goodStars[i].y, 48, 48, 32, 32)) {
if (!game->man.isDead) {
game->man.points++;
}
break;
}
}
所以现在,它只检查一个碰撞,然后添加一个点。
编辑2:
这是您建议的代码,它运行如下:
for (int i = 0; i < GOOD_STARS; i++) {
if (!game->goodStars[i].awarded) {
if (collide2d(game->man.x, game->man.y, game->goodStars[i].x, game->goodStars[i].y, 48, 48, 32, 32)) {
if (!game->man.isDead) {
game->man.points++;
game->goodStars[i].awarded = 1;
}
break;
}
}
}
这是我的初始化代码:
// Initialise stars
for (int i = 0; i < GOOD_STARS; i++) {
game->goodStars[i].baseX = 320 + random() % 38400;
game->goodStars[i].baseY = random() % 480;
game->goodStars[i].mode = random() % 2;
game->goodStars[i].phase = 2 * 3.14 * (random() % 360) / 360.0f;
game->goodStars[i].awarded = 0;
}
发布于 2016-08-20 06:56:03
因此,一般的方法是:你检查玩家是否与一颗恒星相撞,如果是,你给玩家一个点,然后摧毁该星。
好的,看到您的代码,我只需添加一个名为awarded
的布尔值,或者类似于Goodstar
的东西。在创建恒星时,将其初始化为false
。
现在,当玩家与一颗星星相撞时,将awarded
标记为true
,如果awarded
是真的,那么在将来,不要向玩家颁发分数。所以就像
for (int i = 0; i < GOOD_STARS; i++) {
if (!game->goodStars[i]->awarded)
{
if (collide2d(game->man.x, game->man.y, game->goodStars[i].x, game->goodStars[i].y, 48, 48, 32, 32)) {
if (!game->man.isDead) {
game->man.points++;
game->goodStars[i]->awarded = true;
}
break;
}
}
}
然后,您也不会呈现awarded
设置为true的星星。
https://gamedev.stackexchange.com/questions/128591
复制