C 点击图片

C 点击图片,c,sdl-2,sdl-image,C,Sdl 2,Sdl Image,我知道为什么这里不起作用,但我只是想问一下,是否有办法从void或int函数中得到高度、宽度、w或y位置。或者只是如何重新创建这一工作,它在鼠标上准确的图片klik。我知道我可以用main中的图像来完成这一切,但这只是一个菜单,所以我不想有900行的主功能。我有一个想法,就是在一个不同的文件中定义它,而不使用void或int,只需在那里编写一个代码,但还有一个问题,我将如何将其称为state。 这是我的密码: #include <stdio.h> #include <stdli

我知道为什么这里不起作用,但我只是想问一下,是否有办法从void或int函数中得到高度、宽度、w或y位置。或者只是如何重新创建这一工作,它在鼠标上准确的图片klik。我知道我可以用main中的图像来完成这一切,但这只是一个菜单,所以我不想有900行的主功能。我有一个想法,就是在一个不同的文件中定义它,而不使用void或int,只需在那里编写一个代码,但还有一个问题,我将如何将其称为state。 这是我的密码:

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

#include <SDL.h>
#include <SDL_image.h>

#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480

SDL_Window* window = NULL;
SDL_Renderer *renderer;

static SDL_Surface *screen;
static SDL_Surface *nazov;
static SDL_Surface *menu_start;
static SDL_Surface *menu_exit;
SDL_Texture *screen_texture;




 int draw_menu()
{
int width, height;
SDL_Rect src;
SDL_Rect dest;
SDL_Rect src_1;
SDL_Rect dest_1;
SDL_Rect src_2;
SDL_Rect dest_2;

src.x = 0;
src.y = 0;
src.w = nazov->w;
src.h = nazov->h;

dest.x = (screen->w / 2) - (src.w / 2);
dest.y = (screen->h / 2) - (src.h / 2);
dest.w = nazov->w;
dest.h = nazov->h;

src_1.x = 0;
src_1.y = 0;
src_1.w = menu_start->w;
src_1.h = menu_start->h;

dest_1.x = (screen->w / 2) - (src_1.w / 2);
dest_1.y = (screen->h / 2) + src.h;
dest_1.w = menu_start->w;
dest_1.h = menu_start->h;

src_2.x = 0;
src_2.y = 0;
src_2.w = menu_exit->w;
src_2.h = menu_exit->h;

dest_2.x = (screen->w / 2) - (src_2.w / 2);
dest_2.y = (screen->h / 2) + (src.h + src_1.h + (src_1.h * 2));
dest_2.w = menu_exit->w;
dest_2.h = menu_exit->h;

SDL_BlitSurface(nazov, &src, screen, &dest);
SDL_BlitSurface(menu_start, &src_1, screen, &dest_1);
SDL_BlitSurface(menu_exit, &src_2, screen, &dest_2);
}


 int main(int argc, char *args[])
{
if (initialize(SCREEN_WIDTH, SCREEN_HEIGHT, argc, args) == 1) {

    return 0;
}

SDL_GetWindowSize(window, &width, &height);
int quit = 0;
int state = 0;
SDL_Event event;



   while(quit == 0) {


    while (SDL_PollEvent(&event)){
    SDL_PumpEvents();
    const Uint8 *keystate = SDL_GetKeyboardState(NULL);

    if (keystate[SDL_SCANCODE_ESCAPE]) {

        quit = 1;
    }
    if (event.type == SDL_MOUSEBUTTONDOWN)
    {
        int x = event.button.x;
        int y = event.button.y;
        if(event.button.button == SDL_BUTTON_LEFT)
        {
            if ((x > src_1.x) && x < (src_1.x + src_1.w) && ( y > src_1.y ) && ( y < src_1.y + 
    src_1.h ))
            {
            printf("clik\n");
            }
        }
    }
    SDL_RenderClear(renderer);
    SDL_FillRect(screen, NULL, 0x000000ff);


    if (state == 0)
    {
        draw_menu();
    }
    SDL_UpdateTexture(screen_texture, NULL, screen->pixels, screen->w * sizeof (Uint32));
    SDL_RenderCopy(renderer, screen_texture, NULL, NULL);
    SDL_RenderPresent(renderer);

   }

   }

SDL_FreeSurface(screen);
SDL_FreeSurface(nazov);
SDL_FreeSurface(menu_start);
SDL_FreeSurface(menu_exit);
//free renderer and all textures used with it
SDL_DestroyRenderer(renderer);

//Destroy window
SDL_DestroyWindow(window);

//Quit SDL subsystems
SDL_Quit();

return 0;

}

 int initialize(int width, int height, int argc, char *args[]) {

//Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {

    printf("SDL could not initialize! SDL_Error: %s\n", SDL_GetError());

    return 1;
}


SDL_CreateWindowAndRenderer(SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_FULLSCREEN_DESKTOP, &window, &renderer);


if (window == NULL) {

    printf("Window could not be created! SDL_Error: %s\n", SDL_GetError());

    return 1;
}

screen = SDL_CreateRGBSurfaceWithFormat(0, width, height, 32, SDL_PIXELFORMAT_RGBA32);

if (screen == NULL) {

    printf("Could not create the screen surfce! SDL_Error: %s\n", SDL_GetError());

    return 1;
}

screen_texture = SDL_CreateTextureFromSurface(renderer, screen);

if (screen_texture == NULL) {

    printf("Could not create the screen_texture! SDL_Error: %s\n", SDL_GetError());

    return 1;
}

