① 怎麼用編程開發個游戲
第一就是游戲邏輯,也就是與平台無關的游戲邏輯的開發。
第二部分是游戲引擎,大部分會用到一些引擎的工作流、一些各種系統封裝好的高層的API。
但是小游戲有一個重要的一個限制是禁止動態執行代碼,開發者必須先提交審核,在審核通過後才可以上架給普通用戶。另外,小游戲包括引擎的代碼量比較大,所以限制大小比小程序要大,首包限制大小為4M。
② 如何學習入門的游戲編程
以下一篇是以伺服器為例的,希望對你有幫助。
-------------
學習游戲伺服器編程基礎篇
姜雪偉
前段時間,一直給開發者灌輸學習3D游戲引擎技術,包括游戲底層數據結構封裝,演算法與游戲實戰技術分享視頻課程,以及編寫了一些使用演算法解決游戲實際問題等等方面的文章。再給讀者介紹3D游戲引擎的同時,也有人問我關於如何學習游戲伺服器編程技術,其實我也喜歡游戲伺服器編程。在游戲開發過程中,游戲伺服器開發的工作量相對客戶端來說少的多,比如游戲開發後期客戶端要調各種效果,更換UI等。當然網上關於開源的伺服器代碼也很多,在Github上能搜到很多代碼,比如java的,C#的,C++的,C的,erlang,python等等,很多人為此比較迷惑不知道到底該學習那種編程語言。伺服器編程開發也是隨著地區不同而不同,IT行業發展的中心是北京,上海,廣州,它們對於游戲伺服器編程語言的需求也是不同的,北京偏向於java語言編程,上海偏向於C++語言編程,廣州偏向於erlang編程,這個也是告訴開發者,如果想去不同的地方可以根據需求有針對性的學習。本篇文章就是告訴讀者如何學習游戲伺服器編程開發?
我本人還是喜歡C++編程,其實語言只是一方面,原理還是要清楚的,下面我談談學習伺服器編程的一點體會。
學習游戲伺服器編程也要分階段的,先把基礎學習好,編程語言是必須具備的,可以學習java,C++,C#,erlang任意一種要熟練掌握,還是以C++為例,游戲編程中經常會使用一些宏定義或者模版定義,開發者要知道宏定義的含義以及模版定義的含義。伺服器開發中經常會使用STL模版中的對象,比如Map,Dictionary,List,Vector等等。網上有很多學習資料,另外在這里還是要談到數據結構,不論在客戶端開發還是在伺服器端開發,數據結構都會用到,比如哈希表,二叉樹,隊列,堆棧等等,以上提到的是關於語言方面必須具備的。
語言基礎掌握牢固的,可以直接略過這一階段的學習,直接學習第二階段,關於網路通信協議,比如我們TCP/IP協議一共分七層,各個層的作用是什麼?伺服器傳輸有幾種常用的協議分別是TCP協議,UDP協議,還有Web使用的Http。TCP協議是可靠的協議,數據傳輸後必須要經過確認,UPD協議是不可靠的,無需確認,Http協議是主動的去獲取,主要用於資源和Web注冊的。這三種都會在伺服器開發中使用到,必須要要掌握。在這里給讀者展示一下各個層包含的協議:
應用層:TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet 等等
傳輸層:TCP,UDP
網路層:IP,ICMP,OSPF,EIGRP,IGMP
數據鏈路層:SLIP,CSLIP,PPP,MTU
通過上面列舉的點,我們知道了各個層都有哪些通信協議,當然各個層不是孤立存在的,它們之間是有關系的,在計算件原理中也有這方面的介紹,這里借用網上的圖給讀者展示如下:
三次握手在伺服器端程序員面試中,經常被提到,掌握了TCP/IP協議後,接下來進入實兵演練階段,也看看自己對網路這塊掌握程度。以Unity為例,可以學習TNet超輕量級的網路傳輸,因為它沒有資料庫,但是可以很好的驗證學習的TCP協議以及Socket套接字,自己可以在此基礎上再嘗試做一些消息傳遞,最後要學習一下伺服器存儲所需要的資料庫MySql。
學習資料庫的安裝,資料庫操作比如新建表,插入數據,刪除數據,讀去數據等,掌握資料庫後,接下來就需要通過游戲伺服器編程對它進行操作了,建議先學習網上的PhontonServer,它是使用C#編寫的,方便開發者學習,另外它提供了Unity實現的Demo,開發者可以調試連接,從而熟悉Mysql。
以上這些知識也是作為伺服器開發者必須掌握的,掌握了這些技術後,繼續提升的最好方法是去公司跟著項目走,在後面章節還會給讀者介紹關於如何架設真正的游戲伺服器以及知名IT游戲公司的伺服器架構設計以及伺服器負載均衡的設計,最終會介紹如何搭建全球同服伺服器。
③ 如何編程製作一款游戲
一、游戲開發製作的概念
游戲開發是一個過程,為了激發玩家玩游戲熱情,通過遵循設計製作規則,來設計人物、場景等游戲要素。主要流程包括原畫創作、建模、材質、燈光及渲染、骨骼設定、動畫、特效等部分。涉及范疇包括:游戲規則及玩法、視覺藝術、編程、產品化、聲效、編劇、游戲角色、道具、場景、界面等等元素。游戲程序開發歸根到底就是軟體工程,是游戲製造環節中不行短少的重要部分。游液隱清戲程序開發是技術含量最高的,游戲程序員的薪資也相對其他職業高許多,目前游戲職業中游戲程度人才的缺口非常大,供不應求。
二、游戲開發需要具備的知識
游戲本質分析,游戲產業概論、游戲開發流程及職業劃分、玩家需求分析、構思創意及文檔編寫要求、游戲故事設計、游戲元素、規則、任務、系統、關卡設計、游戲平衡設定、界面與操作功能。透視基礎、構圖基礎、結構素描、明暗素描、藝用人體解剖基礎、人物速寫、Adobe軟體應用、造型基礎、游戲美術風格技法、色彩基礎、游戲色彩練習、肖像繪制、質感表現。3DMAX軟體基礎、游戲材質基礎、游戲道具製作、作品渲染游戲場景製作技巧、場景材質製作、卡通角色製作、寫實角色製作、怪物製作。簡單分類的話就是:
1、扎實的演算法知識。主要有:樹或圖的搜索演算法、A*演算法、碰撞檢測演算法、BSP樹、人工智慧
2、相關圖形處理知識。比如:DirectX編程、OpenGL編程、圖形學的相關知識(三維圖形的形體、紋理、貼圖、照明,還有三維對象的消隱演算法比如油畫演算法,Z緩存)和動畫處理知識。如果想深入還要學會幾種三維引擎比如OGRE。
3、扎實的程序語言功底,主要代表為VC、DELPHI和JAVA。其中VC使用最廣,現在比較大的游戲也由此開發;DELPHI功能也很強,很多網游:比如網金、傳奇都用到了DELPHI;JAVA用於開發手機游戲。
三、游戲開發需要學哪些
游戲開發需要學哪些,課程是什麼樣的呢看學游戲程序開發主要有最通用的C及Windows程序設計課程,演算法設計、數據結構、軟體工程、游戲技術,游戲設計方法及流程等課程。所有課程以行業最實用技術為參考,綜合初學者的接受能力精心設計。
1、基礎公共課:游戲概述Photoshop平面軟體及像素美術3dsmax軟體基礎及效果圖製作游戲程序設計基礎及游戲製作原理游戲策劃、製作、測試及運營實踐游戲行業規劃及職業素質。
2、專業技能課:手機2D游戲開發2D游戲開發技術實戰C語言及演算法基礎WIN32程序開發及MFC基礎2D游戲開發實踐行業規劃及職業素質。2D網路游戲開發主要學習內容有網路游戲程序設計、網路游戲演算法設計、2D網路游戲平台設計以及商業實戰項目訓練,包含C、數據結構、演算法基礎、WindowsAPI使用、MFC原理及其應用、2D圖形渲染技術、界面設計與應用。
3、游戲程序方向:Direct3D程序開發基礎3D游戲開發技術實戰游戲引擎的修改與使用網路通訊、資料庫及游戲伺服器、行業規劃及職業素質、游戲綜合項目實戰訓練、基地頂崗項目實訓。
四、游戲開發常用軟體
1、3dsMAX:大多數游戲開發公司美工使用,效率較高,可以獨立製作游戲中所有美術相關資源。
2、Delphi:直接編譯生成可執行攜悶代碼,編譯速度快。由於Delphi編譯器採用了條件編譯和選擇鏈接技術,使用它生成的執行文件更加精煉,運行速度更快。在處理速度和存取伺服器方面,Delphi的性能遠遠高於其他同類產品。
3、Photoshop:PHOTOSHOP是一個很好的圖像編輯軟體,PHOTOSHOP的應用領域很廣泛,在圖像、圖形、文字、視頻、出版各方面都有涉及。
4、MAYA:跟3dsMAX差不多的軟體,因個人喜好而定,MAYA在製作動作的方面較MAX稍差,不過在很多方面這兩款軟體都是可以兼容的。
5、其他:在個人計算機上,可以用目前流性的軟體開發工具,比如:C,C,VC,Delphi,CBuilder等。由於Windows操作系統的普及和其強大的多媒體功能,越來越多的游戲支鬧前持Windows操作系統。
五、學習游戲開發需要了解的常識
1、圖形引擎主要包含游戲中的場景(室內或室外)管理與渲染,角色的動作管理繪制,特效管理與渲染(粒子系統,自然模擬(如水紋,植物等模擬)),光照和材質處理,LOD(LevelObjectDetail)管理等,另外還有圖形數據轉換工具開發,這些工具主要用於把美工用DCC軟體(如3DSMax,Maya,SoftXSI,SoftImage3D等)軟體製作的模型和動作數據以及用Photoshop或painter等工具製作的貼圖,轉化成flash游戲開發程序中用的資源文件。
2、物理引擎主要包含游戲世界中的物體之間、物體和場景之間發生碰撞後的力學模擬,以及發生碰撞後的物體骨骼運動的力學模擬(比較著名的物理引擎有havok公司的gamedynamicssdk,還有opensource的ODE—OpenDynamicsEngine)。
3、游戲開發工具主要包含關卡編輯器,角色編輯器,資源打包管理,DCC軟體的插件工具等開發。
4、支持區域網對戰的網路引擎開發,主要解決區域網網路發包和延遲處理,通訊同步的問題,有同步通訊和非同步通訊兩種做法,非同步通訊用於那些對運行幀速要求比較高的游戲,同步通訊相對非同步通訊來說效率相對低,但是同步通訊的編程模型相對非同步通訊來得簡單一些。
5、游戲引擎主要是把圖形引擎、聲音引擎、物理引擎整合起來,主要針對某個游戲製作一個游戲系統,其包含游戲關卡編輯器,主要用途是可以可視化的對場景進行調整,光照效果和霧化等效果調整,事件設置,道具擺放,NPC設置,另外還有角色編輯器,主要用於編輯角色的屬性和檢查動作數據的正確性。一般日本游戲公司的做法,他們會把關卡編輯器和角色編輯器直接做到游戲中,所有的參數調整都在游戲中通過調試菜單來進行編輯,所以一般他們把這部分調試菜單的功能做的很強大,同時在屏幕上實時的顯示一些重要的信息,這樣做的好處是關卡編輯器調整的效果直接就是游戲的效果,但是對於程序的重用性來說可能不是很好,比如說要用到另外一個游戲項目中就比較難,除非兩個游戲類型相同,只要把場景和角色數據換一下,還有做下一代產品也沒有問題,只要根據式樣增加調試菜單的功能就可以了。
想成為一個游戲開發人員,就得先成為一個很好的程序開發人員。當你成為一個很好的程序開發人員時,就可以考慮學習游戲開發了。成為游戲的測試人員,游戲的藝術人員,或者是游戲設計人員,或者游戲的管理人員都是成為游戲開發人員的前期步驟之一。
④ 教你如何使用C語言編寫簡單小游戲
C語言是計算機專業都要學習的一門基礎學科。一般來說,是比較枯燥的.那麼,我們能不能通過編一些小游戲來提高它的趣味性呢?這樣學習程序設計,就不會是一件艱苦 ,枯燥的事,它變得象電腦游戲一樣充滿好奇,富有樂趣。
例如2048這款游戲:
方法/步驟:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<windows.h>
#define SIZE 4
static int score=0;
void putn(int n[][SIZE]);
void getn(int n[][SIZE]);
int isempty(int n[][SIZE]);
int isfull(int n[][SIZE]);
void math(int n[][SIZE],char c);
void tow(int n[][SIZE]);
void toa(int n[][SIZE]);
void tos(int n[][SIZE]);
void tod(int n[][SIZE]);
//主函數
int main()
{
int i,j;
int n[SIZE][SIZE];
char c=' ';
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
n[i][j]=0;
}
}
printf( "*********************** "
" 2048(%dX%d) "
" control:W/A/S/D "
"press any key to begin "
"*********************** ",SIZE,SIZE);
getch();
system("cls");
//n[0][1]=2048;
//n[0][3]=2048;
while(1)
{
if(isempty(n))
getn(n);
putn(n);
if(!isempty(n)&&isfull(n))
break;
sleep(200);
c=getch();
while(c!='w'&&c!='a'&&c!='s'&&c!='d')
c=getch();
math(n,c);
system("cls");
}
printf(" Game Over! ",score);
return 0;
}
//函數
void putn(int n[][SIZE])
{
int i,j;
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
printf("| ");
printf("| ");
for(j=0;j<SIZE;j++)
{
if(n[i][j]==0)
printf("| ");
else
printf("|%4d ",n[i][j]);
}
printf("| ");
for(j=0;j<SIZE;j++)
printf("|_____");
printf("| ");
}
printf("score: %d",score);
}
void getn(int n[][SIZE])
{
int a,b;
a=rand()%SIZE;
b=rand()%SIZE;
while(n[a][b]!=0)
{
a=rand()%SIZE;
b=rand()%SIZE;
}
n[a][b]=2;
}
int isempty(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
for(j=0;j<SIZE;j++)
if(n[i][j]==0)
count++;
return count;
}
int isfull(int n[][SIZE])
{
int i,j,count=0;
for(i=0;i<SIZE;i++)
{
for(j=1;j<SIZE-1;j++)
{
if(n[i][j]==n[i][j+1]||n[i][j]==n[i][j-1])
count++;
}
}
for(j=0;j<SIZE;j++)
{
for(i=1;i<SIZE-1;i++)
{
if(n[i][j]==n[i+1][j]||n[i][j]==n[i-1][j])
count++;
}
}
return count>0?0:1;
}
void math(int n[][SIZE],char c)
{
switch(c)
{
case 'w':tow(n);break;
case 'a':toa(n);break;
case 's':tos(n);break;
case 'd':tod(n);break;
default :;
}
}
void tow(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=0;j<SIZE;j++)
{
for(a=0;a<SIZE;a++)
{
for(i=0;i<SIZE-1;i++)
{
if(n[i][j]==0)
{
n[i][j]=n[i+1][j];
n[i+1][j]=0;
}
}
}
}
for(j=0;j<SIZE;j++)
{
for(a=0,i=0;i<SIZE;i++)
{
if(n[i][j]!=n[i+1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i+1][j])
{
m[a++]=n[i][j]+n[i+1][j];
score+=m[a-1];
n[i][j]=0,n[i+1][j]=0;
}
}
for(i=0;i<SIZE;i++)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void toa(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=0;i<SIZE;i++)
{
for(a=0;a<SIZE;a++)
{
for(j=0;j<SIZE-1;j++)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j+1];
n[i][j+1]=0;
}
}
}
}
for(i=0;i<SIZE;i++)
{
for(a=0,j=0;j<SIZE;j++)
{
if(n[i][j]!=n[i][j+1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a++]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j+1])
{
m[a++]=n[i][j]+n[i][j+1];
score+=m[a-1];
n[i][j]=0,n[i][j+1]=0;
}
}
for(j=0;j<SIZE;j++)
{
n[i][j]=m[j];
m[j]=0;
}
}
}
void tos(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1;a>=0;a--)
{
for(i=SIZE-1;i>0;i--)
{
if(n[i][j]==0)
{
n[i][j]=n[i-1][j];
n[i-1][j]=0;
}
}
}
}
for(j=SIZE-1;j>=0;j--)
{
for(a=SIZE-1,i=SIZE-1;i>=0;i--)
{
if(n[i][j]!=n[i-1][j]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i-1][j])
{
m[a--]=n[i][j]+n[i-1][j];
score+=m[a+1];
n[i][j]=0,n[i-1][j]=0;
}
}
for(i=SIZE-1;i>=0;i--)
{
n[i][j]=m[i];
m[i]=0;
}
}
}
void tod(int n[][SIZE])
{
int i,j,a;
int m[SIZE];
for(a=0;a<SIZE;a++)
m[a]=0;
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1;a>=0;a--)
{
for(j=SIZE-1;j>0;j--)
{
if(n[i][j]==0)
{
n[i][j]=n[i][j-1];
n[i][j-1]=0;
}
}
}
}
for(i=SIZE-1;i>=0;i--)
{
for(a=SIZE-1,j=SIZE-1;j>=0;j--)
{
if(n[i][j]!=n[i][j-1]&&n[i][j]!=0||n[i][j]==2048)
{
m[a--]=n[i][j];
n[i][j]=0;
}
else if(n[i][j]==n[i][j-1])
{
m[a--]=n[i][j]+n[i][j-1];
score+=m[a+1];
n[i][j]=0,n[i][j-1]=0;
}
}
for(j=SIZE-1;j>=0;j--)
{
n[i][j]=m[j];
m[j]=0;
}
}
}