電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
想設計一款即時戰略遊戲...

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 哈啦交流園地
上一篇主題 :: 下一篇主題  
發表人 內容
zhengyao
對這略感興趣的新人


註冊時間: 2008-05-18
文章: 28

89.61 果凍幣

發表發表於: 2008-5-23, PM 4:41 星期五    文章主題: 想設計一款即時戰略遊戲... 引言回覆

貴站是我找到最專而且有規模的遊戲設計論壇,
所以來此請教一下,希望大家給點建議.

我有幾個想法是要在遊戲中實現的:
1.伺服器無人數上限.(要想辦法分流)
2.舉辦大會戰.(平時最多8人對戰,大會戰無上限)
3.部隊要有方向性.(我想加入陣型概念)

目前我是用openGL來繪2D略圖,(部隊用方形三角代替)
想要變3D再把部隊座標改繪成3D,然後變更視角方向,
等我做到一個段落再把程式貼上來.

以下是我之前對這個遊戲的一些想法:
1. 攻擊陣為長(正)方形,小兵為直角等腰三角形
2. 防禦陣為橢圓扇形,小兵為半圓形
3. 突擊陣為菱形,小兵為正三角形
4. 陣列面積為總士兵數,陣型越寬陣列越薄
5. 變陣能力和轉向能力列入計算
6. 正向,側向,背向,攻防列入計算
7. 兵力多時可組合為大陣
8. 分兵一次都分3000(大於6000才可分),不足300即潰散
9. 同兵種可合併,分遣隊12000即分兵4次後再合併
移動部分
1. 移動指令有移動,原地(轉向),橫向
2. 攻擊陣不能後退移動,只能轉向前進
3. 防禦陣不能前進移動,後方有敵強迫變為圓陣(不能移動)
4. 突擊陣不能橫向和後退移動
5. 移動路徑為直線或平拋物線(S型移動要分兩次)
6. 平拋物線曲率不能太大
7. 移動遇接戰時後續移動取消
大會戰部分
1. 組隊玩家可編入同一陣營
2. 會戰前30分鐘為領兵時間,可志願選擇前方據點(防守任務)
3. 兩方據點兵力相當時即可出戰(領兵時間不可進入對方據點地圖)
4. 領兵時間過後,兵力多方強迫編入對方達成平衡,由大本營出發
5. 平時優秀隊伍授予官階,不會編入對方陣營
6. 換地圖前顯示戰況,以免在地圖邊緣被伏擊
7. 被滅或交出指揮權後,可選擇繼續觀戰
8. 斷線的玩家由電腦控制回防大本營
程式設計
1. 單位目前資訊-->畫面顯示
2. 畫面指令操作-->單位目標資訊-->單位下一時間資訊計算-->循環
3. 遠端操控介面(最小傳輸量傳遞目前資訊和指令操作)
回頂端
檢視會員個人資料 發送私人訊息
zhengyao
對這略感興趣的新人


註冊時間: 2008-05-18
文章: 28

89.61 果凍幣

發表發表於: 2008-5-27, AM 10:18 星期二    文章主題: 引言回覆

目前在想如何在移動時快速的計算有無遭遇阻礙,
我可能會設一個地圖矩陣來紀錄那個矩型內已經有小兵了,
不知道有沒有其他更好的方法,請建議一下,謝謝!

以下為初步的隊形顯示程式,也請大家指教,讓程式更好:
代碼:

**************************************************************************
drawUnit.h
------------------------------------------------
void drawUnit(int);

**************************************************************************
drawUnit.c
------------------------------------------------
#include <GL/glut.h>              /* glut.h */
#include "drawUnit.h"

const GLfloat unitA[][2] = {{-0.026,0.00},{0.026,0.00},{0.00,0.026}};      //for GL_TRIANGLES

//for GL_TRIANGLE_FAN
//const GLfloat unitD[][2] = {{0.00,0.00},{-0.024,0.00},{-0.020785,0.012},{-0.012,0.020785},{0.00,0.024},{0.012,0.020785},{0.020785,0.012},{0.024,0.00}};
const GLfloat unitD[][2] = {{0.00,0.00},{-0.025,0.00},{-0.021651,0.0125},{-0.0125,0.021651},{0.00,0.025},{0.0125,0.021651},{0.021651,0.0125},{0.025,0.00}};

const GLfloat unitS[][2] = {{-0.02,0.00},{0.02,0.00},{0.00,0.034641}};   //for GL_TRIANGLES

