Phiên bản đầu tiên, mong bà con đừng chê quá. Tạm thời phần xử lý tìm đường của máy còn chậm dưới mức cho phép đối với một game real-time. Bachi đang cải tiến vấn đề. Điều khiển : Mũi tên - di chuyển Ctrl - Chém (trong lúc giữ Ctrl, bấm các nút mũi tên để đổi hướng chém). Ý tưởng của bachi là pha trộn loạn xạ giữa Zelda, Diablo, và RPG cổ điển. Bachi xin cảm ơn các ý kiến bổ sung.
cho hỏi tí sư huynh, 1 event đang di chuyển, ví dụ là mon, nếu đụng phải mình thì xuất hiện 1 trận đánh,<--- làm seo vậy chỉ dùm thanks nhìu nhìu
tui thấy phiên bản của ông hay đấy chứ...ông ráng phát triển cho nó đỉnh luôn nhé...cái demo tui chơi có cảm giác giống warcraft...
TO Vo_Dich: Một nhân vật (player hoặc monster) có một biến xác nhận event. Bachi đặt là behavior. Sẽ có 2 function điều khiển hoạt động nhân vật. behavior gồm : BE_STAND, BE_MOVE (left, right, ...), BE_ATTACK, BE_DIE Function thứ nhất là Control_Character. Function này sẽ phân làm 2 phần đối với player và monster, và sẽ phân nữa trong trường hợp điều khiển NPC hoặc follower. Function này sẽ chuyển đổi giá trị behavior cho các nhân vật. Function thứ hai là Animate_Character. Function này chỉ có 1 phần. Nó sẽ kiểm tra giá trị của các trường hợp behavior để điều khiển nhân vật. Source của Control_Character: (Tất nhiên đố ai mà hiểu hết trong cái đám loạn xạ này, nhưng nắm ý chính của nó là được rồi). //test input to control player character void CCharacterManager::ControlPlayer() { if ((player->bDie) | (player->bAnimBehavior == ANI_DIE)) return; d = 0; if (iInput::GetKeyState(HGEK_UP)) d += 1; if (iInput::GetKeyState(HGEK_DOWN)) d += 18; if (iInput::GetKeyState(HGEK_RIGHT)) d += 9; if (iInput::GetKeyState(HGEK_LEFT)) d += 36; switch (d) { case 1: d = DIR_N; break; case 9: d = DIR_E; break; case 18: d = DIR_S; break; case 36: d = DIR_W; break; case 10: d = DIR_NE; break; case 27: d = DIR_SE; break; case 54: d = DIR_SW; break; case 37: d = DIR_NW; break; default: d = 255; break; } bool temp = true; if (iInput::GetKeyState(HGEK_CTRL)) { if ((d < 8) && (player->bAnimBehavior != ANI_ATTACK)) player->bCurrentDir = d; if ((player->bAnimBehavior == ANI_STAND) | ((player->bAnimBehavior == ANI_WALK) && (player->fDimX == player->fDestX) && (player->fDimY == player->fDestY))) { temp = false; player->SetBehavior(ANI_ATTACK); } } if (player->bAnimBehavior == ANI_ATTACK) temp = false; if (temp) { if (d < 8) { MovePlayer(d); } else { if ((player->bAnimBehavior != ANI_STAND) && (player->fDimX == player->fDestX) && (player->fDimY == player->fDestY)) { player->SetBehavior(ANI_STAND); } } } } //AI control monsters void CCharacterManager::ControlMonsters() { int i; BYTE b1, b2; FindWaypoint(monster[queue]); queue++; if (queue == iMonsterCount) queue = 0; for (i = 0; i < iMonsterCount; i++) { if ((!monster->bDie) && (monster->bAnimBehavior != ANI_DIE)) { b1 = b2 = 2; if (monster->iCellX < player->iCellX) b1 = 1; if (monster->iCellX > player->iCellX) b1 = 0; if (monster->iCellY < player->iCellY) b2 = 1; if (monster->iCellY > player->iCellY) b2 = 0; d = bDirConv[b1][b2]; if (d < 255) { x1 = monster->iCellX + iDirDX[d]; y1 = monster->iCellY + iDirDY[d]; if ((x1 >= 0) && (x1 < pTileMap->iMapWidth) && (y1 >= 0) && (y1 < pTileMap->iMapHeight)) { if ((!player->bDie) && (bOccupacy[x1][y1] == 1)) { //player in attack range if ((d < 8) && (monster->bAnimBehavior != ANI_ATTACK)) monster->bCurrentDir = d; if ((monster->bAnimBehavior == ANI_STAND) | ((monster->bAnimBehavior == ANI_WALK) && (monster->fDimX == monster->fDestX) && (monster->fDimY == monster->fDestY))) { monster->SetBehavior(ANI_ATTACK); return; } } } if (monster->pWaypoint->size) { b1 = b2 = 2; if (monster->iCellX < monster->pWaypoint->head->data->x) b1 = 1; if (monster[i]->iCellX > monster[i]->pWaypoint->head->data->x) b1 = 0; if (monster[i]->iCellY < monster[i]->pWaypoint->head->data->y) b2 = 1; if (monster[i]->iCellY > monster[i]->pWaypoint->head->data->y) b2 = 0; d = bDirConv[b1][b2]; monster[i]->pWaypoint->Delete(); MoveCharacter(monster[i], d, i + 2); } } } } } Source của animate: //Animate a character c void CCharacterManager::AnimateCharacter(CCharacter *c) { if (!c->bDie) { if (c->bAnimBehavior == ANI_WALK) { c->NextFrame(); if (c->fDimX < c->fDestX) { c->fDimX += c->fMoveRate; if (c->fDimX > c->fDestX) c->fDimX = c->fDestX; } else if (c->fDimX > c->fDestX) { c->fDimX -= c->fMoveRate; if (c->fDimX < c->fDestX) c->fDimX = c->fDestX; } if (c->fDimY < c->fDestY) { c->fDimY += c->fMoveRate; if (c->fDimY > c->fDestY) c->fDimY = c->fDestY; } else if (c->fDimY > c->fDestY) { c->fDimY -= c->fMoveRate; if (c->fDimY < c->fDestY) c->fDimY = c->fDestY; } } else if (c->bAnimBehavior == ANI_ATTACK) { if (!(c->iAnimFrame | c->iAnimCounter)) { iEffect::Play(c->cType->sound); } c->NextFrame(); if (!(c->iAnimFrame | c->iAnimCounter)) { c->SetBehavior(ANI_STAND); x1 = c->iCellX + iDirDX[c->bCurrentDir]; y1 = c->iCellY + iDirDY[c->bCurrentDir]; if ((x1 >= 0) && (x1 < pTileMap->iMapWidth) && (y1 >= 0) && (y1 < pTileMap->iMapHeight)) { if (c == player) { if (bOccupacy[x1][y1] > 1) { //hit a monster i = bOccupacy[x1][y1] - 2; if ((!monster[i]->bDie) && (monster[i]->bAnimBehavior != ANI_DIE)) { //test "real" position of the monster (because //when moving, the position of the monster is //set to an "unactual" one. x1 = (int) (monster[i]->fDimX / HALF_TILE_WIDTH) >> 1; y1 = (int) (monster[i]->fDimY / HALF_TILE_HEIGHT) >> 1; if ((x1 == monster[i]->iCellX) && (y1 == monster[i]->iCellY)) { monster[i]->iHitPoint -= player->cType->iDamage; //damage the monster if (monster[i]->iHitPoint <= 0) monster[i]->SetBehavior(ANI_DIE); } } } } else { if (bOccupacy[x1][y1] == 1) { //hit the player if ((!player->bDie) && (player->bAnimBehavior != ANI_DIE)) { //test "real" position of the player (because //when moving, the position of the player is //set to an "unactual" one. x1 = (int) (player->fDimX / HALF_TILE_WIDTH) >> 1; y1 = (int) (player->fDimY / HALF_TILE_HEIGHT) >> 1; if ((x1 == player->iCellX) && (y1 == player->iCellY)) { player->iHitPoint -= monster[i]->cType->iDamage; //damage the player if (player->iHitPoint <= 0) player->SetBehavior(ANI_DIE); } } } } } } } else if (c->bAnimBehavior == ANI_STAND) { c->NextFrame(); } else if (c->bAnimBehavior == ANI_DIE) { if (!(c->iAnimFrame | c->iAnimCounter)) iEffect::Play(c->cType->sound2); c->NextFrame(); if (c->iAnimFrame == c->cType->iFrameCount[ANI_DIE] - 1) { bOccupacy[c->iCellX][c->iCellY] = 0; c->bRenderPriority = RENDER_LOW; c->bDie = true; c->fDimX += iUtils::Rnd(-4, 4); c->fDimY += iUtils::Rnd(-4, 4); } } } }[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
TO buno: Cảm ơn sự ủng hộ. Bachi sẽ phát triển phần tìm đường của mấy thằng quái vật. Bachi đã nghĩ ra cách, nhưng cần thời gian. Hình ảnh rip từ RPG maker XP và Warcraft II. Demo thì rip vậy thôi chứ bản chính thức sẽ không.
ông lấy sprite từ free craft phải ko, cảm ơn đã share source, đâu như mấy người khác, cũng toàn kiếm thui chứ có tự viết đâu, kêu share 1 tí cũng ko, đến cái screenshoot battlesystem cũng ko cho xem, hic, hic, zubachi coi dùm tui cái nì, demo thui, coi thử battlesystem ổn chưa thanks. http://zeroonea.freestarthost.com/CBS.rar
không download được, chắc nhầm link hoặc die rồi. Bachi không biết nhiều về RGSS trong cái RPG maker XP. Nếu bạn hỏi về cái này là bachi chịu thua. Source của bachi là 100% tự chế, tự nghĩ. Không phải "hàng" copy. Tất nhiên vì code tự nghĩ ra nên có những chỗ "ngu" đột xuất, bachi đang cải thiện lại. Phần tìm đường đi là phần khó khăn nhất đối với thể loại game kiểu này. Vì là tìm đường realtime. Hiện tại bachi đang cố áp dụng thêm kỹ thuật Light-Of-Sight, nhưng gặp một số khó khăn do các đối tượng chạy nhảy nhiều quá (được cái này mất cái kia, chẳng biết làm thế nào :p , không khéo bỏ luôn cái vụ tìm đường thông minh). Nói thêm: Hình rip bằng Wardraft. Hiện tại Freecraft đang bị Blizzard kiện nên trang chính bị die. Bachi rất muốn xem qua mã nguồn của nó. Ai có hảo tâm xin cho bachi link.
:) Zubachi cũng hỗ trợ cho VM .Nên data của VM tui khổng thể tiếc lộ được .Đâu ông thông cảm , vì mai mốt còn đem đi đăng ký bản quyền mà... -Không không có chôm đào đâu đâu mà ông nói không tự viết ..... _Vô địch ...ông cho tui xin các Y!M cái , (PM nhắn tin á) Tui muốn mời ông vào VM.... :)
@ken10 tui dốt lắm, ko bít gì đâu đừng mời, với lại mới từ box muonline wa đây, đang hoàn thiện trang hack nên ko ở ko.
Chà! Đã ra được Demo rồi hả đại ca Zubachi! Công nhận là đại ca giỏi thiệt. Hình như có mỗi mình đại ca làm thì phải? Về test thôi!
Bachi không dùng RPG maker XP. Hiện tại đang bí ở chỗ dò đường đi đó. Bachi đang đọc thêm một số tài liệu, hy vọng sẽ giải quyết được vấn đề theo hướng tốt nhất. Chương trình được làm bằng Visual C++ 6.0, công cụ hỗ trợ (vẽ map) được làm bằng Visual Basic 6. Engine đồ họa và âm thanh là HGE (hge.relishgames.com). Hình ảnh mượn đỡ từ Warcraft 2 và RPG maker XP. Demo này chỉ làm ra cho vui chứ không phải đề án hiện tại của FaIRYTale. Hiện tại FaIRYTale đang thiết kế lại đề án đã lập (thiết kế là một quá trình khó, ngay như StarCraft cũng phải thiết kế đi thiết kế lại mấy lượt, cho vô sọt rác bao nhiêu cái demo mới ra cái StarCraft nổi tiếng ngày nay).
Đại ca Zubachi này , có phải đại ca vẽ map bằng cái map editor mà đại ca làm hồi trước ko ? Trông y hệt như rpg maker xp luôn ==> bái phục . Vậy đại ca có thể fix câu lệnh và chức năng của rpg maker xp ko ?
mới vọc cái RPGXP rùi làm ra cái nì, ai muốn thư gĩan down về chơi thử, nói trước có 1 bí mật nhỏ nhỏ, đảm bảo ko phí thời gian đâu, chơi thử rùi bít hi hi hi hi he he he he ke ke ke ke ac ac ac ac it it it it toi... rùi ai tìm ra được bí mật thì có thưởng, coi như là phần giải trí cho nhóm của mấy ông, ko cho chơi ăn gian nhé, à cảm ơn ông zubachi lắm lắm, cái link warcraft III viewer đó, hic, trước nay có bít có CT này đâu, ngồi chụp lại mấy ảnh trong war mệt wá chừng lun, cảm ơn nhìu nhé, với lại ông còn bít ct nào tương tự vậy nhưng xài cho Sc hay AoeII thì cho tui xin link lun nha
RPG maker XP, mặc dù có nhiều điểm bất cập đến dễ sùng, nhưng nó vẫn là một công cụ rất linh hoạt. Giống như Game Maker hay các công cụ khác (Torque 2D, v.v...), nó cung cấp một cái khung sườn (frame work), và người làm game chỉ việc script chức năng. Phần khung sườn của RPG maker XP không thể thay đổi được, nhưng phần chức năng thì có thể. Tất cả nằm trong script của nó. Phần event nằm trong class Game_Interpreter và Game_BattleInterpreter. Bachi đang có kế hoạch làm một RAD như thế, nhưng ở mức độ thấp hơn Thấp hơn không phải là kém hơn, mà là phần frame work sẽ được lập trình sẵn, còn phần engine thì người làm game tự lập trình lấy. Những phần khó khăn nhưng dùng đi dùng lại ở rất nhiều game như là hiển thị map, A* v.v... sẽ được lập trình sẵn trong một bộ library. Người lập trình chỉ việc tính đến game logic. Và tất nhiên, bachi sẽ có thiết kế sao cho frame work của cái RAD có thể adjust theo ý muốn của người lập trình, hay ít ra nó cũng đạt được sự linh động. Tất cả là một tương lai phía trước của FaIRYTale. Hiện tại bachi đang chuẩn bị lập trình một engine đồ họa của riêng mình để có được những chức năng cần thiết mà engine HGE chưa có sự đáp ứng.
@Vo Dich : demo game của ông cũng hay , nhưng hông có bán Mp và bình life bới dậy là chết lun .Mà mỗi lần danh ma` cho co' 8 EXP , đánh hard cho co 6 EXp (ác wá )....
không biết có nên post phần thưởng lên đây không ? Lần sau cố gắng kiếm cái phần thưởng nào hấp dẫn hơn nhé . Mà ông vodich học được đâu lời lẽ ngọt ngào quá chừng ?