coc源碼
❶ 做java游戲服務端開發有前途嗎
最近剛跳槽,到新公司已經幹了有兩周時間了,這兩周時間是過得比較充實的,因為這家新公司是個小公司,以前以單機開發為主,伺服器方面我一個人,做兩個游戲的伺服器開發工作,當然,一個很簡單,另一個就相對復雜點,簡單的那個是個弱聯網游戲,伺服器只需要做好數據存檔和登錄支付驗證就好了,而另一個,則是相對復雜的slg游戲,我感覺這是又一款cok,而公司目前並不打算再招伺服器了,所以估計這個項目我會一個人干到明年吧,等第一款上線賺錢了,可能會再招伺服器。老實說,面試的時候,我就覺得這份工作對我而言是一個挑戰,而當我清楚的了解了公司狀況之後,我依然決定接受這個挑戰。
說說我之前的經歷吧,大四的時候,學校安排來北京培訓java(培訓沒什麼丟臉的,出來找工作我也用的真學歷真背景,不像某峰互聯),之後我去了培訓機構推薦的公司實習,那個時候,工資2k,然而工作也幹得很開心,跟著前輩學到了不少東西,當時是做微信公眾號開發的,我跟著前輩做微信後台開發,當時使用SpringMVC+MyBatis框架,剛接觸的時候,我自己學了挺久才弄明白,後來弄明白之後想想,其實挺簡單,對於邏輯開發的程序員來說,你只需要弄懂工作流程就好了,頁面怎麼跳轉,跳轉怎麼傳值,數據怎麼處理,這些足夠了,當然我是個不茄氏猛滿足的人,我會去弄明白,為什麼用這個框架、為什麼不用別的、用這個有什麼好處、如果讓我自己來做這個後台、我會怎麼搭建?帶著這些問題,我會試著自己搭建一下後台框架(雖然前期大部分是復制粘貼)。除了框架部分,微信高級介面也是我研究的重點,我會去官方文檔看看微信是怎麼接入的,然後研究研究前輩的代碼是怎麼寫的,所謂的干一行愛一行大概就是這樣吧,當時我覺得,微信開發,是很有前途的,而我們公司用的框架,也是最先進的(後來看來,確實這個框架組合是當前最流行的框架,而當時,微信公眾號也確實是當時互聯網行核衡業的一個風口,微信後來把h5帶起來了,導致現在一個好的h5前端都是供不應求的,薪資很高)。
說了這么多,為什麼後來又轉行做游戲了呢?其實是這樣的,當時在第一家公司,我的上級打算跳槽走了,帶走整個下面的技術,而不帶實習生,有那麼一兩個月,實習生就一直閑著沒事做,對於我來說,這樣過著就太無聊了,我喜歡挑戰,於是我投簡歷,重新找了份實習工作,在一個游戲公司做java伺服器開發,公司挺大的,幾年前憑借一款slg頁游稱霸游戲行業(什麼游戲我就不說了,說了就知道什麼公司了),後來游戲行業往手游發展,這款slg也出了手游版,這一款游戲,幾乎支撐了整個公司,再加上後來出的幾款手游,公司發展挺好的,我所實習的部門做的是一款mmorpg手游,從實習做到了轉正,做了近一年了,然而這款rpg手游的數據卻不是太好,第一次封測次日留存23,第二次26(現在這家公司的游戲能達到80多次日留存),七日就更不用說了,而我也能感覺到,作為一款mmo游戲,玩家之間的交互實在太少,從頭玩下來,我覺得這是一款單機,失去了mmo的本質,在項目組准備進行第三次封測的時候,我選擇了離開,原因很多,不僅僅因為游戲數據不好,也有一些個人原因吧,不過說實話,是這家公司帶我走進了游戲行業,我很感謝,我覺得游戲行業是一個非常有前景的行業,甚至比之前我認為最好的微信開發還要好,游戲行業非常暴利,在這家公司工作就能感受到,策劃文檔中,充滿了挖坑預留的計費點,這一塊可以正常玩兒,但你如果充錢,你就比別人牛逼。網路游戲,最重要的,就是控制好平民玩家跟普通玩家的佔比以及游戲平衡(當意識到公司的游戲如此處心積慮想要坑錢的時候,我突然明白為什麼公司的游戲大多被騰訊代理了,為什麼騰訊控股,原來如此,沒錢玩兒你**,哈哈)。由此也可以看出,游戲的商業化,已經把游戲公司帶入了一個固定的模式——無條件坑錢,我覺得已經失去了游戲的本質,我看過一本書,叫《游戲人生》(當時在cocos2014年開發者大會上買的。覺得挺值的),書已經送人了,但內容我看了一大半,從游戲的產生,到玩家的心理,到為什麼需要游戲,這本書都詮釋的熱別好(我覺得游戲策劃都應該看看這本書,做良心游戲,拒絕一味坑錢)。啊,突然發現這一段說的有點偏了,說到底,我也只是做游戲伺服器開發的,我也改變不了游戲行業,我只要做好我做的。其實大的游戲公司,就應該走這種商業化路線,憑借幾款長生命周期的游戲,支撐公司流水。
從轉行做游戲之後顫橋,我倒是覺得,游戲開發比web開發有趣多了,當然技術上也比web難多了,之前發過一篇討論,web開發何和游戲開發的區別,
,我把我的答案再粘貼一遍(實際上是別人要求我上他的號去回答的,於是我就自己回答了我自己的問題):1.從第三方支持來說,web後台有很多成熟的第三方框架,開發者不需要關心底層控制器跳轉的實現,只需要一個或幾個配置文件,就能完成核心控制器的部分,而開發者只需要關注web自身的業務邏輯,將邏輯與框架融合即可,使用框架一方面簡化控制層代碼,一方面很好的實現了業務邏輯的分層。而游戲後台開發中,因為各種游戲的需求差異性很大,從網路層,到業務邏輯層,各方面都必須根據自己游戲需求搭建適合自己的框架,因此很難有一些通用的東西能提煉出來一款成熟的框架,游戲後台開發基本上需要自己搭建適合自己的框架。
2.從業務邏輯層面來說,web後台基本上邏輯都是大同小異的,或許這一套系統,稍微改改,另一套系統就能用,而游戲就不同了,每個游戲都有自己的特色,根據策劃的不同需求而實現不同的邏輯,不過也會有一些通用的模塊,但整體上差異性還是很大的。
3.從數據持久化來說,web的數據基本上是很規整的,表與表之間關系很明確,並且以後也不會有太大的變化,而游戲中的數據多種多樣,隨著開服之後,數據的變化也是多種多樣,甚至傳統的關系型資料庫根本無法滿足游戲數據持久化的需求,游戲中有很多狀態和數據是需要伺服器來保存的,我個人認為,在游戲開發中,nosql比關系型資料庫更實用。
4.從通信層來說,web中的用戶都是一個個獨立的個體,而游戲中是多人在線的一個游戲世界,在這個游戲世界中,玩家與玩家之間需要進行交互,這就需要伺服器實時的向所有在線玩家進行消息廣播,這一點很損耗伺服器性能的,在這方面,游戲後台要比web做更多的處理,游戲伺服器是一個IO密集的伺服器類型。
以上便是我當時的答案,或許我的見解尚淺,畢竟我做游戲不到一年,不過對於後台開發這塊,我還是有一點話語權的,從實習游戲開發開始,我便經歷了一個轉換的過程,幾乎又是一個從零開始的學習過程,從mina框架到protobuffer,這些東西,我相信web開發很少接觸(mina作為網路通信框架,web中幾乎只有http通信,protobuffer作為通信協議,web最多用json,其實二者形式上差別不大,但數據大小千差萬別)。而游戲的邏輯,也是比web復雜得多,不得不說,web後台成熟的第三方框架是做的真的很好。
經歷了上家公司的洗禮,我想我對游戲後台開發有了足夠的了解,於是我找到了我現在這家公司,這家公司目前只有我一個伺服器後台,做兩款游戲,一款是塔防類,准備由單機改成弱聯網,伺服器存檔,並做登錄支付驗證,另一款,是比較龐大的slg手游,是准備帶領公司走上巔峰的項目,說一款slg帶領一個公司走上巔峰一點兒不為過,我上家公司就是這樣的,憑借一款《xxxx》(哈哈,名字不透露),走上人生巔峰。我之所以接受這份工作,是因為我接受挑戰,從底層寫起,從架構寫起,這是作為一年工作經驗的我想都不敢想的,不過這是一個挑戰自我,證明自我的機會,我願意接受這個挑戰,人生總會有很多爬坑的時候,但爬過了坑,就真的是人生巔峰了。我接受這個工作的另一個原因,就是公司發展確實不錯,以前做的單機,都是很火的(雖然我認為我自己一個人也能做,我也是學過cocos的),而現在公司也准確的把握了游戲行業的風口——slg,coc和cok的成功案例就能證明一切,mmorpg也不一定能做起來了,moba倒是有可能,但你要跟lol做不到80%的相似,我估計沒人願意在手機玩兒moba,slg或許是性價比最高的了。這么有挑戰的工作,還要從架構寫起,這樣的挑戰,我喜歡!
說說互聯網業的書吧,我認為這個行業的書,分為兩種,理論型的和技術型的,所謂理論型,就是長篇大論互聯網發展,行業模式等,而技術型,就是類似技術的工具書,是從技能入手的書,這兩種書,我家裡都有,但我發現買了之後,我很少有時間看,下班沒多少時間,北京上班,大多數時間都浪費在地鐵上了,上班時間,看看理論型的吧,覺得_嗦,浪費時間(後來我發現,做這行,除了會技術,你還是需要去看看牛人眼中的互聯網的,你需要透過前輩的眼光看世界,不要做IT民工,要做互聯網從業者),看看技術型的吧,讓別人看見了感覺你太low,所以我大多數時間還是能在網上down到pdf就在電腦看,down不到網路谷歌我要研究的技術,畢竟從事這行,還是用電腦學技術好點,主要是電腦看久了眼睛會疲憊,偶爾看看紙質的書也不錯的。而以前面試的時候,面試官經常問,除了大學課本,你還看什麼書啊?(如果是你們,恰巧又沒看什麼書,你們怎麼說?),我一般會說,我會自學其他技術,如cocos2dx,然後買一些技術指南之類的書看。我覺得這已經算最大誇張化了,因為大學我真的很少看書,我記憶中就看過一本C++技術類的,一本C#的,一本Android,還有其他幾本是什麼都不大記得了,大學畢竟十幾層的圖書館,除了英語四六級的時候進去復習,其他時間感覺都浪費了這十幾層的圖書館。
說說成長過程中遇到的問題吧,如果遇到我解決不了的,以前是先自己網路谷歌,看看有沒有辦法解決,不行就問老大,而現在,先網路谷歌,看有沒有辦法解決,沒辦法在網路谷歌,實在不行還要看框架源碼如何實現,上國外論壇看外國友人如何解決,問題總能解決的,總會有辦法的。當我開始學習寫架構的時候,我會開始關心游戲的網路層使用什麼框架,mina還是netty,數據怎麼存儲mysql還是mongo,是否需要緩存redis存什麼,memcached存什麼,緩存什麼數據,數據傳輸用什麼協議,json還是protobuffer,怎麼寫效率高,最高支持多少並發等等,我想這些都是我現在需要考慮的問題,當然這些都需要根據游戲具體的需求來決定的,最終伺服器能否高效穩定的運行,都是取決於我的架構是否高效穩定,所以這個過程我要不斷學習,不斷吸取別人的經驗。剛到新公司的時候,我才體會到,自己寫代碼其實也是一種挑戰,整個後端我自己一個人實現,代碼是否規范,數據如何存儲,都是我說了算,我想我的代碼不僅要高效,還要讓別人看得懂,後來的人能接著我的代碼繼續寫下去。
最後說說Java的題外話,語言之爭,從未停過,為什麼有人擁護Java,有人擁護PHP,有人喜歡C#,有人喜歡C++,各個語言各有各的優勢,業余時間,我也了解了不少其他語言,go,node.js我都有了解,我覺得go的語言層面支持協程並發以及node.js的非同步,都是很適合游戲伺服器的,我特別看好node.js,非同步io真的是對游戲伺服器很好的特性,並且加入對原聲js支持的mongo模塊也是很方便的(上面我有說到,我相信nosql是很適合存儲游戲數據的)。說到游戲行業,我認為h5游戲的發展也是越來越快了,上次白鷺的h5開發者生態大會我去了,白鷺的一整套工作流程,以及webvr,真的很令人興奮(第一輪抽獎我還抽了一個暴風魔鏡,哈哈!),另外,大會的模特挺漂亮,哈哈!2015年,互聯網行業也略呈下降趨勢了,不少創業公司面臨倒閉,泡沫經濟破滅,因為很多老闆抓不住當前經濟形勢,以為不管是啥,有個app就是創業了,其實全然不知一款app後面有多少運營模式、盈利模式,就像一句諷刺的話,「我有個絕壁好的idea,可以顛覆bat,什麼都不缺,就缺個程序員了,等等,千萬別告訴馬雲!」,哈哈,聽到這句話,當時我就笑了,估計好多倒閉的創業公司老闆都這么想的吧,他們並不能抓住用戶真正的需求,只有抓住用戶真正的需求,才會抓住用戶的心,真正活下來的,才是用戶真正需要的,然而,相對來說,游戲行業更是復雜多變,或許今天玩家喜歡這種游戲,明天玩家就喜歡另一種游戲了,就像我們永遠也想不到,flappybird、圍住神經病貓這類的游戲竟然能活起來,愚公移山竟然也能讓h5游戲變為付費的可能。就像一句話,「只要站在風口上,豬也能飛起來!」,只要抓住了玩家此時此刻真正想要的,產品就一定能做起來。
❷ 如何使用 CCache 進行 Cocos2d-x 編譯加速
CCache是C/C++的編譯器緩存。當相同的編譯被再次編譯時,進行檢測並通過之前編譯的緩存進行編譯加速。所以我們可以通過這種方法給Cocos2d-x Android的編譯加速。使用這種方法,在i7 CPU的Macbook Pro Retina上敬前編譯,我們的Cocos2d-x Android工程編譯時間可以從10分鍾減少到30秒!!
注意:以下操作僅對Mac OS X有效。
我們使用homebrew:
brew
install --HEAD ccache
或者通過源碼安裝:
git
clone ht tps:/ /github.co m/jrosd ahl/ccache.git
cd
ccache
./autogen.sh
./configure
make
make
install
cp
/usr/local/bin/ccache /usr/bin/
注意:默認的安裝路徑是 /usr/local/bin,我們需要拷貝ccache到/usr/bin/,不然ndk-build會找不到並報錯
如果終端報錯說找不到autoheader,這說明我們需要先安裝automake:
brew
install automake
但是,如果如果報錯是說找不到brew,我們就必須先安裝brew:
ruby
-e "$(curl
-fsSL
確保ccache的路徑可以被$PATH識別,運行命中稿信令:
ccache
如果你看到幫助信息,恭喜你,安裝成功了!
在android上配置編譯環境
我們必須先設置以下環境變數來使用ccache:
vim
~/.bash_profile
Add
following lines:
export
USE_CCACHE=1
export
NDK_CCACHE=/usr/local/bin/ccache
運行命令行:
ccache
-M 10G
這個命令將緩存大小設置為10G。當然,如果你的硬碟有足夠的空間,你也可以將此設置為50G。
然後,我們跳轉到NDK目錄,如果你忘了這個路徑,你可以賣輪使用以下命令來查看:
which
ndk-build
以下是我的輸出結果:
/developer/android/android-ndk-r9b/ndk-build
所以,我的NDK_ROOT是:
/developer/android/android-ndk-r9b
打開文件:$NDK_ROOT/build/core/default-build-commands.mk
找到以下章節並加入ccache,如下:
ifneq
($(findstring ccc-analyzer,$(CC)),)
TARGET_CC
= $(CC
else
TARGET_CC
= ccache $(TOOLCHAIN_PREFIX)gcc #Add ccache support
endif
TARGET_CFLAGS
=
TARGET_CONLYFLAGS
=
ifneq
($(findstring c++-analyzer,$(CXX)),)
TARGET_CXX
= $(CXX)
else
TARGET_CXX
= ccache $(TOOLCHAIN_PREFIX)g++ #Add ccache support
endif
TARGET_CXXFLAGS
= $(TARGET_CFLAGS) -fno-exceptions -fno-rtti
編譯cocos2d-x游戲
選擇cocos2d-x根目錄,運行:
python
build/android-build.py -p 10 cpp-tests
新建一個終端窗口,運行:
ccache
-s
這個命令會列印出ccache狀態,如下:
cache
directory /Users/heliclei/.ccache
primary
config /Users/heliclei/.ccache/ccache.conf
secondary
config (readonly) /usr/local/etc/ccache.conf
cache
hit (direct) 13588
cache
hit (preprocessed) 11145
cache
miss 696
called
for
link 1
called
for
preprocessing 14
preprocessor
error 1
can't
use precompiled header 129
no
input file 5
files
in cache 32222
cache
size 5.4 GB
max
cache size 30.0 GB
如果緩存的高速緩存命中(cache hit)和緩存大小(cache size)均為0,這就表示ccache沒有運行,我們必須從新檢查配置。
在Xcode中部署
配置Xcode(5.1)的ccache環境有點麻煩。我確實能調用ccache,但貌似沒有增加編譯速度。如果你有好的方法解決這個問題,請到github上為本篇教程提交pr!不過我們還是看看設置方法:
首先,我們添加2個自定義宏(user-defined macros)到cocos2d_libs的編譯選項中:
CC=$(SOURCE_ROOT)/../tools/xcode_ccache_wrapper
LDPLUSPLUS=$(DT_TOOLCHAIN_DIR)/usr/bin/clang++
然後,我們需要在$(COCOS2dX_ROOT)/tools/路徑下創建名為xcode_ccache_wrapper的腳本:
#!/bin/bash
export
CCACHE_CPP2=yes
export
CCACHE_LOGFILE=~/Desktop/ccache.log
exec
/usr/local/bin/ccache /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -Qunused-arguments
"$@"
設置完成,我們就可以快樂的在Xcode中編譯了!
打開ccache.log可以查看cache工作狀態。
但問題是,添加cache後,我mbp的Xcocde依舊沒有提升編譯速度。有可能是我使用的腳本不正確,所以,如果你看到本章節,並知道我的問題出在哪,請到github中提交pr,修正我的錯誤,並造福廣發開發者哦!!
❸ 淺談VB.NET中的跨進程消息鉤子
我們都知道在VB 裡面可以用API函數來進行子類化 以處理自身的窗體過程 如果跨進程 這就麻煩了 由於我們的函數在我們的進程中(廢話) 而目標進程的窗口的消息處理函數在目標進程(還是廢話) 所以只能想辦法把我們的代碼放到對方進程中去執行——並且要告知我們的進程得到了什麼消息 恐怕寫匯編就有點嚇人了 於是大家都寫DLL 其原理就是把回調函數放到一個DLL裡面注入到對方進程 DLL去修改目標窗口的默認處理函數——把消息發送給我們
當然也有 另類 一點的 /ThueDownloads/index s上面有一個DLL包 其中含有一個dssubcls dll 用它 可以輕松的完成我們的工作 就像調用一個API一樣簡單 而且在我們的程序中使用回調函數!呵呵 省去了自己寫DLL的麻煩之後 這些好處足以吸引各位觀眾了吧?
好了 VB 的代碼大家可以在下載的壓縮包中找到 作者提供了一個以記事本為基礎的實例(在dssubcls目錄下) 非常詳細無需詳細敘述了 關鍵是在VB NET裡面如何使用它——如何聲明API 如何進行回調 看用來子類化的API的VB 聲明先
Declare Function SubClass& Lib dssubcls (ByVal HwndSubclass& _Optional ByVal Address& = _Optional ByVal OldStyle& = _Optional ByVal NewStyle& = _Optional ByVal Ext& = _Optional ByVal SubClass& = )轉化成VB NET的聲明類似下面的樣子(習慣使然 我把&展開成了As Integer)
Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As Integer = Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integer
這不是很好嘛?問題來了 這樣的聲謹毀明在VB 裡面可以使用Addressof function來傳入第二個參數(參見你下載的源碼) 但是在VB NET裡面直接Addressof就不成了祥毀備——我們需要委託一個回調
Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
這個委託 對應的是以下函數
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer 在這里處理得到的消息
End Function
使用時 需要注意先實例化這個委託
Private fix_COCD = New HookCallBack(AddressOf mCallback)
此時 fix_COCD就是我們的mCallback函數引用了 用更直觀的觀點來看 fix_COCD就是一個指向mCallback的指針 相余大當於VB 裡面的Addressof function得到的結果 看似問題解決了 於是我們寫了以下代碼來搞對方的進程窗體消息
SubClass(Handle fix_COCD ) 修改處理函數
問題真是接踵而至!IDE提示變數類型不符!!事實確實如此 我們把一個HookCallBack類型當做Integer來傳遞 無法通過檢查 那麼強行轉換吧?當然 你可以去試試 這時 我所做的是 修改這個API聲明
Private Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As Integet
使之符合我們的調用?有點倒行逆施?並非如此 當你習慣了修改API聲明之後 會發現有些事變得如此簡單 有些事需要你重新認識——對於WIN API也是如此
至此 大功告成
較為完整的代碼如下
CodePrivate Declare Function SubClass Lib dssubcls (ByVal HwndSubclass As Integer Optional ByVal Address As HookCallBack = Nothing Optional ByVal OldStyle As Integer = Optional ByVal NewStyle As Integer = Optional ByVal Ext As Integer = Optional ByVal SubClass As Integer = ) As IntegerPrivate Declare Function UseSendMessage Lib dssubcls (ByVal use As Integer) As Integer 實例化的委託Private fix_COCD = New HookCallBack(AddressOf mCallback) 委託Private Delegate Function HookCallBack(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerPublic Sub Hook(ByVal Handle As Integer)proc = SubClass(Handle fix_COCD ) 修改處理函數UseSendMessage( )End Sub
Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As Integer
End Function
用這個代碼的時候 可能會碰見一些 意外情況 例如wm_data 此時 我們需要進一步去獲取LPARTM所指向的結構並對其進行解析(我們要讀的是對方窗口所在進程的內存 具體地址由lParam確定——實際上lParam一直是一個指針——IntPrt 但它與Integer完全就是一回事(如果你使用VB 可能需要使用Intprt toint 或intprt=new intprt(integer)這些)
CodePublic Class GetMsgPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByVal lpBuffer() As Byte ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function ReadProcessMemory Lib kernel (ByVal hProcess As Integer ByVal lpBaseAddress As Integer ByRef int As Integer ByVal nSize As Integer ByRef lpNumberOfBytesWritten As Integer) As IntegerPublic Declare Function OpenProcess Lib kernel (ByVal dwDesiredAccess As Integer ByVal bInheritHandle As Integer ByVal dwProcessId As Integer) As IntegerPublic Declare Function CloseHandle Lib kernel (ByVal hObject As Integer) As IntegerPrivate hProc As IntPtrSub New(ByVal PID As Integer)hProc = OpenProcess(&HFFFF False PID)End Sub
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
Protected Overrides Sub Finalize()CloseHandle(hProc)MyBase Finalize()End SubEnd Class這個類提供了Readmsg方法來讀取一些內容——但這並不是完整的 我們知道 LPARAM指向的結構是這樣的
_Public Structure COPYDATASTRUCTPublic dwData As IntegerPublic cbData As IntegerPublic lpData As IntPtrEnd Structure
其中dwData我們不是很關心 當然其中也可能存在一些有用信息(這里不想多說 網上有些文章純屬誤導)
而cbData是一個長度 lpData的長度
lpData這里被聲明為指針 看起來更直觀了——它就是地址
有了地址和長度 如何讀取代碼就自己寫吧
提示一下 參考我重載的ReadProcessMemory可能對你有不少幫助
當然 上面提到的只是 特殊情況 中的一個典型 還有很多時候 進程是用自定義消息(>&H A)來傳遞數據的 例如我所開發的這個工程 列印mCallBack的參數後 得到的是如下結果(十六進制 只提取了有用的信息)
D
其中lParam就是一個指針 我讀了其中的一部分
Function readmsg(ByVal address As Integer) As Byte()Dim buf( ) As ByteReadProcessMemory(hProc address buf )Return bufEnd Function
現在就明白為什麼上面的代碼是那樣了 )
然後進行了一個處理 得到了我想要的信息
消息解碼後得到的移動棋子信息 玩家 起X 起Y 止X 止Y 棋子編號
走棋總步數Event Move(ByVal player As Byte ByVal sx As Byte ByVal sy As Byte ByVal dx As Byte ByVal dy As Byte ByVal name As Byte ByVal [step] As Byte)Private Function mCallback(ByVal wMsg As Integer ByVal wParam As Integer ByVal lParam As Integer) As IntegerIf wParam = &H ThenDim s As Byte() = msg readmsg(lParam)RaiseEvent Move(s( ) s( ) s( ) s( ) s( ) s( ) s( ))End IfEnd Function
當然 在我的工程裡面重載的ReadProcessMemory並沒有被使用
補充一下咯
在VB NET中 處理自己的窗體的消息只需要重載窗體消息處理過程就可以了 無需子類化 )
有補充一下
lishixin/Article/program/net/201311/12647
❹ Java開源框架是什麼
其實框架很簡單的,你可以認為它是一個工具,甚至一個插件。
框架的作用,就是將一個公用的,常用的技術,封裝起來,
幫你處理一些基礎的東西,可以讓你不用再去寫那些繁瑣的東西。
就拿你要學的struts來說:他本質上也是用java寫的,和我們自己寫的類沒有區別,他實現的東西我們自己也可以實現。
比如接收客戶端的數據,我們是用request.getParameter()來的,但是如果有很多個參數,我們要寫很多個,很麻煩。struts它就幫我們實現,不用我們寫,直接寫個屬性,就可以得到。其實本質還是用request.getParameter()。。
所以你不要再在意框架是什麼東西,等你接觸了就知道了。你把它當做一個工具來用,這就是框架。
前台框架:jQuery
Mvc框架:Struts、spring Mvc
核心框架:Spring
orm框架:Hibernate、Spring JDBC、myBatis。
❺ 為什麼源代碼依賴於很多第三方包而打包jfinal
啟動jfinal不使用其他擴展功能,是不需要再導入其他包的.
JFinal有如下主要特點:
MVC架構,設計精巧,使用簡單
遵循COC原則,零配置,無xml
獨創Db + Record模式,靈活便利
ActiveRecord支持,使資料庫開發極致快速
自動載入修改後的java文件,開發過程中無需重啟web server
AOP支持,攔截器配置靈活,功能強大
Plugin體系結構,擴展磨攔性強
多視圖支持,支持FreeMarker、JSP、Velocity
強大的Validator後端校驗功能
功李培能齊全,擁有struts2的絕大部分功能
體積小僅538K,且無第三方依賴
-----------割-----------
打包jfinal ?描述不是太清晰,未能理解是做什麼,可到社區進行反饋哪游唯
❻ VB.NET中的跨進程消息鉤子
我們都知攔虧道在VB6裡面可以用API函數來進行子類化,以處理自身的窗體過程;如果跨進程,這就麻煩了,由於我們的函數在我們的進程中(廢話),而目標進程的窗口的消息處理函數在目標進程(還是廢話),所以只能想辦法把我們的代碼放到對方進程中去執行——並且要告知我們的進程得到了什麼消息。恐怕寫匯編就有點嚇人了,於是大家都寫DLL,其原理就是把回調函數放到一個DLL裡面注入到對方進程,DLL去修改目標窗口的默認處理函數——把消息發送給我們。
當然也有「另類」一點的:上面有一個DLL包,其中含有一個dssubcls.dll,用它,可以輕松的完成我們的工作:就像調用一個API一樣簡單,而且在我們的程序中使用回調函數!呵呵,省去了自己寫DLL的麻煩之後,這些好處足以吸引各位觀眾了吧?
好了,VB6的代碼大家可以在下載的壓縮包中找到,作者提供了一個以記事本為基礎的實例(在dssubcls目錄下),非常詳細無需詳細敘述了。關鍵是在裡面如何使用它——如何聲明API,如何進行回調,看用來子類化的API的VB6聲明先:
Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass, _
Optional ByVal Address = 0, _
Optional ByVal OldStyle = 0, _
Optional ByVal NewStyle = 0, _
Optional ByVal Ext = 0, _
Optional ByVal SubClass = 0)
轉化成的聲明類似下面的樣子(習慣使然,我把展開成了As Integer):
Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer, Optional ByVal Address As Integer = 0, Optional ByVal OldStyle As Integer = 0, Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0, Optional ByVal SubClass As Integer = 0) As Integer
這不是很好嘛?問題來了,這樣的聲明在VB6裡面可以使用Addressof function來傳入第二個參數(參見你下載的源碼),但是在裡面直接Addressof就不成了——我們需要委託一個回調:
Private Delegate Function HookCallBack(ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
這個委託,對應的是以下函數:
Private Function mCallback(ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
『在這里處理得到的消息
End Function
使用時,需要注意先實例化這個委託:
Private fix_COCD = New HookCallBack(AddressOf mCallback)
此時,fix_COCD就是我們的mCallback函數引用了,用更直觀的觀點來看,fix_COCD就是一個指向mCallback的指針,相當於簡鏈神VB6裡面的Addressof function得到的結果,看似問題解決了,於是我們寫了以下代碼來搞對方的進程窗體消息:
SubClass(Handle, fix_COCD, 0, 0, 0, 1) '修改處理函數
問題真是接踵而至!IDE提示變數類型不符!!事實確實如此,我們把一個HookCallBack類型當做Integer來傳遞,無法通過檢查,那喚弊么強行轉換吧?當然,你可以去試試。這時,我所做的是,修改這個API聲明:
Private Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer, Optional ByVal Address As HookCallBack = Nothing, Optional ByVal OldStyle As Integer = 0, Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0, Optional ByVal SubClass As Integer = 0) As Integet
使之符合我們的調用?有點倒行逆施?並非如此,當你習慣了修改API聲明之後,會發現有些事變得如此簡單,有些事需要你重新認識——對於WIN32 API也是如此。
至此,大功告成:
較為完整的代碼如下:
Code
Private Declare Function SubClass Lib "dssubcls" (ByVal HwndSubclass As Integer, Optional ByVal Address As HookCallBack = Nothing, Optional ByVal OldStyle As Integer = 0, Optional ByVal NewStyle As Integer = 0, Optional ByVal Ext As Integer = 0, Optional ByVal SubClass As Integer = 0) As Integer
Private Declare Function UseSendMessage Lib "dssubcls" (ByVal use As Integer) As Integer
'實例化的委託
Private fix_COCD = New HookCallBack(AddressOf mCallback)
'委託
Private Delegate Function HookCallBack(ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Public Sub Hook(ByVal Handle As Integer)
proc = SubClass(Handle, fix_COCD, 0, 0, 0, 1) '修改處理函數
UseSendMessage(1)
End Sub
Private Function mCallback(ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End Function
用這個代碼的時候,可能會碰見一些「意外情況「,例如wm_data,此時,我們需要進一步去獲取LPARTM所指向的結構並對其進行解析(我們要讀的是對方窗口所在進程的內存,具體地址由lParam確定——實際上lParam一直是一個指針——IntPrt,但它與Integer完全就是一回事(如果你使用VB2005可能需要使用Intprt.toint32或intprt=new intprt(integer)這些):
Code
Public Class GetMsg
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByVal lpBuffer() As Byte, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef int As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
Private hProc As IntPtr
Sub New(ByVal PID As Integer)
hProc = OpenProcess(HFFFF, False, PID)
End Sub
Function readmsg(ByVal address As Integer) As Byte()
Dim buf(19) As Byte
ReadProcessMemory(hProc, address, buf, 20, 0)
Return buf
End Function
Protected Overrides Sub Finalize()
CloseHandle(hProc)
MyBase.Finalize()
End Sub
End Class
這個類提供了Readmsg方法來讀取一些內容——但這並不是完整的,我們知道,LPARAM指向的結構是這樣的:
_
Public Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As IntPtr
End Structure
其中dwData我們不是很關心,當然其中也可能存在一些有用信息(這里不想多說,網上有些文章純屬誤導)
而cbData是一個長度:lpData的長度
lpData這里被聲明為指針,看起來更直觀了——它就是地址
有了地址和長度,如何讀取代碼就自己寫吧。
提示一下:參考我重載的ReadProcessMemory可能對你有不少幫助。
當然,上面提到的只是「特殊情況」中的一個典型,還有很多時候,進程是用自定義消息(H40A)來傳遞數據的,例如我所開發的這個工程,列印mCallBack的參數後,得到的是如下結果(十六進制,只提取了有用的信息):
4731442257D0
其中lParam就是一個指針,我讀了其中的一部分:
Function readmsg(ByVal address As Integer) As Byte()
Dim buf(19) As Byte
ReadProcessMemory(hProc, address, buf, 20, 0)
Return buf
End Function
現在就明白為什麼上面的代碼是那樣了:)
然後進行了一個處理,得到了我想要的信息:
'消息解碼後得到的移動棋子信息:玩家,起X,起Y,止X,止Y,棋子編號,
走棋總步數
Event Move(ByVal player As Byte, ByVal sx As Byte, ByVal sy As Byte, ByVal dx As Byte, ByVal dy As Byte, ByVal name As Byte, ByVal [step] As Byte)
Private Function mCallback(ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
If wParam = H14 Then
Dim s As Byte() = msg.readmsg(lParam)
RaiseEvent Move(s(1), s(10), s(11), s(12), s(13), s(14), s(16))
End If
End Function
當然,在我的工程裡面重載的ReadProcessMemory並沒有被使用。
補充一下咯:
在中,處理自己的窗體的消息只需要重載窗體消息處理過程就可以了,無需子類化:)
有補充一下:
對於wm_data來說,還有一些數據獲取的問題沒有說清楚,實際上都可以用一些方法來解決。
❼ coc雷人輔助顯示小精靈已超出最大運行用戶怎麼解決
目前最好的辦法是多按幾次開啟鍵。伺服器人太多了,多點幾次就行了。就跟cf擠線一樣,不過啟動成功的瞬間要停下來,不然你又點到停止運行了。
雷人輔助基於著名共享軟體《按鍵精靈》為開發環境,本質是「按鍵精靈腳本」,在技術原理上通過判斷屏幕變化,自動模擬滑鼠動作,和當前所流行的以修改游戲源代碼、封包、內存數據的「外掛」軟體存在本質區別!
雷人輔助適合所有COC玩家,無論是想打資源還是想捐兵,還是想干其他,反正COC涉及到的方方面面,只要你不想枯燥的玩,都適合。無論你有錢還是沒錢,皆可用,雷人永久免費!在雷人這里一視同仁!因前期COC不是很肝,推薦7本以上再用雷人,理論是100兵力即可使用!
❽ 游戲源碼是什麼意思
問題一:游戲源代碼什麼意思 游戲源代碼:游戲程序文件的代碼。
源代碼(也稱源程序),是指一系列人類可讀的計算機語言指令。 在現代程序語言中,源代碼可以是以書籍或者磁帶的形式出現,但最為常用的格式是文本文件,這種典型格式的目的是為了編譯出計算機程序。計算機源代碼的最終目的是基虛滾將人類可讀的文本翻譯成為計算機可以執行的二進制指令,這種過程叫做編譯,通過編譯器完成。
問題二:游戲代碼是什麼意思 雖然電腦上標明是音樂文件,但是用TXT打開會發現是一串數字~沒錯~這就是金手指~
保存CMF格式代碼:新建一個記事本,把代碼復制進去,選另保存為(注意文件格式選「任意文件」),搏余然後選擇保存地點和文件名(XXXXX.cmf)即譽慶可~
還有問題請補充~也可私聊~
問題三:請問網路游戲的源代碼是什麼? 網路游戲源代碼就是游戲的基礎,在外行人眼裡是無數行的英文和數字,其實就是一組程序。
作用當然是開發游戲啦。
手上擁有了源代碼就可以製作游戲,當然如果你啥都不改,那功能就伐原來的游戲沒什麼兩樣。
現在網上你可以搜索一下網路游戲的源代碼還是非常多的,但是大多數都是不完整的,也就是說你即便得到了也無法用。
另外只要這款游戲是國產的,你如果一模一樣也不行,因為違反版權。
所以就算你拿到了源代碼,你也要有完整的美術資源,需要讓程序貼圖替換上去,達到視覺上不一樣的效果。世界背景和故事都要換,所有這些的成本當然不是一般的高。
好吧,即便你搞好了,那接下來你還要運營吧,運營的成本就更高了。
問題四:該游戲代碼什麼意思怎麼解決? 50分 這是亂碼,游戲本體已經崩潰,會出現亂碼可能是你私自改動了文件參數,或下載。錯誤,可直接刪除。
問題五:源代碼怎麼用的啊??有的游戲給 有的程序個給的那個 不知道你玩的啥游戲,但是看樣子估計是c++代碼,我英文學的不好
從英文描述中我猜測這是v c++的代碼,「」在代碼中表示注釋,前三行是注釋,其大意如下:
stdafx.cpp :源文件,包括剛才的標准單元?
fixyou.pch將是預編譯的標題
stdafx.obj將包含預編譯的類型信息
「cpp」明顯是c++源碼文件的縮寫名,而最後一行是頭文件。
所謂頭文件預編譯,就是把一個工程(Project)中使用的一些MFC標准頭文件(如Windows.H、Afxwin.H)預先編譯,以後該工程編譯時,不再編譯這部分頭文件,僅僅使用預編譯的結果。這樣可以加快編譯速度,節省時間。
預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由於預編譯的頭文件的後綴是「pch」,所以編譯結果文件是projectname.pch。
編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設置里指定的。編譯器認為,所有在指令#include stdafx.h前的代碼都是預編譯的,它跳過#include stdafx. h指令,使用projectname.pch編譯這條指令之後的所有代碼。
因此,所有的CPP實現文件第一條語句都是:#include stdafx.h。
其實我學的pascal,所以對c++了解的少,如果你真的想學會他,還是自己找幾本c++的書學一下,這樣才能「使用」代碼得心應手。
問題六:手機游戲源代碼是什麼,怎麼使用 不知道你玩的啥游戲,但是看樣子估計是c++代碼,我英文學的不好
從英文描述中我猜測這是v c++的代碼,「」在代碼中表示注釋,前三行是注釋,其大意如下:
stdafx.cpp :源文件,包括剛才的標准單元?
fixyou.pch將是預編譯的標題
stdafx.obj將包含預編譯的類型信息
「cpp」明顯是c++源碼文件的縮寫名,而最後一行是頭文件。
所謂頭文件預編譯,就是把一個工程(Project)中使用的一些MFC標准頭文件(如Windows.H、Afxwin.H)預先編譯,以後該工程編譯時,不再編譯這部分頭文件,僅僅使用預編譯的結果。這樣快編譯速度,節省時間。
預編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由於預編譯的頭文件的後綴是「pch」,所以編譯結果文件是projectname.pch。
編譯器通過一個頭文件stdafx.h來使用預編譯頭文件。stdafx.h這個頭文件名是可以在project的編譯設置里指定的。編譯器認為,所有在指令#include stdafx.h前的代碼都是預編譯的,它跳過#include stdafx. h指令,使用projectname.pch編譯這條指令之後的所有代碼。
因此,所有的CPP實現文件第一條語句都是:#include stdafx.h。
其實我學的pascal,所以對c++了解的少,如果你真的想學會他,還是自己找幾本c++的書學一下,這樣才能「使用」代碼得心應手。
問題七:什麼是游戲代號? 什麼游戲?哪個美女?哪個國家?何為代號?具體點啊!我想回答!
問題八:coc部落對戰里的游戲代碼代表什麼意思 請詳細描述問題謝謝~
問題九:源代碼在游戲中的作用 網路游戲源代碼就是游戲的基礎,在外行人眼裡是無數行的英文和數字,其實就是一組程序。
作用當然是開發游戲啦。
手上擁有了源代碼就可以製作游戲,當然如果你啥都不改,那功能就和原來的游戲沒什麼兩樣。
現在網上你可以搜索一下網路游戲的源代碼還是非常多的,但是大多數都是不完整的,也就是說你即便得到了也無法用。
另外只要這款游戲是國產的,你如果一模一樣也不行,因為違反版權。
所以就算你拿到了源代碼,你也要有完整的美術資源,需要讓程序貼圖替換上去,達到視覺上不一樣的效果。世界背景和故事都要換,所有這些的成本當然不是一般的高。
好吧,即便你搞好了,那接下來你還要運營吧,運營的成本就更高了。
問題十:手機游戲那麼多代碼,他們怎麼找代碼破解游戲的。需要學什麼的才知道游戲代碼的意思。 5分 你好朋友這樣的情況有可能是游戲伺服器問題,建議過段時間再登錄,應當可以正常。