Game C++ SDL – Bài 2: Load một image lên windows
Chào mừng các bạn đến với chủ đề học lập trình game c++ SDL.
Bài số 2 tiếp theo này mình sẽ giới thiệu với các bạn về kỹ thuật load một tấm ảnh background làm nền cho game.
Đây chỉ là demo thử nghiệm cơ bản để chúng ta kiểm tra xem các lib SDL hoạt động đã ok chưa.
1. Chuẩn bị một tấm ảnh.
Các bạn có thể thiết kế một background ảnh riêng cho chương trình game của các bạn.
Hoặc sử dụng tấm ảnh dưới đây của mình để thực hành cũng được.
Sau khi đã có được ảnh.
Bạn cũng đã có được project demo build thành công từ bài số 1.
Chúng ta copy ảnh vào : Cùng vị trí với file source code main.cpp.
Và copy thêm một lần nữa vào folder debug và release (nếu bạn build release)
2. Bắt đầu code
Step 1. Include thêm thư viện:
#include <string>
#include <SDL_image.h>
Step2. Viết một hàm LoadImage như sau:
+ Hàm này trả về là kiểu SDL Surface là một kiểu dữ liệu mà nó có thể tạo ra một surface image bao phủ lên màn hình windows.
+ Đối số đầu vào là tên của ảnh background.
+ IMG_load sẽ thực hiện đọc file ảnh và trả về kết quả là kiểu dữ liệu SDL_Surface.
+ Sau đó kết quả trả về được đưa vào hàm định dạng hiển thị SDL_DisplayFormat để tối ưu hóa surface cho phù hợp.
Step 3. Xử lý trong hàm Main.
Trong hàm Main
+ Khởi tạo chế độ sử dụng thư viện SDL với kiểu là: SDL_INIT_EVEYTHNG.
+ Thiết lập chế độ định dang video SDL trong môi trường windows.
=> Kích thước windows sẽ là 1200, 600. Tôi có thể chọn ngẫu nhiên và sửa lại size của tấm ảnh. Hoặc tôi có thể chọn theo size tấm ảnh.
=> 32 là chỉ số bit per pixel. Nghĩa là một pixel được mã hóa bởi 32 bit.
=> Và cờ flag chọn là SDL_SWSurface
+ Thực hiện load ảnh bằng cách gọi hàm LoadImage ở trên và chúng ta truyền tên ảnh vào. Các bạn nhớ đổi tên tấm ảnh khi down về cho đúng tên bkground.png
+ Sau đó gọi hàm SDL_BlitSurface để thực hiện quá trình map ảnh vào màn hình đồ họa trong chế độ SDL.
+ Thực hiện update lại màn hình screen.
Nếu không có hàm trễ 5000 thì chương trình chạy lên rồi sẽ tắt ngay.
Cuối cùng là giải phóng biến lưu trữ image và thoát chương trình.
Sau đó chúng ta build chương trình và chạy:
+ Nếu thành công image sẽ được load lên. và sau 5s thì chương trình sẽ thoát.
+ Nếu không thành công hãy kiểm tra.
=> tên image đã đúng hay chưa
=> đã copy image vào folder chứa file source : main.cpp hay chưa
=> trong debug folder đã copy các file dll hay chưa ?
Ok. Và dưới đây là video demo để các bạn có thể thực hành dễ dàng hơn
______________________________________________
Pass Pham
ad ơi mình thấy bây giờ người ta dùng sdl_renderer và sdl_texture thay cho sdl_surface để load ảnh lên màn hình, sdl_texture là phiên bản mới của sdl_surface.
ad update code đi ad, đây là link chi tiết hơn: https://stackoverflow.com/questions/21007329/what-is-a-sdl-renderer
oh, ok để mình nghiên cứu thử xem, thank bạn chia sẻ
Tìm mãi ms thấy web học lập trình game hay thế này. Tks ad nha. Em thấy một mình a làm đc cái web này thì a thành thánh cmnr
chúc chú học lập trình tốt, sớm làm ngon được 1 game
A ơi trc khi học cái này thì cần phải học trc những kiến thức gì rồi ạ? E ms học C++ cơ bản và C++ hướng đối tượng cơ bản. Đọc Code anh ko hiểu gì
các video anh đều hướng dẫn từng bước cơ bản mà.
Nói rõ nguyên lý thiết kế và sử dụng các hàm.
c++ cơ bản và c++ hướng đối tượng là các kiến thức chung về ngôn ngữ lập trình
còn SDL là thư viện open source, em có thể tìm hiểu về thư viện open source c++ trước khi học các mảng lập trình ứng dụng c++
Unhandled exception at 0x68126030 (SDL.dll) in GameSDL.exe: 0xC0000005: Access violation reading location 0x00000004.
anh ơi lỗi này sau giải quyết đây a
em post hình ảnh lên group xem. phần mô tả video thực hành có link group đó
Em code trên C::B tới bài 6, lúc compile thì bt, mà import mấy file .cpp .h qua project vs 2015 thì bị lỗi LNK2019: unresolved external symbol tùm lum, ko hỉu vì sao.
vào group rồi post lên xem. Có bạn dùng code block sẽ hỗ trợ cho em
AD ơi, mình viết bằng DEV C++, mình làm như trên nó toàn báo lỗi chưa khai báo load_image, optimize_image, SDL_SetVideoMode, SDL_DisplayFormat, SDL_Flip
Vậy phải xem Dev c++ add lib đã chuẩn chưa, mình ko xài dev c++ nên cũng khó dành lắm.
Mà ko hiểu sao hướng dẫn dùng visual mà các bạn lại cứ làm khác đi nhỉ.
à mình dùng dev c++ quen rồi =))). mình làm lại r, nó báo undefine reference IMG_Load, SDL_DisplayFormat, SDL_FreeSurface, SDL_Init…
mình làm xong nó báo 25 lỗi 🙁
vào group post lên xem nào
https://www.facebook.com/Phattrienphanmem123az/
||=== Build: Debug in big broject (compiler: GNU GCC Compiler) ===|
E:\big broject\Untitled12.cpp||In function ‘SDL_Surface* LoadImageA(std::__cxx11::string)’:|
E:\big broject\Untitled12.cpp|23|error: ‘SDL_DisplayFormat’ was not declared in this scope|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|
e compile k được n báo có lỗi như này là sao ạ? tại sao lại k xác định được SDL_DisplayFormat ạ
đăng vào group đi
Tích cự click quảng cáo để ủng hộ tác giả.
Cảm ơn bạn đã ủng hộ cho blog, hy vọng blog có thể giúp ích phần nào trong quá trình nghiên cứu của bạn.
Ad oi minh dung vs2019 no bao loi SDL_DisplayFormat
Mình cũng bị như vậy, không biết vì sao sai
vao group show loi nhe
ad ơi sao mình build xong ok hết rồi nhưng không di chuyển được cửa sổ vậy nhỉ (cái cửa sổ được tạo ra nó chết dí tại cái chỗ nó hiện ra, cái console cmd thì kéo được ra chỗ khác, còn cái cửa sổ kia nó không thể di chuyển đợc
Xem có đặt debug vào chỗ nào không, vô tình dính một điểm debug, nên chương trình bị dừng tại đó.
anh ơi, e dùng vs 2019, code xong giống như anh rồi, nhưng lại lòi ra cái lỗi “LoadImageW dose not take 1 argument”, mặc dù là e chỉ để hàm LoadImage thôi, nó cứ bị vậy mãi ạ, anh giúp em với
Ah em xin lỗi, tại em viết tên hàm Loadimage mà lại dùng hàm LoadImage 😀
Anh ơi, em viết chương trình xong và khi nhấn Ctrl + F5 thì hiện lên cửa sổ màu đen rồi tắt, không hiện ảnh anh ạ. Nhờ anh chỉ giúp em với.
em vào group đăng bài đi, rồi anh support cho
SDL_DisplayFormat loi gi v
em vào group facebook đăng bài nhé
Mình copy đúng quy trình kể cả SDL_image và Ảnh, nhưng tại sao nó lại báo là không tồn tại SDL_Flip, SDL_SetVideoMode và SDL_DisplayFormat ạ?
ban vao group dang loi len nhe, admin check cho
máy mình xài visua studio 2017 bị lỗi:
– lnk1120 2 unresolved externals
– lnk2019 unresolved external symbol __imp__printf referenced in function_ShowError
– lnk2019 unresolved external symbol __imp____iob_func referenced in function _showerror
bạn đọc lại bài 1 phần 1 trong blog, có đoạn note cho vs từ 2015 trở đi đó.
Anh ơi, em có làm theo anh thì khi mà cho run code thì nó báo là không tìm thấy file SDL_image.dll thì là sao ạ?
em copy đống dll vào folder debug chưa, chak em đang ở bài 1, em sang bài 2 có hướng dẫn đó
làm y chang mà nó hiển thị ra vầy Error 1 error C4700: uninitialized local variable ‘screen’ used d:\c#\gmae\gmae\main.cpp 29 1 gmae
y chang, nhưng visual của em không y chang của anh, anh dùng vs 2012, còn em có thể dùng bản vs cao chak 19, hoắc 22. mà những bản này nó chặt chẽ hơn về việc quản lý biến, nó báo biến screen chưa được khởi tạo giá trị kìa.
em bị lỗi :
error LNK2019: unresolved external symbol IMG_Load referenced in function “struct SDL_Surface * __cdecl LoadImageW(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)” (?LoadImageW@@YAPEAUSDL_Surface@@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)
trong visual code 2022 anh ạ. Xóa dòng này
load_image = IMG_Load(file_path.c_str());
trong hàm LoadImage thì nó mới hết bị compile error anh ơi