在我的 C raylib 项目中,发生了一些奇怪的事情

问题描述 投票:0回答:1

在这段代码中,狗的本意是“吃”骨头,但骨头并没有被吃掉,而是狗远离了骨头!我觉得这个游戏在欺骗我。

#include "raylib.h"
#include <stdio.h>
#include <stdlib.h>
#include "raymath.h"
#include <time.h>

#define HEIGHT 500
#define WIDTH 700

Color extraDarkGreen = {10,30,20,255};

int main(void)
{

    InitWindow(WIDTH, HEIGHT, "Random");
    Image doge = LoadImage("/home/neraan/C/rand/Doge.png");
    ImageResize(&doge, 75, 75);
    Texture2D dogeTex = LoadTextureFromImage(doge);

    Image Bone = LoadImage("/home/neraan/C/rand/Bone.png");
    ImageResize(&Bone, 75, 75);
    Texture2D BoneTex = LoadTextureFromImage(Bone);

    Vector2 DogePos = {50,50};

    Vector2 BonePos = {GetRandomValue(10, WIDTH-10),GetRandomValue(10, HEIGHT-10)};

    SetTargetFPS(60);

    while (!WindowShouldClose())
    {
        Rectangle DogeHit = {DogePos.x,DogePos.y,20,20};
        Rectangle BoneHit = {BonePos.x,BonePos.y,20,20};

        BeginDrawing();
        ClearBackground(extraDarkGreen);
        DrawTexture(dogeTex, DogePos.x, DogePos.y,GREEN);
        DrawTexture(BoneTex, BonePos.x, BonePos.y,GREEN);

        EndDrawing();

        DogePos.x += GetRandomValue(1.0f,2.0f);
        DogePos.x -= GetRandomValue(1.0f,2.0f);
        DogePos.y -= GetRandomValue(1.0f,2.0f);
        DogePos.y += GetRandomValue(1.0f,2.0f);

        if (IsKeyDown(KEY_RIGHT)) DogePos.x += 4.0f;
        if (IsKeyDown(KEY_LEFT)) DogePos.x -= 4.0f;
        if (IsKeyDown(KEY_UP)) DogePos.y -= 4.0f;
        if (IsKeyDown(KEY_DOWN)) DogePos.y += 4.0f;

         if (CheckCollisionRecs(DogeHit,BoneHit))
        {
            SetRandomSeed((unsigned int)time(NULL));
            Vector2 BonePos = {GetRandomValue(10, WIDTH-10),GetRandomValue(10, HEIGHT-10)};
            puts("Lets GOOOO");
        }


    }




    CloseWindow();

    return 0;
}

这是输出的图像:

enter image description here

我完全不知道该尝试什么。 Stack Overflow 希望我添加更多文本,因为“这里只有代码!”但我真的不知道该添加什么。所以,让我告诉你,我不确定这里到底出了什么问题。对我来说,所有的逻辑都成立!它应该有效,而且,天哪,为什么是狗在动,而不是骨头!

c random raylib
1个回答
0
投票

Vector2 BonePos = ...
块内的
if
创建一个新的局部变量,表示其在该范围内的对象。它不影响之前的定义。用于渲染骨骼的位置永远不会改变。

调高编译器警告以捕获未使用的变量。

除此之外,在碰撞时重新播种 pRNG 是值得怀疑的。通常,您会在程序开始时调用

SetRandomSeed
once,或者只是允许
InitWindow
隐式播种 pRNG。

此外,还不清楚这些抖动的目的是什么:

DogePos.x += GetRandomValue(1.0f,2.0f);
DogePos.x -= GetRandomValue(1.0f,2.0f);
DogePos.y -= GetRandomValue(1.0f,2.0f);
DogePos.y += GetRandomValue(1.0f,2.0f);

总体来说,这看起来是一款类似贪吃蛇的游戏,可以自由移动。下面是一个重构的示例。

#include <stdio.h>
#include <stdlib.h>
#include "raylib.h"

#define WIDTH 300
#define HEIGHT 200
#define BOUND_RNG(X,Y) (GetRandomValue(10, (X) - (Y) - 10))

int main(void)
{
    InitWindow(WIDTH, HEIGHT, "Random");
    Rectangle doge = { .x = 50, .y = 50, .width = 20, .height = 20 };
    Rectangle bone = {
        .x = BOUND_RNG(WIDTH, 20),
        .y = BOUND_RNG(HEIGHT, 20),
        .width = 20,
        .height = 20
    };

    SetTargetFPS(60);

    while (!WindowShouldClose()) {
        if (IsKeyDown(KEY_RIGHT)) doge.x += 4.0f;
        if (IsKeyDown(KEY_LEFT)) doge.x -= 4.0f;
        if (IsKeyDown(KEY_UP)) doge.y -= 4.0f;
        if (IsKeyDown(KEY_DOWN)) doge.y += 4.0f;

        if (CheckCollisionRecs(doge, bone)) {
            bone.x = BOUND_RNG(WIDTH, bone.width);
            bone.y = BOUND_RNG(HEIGHT, bone.height);
        }

        BeginDrawing();
        ClearBackground(DARKGRAY);
        DrawRectangleRec(doge, YELLOW);
        DrawRectangleRec(bone, RED);
        EndDrawing();
    }

    CloseWindow();
}

program as a gif

请注意,此示例不处理“bone”随机移动到与“doge”重叠的位置,或“doge”移出游戏区域的事件。它确实可以防止重生时“骨头” 夹在游戏区域之外。

© www.soinside.com 2019 - 2024. All rights reserved.