void drawUnit(int rank) {
   switch (rank) {
   case 1:
      //glTranslatef(0, 0.002, 0);
      glBegin(GL_TRIANGLE_FAN);
          glVertex2fv(unitD[0]);
          glVertex2fv(unitD[1]);
          glVertex2fv(unitD[2]);
          glVertex2fv(unitD[3]);
          glVertex2fv(unitD[4]);
          glVertex2fv(unitD[5]);
          glVertex2fv(unitD[6]);
          glVertex2fv(unitD[7]);
      glEnd();
      break;
   case 2:
      //glTranslatef(0, -0.002, 0);
      glBegin(GL_TRIANGLES);
          glVertex2fv(unitS[0]);
          glVertex2fv(unitS[1]);
          glVertex2fv(unitS[2]);
      glEnd();
      break;
   default:
      glBegin(GL_TRIANGLES);
          glVertex2fv(unitA[0]);
          glVertex2fv(unitA[1]);
          glVertex2fv(unitA[2]);
      glEnd();
   }
}

*************************************************************************************
drawRank.h
-------------------------------------------------------
void drawRank(int , int , int , float , float , int , int );

**************************************************************************************
drawRank.c
--------------------------------------------------------
#include <GL/glut.h>              /* glut.h */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "drawUnit.h"
#include "drawRank.h"

//glTranslatef dy
const GLfloat unitAdy = 0;
const GLfloat unitDdy = 0.002;
const GLfloat unitSdy = -0.002;
const GLfloat rankAdx = 0.06;
const GLfloat rankDdx = 0.06;
const GLfloat rankSdx = 0.06;
const GLfloat rankAdy = 0.06;
const GLfloat rankDdy = 0.05;
const GLfloat rankSdy = 0.05;
const GLfloat rankDdDy = 0.003;   //rankD special dy
const GLfloat rankDdr = 0.9;

void drawCheck(int rank, int total, float x, float y, int width) {
   const GLfloat unitD[][2] = {{0.00,0.00},{-0.025,0.00},{-0.021651,0.0125},{-0.0125,0.021651},{0.00,0.025},{0.0125,0.021651},{0.021651,0.0125},{0.025,0.00}};

   glLoadIdentity();
   glTranslatef(x, y, 0);
   glScalef(13.0, 13.0, 13.0);
   glColor3ub(255,255,255);
      glBegin(GL_LINE_STRIP);
          glVertex2f(0,0);
          glVertex2fv(unitD[1]);
          glVertex2fv(unitD[2]);
          glVertex2fv(unitD[3]);
          glVertex2fv(unitD[4]);
          glVertex2fv(unitD[5]);
          glVertex2fv(unitD[6]);
          glVertex2fv(unitD[7]);
      glEnd();
   glFlush();
}

void rankLoadIdentity(float x, float y, int angle) {
   glLoadIdentity();
   glTranslatef(x, y, 0);
   glRotatef(angle, 0, 0, 1);
}

void drawRank(int team, int rank, int total, float x, float y, int angle, int width) {
   GLfloat dx, dy;
   int i, j, n, nX, nY, dDy=0, rem;

   rankLoadIdentity(x,y,angle);
   switch (team) {
   case 1:
      glColor3ub(255,0,0);
      break;
   default:
      glColor3ub(0,0,255);
   }

   n = (total - 1) / 100;
   if (rank == 2) {
      nX = sqrt(n) + 1;
      nY = nX;
   } else {
      nX = sqrt(n) + width + 1;
      if (nX > n + 1) {
         nX = n + 1;
      }
      if (nX > 22) {
         nX = 22;
      }
      nY = n / nX + 1;
   }

   rem = nX * nY - n - 1;
   //printf("%d %d %d %d\n",n,nX,nY,rem);
   for (j = 0; j < nY; j++) {
      switch (rank) {
      case 1:
         dy = (0.5 * (nY-1) * rankDdy) + unitDdy - (j * rankDdy) + ((nX-1)/2)*((nX-1)/2)*rankDdDy*0.5;
         break;
      case 2:
         dy = ((nY-1) * rankSdy) + unitSdy - (j * rankSdy);
         break;
      default:
         dy = (0.5 * (nY-1) * rankAdy) + unitAdy - (j * rankAdy);
      }
      if (j + 1 == nY) {
         nX = nX - rem;
      }
      for (i = 0; i < nX; i++) {
         glPushMatrix();
         switch (rank) {
         case 1:   //rankD
            dx = -(0.5 * (nX-1) * rankDdx) + (i * rankDdx);
            if (nX % 2 == 0 && i >= nX / 2) {
               dDy = ((nX-1)/2) - i + 1;
            } else {
               dDy = ((nX-1)/2) - i;
            }
            glTranslatef(dx, dy - (dDy * dDy * rankDdDy), 0);
            glRotatef(dDy * abs(dDy) * rankDdr, 0, 0, 1);
            drawUnit(rank);
            break;
         case 2:   //rankS
            if (i > j) {
               break;
            }
            nX = j + 1;
            dx = -(0.5 * (nX-1) * rankSdx) + (i * rankSdx);
            glTranslatef(dx, dy, 0);
            drawUnit(rank);
            if (j + 1 == nY || rem >= nX) {
               break;
            }
            if (rem != 0 && nX > rem) {
               rem = nX - rem;   //rem be nX temp here
               dx = -(0.5 * (rem-1) * rankSdx) + (i * rankSdx);
               if (j % 2 != 0) {
                  dx = dx - 0.5 * rankSdx;
               }
               rem = nX;   //rem=0 at next j
            }
            glTranslatef(0, -2 * dy, 0);
            drawUnit(rank);
            break;
         default:   //rankA
            dx = -(0.5 * (nX-1) * rankAdx) + (i * rankAdx);
            glTranslatef(dx, dy, 0);
            drawUnit(rank);
         }
         glPopMatrix();
      }
      if (rem > 0 && rank == 2) {
         rem = rem - nX;
      }
   }
   glFlush();
}

