歸納編程學習的感悟,
記錄奮斗路上的點滴,
希望能幫到一樣刻苦的你!
如有不足歡迎指正!
共同學習交流!
🌎歡迎各位→點贊 👍+ 收藏? + 留言?📝
站在巨人的肩上是為了超過巨人!
一起加油!
?
目錄
五、實現EasyX按鍵交互功能:
六、?實現EasyX中鼠標交互功能:
五、實現EasyX按鍵交互功能:
1.阻塞按鍵交互? ? ? ? 不按鍵就不運行,像C語言中的scanf函數,不輸入,程序就不往下運行。
2.非阻塞按鍵交互? ? ? ? 不按鍵程序仍在運行
案例:
1.小球移動:
2.按鍵控制移動:
- 雙緩沖貼圖(解決閃爍問題)
- 開始雙緩沖????????BeginBatchDraw();
- 顯示一幀? ? ? ? ? ?FlushBatchDraw();
- 結束雙緩沖? ? ? ?EndBatchDraw();
#include<stdio.h>
#include<graphics.h>
#include<time.h>
#include<conio.h>//_getch()函數 不需要回車確認函數,_kbhit()函數 判斷存在按鍵再去處理
//定義球的結構體
struct Ball {int x;//球的坐標int y;int r;//球的半徑int dx;//增量xint dy;//增量y
};
Ball ball = { 300,300,15,5,-4 };
Ball myball = {400,400,15,5,5};
void DrawBall(struct Ball ball) {//畫球//給球填充顏色為紅色setfillcolor(RED);//畫出球solidcircle(ball.x, ball.y, ball.r);
}
void MoveBall() {//移動球if (ball.x - ball.r < 0 || ball.x + ball.r>=600) {ball.dx = -ball.dx;//撞左壁}if (ball.y - ball.r < 0 || ball.y + ball.r>=600) {ball.dy = -ball.dy;//撞右壁}ball.x += ball.dx;ball.y += ball.dy;
}
//定時器 去控制自動移動的東西
int Timer(int duration, int id) {static int startTime[10];//通過靜態變量做10個定時器,靜態變量自動被初始化int endTime = clock();//clock()函數統計程序運行到當前代碼所需的時間if (endTime - startTime[id] > duration) {//觸發定時器返回1startTime[id] = endTime;//開始時間改為上一次的結束時間return 1;}return 0;
}
void KeyDown() {//接收用戶按鍵int useKey =_getch();switch (useKey) {case'w':case'W':case 72://小鍵盤的箭頭上myball.y -= 5;break;case 's':case'S':case 80:myball.y += 5;break;case'a':case'A':case 75:myball.x -= 5;break;case'd':case'D':case 77:myball.x += 5;break;}
}
void KeyDown2() {//異步交互if (GetAsyncKeyState(VK_UP)) {myball.y -= 5;}if (GetAsyncKeyState(VK_DOWN)) {myball.y += 5;}if (GetAsyncKeyState(VK_LEFT)) {myball.x -= 5;}if (GetAsyncKeyState(VK_RIGHT)) {myball.x += 5;}
}
int main() {initgraph(600, 600);//創建800x800的窗口BeginBatchDraw();//雙緩沖貼圖,開始雙緩沖while (1) {cleardevice();DrawBall(ball);DrawBall(myball);if (Timer(20, 0)) {MoveBall();}if (_kbhit()) {//判斷存在按鍵再去處理KeyDown();}if (Timer(20, 1)) {KeyDown2();}FlushBatchDraw();//顯示一幀//Sleep(20);//阻塞函數,做移動一般不用Sleep,他會阻塞整個程序,一般用定時器去做}EndBatchDraw();//結束雙緩沖closegraph();return 0;
}
六、?實現EasyX中鼠標交互功能:
ExMassag類型的變量,去存儲鼠標消息
獲取鼠標消息:peekmassage(&變量)
討論鼠標消息
- msg.massage區分鼠標消息的類型
- msg.x? ?msg.y鼠標的當前坐標
#include<graphics.h>
int main() {initgraph(600, 600);ExMessage msg;//按左鍵畫圓,右鍵畫方while (1) {while (peekmessage(&msg)) {switch (msg.message) {//windows massage left button downcase WM_LBUTTONDOWN:circle(msg.x, msg.y, 10);break;//windows massage right button downcase WM_RBUTTONDOWN:rectangle(msg.x - 10, msg.y - 10, msg.x + 10, msg.y + 10);break;}}}closegraph();return 0;
}