如何使用SDL c++在win32窗口中设置GUI按钮
How to set a GUI Button in the win32 window using SDL C++?
我是SDL和游戏开发的新手。我想制作一款游戏,我需要在游戏窗口中添加一个"开始"按钮。有人能告诉我怎么做吗?整个屏幕没有鼠标事件,我只想创建一个按钮来点击它,我可以在哪里插入按钮的代码?这是我的代码:
int main (int argc, char *argv[]){
int quit = 0;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = NULL;
window = SDL_CreateWindow("Snaykie v1.0",350, 150, 800, 500, SDL_WINDOW_SHOWN);
if (window == NULL){
std::cout << "Can not open the game" << std::endl;
return 0;
}
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Event* evt = new SDL_Event();
SDL_Texture* txt = NULL;
txt = IMG_LoadTexture(renderer, "mainview.bmp");
SDL_Rect rct;
rct.x = 0 ;
rct.y = 0;
rct.h = 500;
rct.w = 800;
SDL_Surface *button = NULL;
while (!quit && evt->type != SDL_QUIT){
SDL_PollEvent(evt);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, txt, NULL, &rct);
SDL_RenderPresent(renderer);
}
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
delete evt;
return 0;
}
这不是一两行那么简单。下面是一个例子:
#include <SDL2/SDL.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
typedef struct {
SDL_Rect draw_rect; // dimensions of button
struct {
Uint8 r, g, b, a;
} colour;
bool pressed;
} button_t;
static void button_process_event(button_t *btn, const SDL_Event *ev) {
// react on mouse click within button rectangle by setting 'pressed'
if(ev->type == SDL_MOUSEBUTTONDOWN) {
if(ev->button.button == SDL_BUTTON_LEFT &&
ev->button.x >= btn->draw_rect.x &&
ev->button.x <= (btn->draw_rect.x + btn->draw_rect.w) &&
ev->button.y >= btn->draw_rect.y &&
ev->button.y <= (btn->draw_rect.y + btn->draw_rect.h)) {
btn->pressed = true;
}
}
}
static bool button(SDL_Renderer *r, button_t *btn) {
// draw button
SDL_SetRenderDrawColor(r, btn->colour.r, btn->colour.g, btn->colour.b, btn->colour.a);
SDL_RenderFillRect(r, &btn->draw_rect);
// if button press detected - reset it so it wouldn't trigger twice
if(btn->pressed) {
btn->pressed = false;
return true;
}
return false;
}
int main (int argc, char *argv[]){
int quit = 0;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = NULL;
window = SDL_CreateWindow("",350, 150, 800, 500, SDL_WINDOW_SHOWN);
if (window == NULL){
fprintf(stderr, "create window failed: %sn", SDL_GetError());
return 1; // 'error' return status is !0. 1 is good enough
}
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if(!renderer) { // renderer creation may fail too
fprintf(stderr, "create renderer failed: %sn", SDL_GetError());
return 1;
}
SDL_Texture* txt = NULL;
SDL_Rect rct;
rct.x = 0 ;
rct.y = 0;
rct.h = 500;
rct.w = 800;
// button state - colour and rectangle
button_t start_button = {
.colour = { .r = 255, .g = 255, .b = 255, .a = 255, },
.draw_rect = { .x = 128, .y = 128, .w = 128, .h = 128 },
};
enum {
STATE_IN_MENU,
STATE_IN_GAME,
} state = 0;
while(!quit) {
SDL_Event evt; // no need for new/delete, stack is fine
// event loop and draw loop are separate things, don't mix them
while(SDL_PollEvent(&evt)) {
// quit on close, window close, or 'escape' key hit
if(evt.type == SDL_QUIT ||
(evt.type == SDL_WINDOWEVENT && evt.window.event == SDL_WINDOWEVENT_CLOSE) ||
(evt.type == SDL_KEYDOWN && evt.key.keysym.sym == SDLK_ESCAPE)) {
quit = 1;
}
// pass event to button
button_process_event(&start_button, &evt);
}
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
// SDL_RenderCopy(renderer, txt, NULL, &rct);
if(state == STATE_IN_MENU) {
if(button(renderer, &start_button)) {
printf("start button pressedn");
state = STATE_IN_GAME; // state change - button will not be drawn anymore
}
} else if(state == STATE_IN_GAME) {
/* your game logic */
}
SDL_RenderPresent(renderer);
}
SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
return 0;
}
(它是C,但这里不是一个点)。它绘制一个简单的恒定颜色的矩形,并检测点击。用纹理代替矩形是很简单的;添加文本可能有点困难,使用SDL_ttf可能是最简单的方法。
它可以在很多方面得到改进,这取决于你想要得到什么。例如,它会在鼠标按下时做出反应,而在某些情况下,你可能想要对按钮释放做出反应,并跟踪它被按下和释放的位置。如果你有很多按钮,在每个按钮上调用event update是很难看的,所以你可能需要使用不同的系统。你可能也想要有非矩形按钮(例如一些由图像指定的形状)-这将需要完全不同的方法,因为你需要检查鼠标点击对形状蒙版。
我建议你看一下imgui。
作为旁注,不要new
SDL_Event
,这绝对没有意义。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何在C Win32 GUI中为文本框设置默认背景(灰色)文本
- GCC/G++ 编译器设置 GUI
- 如何在运行 cpp 应用程序的 GUI 时通过 GDB 设置中断
- Qt Creator中的Qt GUI应用程序构建设置
- MSVS: c++: Allegro 5模板:Agui GUI API:如何设置包括
- Qt c++加载GUI然后加载其他设置
- CMake -从另一个CMake文件的GUI设置中删除一个选项
- 如何使用SDL c++在win32窗口中设置GUI按钮
- 如何在Qt Creator 5.7中制作一个只有一个窗口的c++ GUI程序,但每次点击都会使窗口有其他元素-如设置向导