Blackberry Passport >> Core Native (C/C++) >> SDL 1.2
Hello, world!
由於Blackberry官方提供的Toolchain本身並沒有包含SDL相關的Library,而大部份的懷舊游戲卻是使用SDL Library製作,如果司徒想要在Passport上面玩這些懷舊遊戲的話,只能移植SDL Library到Passport或者重新把這些懷舊游戲的程式碼,從原本的SDL API都改成使用Blackberry支援的OpenGL ES API以及screen API,就花費時間來看,移植SDL Library看似比較划算一點,畢竟一個一個遊戲移植,似乎有點傻,因此,這才讓司徒有了移植SDL Library到Passport的動機,不過,幸運的是,已經有熱心的網友移植SDL Library到Playbook身上,剛好這部分可以直接用在Passport身上,這也幫司徒節省許多寶貴的時間,而針對移植的部份,司徒猜想大家可能會很好奇,移植SDL Library不就是編譯SDL而已嗎?有什麼困難的嗎?其實沒那麼容易,因為Blackberry 10本身並沒有提供/dev/fb*這個裝置,取得代之的則是必須使用QNX的screen API繪製,因此存取/dev/fb*的部份必須改寫,這也比較麻煩的地方,不過,還是得感謝這位網友的移植,造福大家!
有了這個動機之後,司徒便開始在網路上找尋相關的SDL教學網站,一方面是可以比較有系統的建立SDL教學文章,另一方面則是可以知道Passport到底還缺多少SDL相關的Library,司徒剛好可以趁這個機會,移植這些缺少的Library到Passport上身,而找尋一段時間之後,司徒發現lazyfoo的網站算是一個相當不錯的SDL教學網站,可惜的是這個網站在FAQ頁面,很清楚的表示,不能基于它的網站資源建立另一個教學網站,加上該網站的相關資源,在未取得同意前,不可使用隨意使用,這些聲明最終讓司徒打了退堂鼓,於是司徒只好自己建立相關的SDL教學文章,但是,司徒參考的SDL相關文章,還是基于該網站,只是司徒的教導方向是建立在如何熟悉SDL API,而非是如何用SDL寫一個遊戲。
main.cpp
#include <stdio.h> #include <stdlib.h> #include <SDL.h> int main(int argc, char* args[]) { if(SDL_Init(SDL_INIT_VIDEO) != 0){ printf("%s, failed to SDL_Init\n", __func__); return -1; } SDL_Surface* screen; screen = SDL_SetVideoMode(1440, 1440, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); if(screen == NULL){ printf("%s, failed to SDL_SetVideMode\n", __func__); return -1; } SDL_Surface* bmp = SDL_LoadBMP("app/native/hello.bmp"); if(bmp == NULL){ printf("%s, failed to SDL_LoadBMP\n", __func__); return -1; } SDL_ShowCursor(0); SDL_BlitSurface(bmp, NULL, screen, NULL); SDL_Flip(screen); SDL_Delay(30000); SDL_FreeSurface(bmp); SDL_Quit(); return 0; }
SDL程式的基本流程就是:初始化(SDL_Init)、設定解析度(SDL_SetVideoMode)、畫圖、刷新畫面(SDL_Flip)、結束並釋放資源(SDL_FreeSurface)。
大方向掌握後就可以更深入了解SDL的運作方式,因此,如上面的範例,做完基本的初始化後,接著就是載入圖片,完成一個簡單的Hello, world!範例。
bar-descriptor.xml
<?xml version="1.0" encoding="utf-8" standalone="no"?> <qnx xmlns="http://www.qnx.com/schemas/application/1.0"> <id>com.steward.sdl.ch1</id> <name>ch1</name> <filename>ch1</filename> <versionNumber>1.0.0</versionNumber> <buildId>1</buildId> <description>Lession 1. Setting up SDL and Getting an Image on the Screen</description> <author>Steward</author> <authorId>gYAAgGE4qaHzBnzEAu8JKe4G1OI</authorId> <asset path="main" entry="true" type="Qnx/Elf">main</asset> <asset path="hello.bmp">hello.bmp</asset> <asset path="libSDL-1.2.so.11" type="Qnx/Elf">lib/libSDL-1.2.so.11</asset> <asset path="libTouchControlOverlay.so.1" type="Qnx/Elf">lib/libTouchControlOverlay.so.1</asset> <permission system="true">run_native</permission> <env var="LD_LIBRARY_PATH" value="app/native/lib"/> </qnx>
Makefile
main: main.cpp ntoarmv7-gcc main.cpp -g -o main libSDL-1.2.so.11 -Iinclude blackberry-nativepackager -package main.bar bar-descriptor.xml -devMode -debugToken ${HOME}/.rim/debugtoken_q30.bar clean: rm -rf main rm -rf main.bar
完成