顯示具有 BCB遊戲 標籤的文章。 顯示所有文章
顯示具有 BCB遊戲 標籤的文章。 顯示所有文章

2011年11月19日 星期六

地圖簡介

地圖畫面是2D遊戲中重要的一環,大致上分成兩種,一種是像貼瓷磚一樣的平面格子狀的,如勇者鬥惡龍,另一種是捲軸式的像清明上河圖的整張式的,如橫向或縱向射擊類遊戲,當然還有後續演變出來的所謂45度斜角(2﹒5D)地圖,最重要的是它們都離不開「迴圈」和「陣列」。

首先,先說拼接式的地圖,在學迴圈時應該都做過一個題目,利用迴圈輸出等腰三角形圖案,搭配上二維陣列就可做出地圖,首先看一下成品圖。



在開始之前我們要先準備圖檔,才能有東西顯示在地圖上,只是練習所以只做了兩個,草地跟沙漠。
 
草地  沙漠

大小為32X32的尺寸,接著就是開啟BCB寫程式吧。

程式碼:
物件  Name  屬性
Panel1 Panel1
Image1 Image1 高跟寬自己算吧,看你要放多少個地形再乘32。

Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
#include 
#include 
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPanel *Panel1;
TImage *Image1;
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall drawbmp(); //drawbmp()函式
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

Unit1.cpp
//---------------------------------------------------------------------------
#include 
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int cs=32,row=11,col=15;
//設定地圖變數,cs=32 為圖像的大小32x32,row=11 為地圖為11 行,col=15 為15 列
int map[11][15] = { //設定地圖陣列,1 為沙漠地形,0 為草地地形
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,1,1,0,1},
{1,0,1,0,0,0,1,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,1,0,0,0,1,0,0,0,1},
{1,0,1,1,1,1,1,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,1,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,1,0,0,0,1,0,0,0,1},
{1,0,1,0,0,0,1,0,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Panel1->DoubleBuffered=true; //設定雙倍緩衝,不會有閃爍
drawbmp(); //呼叫drawbmp()函式
}
//---------------------------------------------------------------------------
//drawbmp()函式
void __fastcall TForm1::drawbmp()
{
//此段可另寫一個loadbmp()函式
Graphics::TBitmap *map1; //利用Graphics 類別的TBitmap 方法設定map1 指標
map1 = new Graphics::TBitmap(); //產生map1 物件
map1->LoadFromFile("1.bmp"); //將1.bmp 載入到map1 物件的記憶體當中
Graphics::TBitmap *map2;
map2 = new Graphics::TBitmap();
map2->LoadFromFile("2.bmp");
for(int i=0;iCanvas->Draw(j*cs,i*cs,map1); //在Image1 的相對位置畫出map1 的圖形
break;
}
case 1: //當陣列內容為1 時
{
Image1->Canvas->Draw(j*cs,i*cs,map2);
break;
}
}
}
delete map1,map2; //釋放記憶體中map1 及map2 的內容
}
//---------------------------------------------------------------------------

2011年9月17日 星期六

小遊戲


最近試著寫一款RPG的小遊戲,完成度還不是很高,戰鬥部分約70%吧,Miss,爆擊部分以及掉落道具還沒寫,使用者介面也還沒做,下次說說玩法吧。

2011年9月3日 星期六

BCB小瑪俐設計(二)

繼續上次的程式,再來就是寫下注的部分,利用滑鼠Click事件來增加金額,中獎金額的計算,就是下注金額乘於倍率,比大小的部分,用亂數取1到13之間,7的話就再取一次,最後就把中獎金額加到總金額就完成了。

2011年8月27日 星期六

2.5D RPG地圖


提到2D的地圖,當然也要說說2.5D的地圖,原理上是一樣的,用二維陣列搭配巢狀迴圈,只是,座標位置做點改變。

2011年8月20日 星期六

2D RPG地圖


早期RPG遊戲地圖最常見的,就是這種拼接式的地圖,利用二維陣列來呈現地圖,像貼瓷磚一樣來鋪地圖,下次有時間再說吧。

2011年8月13日 星期六

數值計算

 新天上碑數值計算[VB]
 暗黑破壞神2
網頁遊戲-戰國IXA

從以前就喜歡寫一些數值計算的模擬器,玩過許多可以自行配點的網路遊戲,都會記下配點後變動的數值,之後寫個小程式,模擬一下配點,看看職業的公平性設計如何,其實Excel就可以輕鬆達到目的,上週提到最近在玩日本的網頁遊戲,當然也寫了一個計算攻擊力的程式囉,其實不用麻煩,遊戲中指定攻擊的地點之後,會告訴你總攻擊力及距離,只是用來練習寫BCB程式的。

2011年7月15日 星期五

BCB小瑪俐設計(一)

