// LAB3.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #ifdef _MSC_VER // tham số liên kết với # pragma comment (lib, "sdl2main.lib") # pragma comment (lib, "sdl2.lib") # pragma comment (linker, "/entry:\"mainCRTStartup\"" ) # pragma comment (linker, "/subsystem:WINDOWS") #endif #define WWIDTH 320 // chiều rộng cửa sổ #define WHEIGHT 240 // chiều cao cửa sổ #define BLK_SIZE 16 // kích thước hình vuông SDL_Window * wnd; // con trỏ cửa sổ SDL SDL_Renderer * rend; // con trỏ đối tượng dựn int x = WWIDTH / 2, vx = 2; // tọa độ và vận tốc di int y = WHEIGHT / 2, vy = 2; // ban đầu của hình vuôn int a = WWIDTH / 2, va = 3; int b = WHEIGHT / 2, vb = 5; int c = WWIDTH / 2, vc = 100; int d = WHEIGHT / 2, vd = 1; void block(int x, int y) // vẽ hình vuông 16x16 t { // sử dụng màu trắng SDL_Rect r = { x, y, BLK_SIZE, BLK_SIZE }; SDL_SetRenderDrawColor(rend, 255, 255, 255, 255); SDL_RenderFillRect(rend, &r); } void block2(int a, int b) { SDL_Rect A = { a, b, BLK_SIZE, BLK_SIZE }; SDL_SetRenderDrawColor(rend, 100, 200, 250, 255); SDL_RenderFillRect(rend, &A); } void block3(int c, int d) { SDL_Rect B = { c,d,BLK_SIZE,BLK_SIZE }; SDL_SetRenderDrawColor(rend, 201, 201, 201, 201); SDL_RenderFillRect(rend, &B); } void init(int vsync) // khởi tạo môi trường đồ họa SDL { // vsync = 1 nếu muốn sử dụng V-Sync SDL_Init(SDL_INIT_VIDEO); // khởi tạo hệ thống đồ họa // tạo cửa sổ tại vị trí (100, 100), kích thước 640x480. wnd = SDL_CreateWindow("FPS", 100, 100, WWIDTH, WHEIGHT, SDL_WINDOW_SHOWN); // tạo đối tượng dựng hình 2D, kiểm tra việc kích hoạt V-Sync rend = SDL_CreateRenderer(wnd, -1, SDL_RENDERER_ACCELERATED | (vsync ? SDL_RENDERER_PRESENTVSYNC : 0)); } int event() // xử lý sự kiện { SDL_Event e; // biến lưu trữ sự kiện int running = 1; // biến kiểm soát vòng lặp while (SDL_PollEvent(&e) != 0) // lấy 1 sự kiện khỏi hàng đợi, nếu có { // nếu là phím nhấn, kiểm tra có phải ESC được nhấn hay không if (e.type == SDL_KEYDOWN) if (e.key.keysym.sym == SDLK_ESCAPE) running = 0; // nếu đúng, ta yêu cầu đóng chương trình // nếu là sự kiện đóng cửa sổ (nhấn vào nút [X]) if (e.type == SDL_QUIT) running = 0; // ta cũng yêu cầu đóng chương trình } return running; } void update() { x += vx; y += vy; // di chuyển hình vuông a += va; b += vb; c += vc; d += vd; // nảy ngược lại nếu chạm các cạnh cửa sổ if (x < 0 || x > WWIDTH-BLK_SIZE) vx = -vx; if (y < 0 || y > WHEIGHT-BLK_SIZE) vy = -vy; if (a < 0 || a > WWIDTH-BLK_SIZE) va = -va; if (b < 0 || b > WHEIGHT-BLK_SIZE) vb = -vb; if (c < 0 || c > WWIDTH-BLK_SIZE) vc = -vc; if (d < 0 || d > WHEIGHT-BLK_SIZE) vd = -vd; } void draw() // xử lý các thao tác dựng hình { // xóa toàn bộ framebuffer về màu đen SDL_SetRenderDrawColor(rend, 0, 0, 0, 0); SDL_RenderClear(rend); block(x, y); // vẽ hình vuông tại vị trí hiện hành block2(a, b); block3(c, d); SDL_RenderPresent(rend); // copy framebuffer -> screen } void done() // dọn dẹp ứng dụng { SDL_DestroyRenderer(rend); // hủy đối tượng ngữ cảnh dựng hình SDL_DestroyWindow(wnd); // hủy cửa sổ SDL SDL_Quit(); // chấm dứt phiên làm việc SDL } int main(int argc, char ** argv) { int timerBegin, frameCount; // bộ đếm FPS float fps; // giá trị frame-per-second int running = 1; // biến kiểm soát vòng lặp char buf[64]; // buffer tạm để hiển thị nội dung FPS init(1); // khởi tạo ứng dụng với VSync bật frameCount = 0; // bắt đầu đếm số frame đã dựng timerBegin = SDL_GetTicks();// lấy thời gian bắt đầu vòng lặp while (running) { running = event(); // xử lý sự kiện trên cửa sổ update(); // cập nhật trạng thái ứng dụng draw(); // dựng hình frameCount++; // đã dựng xong 1 frame // tính số FPS fps = frameCount / ((SDL_GetTicks() - timerBegin)/1000.0f); // và hiển thị lên tiêu đề cửa sổ sprintf_s(buf, "FPS=%0.2f", fps); SDL_SetWindowTitle(wnd, buf); } done(); // kết thúc ứng dụng return 0; }