nazov = IMG_Load("nazov.png");
if (nazov == NULL) {

    printf("Could not Load nazov image! SDL_Error: %s\n", SDL_GetError());

    return 1;
}
menu_start = IMG_Load("menu_start.png");
if (menu_start == NULL) {

    printf("Could not Load menu_start image! SDL_Error: %s\n", SDL_GetError());

    return 1;
}
menu_exit = IMG_Load("menu_exit.png");
if (menu_exit == NULL) {

    printf("Could not Load nazov image! SDL_Error: %s\n", SDL_GetError());

    return 1;
}


Uint32 colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(nazov, SDL_TRUE, colorkey);





return 0;
}
#包括
#包括
#包括
#包括
#定义屏幕宽度640
#定义屏幕高度480
SDL_Window*Window=NULL;
SDL_渲染器*渲染器;
静态SDL_表面*屏幕;
静态SDL_表面*nazov;
静态SDL_表面*菜单_开始;
静态SDL_表面*菜单_退出;
SDL_纹理*屏幕_纹理;
int draw_菜单()
{
int宽度、高度;
SDL__Rect src;
直接目的地;
SDL_Rect src_1;
直接目的地1;
SDL_Rect src_2;
SDL直接目的地2;
src.x=0;
src.y=0;
src.w=nazov->w;
src.h=nazov->h;
目标x=(屏幕->w/2)-(src.w/2);
目的地y=(屏幕->h/2)-(src.h/2);
目的地w=nazov->w;
目的地h=nazov->h;
src_1.x=0;
src_1.y=0;
src_1.w=菜单开始->w;
src_1.h=菜单开始->h;
dest_1.x=(屏幕->w/2)-(src_1.w/2);
dest_1.y=(屏幕->h/2)+src.h;
dest_1.w=菜单\u开始->w;
dest_1.h=菜单\u开始->h;
src_2.x=0;
src_2.y=0;
src_2.w=菜单退出->w;
src_2.h=菜单退出->h;
dest_2.x=(屏幕->w/2)-(src_2.w/2);
dest_2.y=(屏幕->h/2)+(src.h+src_1.h+(src_1.h*2));
dest_2.w=菜单退出->w;
dest_2.h=菜单退出->h;
SDL_BlitSurface(纳佐夫、src、屏幕和目的地);
SDL_BlitSurface(菜单开始和src_1、屏幕和目的地1);
SDL_BlitSurface(菜单退出和src_2、屏幕和目的地2);
}
int main(int argc,char*args[]
{
如果(初始化(屏幕宽度、屏幕高度、argc、args)==1){
返回0;
}
SDL_GetWindowsSize(窗口、宽度和高度);
int-quit=0;
int state=0;
SDL_事件;
while(quit==0){
while(SDL_事件和事件)){
SDL_泵通风孔();
const Uint8*keystate=SDL_GetKeyboardState(NULL);
if(键状态[SDL\U扫描代码\U转义]){
退出=1;
}
if(event.type==SDL_MOUSEBUTTONDOWN)
{
INTX=事件按钮x;
int y=event.button.y;
if(event.button.button==SDL_按钮左)
{
如果((x>src_1.x)和&x<(src_1.x+src_1.w)和&(y>src_1.y)和&(y像素,屏幕->w*sizeof(Uint32));
SDL_RenderCopy(渲染器、屏幕_纹理、NULL、NULL);
SDL_渲染器呈现(渲染器);
}
}
SDL_自由曲面(屏幕);
SDL_自由曲面(纳佐夫);
SDL_自由曲面(菜单开始);
SDL_自由曲面(菜单_退出);
//自由渲染器及其使用的所有纹理
SDL_渲染器(渲染器);
//破坏窗口
SDL_窗口(窗口);
//退出SDL子系统
SDL_退出();
返回0;
}
int初始化(int-width、int-height、int-argc、char*args[]){
//初始化SDL
if(SDL_Init(SDL_Init_视频)<0){
printf(“SDL无法初始化!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
SDL_创建窗口和渲染器(屏幕宽度、屏幕高度、SDL_窗口、全屏桌面、窗口和渲染器);
如果(窗口==NULL){
printf(“无法创建窗口!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
screen=SDL_CreateRGBSurfaceWithFormat(0,宽度,高度,32,SDL_像素格式_RGBA32);
如果(屏幕==NULL){
printf(“无法创建屏幕浏览!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
screen\u texture=SDL\u CreateTextureFromSurface(渲染器,屏幕);
如果(屏幕纹理==NULL){
printf(“无法创建屏幕纹理!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
nazov=IMG_荷载(“nazov.png”);
if(nazov==NULL){
printf(“无法加载nazov图像!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
menu_start=IMG_Load(“menu_start.png”);
如果(菜单\开始==NULL){
printf(“无法加载菜单\u开始图像!SDL\u错误:%s\n”,SDL\u GetError());
返回1;
}
menu_exit=IMG_Load(“menu_exit.png”);
如果(菜单_退出==NULL){
printf(“无法加载nazov图像!SDL_错误:%s\n”,SDL_GetError());
返回1;
}
Uint32 colorkey=SDL_MapRGB(屏幕->格式,255,0,255);
SDL_SetColorKey(nazov,SDL_TRUE,colorkey);
返回0;
}

我无法评论,但如果您的图像有自己的
SDL\u Rect
(通过这样做实现):

然后你可以这样称呼:

SDL_Rect imageRect;
SDL_QueryTexture(imageTexture, nullptr, nullptr, &imageRect.w, &imageRect.h);
if ( SDL_PointInRect( &mousePosition, &imageRect ) ){
    //Mouse in texture
}