123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #include <iostream>
- #include <SDL2/SDL.h>
- #include <box2d/box2d.h>
- #include "texturer.h"
- #include "Input.h"
- using namespace std;
- int main() {
- // Start
- cout << "SDL2 app is loading..." << endl;
- // Useful data
- const int SCREEN_WIDTH = 1200;
- const int SCREEN_HEIGHT = 700;
- // Init video
- if (SDL_Init(SDL_INIT_VIDEO) != 0) {
- logSDLError(cout, "SDL_Init(SDL_INIT_VIDEO)");
- return 1;
- }
- // Opening window
- SDL_Window *win = SDL_CreateWindow("Hello Box2D!",
- SDL_WINDOWPOS_UNDEFINED,
- SDL_WINDOWPOS_UNDEFINED,
- SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
- if (win == nullptr) {
- logSDLError(cout, "SDL_CreateWindow");
- SDL_Quit();
- return 1;
- }
- // Create a renderer
- SDL_Renderer *ren = SDL_CreateRenderer(win, -1,
- SDL_RENDERER_ACCELERATED |
- SDL_RENDERER_PRESENTVSYNC);
- if (ren == nullptr) {
- SDL_DestroyWindow(win);
- logSDLError(cout, "SDL_CreateRenderer");
- SDL_Quit();
- return 1;
- }
- // Events
- Input myInput;
- // Time
- Uint32 frameRate(60);
- Uint32 prevTime(0);
- Uint32 waitTime(1000 / frameRate);
- float timeStep(1.0f / frameRate);
- int32 velocityIterations = 6;
- int32 positionIterations = 2;
- /// Physic
- // World
- b2Vec2 gravity(0.0f, 10.0f);
- b2World world(gravity);
- float zoom = 50.0f;
- // Defs
- b2BodyDef myBodyDef;
- b2PolygonShape myBox;
- // Ground body
- myBodyDef.position.Set(10.0f, 17.0f);
- b2Body* groundBody(world.CreateBody(&myBodyDef));
- myBox.SetAsBox(50.0f, 5.0f);
- groundBody->CreateFixture(&myBox, 0.0f); // Warning : simple function (no fixture)
- // Crate body
- myBodyDef.type = b2_dynamicBody;
- myBodyDef.position.Set(10.0f, -4.0f);
- b2Body* crateBody(world.CreateBody(&myBodyDef));
- myBox.SetAsBox(1.0f, 1.0f);
- b2FixtureDef myFixtureDef;
- myFixtureDef.shape = &myBox;
- myFixtureDef.density = 1.0f;
- myFixtureDef.friction = 0.3f;
- myFixtureDef.restitution = 0.3f;
- crateBody->CreateFixture(&myFixtureDef);
- while (!myInput.isFinished()) {
- // Update events
- myInput.updateEvents();
- // Update physic
- world.Step(timeStep, velocityIterations, positionIterations);
- // Reset renderer
- SDL_SetRenderDrawColor(ren, 0xFF, 0xFF, 0xFF, 0xFF);
- SDL_RenderClear(ren);
- // Foreground
- b2Vec2 pos(crateBody->GetPosition());
- float angle(crateBody->GetAngle());
- SDL_Rect fillRect = {(int)(pos.x * zoom), (int)(pos.y * zoom), 100, 100};
- SDL_SetRenderDrawColor(ren, 0xFF, 0x00, 0x00, 0xFF);
- SDL_RenderFillRect(ren, &fillRect);
- // Render
- SDL_RenderPresent(ren);
- // Pause
- if (SDL_GetTicks() < prevTime + waitTime)
- SDL_Delay(waitTime + prevTime - SDL_GetTicks());
- prevTime = SDL_GetTicks();
- }
- // End
- SDL_DestroyRenderer(ren);
- SDL_DestroyWindow(win);
- SDL_Quit();
- return 0;
- }
|