mirror of
https://github.com/ScrelliCopter/Lesson10-SDL3.git
synced 2025-02-21 07:19:26 +11:00
simpler event loop
This commit is contained in:
253
Lesson10.c
253
Lesson10.c
@@ -421,34 +421,42 @@ bool CreateGLWindow(char *title, int width, int height, int bits, bool fullscree
|
|||||||
return true; // Success
|
return true; // Success
|
||||||
}
|
}
|
||||||
|
|
||||||
void WndProc(SDL_Event *uMsg)
|
|
||||||
|
bool done = false; // Bool Variable To Exit Loop
|
||||||
|
|
||||||
|
void WndProc(SDL_Event *event)
|
||||||
{
|
{
|
||||||
switch (uMsg->type) // Check For Windows Messages
|
switch (event->type) // Check For Windows Messages
|
||||||
{
|
{
|
||||||
case SDL_EVENT_KEY_DOWN: // Is A Key Being Held Down?
|
case SDL_EVENT_QUIT: // Have We Received A Quit Message?
|
||||||
{
|
{
|
||||||
keys[uMsg->key.keysym.scancode] = true; // If So, Mark It As TRUE
|
done = true; // If So done=TRUE
|
||||||
break; // Jump Back
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case SDL_EVENT_KEY_DOWN: // Is A Key Being Held Down?
|
||||||
|
{
|
||||||
|
keys[event->key.keysym.scancode] = true; // If So, Mark It As TRUE
|
||||||
|
break; // Jump Back
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_EVENT_KEY_UP: // Has A Key Been Released?
|
case SDL_EVENT_KEY_UP: // Has A Key Been Released?
|
||||||
{
|
{
|
||||||
keys[uMsg->key.keysym.scancode] = false; // If So, Mark It As FALSE
|
keys[event->key.keysym.scancode] = false; // If So, Mark It As FALSE
|
||||||
break; // Jump Back
|
break; // Jump Back
|
||||||
}
|
}
|
||||||
|
|
||||||
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: // Resize The OpenGL Window
|
case SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: // Resize The OpenGL Window
|
||||||
{
|
{
|
||||||
ReSizeGLScene(uMsg->window.data1, uMsg->window.data2); // LoWord=Width, HiWord=Height
|
ReSizeGLScene(event->window.data1, event->window.data2); // data1=Width, data2=Height
|
||||||
break; // Jump Back
|
break; // Jump Back
|
||||||
}
|
}
|
||||||
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
SDL_Event msg; // Windows Message Structure
|
|
||||||
bool done = false; // Bool Variable To Exit Loop
|
|
||||||
|
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
|
|
||||||
@@ -478,136 +486,127 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
while (!done) // Loop That Runs While done=FALSE
|
while (!done) // Loop That Runs While done=FALSE
|
||||||
{
|
{
|
||||||
if (SDL_PollEvent(&msg) > 0) // Is There A Message Waiting?
|
SDL_Event event; // SDL Event Structure
|
||||||
|
while (SDL_PollEvent(&event) > 0) // Is There A Message Waiting?
|
||||||
{
|
{
|
||||||
if (msg.type == SDL_EVENT_QUIT) // Have We Received A Quit Message?
|
WndProc(&event); // Deal with events
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
|
||||||
|
if ((active && !DrawGLScene()) || keys[SDL_SCANCODE_ESCAPE]) // Active? Was There A Quit Received?
|
||||||
|
{
|
||||||
|
done = true; // ESC or DrawGLScene Signalled A Quit
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_GL_SwapWindow(win); // Swap Buffers (Double Buffering)
|
||||||
|
if (keys[SDL_SCANCODE_B] && !bpressed)
|
||||||
|
{
|
||||||
|
bpressed = true;
|
||||||
|
blend = !blend;
|
||||||
|
if (!blend)
|
||||||
{
|
{
|
||||||
done = true; // If So done=TRUE
|
glDisable(GL_BLEND);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
}
|
}
|
||||||
else // If Not, Deal With Window Messages
|
else
|
||||||
{
|
{
|
||||||
WndProc(&msg);
|
glEnable(GL_BLEND);
|
||||||
|
glDisable(GL_DEPTH_TEST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // If There Are No Messages
|
if (!keys[SDL_SCANCODE_B])
|
||||||
{
|
{
|
||||||
// Draw The Scene. Watch For ESC Key And Quit Messages From DrawGLScene()
|
bpressed = false;
|
||||||
if ((active && !DrawGLScene()) || keys[SDL_SCANCODE_ESCAPE]) // Active? Was There A Quit Received?
|
}
|
||||||
|
|
||||||
|
if (keys[SDL_SCANCODE_F] && !fpressed)
|
||||||
|
{
|
||||||
|
fpressed = true;
|
||||||
|
filter += 1;
|
||||||
|
if (filter > 2)
|
||||||
{
|
{
|
||||||
done = true; // ESC or DrawGLScene Signalled A Quit
|
filter = 0;
|
||||||
}
|
}
|
||||||
else // Not Time To Quit, Update Screen
|
}
|
||||||
|
if (!keys[SDL_SCANCODE_F])
|
||||||
|
{
|
||||||
|
fpressed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys[SDL_SCANCODE_PAGEUP])
|
||||||
|
{
|
||||||
|
z -= 0.02f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys[SDL_SCANCODE_PAGEDOWN])
|
||||||
|
{
|
||||||
|
z += 0.02f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keys[SDL_SCANCODE_UP])
|
||||||
|
{
|
||||||
|
|
||||||
|
xpos -= (float)sin(heading * piover180) * 0.05f;
|
||||||
|
zpos -= (float)cos(heading * piover180) * 0.05f;
|
||||||
|
if (walkbiasangle >= 359.0f)
|
||||||
{
|
{
|
||||||
SDL_GL_SwapWindow(win); // Swap Buffers (Double Buffering)
|
walkbiasangle = 0.0f;
|
||||||
if (keys[SDL_SCANCODE_B] && !bpressed)
|
}
|
||||||
{
|
else
|
||||||
bpressed = true;
|
{
|
||||||
blend = !blend;
|
walkbiasangle += 10;
|
||||||
if (!blend)
|
}
|
||||||
{
|
walkbias = (float)sin(walkbiasangle * piover180) / 20.0f;
|
||||||
glDisable(GL_BLEND);
|
}
|
||||||
glEnable(GL_DEPTH_TEST);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
glEnable(GL_BLEND);
|
|
||||||
glDisable(GL_DEPTH_TEST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!keys[SDL_SCANCODE_B])
|
|
||||||
{
|
|
||||||
bpressed = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_F] && !fpressed)
|
if (keys[SDL_SCANCODE_DOWN])
|
||||||
{
|
{
|
||||||
fpressed = true;
|
xpos += (float)sin(heading*piover180) * 0.05f;
|
||||||
filter += 1;
|
zpos += (float)cos(heading*piover180) * 0.05f;
|
||||||
if (filter > 2)
|
if (walkbiasangle <= 1.0f)
|
||||||
{
|
{
|
||||||
filter = 0;
|
walkbiasangle = 359.0f;
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
if (!keys[SDL_SCANCODE_F])
|
{
|
||||||
{
|
walkbiasangle -= 10;
|
||||||
fpressed = false;
|
}
|
||||||
}
|
walkbias = (float)sin(walkbiasangle * piover180) / 20.0f;
|
||||||
|
}
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_PAGEUP])
|
if (keys[SDL_SCANCODE_RIGHT])
|
||||||
{
|
{
|
||||||
z -= 0.02f;
|
heading -= 1.0f;
|
||||||
}
|
yrot = heading;
|
||||||
|
}
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_PAGEDOWN])
|
if (keys[SDL_SCANCODE_LEFT])
|
||||||
{
|
{
|
||||||
z += 0.02f;
|
heading += 1.0f;
|
||||||
}
|
yrot = heading;
|
||||||
|
}
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_UP])
|
if (keys[SDL_SCANCODE_PAGEUP])
|
||||||
{
|
{
|
||||||
|
lookupdown -= 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
xpos -= (float)sin(heading * piover180) * 0.05f;
|
if (keys[SDL_SCANCODE_PAGEDOWN])
|
||||||
zpos -= (float)cos(heading * piover180) * 0.05f;
|
{
|
||||||
if (walkbiasangle >= 359.0f)
|
lookupdown += 1.0f;
|
||||||
{
|
}
|
||||||
walkbiasangle = 0.0f;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
walkbiasangle += 10;
|
|
||||||
}
|
|
||||||
walkbias = (float)sin(walkbiasangle * piover180) / 20.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_DOWN])
|
if (keys[SDL_SCANCODE_F1]) // Is F1 Being Pressed?
|
||||||
{
|
{
|
||||||
xpos += (float)sin(heading*piover180) * 0.05f;
|
keys[SDL_SCANCODE_F1] = false; // If So Make Key FALSE
|
||||||
zpos += (float)cos(heading*piover180) * 0.05f;
|
FreeResources();
|
||||||
if (walkbiasangle <= 1.0f)
|
KillGLWindow(); // Kill Our Current Window
|
||||||
{
|
fullscreen = !fullscreen; // Toggle Fullscreen / Windowed Mode
|
||||||
walkbiasangle = 359.0f;
|
// Recreate Our OpenGL Window
|
||||||
}
|
if (!CreateGLWindow("Lionel Brits & NeHe's 3D World Tutorial", 640, 480, 16, fullscreen))
|
||||||
else
|
{
|
||||||
{
|
return 0; // Quit If Window Was Not Created
|
||||||
walkbiasangle -= 10;
|
|
||||||
}
|
|
||||||
walkbias = (float)sin(walkbiasangle * piover180) / 20.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_RIGHT])
|
|
||||||
{
|
|
||||||
heading -= 1.0f;
|
|
||||||
yrot = heading;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_LEFT])
|
|
||||||
{
|
|
||||||
heading += 1.0f;
|
|
||||||
yrot = heading;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_PAGEUP])
|
|
||||||
{
|
|
||||||
lookupdown -= 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_PAGEDOWN])
|
|
||||||
{
|
|
||||||
lookupdown += 1.0f;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keys[SDL_SCANCODE_F1]) // Is F1 Being Pressed?
|
|
||||||
{
|
|
||||||
keys[SDL_SCANCODE_F1] = false; // If So Make Key FALSE
|
|
||||||
FreeResources();
|
|
||||||
KillGLWindow(); // Kill Our Current Window
|
|
||||||
fullscreen = !fullscreen; // Toggle Fullscreen / Windowed Mode
|
|
||||||
// Recreate Our OpenGL Window
|
|
||||||
if (!CreateGLWindow("Lionel Brits & NeHe's 3D World Tutorial", 640, 480, 16, fullscreen))
|
|
||||||
{
|
|
||||||
return 0; // Quit If Window Was Not Created
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user