παπι Δημοσ. 4 Οκτωβρίου 2011 Δημοσ. 4 Οκτωβρίου 2011 Να τον ποστάρω χύμα τον κώδικα χωρίς σχόλια; (φοβάμαι μην χάσετε την μπάλα). Θα δω κατι χειροτερο απο αυτο http://trac.assembla.com/jump-in-the-world-free/browser/trunk/Server/java/l2/jw/gameserver?rev=195 ; Αν οχι, ανεβασε το
migf1 Δημοσ. 4 Οκτωβρίου 2011 Μέλος Δημοσ. 4 Οκτωβρίου 2011 Θα δω κατι χειροτερο απο αυτο http://trac.assembla.com/jump-in-the-world-free/browser/trunk/Server/java/l2/jw/gameserver?rev=195 ; Αν οχι, ανεβασε το Τα δικά μου είναι πολύ πιο χύμα ρε συ, δεν είχα σκοπό να τα ανεβάσω ακόμα. Τέσπα, θα βάλω μερικά σχόλια σε κάθε συνάρτηση και θα τα ανεβάσω σε ένα rar... θα βάλω κι ένα make για command-line compilation κι ένα project-file για Pelles-C. Για άλλους compilers, το μόνο που θα χρειαστεί θα είναι απλά να προστεθούν τα 4 .c και το 1.h αρχείο χειροκίνητα σε ένα νέο project ( δεν χρησιμοποιώ VS όπως ίσως γνωρίζεις).
migf1 Δημοσ. 7 Οκτωβρίου 2011 Μέλος Δημοσ. 7 Οκτωβρίου 2011 Μετά από ένα break 1 ημέρας, έγραψα σήμερα μερικά σχόλια, έγραψα κι ένα σύντομο readme file (και τα 2 είναι στα Αγγλικά) κι επισύναψα τον μέχρι στιγμής κώδικα στον 1ο ποστ αυτού του νήματος, για όποιον θέλει να τον δει. Έχει υλοποιημένα τα 3 σκαναρίσματα του δοκιμαστικού σταδίου (Trial Mode). Το παιχνίδι αρχικοποιείται στην συνάρτηση: game_init() στο αρχείο: main.c, ενώ το AI καλείται στη συνάρτηση: player_play_cpu(), επίσης στο αρχείο: main.c. Οι συναρτήσεις του AI είναι συγκεντρωμένες στο αρχείο: ai.c, ενώ όλοι οι τύποι δεδομένων, σταθερές, κλπ είναι στο αρχείο: main.h Αγνοήστε οτιδήποτε έχει να κάνει με Sink Mode (κυρίως στο main.h)... δεν το έχω υλοπιήσει. Λέτε να το γυρίσουμε σε Open Source προτζεκτάκι του insomnia τελικά; Πλάκα, πλάκα, αν θέλει κανείς να φτιάξει γραφικό UI, by all means FEEL FREE! Κι αν θέλει κανείς να προσθέσει και το Sink Mode, ακόμα καλύτερα! Διαβάστε το readme.txt που έχω βάλει στο zip αρχείο κι ότι απορίες/παρατηρήσεις έχετε, shoot me άφοβα Περισσότερο το έγραψα για να μην αναγκαστώ να απαντάω συνέχεια στα ίδια πράγματα
παπι Δημοσ. 7 Οκτωβρίου 2011 Δημοσ. 7 Οκτωβρίου 2011 Το ανέκδοτο περί open, ε; :lol: Ειναι η πρωτη φορα που κατεβαζω κατι απο αυτο εδω το section και αυτο δουλευει
GKNSB Δημοσ. 7 Οκτωβρίου 2011 Δημοσ. 7 Οκτωβρίου 2011 Ψηθείτε πάντα ήθελα να δοκιμάσω κλήσεις C από Java(gui) να δω τι θα βγει
migf1 Δημοσ. 9 Οκτωβρίου 2011 Μέλος Δημοσ. 9 Οκτωβρίου 2011 Ψηθείτε πάντα ήθελα να δοκιμάσω κλήσεις C από Java(gui) να δω τι θα βγει Μάλλον βαρέθηκαν να διαβάσουν τόσο κώδικα
παπι Δημοσ. 10 Οκτωβρίου 2011 Δημοσ. 10 Οκτωβρίου 2011 Μάλλον βαρέθηκαν να διαβάσουν τόσο κώδικα Σε παρακαλω... Σε φτιαχνω gui
παπι Δημοσ. 10 Οκτωβρίου 2011 Δημοσ. 10 Οκτωβρίου 2011 Θα ειναι καπως ετσι ΥΓ Δε θελω σχολια για τα καραβακια Μεχρι τωρα εχω κανει τα παρακατω > #include <Windows.h> #include <tchar.h> typedef struct { int matX,matY; int *matrix; HBITMAP hShips; }GRID_INFO; typedef struct { HBITMAP hShip; }CONTAINER_INFO; struct { BOOL isInDND; HBITMAP hBitmap; POINT p; }DndState; #define WM_GRID_EX (WM_USER + 1) #define GRID_RESIZEMATRIX 1 //LPARAM HIWORD x LOWORD y #define GRID_GETMATRIX 2 //LPARAM not used //Grid command notify #define GRID_CLICK 1 // WPARAM LOWORD grid id HIWORD event LPARAM HIWORD x LOWORD y #define Grid_ResizeMatrix(hGrid,x,y) SendMessage(hGrid,WM_GRID_EX,GRID_RESIZEMATRIX,MAKELPARAM(x,y)) #define Grid_GetMatrixPtr(hGrid) (int*)SendMessage(hGrid,WM_GRID_EX,GRID_GETMATRIX,0) #define IDC_GRIDPALYER 101 #define IDC_GRIDCOMPUTER 102 #define IDC_SHIPCONTAINER 103 #define MAT_V (1<<31) #define MAT_H (1<<30) #define MAT_BEGIN (1<<29) #define MAT_END (1<<28) #define MAT_CUR (1<<27) #define Matrix_GetShipType(p) LOWORD(p) PCTSTR szClsMain = _T("clsMain"); PCTSTR szClsGrid = _T("clsGrid"); PCTSTR szClsShipContainer = _T("clsShipContainer"); HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); HRESULT CALLBACK _GridProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam); BOOL RegisterClasses(HINSTANCE hInst); //DND void DNDInit(); void DNDEnter(); void DNDLeave(); void DNDUpdatePos(POINT p); void DNDDraw(HDC hdc); //event handlers void Grid_Clicked(HWND hGrid, int x, int y); int WINAPI _tWinMain(HINSTANCE hInst,HINSTANCE hPrev,PTSTR szCmdLine,int nShow) { MSG msg; HWND hWndMain; if(!RegisterClasses(hInst)) return 1; hWndMain = CreateWindowEx(WS_EX_COMPOSITED,szClsMain,_T("Title"),WS_OVERLAPPEDWINDOW,100,100,1000,600,NULL,NULL,hInst,NULL); ShowWindow(hWndMain,nShow); while(GetMessage(&msg,NULL,0,0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } HRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { POINT p; PAINTSTRUCT ps; HDC hdc; switch(msg) { case WM_MOUSEMOVE: break; case WM_CREATE: CreateWindowEx(WS_EX_COMPOSITED,szClsGrid,NULL,WS_VISIBLE | WS_CHILD,20,130,400,400,hWnd,(HMENU)IDC_GRIDPALYER,NULL,NULL); CreateWindowEx(WS_EX_COMPOSITED,szClsGrid,NULL,WS_VISIBLE | WS_CHILD,480,130,400,400,hWnd,(HMENU)IDC_GRIDCOMPUTER,NULL,NULL); Grid_ResizeMatrix(GetDlgItem(hWnd,IDC_GRIDPALYER),8,8); Grid_ResizeMatrix(GetDlgItem(hWnd,IDC_GRIDCOMPUTER),8,8); break; case WM_CLOSE: PostQuitMessage(0); case WM_COMMAND: switch(LOWORD(wParam)) { case IDC_GRIDPALYER: switch(HIWORD(wParam)) { case GRID_CLICK: Grid_Clicked(GetDlgItem(hWnd,LOWORD(wParam)),HIWORD(lParam),LOWORD(lParam)); break; } default: return DefWindowProc(hWnd,msg,wParam,lParam); } break; case WM_MBUTTONDOWN: { GetCursorPos(&p); }break; case WM_PAINT: hdc = BeginPaint(hWnd,&ps); EndPaint(hWnd,&ps); break; default: return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } HRESULT CALLBACK _GridProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) { GRID_INFO *pInfo; PAINTSTRUCT ps; HDC hdc,hdcMem; HGDIOBJ hOld; int i,j; RECT rect; POINT p; static HMENU hPopup; switch(msg) { case WM_RBUTTONDOWN: GetCursorPos(&p); GetClientRect(hWnd,&rect); pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA); switch(TrackPopupMenu(hPopup,TPM_RETURNCMD,p.x,p.y,0,hWnd,NULL)) { case 1: //test j = HIWORD(lParam) / ((rect.bottom - rect.top) / pInfo->matY); i = LOWORD(lParam) / ((rect.right - rect.left) /pInfo->matX ); pInfo->matrix[j * pInfo->matY + i + 0] = 1 | MAT_V | MAT_BEGIN; pInfo->matrix[j * pInfo->matY + i + 1] = 1 | MAT_V | MAT_CUR; pInfo->matrix[j * pInfo->matY + i + 2] = 1 | MAT_V | MAT_CUR; pInfo->matrix[j * pInfo->matY + i + 3] = 1 | MAT_V | MAT_CUR; pInfo->matrix[j * pInfo->matY + i + 4] = 1 | MAT_V | MAT_END; break; default: break; } InvalidateRect(hWnd,NULL,TRUE); break; case WM_LBUTTONDOWN: GetClientRect(hWnd,&rect); pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA); SendMessage(GetParent(hWnd),WM_COMMAND,MAKEWPARAM((WPARAM)GetMenu(hWnd),GRID_CLICK), MAKELPARAM ( HIWORD(lParam) / ((rect.bottom - rect.top) / pInfo->matY) , LOWORD(lParam) / ((rect.right - rect.left) /pInfo->matX ) ) ); break; case WM_GRID_EX: switch(wParam) { case GRID_RESIZEMATRIX: pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA); pInfo->matX = HIWORD(lParam); pInfo->matY = LOWORD(lParam); if(pInfo->matrix) free(pInfo->matrix); pInfo->matrix = (int*) malloc(sizeof(int) * pInfo->matX * pInfo->matY); ZeroMemory(pInfo->matrix,sizeof(int) * pInfo->matX * pInfo->matY); RedrawWindow(hWnd,NULL,NULL,RDW_UPDATENOW); break; case GRID_GETMATRIX: pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA); return (HRESULT)pInfo->matrix; default: return 0; } break; case WM_CREATE: pInfo = (GRID_INFO*) malloc(sizeof(GRID_INFO)); if(!pInfo) return -1; ZeroMemory(pInfo,sizeof(GRID_INFO)); pInfo->hShips = LoadImage(NULL,_T("ships.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE); SetWindowLongPtr(hWnd,GWLP_USERDATA,(LONG)pInfo); Grid_ResizeMatrix(hWnd,10,10); //defualt hPopup = CreatePopupMenu(); AppendMenu(hPopup,MF_STRING,1,_T("Add ship Buldoza")); AppendMenu(hPopup,MF_STRING,2,_T("Add ship AirForce!!")); break; case WM_PAINT: //draw grid hdc = BeginPaint(hWnd,&ps); pInfo = (GRID_INFO*) GetWindowLongPtr(hWnd,GWLP_USERDATA); GetClientRect(hWnd,&rect); for(i = 0; i <= (rect.right - rect.left-1); i += (rect.right - rect.left-1) / pInfo->matX) { for(j = 0; j <= (rect.bottom - rect.top) ; j += (rect.bottom - rect.top-1) / pInfo->matY) { MoveToEx(hdc,i ,0,NULL); LineTo(hdc,i,j); MoveToEx(hdc,0,j,NULL); LineTo(hdc,i,j); } } hdcMem = CreateCompatibleDC(hdc); hOld = SelectObject(hdcMem,pInfo->hShips); for(i = 0; i < pInfo->matX ; i++) { for(j = 0; j < pInfo->matY; j++) { if(pInfo->matrix[i* pInfo->matY + j]) { if(pInfo->matrix[i* pInfo->matY + j] & MAT_BEGIN) { BitBlt(hdc, j * ((rect.right - rect.left) / pInfo->matX), i * ((rect.bottom - rect.top) / pInfo->matY), 50,50, hdcMem, 0,0, SRCCOPY); } else if(pInfo->matrix[i* pInfo->matY + j] & MAT_CUR) { BitBlt(hdc, j * ((rect.right - rect.left) / pInfo->matX), i * ((rect.bottom - rect.top) / pInfo->matY), 50,50, hdcMem, 50,0, SRCCOPY); } else if(pInfo->matrix[i* pInfo->matY + j] & MAT_END) { BitBlt(hdc, j * ((rect.right - rect.left) / pInfo->matX), i * ((rect.bottom - rect.top) / pInfo->matY), 50,50, hdcMem, 100,0, SRCCOPY); } } } } SelectObject(hdc,hOld); DeleteDC(hdcMem); EndPaint(hWnd,&ps); break; case WM_DESTROY: pInfo = (GRID_INFO*)GetWindowLongPtr(hWnd,GWLP_USERDATA); free(pInfo->matrix); free(pInfo); DestroyMenu(hPopup); break; default: return DefWindowProc(hWnd,msg,wParam,lParam); } return 0; } BOOL RegisterClasses(HINSTANCE hInst) { WNDCLASSEX wcGrid,wcMain; ZeroMemory(&wcGrid,sizeof(wcGrid)); ZeroMemory(&wcMain,sizeof(wcMain)); wcGrid.cbSize = sizeof(wcGrid); wcGrid.style = CS_SAVEBITS; wcGrid.hCursor = LoadCursor(NULL,IDC_HAND); wcGrid.lpfnWndProc = _GridProc; wcGrid.lpszClassName = szClsGrid; wcGrid.hInstance = hInst; wcMain.cbSize = sizeof(wcMain); wcMain.hCursor = LoadCursor(NULL,IDC_ARROW); wcMain.hInstance = hInst; wcMain.lpfnWndProc = WndProc; wcMain.lpszClassName = szClsMain; wcMain.style = (CS_HREDRAW | CS_VREDRAW); wcMain.hbrBackground = (HBRUSH) (COLOR_WINDOW); return ( RegisterClassEx(&wcMain) && RegisterClassEx(&wcGrid) ); } void Grid_Clicked(HWND hGrid,int x,int y) { wchar_t buf[200]; wsprintf(buf,L"X:%d Y:%d",x,y); MessageBox(0,buf,L"Clicked",0); } το ships.bmp
migf1 Δημοσ. 10 Οκτωβρίου 2011 Μέλος Δημοσ. 10 Οκτωβρίου 2011 Σούπερ To .bmp είναι το μόνο εύκολο, απλά κάνε αν θες τον κώδικα να χρησιμοποιεί διαφορετικό bmp για κάθε ξεχωριστό τύπο καραβιού, ώστε να έχουμε την ελευθερία να βάλουμε διαφορετική εικόνα για κάθε καράβι, προσθέτοντας ένα σχετικό πεδίο στο struct ShipType (όταν καταλήξεις, πες μου σε τι διαστάσεις θες τα bmp και θα στα φτιάξω εγώ). Μπορούμε επίσης να αφήσουμε επιλογή στον παίκτη να διαλέγει αν θα τρέχει με GUI (αν είναι σε Windows) ή σε text-mode (αν είναι σε άλλη πλατφόρμα)... εκτός αν φτιάξει κάποιος μελλοντικά και 3ο front-end για άλλη πλατφόρμα (ή κάποιο cross-platform, π.χ. GTK+) και να επιλέγει αυτόματα το πρόγραμμα ποιο θα χρησιμοποιήσεις (ή να ρωτάει τον χρήστη). Καλή φάση πάει αν γίνει πάντως ΥΓ, Το Sink Mode βαριέμαι να το φτιάξω .. θα κάνω break μερικές μέρες να μου ξανα-ερθει η όρεξη και να το φτιάξω (αν δεν με προλάβει κανείς άλλος).
migf1 Δημοσ. 10 Οκτωβρίου 2011 Μέλος Δημοσ. 10 Οκτωβρίου 2011 Για τις εικόνες, κρατήστε αυτό εδώ το link: http://www.the-bluep...ueprints/ships/ ship_healthy_images.zip Υποθέτοντας από το sample bmp που ποστάρισε ο παπι πως το κάθε τετράγωνο είναι 50px, έφτιαξα εικόνες και για τους 4 τύπους πλοίων, όταν είναι σε healthy κατάσταση και τα επισυνάπτω ζιπαρισμένα (είναι σε .png μορφή, με ενεργοποιημένη τη διαφάνεια... transparency). Θα φαίνονται κάπως έτσι... Για τα βομβαρδισμένα μέρη, να φτιάξω ξεχωριστές εικόνες για κάθε μέρος, ή θα έχουμε μια μόνο εικόνα βομβαδρισμένης περιοχής που θα την κάνουμε blend στο εκάστοτε κελί; Για να ξέρω τι να φτιάξω αν είναι.
migf1 Δημοσ. 11 Οκτωβρίου 2011 Μέλος Δημοσ. 11 Οκτωβρίου 2011 Λοιπόν έφτιαξα απλά textures για το graphical front-end θεωρώντας πως το κάθε κελί είναι 50px X 50 px (συμπεριλαμβανομένου του περιγράμματος). Δεν ξέρω αν οι διαστάσεις είναι οι σωστές, αν όχι μου λέτε (με κόκκινο τα βυθισμένα πλοία). battle-images.zip
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα