Sakura__Lu 2016-09-29 00:00 采纳率: 42.9%
浏览 1033
已采纳

SDL2雨点下落的实现却变成了面条一样的效果...

用SDL2实现雨点下落的结果,本人小白,是按照视频一步步来写的,不知道哪里出错了

本来是雨水一点点往下落的效果,为什么变成了面条一样的呢?求解释,求修改
素材图片是BMP格式的,无法上传, balck.bmp 是一个黑色的小点,用来做覆盖背景,circle是一个白色的圆,圆的不用的杂色的RGB是149,149,149.
大神们有空帮我跑一跑找找错误 啊

 #include<SDL.h>
#include<iostream>
#define WINDOW_HEIGHT 600
#define WINDOW_WIDTH 800
using namespace std;

typedef struct {
    int x;
    int y;
    int r;
    int speed;
}Spot;

void moveSpot(Spot* spot){
    spot->y += spot->speed;
    if(spot->y >= WINDOW_HEIGHT){
        spot->y = 0;
    }

}


void drawSpot(Spot *spot, SDL_Renderer *rend ,SDL_Texture *circle){
    SDL_Rect rect;
    rect.x = spot->x;
    rect.y = spot->y;
    rect.w = spot->r;
    rect.h = spot->r;
    SDL_RenderCopy(rend, circle, NULL , &rect);
}


int main( int argc ,char ** argv)
{
    /*
        窗口创建
    */
    SDL_Window *window = SDL_CreateWindow("meteor",
                                        SDL_WINDOWPOS_UNDEFINED,SDL_WINDOWPOS_UNDEFINED,
                                        WINDOW_WIDTH,WINDOW_HEIGHT,
                                        SDL_WINDOW_SHOWN
                                            );
    /*渲染器初始化*/
    SDL_Renderer* rend = SDL_CreateRenderer(window, -1 ,SDL_RENDERER_ACCELERATED );

    /*加载图片*/
    SDL_Surface * blackSurface = SDL_LoadBMP("balck.bmp");
    SDL_Surface * circleSurface = SDL_LoadBMP("circle.bmp");

    /*除杂色*/
    SDL_SetColorKey(circleSurface, SDL_TRUE, SDL_MapRGB(circleSurface->format,149,149,149));

    /*设置纹理*/
    SDL_Texture *black = SDL_CreateTextureFromSurface(rend,blackSurface);
    SDL_Texture *circle = SDL_CreateTextureFromSurface(rend,circleSurface);

    /*位置矩形*/
    SDL_Rect rectWindow;
    rectWindow.x = 0;
    rectWindow.y = 0;
    rectWindow.w = WINDOW_WIDTH;
    rectWindow.h = WINDOW_HEIGHT;

    SDL_Rect rectCircle;
    rectCircle.x = 0;
    rectCircle.y = 0;
    rectCircle.w = 5;
    rectCircle.h = 5;

    bool quit = false;

    //初始化50个白点
    Spot spots[50];
    for (int i = 0; i < 50; i++)
    {
        spots[i].x = rand()%WINDOW_WIDTH;
        spots[i].y = rand()%WINDOW_HEIGHT;
        spots[i].r = 4;
        spots[i].speed = rand() % 2 +1;
    }
    SDL_Event event;
    while(!quit){
        while(SDL_PollEvent(&event)){
            if(event.type == SDL_QUIT){
                quit = true;
            }
        }
        SDL_RenderCopy(rend, black, NULL , &rectWindow);
        /*画点*/
        for (int i = 0; i < 50; i++)
        {
            drawSpot(&spots[i],rend,circle);
            moveSpot(&spots[i]);
        }
        SDL_RenderPresent(rend);
        SDL_Delay(5);
    }

    SDL_DestroyWindow(window);
    return 0;
}

我把文件和代码贴出来,大神们帮我看看哇!求帮修改,谢谢各位大神啦!!图片说明

  • 写回答

4条回答 默认 最新

  • 关注

    你这应该是产生的雨点都出现了,要清除之前产生的雨点

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