c語言實現幀
1. 棧幀(ebp與esp)
棧幀,亦稱為活動記錄過程,是編譯器實現過程的一種機制。
寄存器ebp,亦稱棧底寄存器,用於記錄棧的基址。
寄存器esp,亦稱棧頂寄存器,用於指示棧的當前位置。
寄存器pc指針,即程序計數器,其作用是指向當前指令的下一個指令。
在函數調用過程中,首先調用main函數,為主函數分配存儲空間,並設置ebp和esp分別指向棧頂和棧底,同時pc指針指向main函數中的下一條指令。需要注意的是,棧是從高地址向低地址生長的,如圖所示,紅色箭頭代表main函數的指針,藍色箭頭代表指向fun函數的指針,首先執行main函數,然後執行fun函數,先使用紅色指針,再使用藍色指針。
以下是一個c語言的例子,用於解釋函數調用的過程:
源代碼中的int iRes = FunAdd(iVal1, iVal2);對應的匯編指令如下:
根據上述匯編指令的解釋,將iVal2和iVal1的值作為函數參數依次壓棧(參數從右向左),而call指令除了調用FunAdd外,還隱含地將下一條指令的地址壓棧(即add esp, 8的地址,通常稱為返回地址),以便FunAdd函數返回時知道接著應該執行哪條指令。
此時的棧幀如圖所示:
第二步,開始執行FunAdd函數,函數的匯編和解釋如下:
棧上還存在著調用FunAdd時入棧的兩個參數,返回值還沒有獲取。首先執行add esp, 8指令,將棧頂去除八個位元組,這八個位元組用於存儲FunAdd的入棧參數。由於編譯器默認採用的__cdecl約定,因此由調用函數main來清理入棧的函數參數。
EBP-0Ch地址存儲的是iRes,從第二步中可知,將返回結果存儲在EAX,然後使用mov dword ptr [ebp-0Ch],eax將返回結果存儲到iRes中。
2. c語言中如何播放mp3數據幀
可以使用PlaySound()函數播放mp3聲音,該函數原型位於windows.h中,
函數原型為:
BOOL PlaySound(LPCSTR pszSound, HMODULE hmod,DWORD fdwSound);
參數pszSound是指定了要播放聲音的字元串,該參數可以是MP3文件的名字,或是MP3資源的名字,或是內存中聲音數據的指針,或是在系統注冊表WIN.INI中定義的系統事件聲音。如果該參數為NULL則停止正在播放的聲音。
參數hmod是應用程序的實例句柄,當播放MP3資源時要用到該參數,否則它必須為NULL。
參數fdwSound是標志的組合,各種可選的標志及意義如下所示。若成功則函數返回TRUE,否則返回FALSE。
播放標志以及含義:
SND_APPLICATION
用應用程序指定的關聯來播放聲音。
SND_ALIAS
pszSound參數指定了注冊表或WIN.INI中的系統事件的別名。
SND_ALIAS_ID
pszSound參數指定了預定義的聲音標識符。
SND_ASYNC
用非同步方式播放聲音,PlaySound函數在開始播放後立即返回。
SND_FILENAME
pszSound參數指定了MP3文件名。
SND_LOOP
重復播放聲音,必須與SND_ASYNC標志一塊使用。
SND_MEMORY
播放載入到內存中的聲音,此時pszSound是指向聲音數據的指針。
SND_NODEFAULT
不播放預設聲音,若無此標志,則PlaySound在沒找到聲音時會播放預設聲音。
SND_NOSTOP
PlaySound不打斷原來的聲音播出並立即返回FALSE。
SND_NOWAIT
如果驅動程序正忙則函數就不播放聲音並立即返回。
SND_PURGE
停止所有與調用任務有關的聲音。若參數pszSound為NULL,就停止所有的聲音,否則,停止pszSound指定的聲音。
SND_RESOURCE
pszSound參數是WAVE資源的標識符,這時要用到hmod參數。
SND_SYNC
同步播放聲音,在播放完後PlaySound函數才返回。
************************************************************
例如我想播放在C:\WINDOWS\Media目錄中的 Windows XP 啟動.MP3文件
程序如下:
#include <windows.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
PlaySound("C:\\WINDOWS\\Media\\Windows XP 啟動.MP3", NULL, SND_FILENAME | SND_ASYNC);
system("pause");
return 0;
}
*/:)))))))))))))))))))))))))))))))
3. 【C語言項目】源碼+教程:植物大戰僵屍
創建自己的植物大戰僵屍項目,作為初學者的項目,非常值得期待,不僅能夠提升個人的項目開發能力,還能作為課程設計的一部分。此項目詳細步驟如下:
項目准備階段,使用Visual Studio 創建空項目模板,導入所需素材,並在項目目錄下創建「res」文件夾,將解壓後的素材文件復制至其中。
實現游戲初始場景,代碼需配合視頻講解,具體實現細節請回復「代碼講解」。
添加啟動菜單,創建菜單界面,確保在main函數中調用菜單,實現游戲的初步啟動。
生成陽光機制,植物大戰僵屍中種植植物需要陽光值,通過隨機降落陽光或種植向日葵自動生產陽光實現。定義陽光結構體,使用圖片幀數組模擬旋轉效果,初始化陽光幀數組,創建並更新陽光位置與幀序號。在updateGame函數中調用創建與更新陽光狀態的函數,並在updateWindow函數中渲染陽光。
收集陽光功能,用戶點擊陽光球時,收集陽光並增加當前總陽光值,設置全局變數表示總陽光值,初始化值,並在用戶點擊處理中調用收集陽光的函數。在gameInit初始化中設置字體,更新window中繪制陽光值。
僵屍生成機制,創建僵屍數據模型,初始化僵屍數組與序列幀圖片數組,實現僵屍的創建與更新數據。在updateGame函數中創建僵屍並更新數據,並創建繪制僵屍的介面。在updateWindow函數中繪制僵屍。
陽光球的飛躍效果,實現陽光被點擊後自動飛向左上角,增加陽光值。給陽光結構體添加偏移量成員,設置陽光飛躍過程中的偏移量,修改渲染判斷條件。
豌豆發射功能,僵屍靠近時植物自動發射豌豆子彈。定義子彈數據類型,初始化子彈池與圖片,更新僵屍的「行」成員,實現豌豆發射並更新子彈位置。在updateGame函數中發射子彈並更新位置,在updateWindow函數中繪制子彈。
子彈與僵屍碰撞檢測,子彈碰到僵屍後爆炸並顯示效果,給僵屍添加血量成員與爆炸狀態處理。初始化子彈幀圖片數組,更新子彈爆炸狀態與幀序號。在updateGame函數中檢測碰撞,渲染子彈爆炸效果。
僵屍死亡機制,豌豆子彈擊中僵屍後,減少血量直至死亡,僵屍狀態變為黑沙。給僵屍添加死亡狀態成員,初始化死亡狀態圖片幀數組,更新僵屍狀態與繪制死亡狀態。後續實現細節,點擊鏈接查看完整實現。
4. linux下怎麼用c語言獲取一幀屏幕圖像數據,怎麼分塊
教你一個方法,你想找某個方面的資源,就在關鍵詞後面加詳解兩個字,通常都能搜到。例如搜
FrameBuffer詳解
就能得到你要的東西了。
至於圖像分塊嘛,自己用memcpy把buffer里的圖像拷貝出來,自己手動寫循環分塊啦。分4塊那就拷貝到4個內存塊里啦,寫的時候注意循環的下標就行了。