在这段代码中,狗的本意是“吃”骨头,但骨头并没有被吃掉,而是狗远离了骨头!我觉得这个游戏在欺骗我。
#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;
}
这是输出的图像:
我完全不知道该尝试什么。 Stack Overflow 希望我添加更多文本,因为“这里只有代码!”但我真的不知道该添加什么。所以,让我告诉你,我不确定这里到底出了什么问题。对我来说,所有的逻辑都成立!它应该有效,而且,天哪,为什么是狗在动,而不是骨头!
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();
}
请注意,此示例不处理“bone”随机移动到与“doge”重叠的位置,或“doge”移出游戏区域的事件。它确实可以防止重生时“骨头” 夹在游戏区域之外。