發新話題

[問題] 看不出來BUG在哪裡,尋求幫助...

看不出來BUG在哪裡,尋求幫助...

我在程式中有怪物monster&玩家player&子彈bullet,這三個重要角色,BUG是我明明設定好bullet[].shift(0.-10);但子彈射出後,卻無法移動,停留在player當時位置。
麻煩各位前輩為我解惑,謝謝您!

原始碼:
ME1.h檔

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

const int radius = 50;//radius圓的大小

class Unit{
        public:
         float x,y;
         int hp;

         void draw(HDC hdc){
                Ellipse(hdc,x-radius,y-radius,x+radius,y+radius);
                char buf[256];
                sprintf(buf,"HP:%d/100",hp);
                TextOut(hdc, x, y, buf, strlen(buf));
         }
         void shift(float dx,float dy){
                x+=dx;
                y+=dy;
         }
         void move(Unit& target){
                float L=sqrt(pow((x-target.x),2)+
                            pow((y-target.y),2));//距離
                float m=1;//步伐
                if(m<L){
                        x+=((target.x-x)*m/L);
                        y+=((target.y-y)*m/L);
                }
                if(m>=L){
                        x=target.x;
                        y=target.y;
                }
         }
         bool TouchAttack(Unit& target){//偵測玩家是否被怪獸碰到;偵測子彈是否碰到怪獸
                float L=sqrt(pow((x-target.x),2)+
                            pow((y-target.y),2));//距離
                float m=1;//步伐
                if(L<=2*radius)
                        return true;
                else
                        return false;
         }
};

Unit player;

const int MonsterLimit=10;//怪物數量上限
Unit monster[MonsterLimit];
int MonsterNum=0;                  //目前怪物數量

const int BulletInit=100;//初始彈藥量
Unit bullet[BulletInit];
int BulletID=0;                         //子彈編號


void gameInit(){
        player.x=500;
        player.y=250;
        player.hp=100000;
}

void gameWork(){
        //控制玩家
        if(GetAsyncKeyState(VK_RIGHT)<0){
                player.shift(10,0);
        }
        if(GetAsyncKeyState(VK_LEFT)<0){
                player.shift(-10,0);
        }
        if(GetAsyncKeyState(VK_UP)<0){
                player.shift(0,-10);
        }
        if(GetAsyncKeyState(VK_DOWN)<0){
                player.shift(0,10);
        }
        //攻擊鍵設定
        if(GetAsyncKeyState('Z')<0){
                bullet[BulletID].x=player.x;
                bullet[BulletID].y=player.y;
                BulletID++;
        }
        //子彈移動設定
        for(int i=0; i<BulletID; i++){
                bullet[BulletID].shift(0,-50);
        //        if(bullet[BulletID].TouchAttack)

        }
       
       
        //生產怪獸
        if(GetAsyncKeyState(VK_F1)<0 && MonsterNum<MonsterLimit){
                monster[MonsterNum].x=rand()%500;
                monster[MonsterNum].y=rand()%500;
                monster[MonsterNum].hp=100;
                MonsterNum++;
        }
        //設定怪獸
        if(player.hp>0){
                for(int i=0;i<MonsterNum;i++){
                        monster.move(player);
                        if(monster.TouchAttack(player))
                                player.hp--;
                }
        }

}

void gameDraw(HDC hdc){
        if(player.hp>0)
                player.draw(hdc);

        for(int i=0; i<MonsterNum; i++){
                if(monster.hp>0)
                        monster.draw(hdc);
        }
        for(int i=0; i<BulletID; i++){
                bullet.draw(hdc);
        }
}


---------------------------------------------------------------------------------------------------------------------------------------------------------------------


ME.cpp
// ME.cpp : Defines the entry point for the application.
//

#include "stdafx.h"
#include "ME.h"
#include "ME1.h"

#define MAX_LOADSTRING 100

// Global Variables:
HINSTANCE hInst;                                                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                                        // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                        // the main window class name

// Forward declarations of functions included in this code module:
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK        About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
        UNREFERENCED_PARAMETER(hPrevInstance);
        UNREFERENCED_PARAMETER(lpCmdLine);

        // TODO: Place code here.
        MSG msg;
        HACCEL hAccelTable;

        // Initialize global strings
        LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
        LoadString(hInstance, IDC_ME, szWindowClass, MAX_LOADSTRING);
        MyRegisterClass(hInstance);

        // Perform application initialization:
        if (!InitInstance (hInstance, nCmdShow))
        {
                return FALSE;
        }

        hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ME));

        // Main message loop:
        while (GetMessage(&msg, NULL, 0, 0))
        {
                if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
        }

        return (int) msg.wParam;
}



//
//  FUNCTION: MyRegisterClass()
//
//  PURPOSE: Registers the window class.
//
//  COMMENTS:
//
//    This function and its usage are only necessary if you want this code
//    to be compatible with Win32 systems prior to the 'RegisterClassEx'
//    function that was added to Windows 95. It is important to call this function
//    so that the application will get 'well formed' small icons associated
//    with it.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);

        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ME));
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName        = MAKEINTRESOURCE(IDC_ME);
        wcex.lpszClassName        = szWindowClass;
        wcex.hIconSm                = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

        return RegisterClassEx(&wcex);
}

//
//   FUNCTION: InitInstance(HINSTANCE, int)
//
//   PURPOSE: Saves instance handle and creates main window
//
//   COMMENTS:
//
//        In this function, we save the instance handle in a global variable and
//        create and display the main program window.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   hInst = hInstance; // Store instance handle in our global variable

   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
      CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

   if (!hWnd)
   {
      return FALSE;
   }

   gameWork;
   SetTimer(hWnd,100,1000/30,NULL);

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   return TRUE;
}

//
//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_COMMAND        - process the application menu
//  WM_PAINT        - Paint the main window
//  WM_DESTROY        - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        int wmId, wmEvent;
        PAINTSTRUCT ps;
        HDC hdc;

        switch (message)
        {
        case WM_COMMAND:
                wmId    = LOWORD(wParam);
                wmEvent = HIWORD(wParam);
                // Parse the menu selections:
                switch (wmId)
                {
                case IDM_ABOUT:
                        DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                        break;
                case IDM_EXIT:
                        DestroyWindow(hWnd);
                        break;
                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
                }
                break;
        case WM_TIMER:
                gameWork();
                InvalidateRect(hWnd, NULL, TRUE);
                break;
        case WM_PAINT:
                hdc = BeginPaint(hWnd, &ps);
                // TODO: Add any drawing code here...
                gameDraw(hdc);
                EndPaint(hWnd, &ps);
                break;
        case WM_DESTROY:
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
}

// Message handler for about box.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
                return (INT_PTR)TRUE;

        case WM_COMMAND:
                if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
                {
                        EndDialog(hDlg, LOWORD(wParam));
                        return (INT_PTR)TRUE;
                }
                break;
        }
        return (INT_PTR)FALSE;
}

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。