日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++控制台实现滚动字幕

發(fā)布時間:2023/12/14 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++控制台实现滚动字幕 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? 這是大二的面向?qū)ο蟪绦蛟O(shè)計(C)這門課的期末大作業(yè),老師的基本要求是:形成16*16漢字的字幕,并實現(xiàn)字體選擇;有多種動畫效果。

? ? ? ? 以下是我做完設(shè)計后提交的作業(yè)文檔,對主要技術(shù)進行了詳盡的解釋:


字幕滾動思路流程與代碼分析

預期效果

使用C++語言編寫程序,在字符界面上模擬滾動字幕。

基本功能包括:

1.讓用戶輸入漢字,然后在字符界面上實現(xiàn)16*16(每個漢字)的字幕。

2.具有三種不同的動畫效果。

3.有10*9種背景顏色和字體顏色可供選擇。

4.5種不同的字體可供選擇。

4.界面友好,操作簡便。

?

功能實現(xiàn)分析

????????對于這道“字幕顯示”作業(yè)要求,我們遇到的第一個知識盲區(qū)就是如何將漢字用點陣的方式在控制臺顯示出來,甚至需要更改漢字的字體。博主“帶她去流浪”(https://blog.twofei.com/embedded/hzk.html)為我們詳細介紹了HZK庫的用法和C++代碼實現(xiàn)方式,這個問題迎刃而解!

步驟一:實現(xiàn)單字矩陣的顯示

為便讀者閱讀,這里先附上博客內(nèi)原文代碼:

這里仍有兩個地方需要解釋:

  • 漢字編碼:GB2312編碼方式使用兩個字節(jié)(1字節(jié)區(qū)號、1字節(jié)位號)為一個漢字編碼,計算:offset = (94*(區(qū)碼-1)+(位碼-1))*32得到漢字在HZK16庫中的絕對偏移位置從而獲取32個十六進制的數(shù)。
  • 如何使用獲得的編碼:數(shù)組buffer[]和key[]做按位與運算,得到16*16矩陣每個點的信息,如下圖:
  • ?解決了單字矩陣,多字如何同時顯示呢?

    步驟二:多字矩陣的顯示

    我們采用字符數(shù)組儲存需要輸出的字,并計算字符串長度:

    ?(C++也可以使用string儲存字符串,且有計算長度函數(shù),但當時并沒想到使用string,而是使用了字符數(shù)組,后來作業(yè)太多也沒精力再進行嘗試)

    上述博客采取了printf(“\n”)實現(xiàn)矩陣多行顯示,換行時自動出現(xiàn)在下一行第一列的位置。在已經(jīng)打印了第一個字的基礎(chǔ)上,要怎么讓第二個字矩陣出現(xiàn)在第17~32列的位置呢(由于控制臺不便使用像素為單位的坐標系,所以直接采取了以行和列為單位的坐標系定位)?我們采用了SetConsoleCursorPosition()函數(shù)來定義光標位置,這里以最簡單的逐字輸出為例:

    ?其中,Y坐標只與字符行位置有關(guān),X坐標與字符處于第幾列、正在輸出第幾個字(CharNo)有關(guān)。SetConsoleCursorPosition()只對下一行代碼修改坐標,因此事實上每一個符號都使用這個函數(shù)修改了坐標。

    (有的組使用了一個大二維數(shù)組,比如16*160,先計算出要輸出的字符在這個二維數(shù)組中的位置,再逐行輸出整個二維數(shù)組,這個方法卡頓比我采用的方法小很多)

    步驟三:設(shè)計動畫顯示

    對于逐字顯示、滾動出現(xiàn)、翻轉(zhuǎn)出現(xiàn)三種動畫,我們寫了三個函數(shù)來分別完成單字的動畫,然后在Play()函數(shù)中根據(jù)字符串長度決定調(diào)用動畫函數(shù)次數(shù)。

    ?這里需要說明的是,起初,為了使得時鐘移動(TimeElapsed)前后打印的內(nèi)容不沖突、輸出的字不“拖尾”,我們在sleep()函數(shù)之后使用了system(“cls”)清屏函數(shù),但是這個方法最大的缺點是屏幕閃爍情況嚴重,于是我們改用了另一個方法。我們用直接覆蓋的方式解決了沖突問題,然后在屏幕空余的部分打印空格覆蓋原來的字符,如下圖:

    ?基于上面逐字輸出,滾動出現(xiàn)和翻轉(zhuǎn)滾動的實現(xiàn)如下:

    滾動出現(xiàn):(核心部分)

    ?解釋:Width是屏幕顯示滾動的列數(shù),move隨之時間變化字符的移動量,字符X坐標隨move一直在減少,使用CycleTime = move / Width記錄字符走過一個Width的次數(shù),從而修正pos.X,使得字符實現(xiàn)在左邊緣消失后在右邊緣出現(xiàn)的效果。if (pos.X <= Width)語句表示在非顯示區(qū)域的字符不打印,這一步主要是為了程序剛剛運行時字符不會溢出顯示區(qū)域(因為該程序根本原理是在每一個Sleep()函數(shù)前都要完整打印一次16*16*字數(shù)矩陣和空白矩陣,不使用這個檢驗會導致程序剛運行時發(fā)生錯亂),事實上CycleTime>0時并不需要這一檢驗步驟。

    翻轉(zhuǎn)滾動出現(xiàn):(核心部分)

    實現(xiàn)了滾動顯示,實現(xiàn)矩陣翻轉(zhuǎn)、鏡像、縮放等功能實質(zhì)只需要修改部分參數(shù)即可完成。

    步驟四:菜單設(shè)計

    菜單函數(shù)menu()的存在就是為了減少main()函數(shù)的代碼,使得mian()函數(shù)看起來更加“清爽”。Menu()中包含四個選擇函數(shù),包括選擇字體函數(shù)SelectType()、選擇背景色函數(shù)SelectBGColor(),選擇字體顏色函數(shù)SelectWordColor(),選擇字體動畫方式函數(shù)SelectShow()。其中大部分是使用了switch函數(shù),根據(jù)用戶輸入的按鍵,返回一個string,最終傳到play()函數(shù)中。下面是選擇函數(shù)之一的代碼:

    ?總之,這是一個平平無奇的菜單小函數(shù),main()函數(shù)將不停的調(diào)用它。它的存在是為了簡化main()函數(shù)的代碼,體現(xiàn)式布局更加美觀。

    不足和改進建議:

    1.在不同的動畫函數(shù)里面都包含了大量重復的代碼,但是又有細微的不同。我們想改進方式也許可以將其中相同的部分抽象出一個類,用繼承的方法來減少代碼工作量。

    2.網(wǎng)絡(luò)上的大佬實現(xiàn)了鼠標點擊操作菜單,但數(shù)次嘗試均未成功,且在老師說控制臺還是不要使用鼠標后成功勸退。我想控制臺也許不適合鼠標,但應(yīng)仍是可實現(xiàn)的(將控制臺由行列坐標轉(zhuǎn)換為像素坐標,獲取鼠標位置),所以如有時間不妨一試。


    本人小白,首篇博客試水,不妥之處請多指正鴨

    總結(jié)

    以上是生活随笔為你收集整理的C++控制台实现滚动字幕的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。