BCB小瑪俐設計(一)

  由於自己本身也還是學生,因此,難免有些狂言謬論,如果有錯誤之處,還請多多指教,或者,你有些想法也可以提出討論。

  個人習慣在寫程式之前,會先想一下遊戲的雛型,比如說遊戲的畫面、規則等等…,這樣才好規劃流程圖,在做流程圖同時順便設計一下公式,接著就開始蒐集資料、參考的圖片,畫些遊戲圖片、使用者介面圖形,再來就開始寫程式,測試,除錯,繼續迴圈,直到完成為止。

  以小瑪俐來說,依面板上的水果圖案數量取亂數,比如說有14個,那就設定取亂數1~14,再來就是利用switch來移動LED燈,透過設定物件的Left、Top值來達成目的,使用計時器控制移動的速度。


程式碼:
bw為LED燈物件
//---------------------------------------------------------------------------



#include

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//全域變數(num中獎的號碼),(pos代表LED燈位置),(sel控制移動速度)

int num,pos = 1,sel;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

        : TForm(Owner)

{

}

//---------------------------------------------------------------------------

//點擊開始按鈕

void __fastcall TForm1::bGoClick(TObject *Sender)

{

  srand((unsigned)time(NULL)); //取得系統時間作為亂數種子

  Timer1->Enabled = true; //開啟計時器1

  Timer1->Interval = 100; //設定計時器執行時間

  num=rand()%14; //取亂數

  num += 56; //將取得的亂數加56,可多繞4圈

  sel = num;

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)

{

  sel--;

  if(sel<6) //判斷sel小於6增加計時器執行時間為500(0.5秒執行一次)

    Timer1->Interval = 500;

  if(sel<3) //判斷sel小於3增加計時器執行時間為1000(1秒執行一次)

    Timer1->Interval = 1000;

  if(sel==0) //判斷sel等於0關閉計時器

  {

    Timer1->Enabled = false;

  }



  pos++; //移動位置加1,等於15(即繞完一圈)回到1

  if(pos==15)

    pos=1;



  switch(pos) //依照pos移動到指定的位置

  {

    case 1:

      bw->Left = 64;

      bw->Top = 16;

      break;

    case 2:

      bw->Left = 112;

      bw->Top = 16;

      break;

    case 3:

      bw->Left = 160;

      bw->Top = 16;

      break;

    case 4:

      bw->Left = 208;

      bw->Top = 16;

      break;

    case 5:

      bw->Left = 208;

      bw->Top = 64;

      break;

    case 6:

      bw->Left = 208;

      bw->Top = 112;

      break;

    case 7:

      bw->Left = 208;

      bw->Top = 160;

      break;

    case 8:

      bw->Left = 160;

      bw->Top = 160;

      break;

    case 9:

      bw->Left = 112;

      bw->Top = 160;

      break;

    case 10:

      bw->Left = 64;

      bw->Top = 160;

      break;

    case 11:

      bw->Left = 16;

      bw->Top = 160;

      break;

    case 12:

      bw->Left = 16;

      bw->Top = 112;

      break;

    case 13:

      bw->Left = 16;

      bw->Top = 64;

      break;

    case 14:

      bw->Left = 16;

      bw->Top = 16;

      break;

  }
}

2011年7月9日 星期六

BCB 小瑪俐






同樣是升大二那年暑假寫的,沒有設定機率,也就是說隨機中獎的,Bar絕對有機會中,全部下注1也不會輸光,除非愛比大小。

最近在學Unity,方便是方便,但是,自帶的函數還真是多,光是GUI就有的玩了,以自訂遊戲介面部分來說啦,不過設定好之後就比較輕鬆了,直接呼叫就好了。

2011年5月14日 星期六

隨機亂數Random


random()函數對遊戲來說,也是很重要的,同樣在眾多的程式語言中也都有。那在遊戲中有什麼功用,其實並不是一般網遊中說的衝裝,或掉寶機率,那樣的網遊對台灣人不屈不撓的打寶精神來說,那遊戲中的神裝就人手一件了,而是可以用在不重要,比較需要隨性的地方,比如遊戲中隨意走動的NPC,用亂數產生1-4的數字,NPC依照數字往指定方向移動。

2011年5月7日 星期六

鍵盤輸入


玩家要控制遊戲中的角色,一般都是使用鍵盤或滑鼠,所以,要讓程式知道當玩家使用者按下鍵盤上的某某鍵,程式應該要做什麼動作,這時就需要知道按鍵所對應的ASCII碼,通常都會搭配switch敘述來使用,當然,如果要用if來做判斷也是可以啦,因此,這部分也是要做遊戲必須學會的。

2011年4月30日 星期六

計時器 Timer


在許多的遊戲中,不可或缺的就是計時器Timer,可以用來控制物件的移動,或是關卡的時間限制,至於Time()這個函式,我就不多說了,不管哪種程式語言,一定有相關的函式,所以,要寫遊戲,一定要會的,趕快拿出程式語言書籍溫習一下吧。

2011年4月16日 星期六

BCB寫的第一個遊戲




這是大一下學期教C語言後,趁著暑假寫的BCB第一個遊戲,降落傘(Parachute)。

Game&Watch掌上型電動玩具,在我小學期間可是校外教學的必備品,當時還沒有什麼GameBoy,GBA,PSP,NDS這些東西。有機會再說說超級笨土法煉鋼的程式寫法吧。