Cơ bản về lập trình Game
Trong thời điểm hiện tại, có rất nhiều bạn trẻhướng sựquan tâm của mình vào thiết kếvà
lập trình game, phải công nhận một điều rằng chơi game đã là một sựhấp dẫn, nhưng chơi
game mình làm ra còn hấp dẫn hơn nhiều, cho dù đó là một trò chơi dở ẹc. Trên những diễn
đàn tin học trên Internet đầy rẫy những topic kiểu nhưlà “Lập trình game với.” hay là “Ai
chỉgiúp em lập trình game nhưthếnào”, tất cả đều là sựquan tâm đến mục đích “Làm thế
nào đểviết nên một game ?”. Những ý kiến xoay quanh vấn đềnày rất đa dạng, nói khó
cũng có mà nói dễcũng có. Với kinh nghiệm và trình độhiện tại, tôi công nhận một điều là
khó, nhưng không phải là quá khó nếu bạn biết đặt mục tiêu vừa tầm và tìm cách tiếp cận
nó. Nếu ai cũng hi vọng mình viết ra game tương đương với Quake hay là Warcraft – là sản
phẩm của cảmột tập thểchuyên nghiệp được xây dựng trong một thời gian dài - ngay lập
tức thì quá là viển vông, nhưng nếu bạn hạthấp mục tiêu xuống một chút nhưlà làm những
game đơn giản kiểu nhưbắn tăng hay Mario, IQ hoặc là những game cho trẻem trước thì
không quá khó nếu bạn biết lập trình. Cá nhân tôi dường như đã nhận thức được điều này
và đã có được một sốthành công nhỏtrong việc thiết kếvà lập trình game. Trong thời điểm
này tôi đang được nghỉôn thi và tôi quyết định dành một thời gian ngắn đểviết cuốn sách
này, trong cuốn sách này tôi trình bày một cách đầy đủquá trình tôi thiết kếvà viết mã cho
một game RTS đơn giản (được lược bỏkhá nhiều tính năng ví dụnhưchơi mạng) nhằm giúp
các bạn hiểu được phần nào quá trình “ziết game tại gia”. Hi vọng cuốn sách có thểgiúp các
bạn trong quá trình thiết kếvà viết game của chính mình. Chúc tất cảcác bạn thành công
trong dựán viết game của mình.
thể nâng cấp thành cho phép chọn loại quân có thể sinh. Bạn cần thêm một list các loại quân có thể sinh vào dữ liệu đặc tính của unit trong game, sau đó xây dựng hệ thống menu cho game để người chơi có thể lựa chọn những tính năng sinh quân này. Các tính năng như di chuyển, tấn công cũng cần được hiển thị rõ ràng hơn thông qua hệ thống menu. • Trong game chưa có khai thác tài nguyên, thêm công việc này sẽ khiến game có tính cạnh tranh hơn, mặc dù như vậy sẽ khó tính toán AI cho máy hơn và nhiều game hiện tại thường giảm nhẹ sự quan tâm đến vấn đề này (?). • Nâng cấp tính năng AI: Hiện tại game hoàn toàn chưa có AI, các đơn vị quân máy chỉ đơn giản là sinh quân ầm ầm rùi chạy toán loạn quanh bản đồ. Bạn nên xây dựng modun cho phép máy điều khiển quân tập trung lại rùi “lùng giết” quân của người chơi sẽ hiệu quả hơn. • Hoàn thiện tính năng âm thanh của game. Game cần xây dựng một modun quản lý âm thanh riêng, các thực thi âm thanh được gọi nên có các thông số đại loại như vị trí, kiểu âm thanh… nhằm xác định độ to nhỏ và loại bỏ bớt các âm thanh cùng loại được gọi liên tục, ví dụ như một đám tàu cùng bắn tên lửa chẳng hạn, modun này có thể chỉ phát 2/3 âm thanh bắn mà cũng đạt được hiệu quả tương đương. • ….Tiếp tục là tùy ý bạn….Hix, công việc vẫn còn rất nhìu ở phía trước hix hix… Dưới đây là screen shot từ một game RTS tôi đang phát triển: Simple ЯTS G∆me Dεsign & CΘding © CrazyBabe 2003. K-Outertainment™ Trang 60 Reference AvenusHelper • Định nghĩa kiểu: o TBitDepth: Kiểu độ sâu màu của màn hình. BD16Bit: Độ sâu màu 16bit. BD32Bit: Độ sâu màu 32bit. o TImageFormat: Kiểu format của ảnh. FormatR3G3B2: Ảnh 8bit (Red 3bit, Green 3bit, Blue 2bit). FormatX4R4G4B4: Ảnh 16bit (Mask 4bit, Red 4bit, Green 4bit, Blue 4bit). FormatA4R4G4B4: Ảnh 16bit (Alpha 4bit, Red 4bit, Green 4bit, Blue 4bit). FormatA8R3G3B2: Ảnh 16bit (Alpha 8bit, Red 3bit, Green 3bit, Blue 2bit). FormatR5G6B5: Ảnh 16bit (Red 5bit, Green 6bit, Blue 5bit). FormatX1R5G5B5: Ảnh 16bit (Mask 1bit, Red 5bit, Green 5bit, Blue 5bit). FormatA1R5G5B5:Ảnh 16bit (Alpha 1bit, Red 5bit, Green 5bit, Blue 5bit). FormatX8R8G8B8: Ảnh 32bit (Mask 8bit, Red 8bit, Green 8bit, Blue 8bit). FormatA8R8G8B8:Ảnh 32bit (Alpha 8bit, Red 8bit, Green 8bit, Blue 8bit). • Định nghĩa hằng: o EffectNone: Vẽ không hiệu ứng. o EffectAdd: Vẽ kiểu cộng. o EffectSrcAlpha: Vẽ theo kênh alpha của ảnh, chỉ áp dụng với những ảnh có kênh alpha. o EffectSrcAlphaAdd: Vẽ kiểu cộng theo kênh alpha của ảnh, chỉ áp dụng với những ảnh có kênh alpha. o EffectMul: Vẽ theo kiểu nhân. o EffectSrcColor: Vẽ sử dụng màu source như là kênh alpha. o EffectSrcColorAdd: Vẽ kiểu cộng, sử dụng màu source như là kênh alpha. o EffectInvSrcColor: Vẽ với giá trị màu nguồn đảo ngược. o EffectInvSrcAlpha: Vẽ với giá trị kênh alpha đảo ngược. Simple ЯTS G∆me Dεsign & CΘding © CrazyBabe 2003. K-Outertainment™ Trang 61 o EffectInvSrcMask: Vẽ với giá trị mask đảo ngược. o EffectBlend1, EffectBlend2, EffectBlend3, EffectBlend4: Các kiểu hiệu ứng blend ảnh đang thử nghiệm. o EffectShadow: Vẽ bóng. o EffectBlendColor: Vẽ blend với màu nguồn. o EffectBlendColorAlphaChannel: Vẽ blend sử dụng kênh alpha. o EffectAddDiffuse, EffectDiffuseAlpha: Vẽ khuếch tán với kênh alpha. o EffectMirror, EffectFlip: Vẽ lật hình, hiệu ứng này có thể kết hợp với các hiệu ứng ở trên. o Các hằng số Key_# là các hằng số định nghĩa số hiệu phím, bạn có thể dễ dàng đoán ra nó đại diện cho phím nào, tôi không chú thích ở đây do nó dài quá . • Các hàm, lệnh: o Hàm CreateWindow(Width,Height : Integer;Title : PChar) : Boolean Tạo một cửa sổ kích thước Width x Height có caption là Title. Hàm trả về true nếu tạo thành công, trả về false nếu không tạo được cửa sổ. o Hàm CreateFullScreen(Width,Height : Integer;ScreenDepth : TBitDepth;Title : PChar) : Boolean Khởi tạo chế độ màn hình Width x Height độ sâu màu là ScreenDepth có caption là Title. Hàm trả về true nếu khởi tạo thành công, trả về false nếu không khởi tạo được chế độ đó. o Lệnh DestroyScreen Huỷ cửa sổ/chế độ đã tạo trước đó, sau khi gọi lệnh này tất cả các hàm vẽ, lấy phím… đều sinh lỗi do chương trình đã huỷ handle quản lý tất cả các dịch vụ này. o Hàm EventMessage : Boolean Kiểm tra các events, trả về false nếu xuất hiện event Quit. o Lệnh LoadFont(FileName : String;SizeX,SizeY,Width,Height,TransColor : LongWord) Đọc font chữ từ file ảnh FileName o Lệnh TextOut(X,Y : Integer;Text : String;Color : LongWord) Viết xâu Text ra màn hình, ở toạ độ [X,Y], màu Color. o Lệnh TextOut(X,Y : Integer;Text : String;Color : LongWord;Effect : Integer) Viết xâu Text ra màn hình, ở toạ độ [X,Y], màu Color. Hiệu ứng Effect o Hàm CreateImage(SizeX,SizeY : Integer;Format : TImageFormat) : Integer Tạo một ảnh có kích thước SizeX x SizeY với format là Format. Số trả về là số hiệu của ảnh đã tạo. o Hàm LoadImage(FileName : String;Format : TImageFormat) : Integer Đọc ảnh từ FileName, ảnh đọc vào với format là Format. Hỗ trợ các định dạng ảnh JPEG, PNG, BMP. Số trả về là số hiệu của ảnh đã đọc. o Hàm SetAlphaMask(ImageNum,TransparentColor : Integer) : Integer Đặt kênh Alpha cho tất cả các điểm ảnh có màu Transparent. Chỉ hỗ trợ format ảnh FormatA1R5G5B5. o Hàm GetImageWidth(ImageNum : Integer) : Integer Lấy độ rộng của ảnh số hiệu ImageNum. o Hàm GetImageHeight(ImageNum : Integer) : Integer Lấy độ cao của ảnh số hiệu ImageNum. o Hàm ImageLock(ImageNum : Integer) : Integer Simple ЯTS G∆me Dεsign & CΘding © CrazyBabe 2003. K-Outertainment™ Trang 62 Lock ảnh số hiệu ImageNum. o Hàm ImageUnLock(ImageNum : Integer) : Integer UnLock ảnh số hiệu ImageNum. o Lệnh ImageClear(ImageNum : Integer;Color : Cardinal) Xoá ảnh ImageNum bằng màu Color. o Lệnh ImagePutPixel(ImageNum,X,Y : Integer;Color : Cardinal) Vẽ điểm ảnh màu Color ở toạ độ [X,Y] trong ảnh ImageNum. o Hàm ImageGetPixel(ImageNum,X,Y : Integer) : Cardinal Lấy màu điểm ảnh Color ở toạ độ [X,Y] trong ảnh ImageNum. o Lệnh ImageLine(ImageNum,X1,Y1,X2,Y2 : Integer;Color : Cardinal) Vẽ đường thẳng màu Color từ [X1,Y1] đến [X2,Y2] trong ảnh ImageNum. o Lệnh ImageRect(ImageNum,X1,Y1,X2,Y2 : Integer;Color : Cardinal) Vẽ hình chữ nhật màu Color từ [X1,Y1] đến [X2,Y2] trong ảnh ImageNum. o Lệnh ImageFillRect(ImageNum,X1,Y1,X2,Y2 : Integer;Color : Cardinal) Tô hình chữ nhật màu Color từ [X1,Y1] đến [X2,Y2] trong ảnh ImageNum. o Lệnh BeginRender Bắt đầu vẽ scene mới (xoá buffer, xoá render buffer). o Lệnh EndRender Kết thúc vẽ scene. o Lệnh ClearScreen(Color : Cardinal) Xoá màn hình bằng màu Color. o Hàm RenderBuffer : Integer Dựng toàn bộ hình trong render buffer. o Lệnh SetClipRect(X1,Y1,X2,Y2 : Integer) Đặt clip rect. o Lệnh Rect(X1,Y1,X2,Y2 : Integer;Color : Cardinal;Effect : Integer) Vẽ hình chữ nhật. o Lệnh Bar(X1,Y1,X2,Y2 : Integer;Color : Cardinal;Effect : Integer) Tô hình chữ nhật. o Lệnh Line(X1,Y1,X2,Y2 : Integer;Color : Cardinal;Effect : Integer) Vẽ đường thẳng. o Lệnh SmoothLine(X1,Y1,X2,Y2 : Integer;Color : Cardinal) Vẽ đường thẳng smooth (mịn). o Hàm ImageRenderEffect(XPos,YPos,Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern ở vị trí [XPos, YPos] với hiệu ứng Effect. o Hàm ImageRenderEffect(X1,Y1,X2,Y2,Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern thành hình chữ nhật [X1,Y1,X2,Y2] với hiệu ứng Effect. o Hàm ImageRenderEffect(XPos,YPos,Scale,Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern ở vị trí [XPos, YPos] với hiệu ứng Effect. Tỉ lệ zoom là Scale/256. o Hàm ImageRenderEffectColor(XPos,YPos : Integer;Color : Cardinal;Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern ở vị trí [XPos, YPos] với hiệu ứng Effect. Màu áp là Color. o Hàm ImageRenderEffectColor(X1,Y1,X2,Y2 : Integer;Color : Cardinal;Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern thành hình chữ nhật [X1,Y1,X2,Y2] với hiệu ứng Effect. Màu áp là Color. Simple ЯTS G∆me Dεsign & CΘding © CrazyBabe 2003. K-Outertainment™ Trang 63 o Hàm ImageRenderEffectColor(XPos,YPos : Integer;C1,C2,C3,C4 : LongWord;Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern ở vị trí [XPos, YPos] với hiệu ứng Effect. Màu áp ở bốn góc lần lượt là C1, C2, C3, C4. o Hàm ImageRenderEffectColor(XPos,YPos,Scale : Integer;Color : Cardinal;Pattern,Effect : Integer) : Boolean Dựng ảnh Pattern ở vị trí [XPos, YPos] với hiệu ứng Effect. Tỉ lệ zoom là Scale/256. Màu áp là Color. o Lệnh GetInputStatus Cập nhật input (Trạng thái mouse, keyboard…) o Hàm KeyDown(Key : Byte) : Boolean Kiểm tra phím Key có bị nhấn hay không ? o Hàm KeyPress(Key : Byte) : Boolean Kiểm tra phím Key có bị gõ hay không ? o Hàm MouseFirstClickL : Boolean Click chuột trái ? o Hàm MouseFirstClickR : Boolean Click chuột phải ? o Hàm MouseFirstClickM : Boolean Click chuột giữa ? o Hàm MouseReleasedL : Boolean Thả chuột trái ? o Hàm MouseReleasedR : Boolean Thả chuột phải ? o Hàm MouseReleasedM : Boolean Thả chuột giữa ? o Hàm MouseHoldL : Boolean Nhấn chuột trái ? o Hàm MouseHoldR : Boolean Nhấn chuột phải ? o Hàm MouseHoldM : Boolean Nhấn chuột giữa ? o Hàm MouseX : Integer Toạ độ X của chuột. o Hàm MouseY : Integer Toạ độ Y của chuột. o Hàm CreateSound(FileName : String;Loop : Boolean) : Integer Tạo handle cho sound FileName. Trả về handle quản lý sound này. o Lệnh SoundPlay(Slot : Integer) Chơi sound số hiệu slot. o Lệnh SoundPause(Slot : Integer) Tạm dừng sound số hiệu slot. o Lệnh SoundStop(Slot : Integer) Dừng sound số hiệu slot. o Lệnh SoundSetVolume(Slot : Integer;Value : Byte) Đặt cường độ âm thanh cho Slot. o Hàm SoundGetVolume(Slot : Integer) : Byte Lấy cường độ âm thanh của Slot.
File đính kèm:
- Cơ bản về lập trình Game.pdf