一篇關於c的雜文,無意中亂寫整理
我們先來說一下,物體的運動,我們高中就知道,物體的運動有如下幾種:
比如物體的速度大小發生變化,方向不變的變加速運動,減速運動,勻加速,勻減速運動。
比如速度大小不變,方向發生變化,如勻速圓周運動
還有就是速度的大小與方向都發生變化,如簡諧運動,也就是說按照正弦,餘弦方式函式運動。
既然說到了高中物理,我們就倆多說幾個公式吧。
我們來說一下,勻變速直線運動的幾個公式:
Vt=v0+at
S=v0t+1/2at^2
Vt^2-v0^2=2as
S=v0+vt/2*t
我們記幾個上面的公式就可以了。
然後我們切換幾個概念:
幀數:就是在1秒鐘之內傳輸圖片的數目,也可以理解為圖形處理器,每秒可以重新整理幾次,通常用
幀率:測量顯示幀數的度量,也就是說每秒顯示幀數(fps)
一般來說30fps是可以接受的。但是將幀率提升至60fps就可以有明顯的互動感與逼真感。但是超過75fps則沒有明顯的流暢度了,因為顯示太快了。
3D:120HZ
液晶顯示器:60HZ
既然就是說,我們要求的是重新整理率越快越好,為什麼沒有必要追求太高的重新整理率呢?
原因就是說,在解析度不變的情況下,fps越高,則對顯示卡的處理能力要求也就越高。
電腦中所顯示的畫面,都是由顯示卡進行輸出的,因此螢幕上面的每一個畫素的填充都是由顯示卡來進行計算,輸出的。
我們舉個例子來說明一下啊,當畫面的解析度是
你想一下,如果幀率越高,那麼顯示卡1秒鐘處理畫素的能力是不是要進行提升呢。所以,我們不適宜設定很大的幀率,只要在合理範圍就可以了。顯示卡處理能力越大,畫面肯定就會不流暢。
一般來說到下一個畫面的切換時間幀速率為1/60秒,如果讓物體每幀增加3個畫素的距離,那麼1秒就會移動180個畫素的大小。
好了,拋棄上面不說,下面做一個讓一個應用程式從左往右移動,又從右往左移動。我們就倆讓qq這個應用程式來移動吧。
先來說一下,如何看電腦上的座標圖:
從電腦左上角開始,往下面是y軸,往右面是x軸。還有就是
來說一個cmd命令:
下面我們看一下面這個程式程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//開啟qq應用程式
void openQQ()
{
ShellExecuteA(0, "open", "\"C:\\Program Files(x86)\\Thunder Network\\Thunder\\Program\\Thunder.exe\" -StartType:DesktopIcon", 0, 0, 3);
}
//關閉qq應用程式
void closeQQ()
{
system("taskkill /f /im Thunder.exe");//強制性結束程序
}
//模擬移動qq,從左向開始移動
void leftMoveQQ()
{
//一般從左開始移動,設定一個編號為0
int i = 0;
//要進行移動,就要先找到這個視窗的編號,也就是視窗控制代碼
HWND win1 = FindWindowA("XLUEFrameHostWnd", "迅雷7");//一個是類名,一個是標題
//對函式返回結果做一個處理
if (NULL == win1)
{
printf("沒有找到QQ這個應用視窗\n");
}
//下面就是找到了,處理一下程式的位置
SetWindowPos(win1, NULL, 0, 0, 400, 400, 0);//視窗編號,保留引數,座標,視窗的長度與寬度
//根據電腦解析度不同,來進行設定不同的移動長度
//我的電腦解析度是1366*768,加上本身qq就佔用了400的長度,所以,我就讓它移動966個畫素,差不多
while (i < 966)
{
//最開始的i是設定的為0,後來就要移動,按固定長度移動
SetWindowPos(win1, NULL, i, 0, 400, 400, 0);
//而且我們移動的中間,緩衝一秒鐘,不要移動的太快
Sleep(1000);//緩衝1秒
i += 30;//每次移動30個畫素,並且讓它移動的過程中若隱若現的移動
if (i / 10 % 2 == 1)
{
//如果十位數是奇數,就讓它隱藏
ShowWindow(win1, SW_HIDE);//讓視窗隱藏
}
else
{
ShowWindow(win1, SW_SHOW);//讓視窗顯示
}
}
}
//下面我們又要從右向左移動
void rightMoveQQ()
{
//這個時候就要從螢幕最右邊開始定位了
int i = 966;
HWND win1 = FindWindowA("XLUEFrameHostWnd", "迅雷7");//還是通過類名與標題來找到控制代碼
//對函式的返回結果我們必須要判定一下
if (NULL == win1)
{
printf("沒有找到QQ這個引用視窗\n");
}
//下面我們再來設定初始位置,從最右邊開始移動
SetWindowPos(win1, NULL,966, 0, 400, 400, 0);
//當位置小於0的時候,就不移動了
while (i > 0)
{
SetWindowPos(win1, NULL, i, 0, 400, 400, 0);
Sleep(1000);//緩衝1秒鐘
i -= 30;
}
}
//上面各項功能差不多就做好了,下面我們就要來寫入口函式
int main()
{
closeQQ();//在開啟前,我們先關閉之前開啟的QQ
openQQ();//開啟QQ
//在做一個死迴圈移動qq
while (1)
{
Sleep(3000);
leftMoveQQ();//從左開始移動qq
Sleep(3000);
rightMoveQQ();//從右開始移動QQ
}
system("pause");
return 0;
}
上面就是移動在螢幕上從左向右,又從右向左移動的一個小程式,下面我們讓它沿對角線移動,下面是程式程式碼:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
//我們還是先開啟QQ這個應用程式
void openQQ()
{
//先開啟應用程式
ShellExecuteA(0, "open", "\"C:\\Program Files(x86)\\Tencent\\QQ\\Bin\\QQScLauncher.exe\"", 0, 0, 3);//先來開啟這個引用程式
}
//然後關閉qq這個應用程式
void closeQQ()
{
system("taskkill /f /im QQProtect.exe");
}
//開始移動
void moveQQ()
{
//要移動一個視窗,我們必須先知道這個視窗的控制代碼
int i = 0;
HWND win1 = FindWindowA("TXGuiFoundation", "QQ");//一個是類名,一個是標題
//找到了之後,就開始設定一下它的初始位置
SetWindowPos(win1, NULL, 0, 0, 400, 400, 0);//初始位置,還有長度與寬度
//這裡關於沿對角線移動的一個設定,每個計算機解析度不一樣,自然也就不一樣
//x移動兩倍,y移動一倍,注意,引用視窗本身還有400的長度
while (i < 368)//768-400
{
//我們需要來設定一下位置
SetWindowPos(win1, NULL, 2 * i, i, 400, 400, 0);//每一次的i都是在不斷髮生變化的
Sleep(1000);//讓這個程式緩衝1秒執行
i += 10;
//讓視窗一閃一閃的移動
if ((i / 10 % 2) == 1)
{
//這個時候我們就隱藏視窗
ShowWindow(win1, SW_HIDE);//隱藏
}
else
{
ShowWindow(win1, SW_SHOW);//顯示
}
}
}
int main()
{
//把上面函式用起來就可以了
closeQQ();
openQQ();
while (1)
{
Sleep(2000);//緩衝兩秒鐘執行
moveQQ();//移動qq
}
system("pause");
return 0;
}
下面我們做一個植物大戰殭屍自動加血外掛:
首先,我們需要在電腦上面下載這款單機遊戲,然後執行:
然後開啟vs2013開發工具:
我們這裡的目標是,當太陽數小於100的時候,自動回升到200
其實也就是寫一個dll,然後載入到程式裡面去。
把原來的exe專案改成dll應用程式就可以了。
其實原理就是找到這個代表太陽數的變數,然後通過指標來做修改
我們必須通過一款軟體找到這個變數的地址:
比如CE軟體:
很明顯我們已經到了這個太陽的地址。
#include <Windows.h>
_declspec(dllexport) void change()
{
int *p = (int *)1FD87590;
while (1)
{
if (*p < 100)
{
*p = 200;
}
Sleep(2000);//每兩秒就檢查一次
}
}
上面就是目的碼
下面我們通過專案-》屬性->把配置型別變成dll檔案。
下面我們又要通過一款軟體把這個dll注入進去。注意要重新生成一下解決方案。注意在生成解決方案之前,就要把專案變成dll檔案,然後生成解決方案,不然不會成功。
上面找到dll注入就可以了。