Monday, July 14, 2025
Lập Trình Game C++

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.

=> Download ảnh gố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

 

 

 

41 thoughts on “Game C++ SDL – Bài 2: Load một image lên windows

    • passionphamPost author

      oh, ok để mình nghiên cứu thử xem, thank bạn chia sẻ

      Reply
  • Uchiha Itachi

    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

    Reply
    • passionphamPost author

      chúc chú học lập trình tốt, sớm làm ngon được 1 game

      Reply
      • Uchiha Itachi

        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ì

        Reply
        • passionphamPost author

          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++

          Reply
  • 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

    Reply
    • passionphamPost author

      em post hình ảnh lên group xem. phần mô tả video thực hành có link group đó

      Reply
  • 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.

    Reply
    • passionphamPost author

      vào group rồi post lên xem. Có bạn dùng code block sẽ hỗ trợ cho em

      Reply
  • nguyen van luong

    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

    Reply
    • passionphamPost author

      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ỉ.

      Reply
      • nguyen van luong

        à 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…

        Reply
  • gay lọ

    mình làm xong nó báo 25 lỗi 🙁

    Reply
  • Nguyễn Ngọc Trung

    ||=== 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 ạ

    Reply
  • TuấnNguyễn

    Tích cự click quảng cáo để ủng hộ tác giả.

    Reply
    • 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.

      Reply
  • Tran Van Tu

    Ad oi minh dung vs2019 no bao loi SDL_DisplayFormat

    Reply
    • Trần Đình Long

      Mình cũng bị như vậy, không biết vì sao sai

      Reply
  • 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

    Reply
    • 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 đó.

      Reply
  • PinoChicco

    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

    Reply
    • PinoChicco

      Ah em xin lỗi, tại em viết tên hàm Loadimage mà lại dùng hàm LoadImage 😀

      Reply
  • Võ Quang Chiến

    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.

    Reply
    • ptpham

      em vào group đăng bài đi, rồi anh support cho

      Reply
  • SDL_DisplayFormat loi gi v

    Reply
    • ptpham

      em vào group facebook đăng bài nhé

      Reply
  • duongle.CN1.uet

    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 ạ?

    Reply
    • ban vao group dang loi len nhe, admin check cho

      Reply
  • Phạm Văn Thành

    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

    Reply
    • bạn đọc lại bài 1 phần 1 trong blog, có đoạn note cho vs từ 2015 trở đi đó.

      Reply
  • Hitomi Arashi

    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 ạ?

    Reply
    • 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 đó

      Reply
  • Vietphan

    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

    Reply
    • 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.

      Reply
  • Minh Nguyen

    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

    Reply
  • 1>d:\sdl\gamesdldemo\gamesdldemo\main.cpp(11): error C3861: ‘IMG_load’: identifier not found
    anh ơi em bị lỗi như này, tất cả phiên bản VS em đều dùng như anh, nhưng không hiểu sao nó vẫn bị lỗi không tìm thấy IMG

    Reply
    • em vào group rồi post lên group facebook xem nào. group: phattrienphanmem123az.com

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.