台灣最大程式設計社群網站
線上人數
1675
 
會員總數:242762
討論主題:187731
歡迎您免費加入會員
討論區列表 >> C/C++ >> 如何清空螢幕
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何清空螢幕
價值 : 50 QP  點閱數:338 回應數:20

樓主

DANNY
初學者
20 4
146 23
發送站內信

請問要如何清空螢幕?
以下方法沒用,甚至跳出錯誤!

該怎麼解決?

搜尋相關Tags的文章: [ 清空螢幕 ] , [ 刷新畫面 ] , [ clrscr() ] ,
本篇文章發表於2018-05-20 14:34
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

小魚
檢舉此回應
#define clrscr() system("cls");

其實真正清空螢幕的是 system("cls");

但是應該要以下兩行
#include <iostream>
using namespace std;
本篇文章回覆於2018-05-20 15:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

淺水員
檢舉此回應
1. clrscr 印象中是某特定編譯器內建的,不是每個編譯器都有,所以沒有也很正常
2. system 是 cstdlib 的函式庫,應該是 include <cstdlib>
3. system 裡面要放什麼跟環境有關,windows 用 cls,linux 用 clear,其他環境請自行查詢相關指令。
本篇文章回覆於2018-05-20 19:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
作者回應

DANNY
檢舉此回應
system()是使用系統指令,可是有辦法不用嗎(替代方法)?
想用別的方法是因為這樣在不同系統就不能用了(應該吧,錯了請糾正)。
本篇文章回覆於2018-05-20 21:48
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

小魚
檢舉此回應
針對不同作業系統,
做不同的處理.
本篇文章回覆於2018-05-21 12:40
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

淺水員
檢舉此回應
C/C++ 因為沒有相關函式
所以除了呼叫外部指令外
就是自己呼叫系統的 API
但是這也是必須針對系統個別寫程式碼

另一個通用的方式是使用其他人做好的函式庫
這樣的話在不同的系統自己的程式碼有可能做到不需要調整
只要個別在不同系統編譯就可
(其實這只是把在不同系統呼叫個別 API 的工作交給其他人)

第二種方式並不會很少見
例如我希望寫一個可以在 windows 以及 linux 使用的視窗程式
那麼我可以使用 wxWidgets (別人寫好的函式庫)
這樣只要我使用的是共通的元件就不需要更動程式碼就可以在不同平台編譯

不過以目前狀況來說是還不需要玩那麼大
直接用 system 即可
本篇文章回覆於2018-05-21 13:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

DANNY
檢舉此回應
那是否有一段程式碼(EX:
inline void setColor(unsigned short int color = 240) { // set the colors of the text
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, color);
}
),可以進行螢幕的清空?
本篇文章回覆於2018-05-23 13:42
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
回應

小魚
檢舉此回應
這是什麼??
感覺有點像視窗程式...
本篇文章回覆於2018-05-24 21:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

淺水員
檢舉此回應
應該是 windows api 的東西
也就是我提到的「呼叫系統的 api」
下面是 windows api 的手冊(console部分)
https://docs.microsoft.com/en-us/windows/console/console-functions

小魚對 windows 有興趣的話也可以玩玩
比起一些包裝好的庫,這算是比較底層的東西
本篇文章回覆於2018-05-25 00:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
回應

淺水員
檢舉此回應
給 DANNY
windows官方在這邊有給清除畫面的範例
https://docs.microsoft.com/en-us/windows/console/clearing-the-screen

example 2 應該很接近你 6F 提到的內容
不過這也是限定在 windows 平台使用
換一個系統就要重寫了
本篇文章回覆於2018-05-25 00:11
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
10樓
作者回應

DANNY
檢舉此回應
因為我是要做遊戲,所以需要比較快的清除方法。
SYSTEM()似乎很慢...
本篇文章回覆於2018-05-25 12:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
11樓
最有價值解答

淺水員
檢舉此回應
不考慮跨平台的話
我參考微軟官方文件內容做了一個範例(動畫)
因為你的需求是做遊戲
所以我用了雙重緩衝的機制以求畫面穩定
(雖然說這通常是圖形介面的使用方式,用在文字介面不知道會不會多此一舉就是)

本篇文章回覆於2018-05-25 22:57
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
12樓
作者回應

DANNY
檢舉此回應
11樓
我不太懂那段程式碼...
本篇文章回覆於2018-05-26 00:18
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
13樓
回應

淺水員
檢舉此回應
你原先的方式是透過清除整個畫面再把東西「畫」上去
這是最簡單的方法
不過因為是清除再重繪
畫面可能會比較閃爍

稍加改進的方式是只在需要修改的地方畫上新的東西

至於我寫的那段又是另一個方法
你可以想成是我有2個螢幕(其實是 ScreenBuffer)
一個是呈現在當前螢幕上
另一個則在背景先畫好下一個畫面
接下來把背景的畫面放到跟螢幕上的做交換
原本螢幕上的變成再下一個畫面的畫板
如此循環交替產生穩定的動畫效果

我不知道你是用 C 還是 C++ 在寫
因為微軟官方文件是基於 C 的寫法
所以我就用 C 來寫了
習慣用 C++ 的話那些 API 也是可以使用
然後我的 dbScrBuf 可以改寫成 class

【11F補充說明】
initDoubleBuffer:其實相當於 constructor
closeDoubleBuffer:相當於 destructor
DoubleBufferSwap:用來執行交換畫面

使用時,將下一個畫面的值寫入 dbScrBuf.buf
然後用 DoubleBufferSwap 呈現在螢幕上
dbScrBuf.buf 是一個 char*
其可用大小為螢幕的寬×高
至於螢幕的寬高可以讀取 dbScrBuf.w 跟 dbScrBuf.h
例如:dbScrBuf.buf[dbScrBuf.w*5+1] 代表第6行第2個字
本篇文章回覆於2018-05-26 11:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
14樓
作者回應

DANNY
檢舉此回應
回F 13

我用C++,Code::Blocks 17.12。

那應該要把程式碼插在哪裡?
前面的自訂函數都要,那main裡的呢?
我是要將多張圖顯示,每張圖一個角色(目前尚不確定能否成功)。
您的意思是將背景和角色分開嗎?
兩張圖互換...?
本篇文章回覆於2018-05-26 17:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
15樓
回應

淺水員
檢舉此回應
你誤會我說的兩張圖的意思了
假設我有A跟B兩張畫布
而螢幕一次只能呈現1張
假設一開始顯示的是A
那麼可以在B上面畫下一秒的圖片
畫好後換成顯示B
這時候A就沒有顯示了
可以在A上面畫再下一秒的畫面
畫好後再換成顯示A
如此循環
這就是雙重緩衝的概念

我原本只是做個示範
那段程式你拿去codeblock編譯應該是沒問題的
可以看到 hello 左右往返移動

如果你要拿去用
大致上你的相關程式碼會寫在動畫開始跟動畫結束之間

如果能看到你寫的東西也許會更好討論吧
因為我也不知道你設計的方向是什麼
本篇文章回覆於2018-05-26 18:12
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   

回覆
如要回應,請先登入.