Lập Trình Game C++ SDL Bài 2: Load một background image

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

 

 

 

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

    • 19 April, 2018 at 8:59 am
      Permalink

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

      Reply
  • 10 June, 2018 at 7:13 am
    Permalink

    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
    • 10 June, 2018 at 8:56 am
      Permalink

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

      Reply
      • 19 June, 2018 at 1:41 am
        Permalink

        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
        • 30 June, 2018 at 12:48 am
          Permalink

          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
  • 13 June, 2018 at 8:25 am
    Permalink

    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
    • 13 June, 2018 at 9:01 am
      Permalink

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

      Reply
  • 29 June, 2018 at 8:33 pm
    Permalink

    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
    • 30 June, 2018 at 12:48 am
      Permalink

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

      Reply
  • 30 June, 2018 at 8:55 am
    Permalink

    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
    • 30 June, 2018 at 9:04 am
      Permalink

      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
      • 30 June, 2018 at 9:27 am
        Permalink

        à 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
  • 4 August, 2018 at 6:15 pm
    Permalink

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

    Reply
  • 8 May, 2019 at 1:19 am
    Permalink

    ||=== 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
  • 1 January, 2020 at 3:17 pm
    Permalink

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

    Reply
    • 3 January, 2020 at 5:36 am
      Permalink

      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
  • 3 February, 2020 at 12:52 pm
    Permalink

    Ad oi minh dung vs2019 no bao loi SDL_DisplayFormat

    Reply
    • 4 May, 2020 at 6:28 pm
      Permalink

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

      Reply
  • 2 March, 2020 at 3:39 am
    Permalink

    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
    • 2 March, 2020 at 5:52 am
      Permalink

      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
  • 3 April, 2020 at 4:02 am
    Permalink

    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
    • 3 April, 2020 at 4:04 am
      Permalink

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

      Reply
  • 26 December, 2020 at 2:08 am
    Permalink

    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
    • 27 December, 2020 at 1:55 am
      Permalink

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

      Reply
  • 28 January, 2021 at 10:14 pm
    Permalink

    SDL_DisplayFormat loi gi v

    Reply
    • 29 January, 2021 at 6:17 am
      Permalink

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

      Reply
  • 11 March, 2021 at 6:34 am
    Permalink

    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
    • 14 March, 2021 at 6:33 am
      Permalink

      ban vao group dang loi len nhe, admin check cho

      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.