void display()
{
   glClear(GL_COLOR_BUFFER_BIT);
   //drawCheck(0,10000,0,0,0);   
   drawRank(0,0,10000,0,0,0,0);

   //drawCheck(0,10000,0.6,0,0);   
   //drawRank(1,2,10000,0.6,0,-45,0);

   //drawCheck(0,10000,-0.6,0,0);   
   //drawRank(1,1,10000,-0.6,0,45,0);
}

int main(int argc, char** argv)
{
   GLsizei wh = 600, ww = 800; // initial window size
   glutInit(&argc,argv);
   glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
   glutInitWindowSize(ww,wh);
   glutInitWindowPosition(0,0);
   glutCreateWindow("game");
   glutDisplayFunc(display);
   glutMainLoop();
   return 0;
}
回頂端
檢視會員個人資料 發送私人訊息
還是零分
散播福音的祭司


註冊時間: 2007-09-19
文章: 164

653.83 果凍幣

發表發表於: 2008-5-27, PM 9:46 星期二    文章主題: 引言回覆

是用glut啊
好久沒看到有人貼有關OpenGL的文章了
glut是你要用來打草稿的嗎?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
zhengyao
對這略感興趣的新人


註冊時間: 2008-05-18
文章: 28

89.61 果凍幣

發表發表於: 2008-5-28, AM 8:42 星期三    文章主題: 引言回覆

還是零分 寫到:
是用glut啊
好久沒看到有人貼有關OpenGL的文章了
glut是你要用來打草稿的嗎?

慚愧! 我只會這個!
我學的是比較偏工程圖學......
回頂端
檢視會員個人資料 發送私人訊息
還是零分
散播福音的祭司


註冊時間: 2007-09-19
文章: 164

653.83 果凍幣

發表發表於: 2008-5-29, PM 8:21 星期四    文章主題: 引言回覆

zhengyao 寫到:
還是零分 寫到:
是用glut啊
好久沒看到有人貼有關OpenGL的文章了
glut是你要用來打草稿的嗎?

慚愧! 我只會這個!
我學的是比較偏工程圖學......

哈哈 Very Happy
不會啦
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
shogun1234
稍嫌羞澀的路人


註冊時間: 2008-06-11
文章: 1

0.00 果凍幣

發表發表於: 2008-6-11, AM 5:46 星期三    文章主題: 引言回覆

請問一下, 撰寫陣型相關的 程式 通常會用到哪些algorithm (不含graphic, e.g. 3d) 會需要涉列哪些相關的知識 ?

謝謝
回頂端
檢視會員個人資料 發送私人訊息
zhengyao
對這略感興趣的新人


註冊時間: 2008-05-18
文章: 28

89.61 果凍幣

發表發表於: 2008-6-12, AM 8:59 星期四    文章主題: 引言回覆

shogun1234 寫到:
請問一下, 撰寫陣型相關的 程式 通常會用到哪些algorithm (不含graphic, e.g. 3d) 會需要涉列哪些相關的知識 ?

謝謝

我也是想說邊做,看看會不會遇上問題^^.
涉及陣型就表示隊伍有方向性囉.
也要跟從前4方格或6方格遊戲有所區別,
所以大概會把360度簡化成8個方位吧.
然後是曲線移動等等的問題,
目前我覺得數學要好才行......
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 哈啦交流園地 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作