[ reiser @ 19.06.2003. 16:46 ] @
Evo, skoro sam zavrsio Arkanoid - pisem ga u pascalu, ali mi odbijanje loptice od plocica (ne od odbijaca ) predstavlja problem. Evo kako su definisane promenljive :

Ball.SirinaN := 8 (** Oznacava koliko ima plocica po X osi, i ne menja se tokom igre**)
Ball.VisinaN := 10 (** ------------ || ------------ Y osi, takodje se ne menja tokom igre**)


Ball.XMove se menja, zavisi pod kojim se uglom odbije od odbijaca, i nikada ne prelazi 6, odnosno -6, oznacava jedinicu kretanja lopte po X osi.
Ball.YMove se takodje menja, i nikada ne prelazi 3, odnosno -3, oznacava jedinicu kretanja lopte po Y osi.

Ball.Radius := 3 (** Poluprecnik lopte, ne menja se tokom igre **)

E sad, kako da napravim odbijanje ???

Otprilike, treba ovako :
Code:

Procedure BallBrickReflect;
 Begin
  For C1 := 1 to Ball.SirinaN Do Begin
   For C2 := 1 to Ball.VisinaN Do Begin
    (** Sad ovde treba da se ispita da li ce se lopta odbiti od zida **)
   End;
  End;
 End;
[ Che-Lik @ 20.06.2003. 03:31 ] @
Pravo da ti kazem, vrlo rado bih ti pomogao nego si mi nesto mnogo nerazumljivo definisao pitanje... ?

Ajde ti to malo pojasni pa se cujemo....

Pozdrav


Che
[ reiser @ 20.06.2003. 21:55 ] @
Kako su promenljive definisane, to je valjda jasno - Ball.Radius, Ball.XMove, Ball.YMove ?
E sad, kako da napravim odbijanje loptice od plocica - potprogram treba da ispita da li se koordinata loptice nalazi dovoljno blizu neke plocice da bi se odbila, to mi predstavlja problem...
[ Lale23 @ 21.06.2003. 00:23 ] @
Imas srece bas sam skoro (prosle godine) pravio arkanoid takodje u pascal-u tako da se secam necega. Ja sam cinimi se to resio ovako. Plocice su definisane u matrici, imam funkciju koja za svako polje umatrici vraca koordinate gornjeg levog temena (ostala su odredjena zbog fiksne duzine), a imam i funkciju koja za koordinatu vraca polje u matrici koje predstavlja plocicu. Tako da ako je to polje npr. 0 onda neradim nista jer jer kao tu nema plocia, a ako je 1 ili neki drugi broj(ako hoces da plocice budu razlicite boje) proveris gde se nalazi udarna tacka( da li sa strane ili odozgo/odozdo i napravis odbijanje kao od zida).

Valjda si shvatio, mozda ima i malo bolji nacim ali ja se licno nisam zamarao time(ipak sam radio u 1. srednje).
[ reiser @ 22.06.2003. 01:03 ] @
Znam ja to, vec sam tako probao, hoce da se odbija, ali ne tako dobro - recimo, loptica ide levo i udara sa desne strane na granici izmedju dve plocice i umesto da promeni kretanje po x osi ( Ball.XMove := -Ball.XMove), ona promeni kretanje po y osi.
Evo tog potprograma :
Code:

Procedure BallBrickReflect;
 Begin
  For C1 := 1 to Brk.SirinaN Do Begin
   For C2 := 1 to Brk.VisinaN Do Begin
    If Brk.Block[C1, C2] = FALSE Then Begin

    If (Ball.X > Brk.X + C1 * Brk.X1 - Ball.Radius - Abs(Ball.XMove)) and
       (Ball.X < Brk.X + (C1 + 1) * Brk.X1 + Ball.Radius + Abs(Ball.XMove))
      Then
     If ((Ball.Y > Brk.Y + C2 * Brk.Y1 - Ball.Radius - Abs(Ball.YMove)) and
        (Ball.Y < Brk.Y + C2 * Brk.Y1) and (Ball.YMove > 0)) or
        ((Ball.Y < Brk.Y + (C2 + 1) * Brk.Y1 + Ball.Radius + Abs(Ball.YMove))
    and (Ball.Y > Brk.Y + (C2 + 1) * Brk.Y1) and (Ball.YMove < 0)) Then Begin
      Ball.YMove := -Ball.YMove;
      Brk.Block[C1, C2] := TRUE;
      BrickDelete;
     End;

    If (Ball.Y > Brk.Y + C2 * Brk.Y1 - Ball.Radius) and
       (Ball.Y < Brk.Y + (C2 + 1) * Brk.Y1 + Ball.Radius)
      Then
     If ((Ball.X > Brk.X + C1 * Brk.X1 - Ball.Radius - Abs(Ball.XMove)) and
        (Ball.X < Brk.X + C1 * Brk.X1) and (Ball.XMove > 0)) or
        ((Ball.X < Brk.X + (C1 + 1) * Brk.X1 + Ball.Radius + Abs(Ball.XMove))
    and (Ball.X > Brk.X + (C1 + 1) * Brk.X1) and (Ball.XMove < 0)) Then Begin
      Ball.XMove := -Ball.XMove;
      Brk.Block[C1, C2] := TRUE;
      BrickDelete;
     End;
    End;
   End;
  End;
 End;

Prouci malo ovaj kod, pa vidi sta ne valja, ili kazi neki drugi nacin da ovo napisem.

P.S. - Ja imam 13 godina, 7 sam razred osnovne.
[ Voodoo @ 28.06.2003. 17:08 ] @
dechache, evo ti moja verzija, dodushe pisana u c-u za windows, pa ti prouchavaj...

Code:

#include <windows.h>

#define TIMER  1000

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

// Global variables

long x1 = 50;
long x2 = 50;
long Ballx = 50;
long Bally = 50;
BOOL movingright = TRUE;
BOOL movingdown = TRUE;
HPEN hBlackPen;
HPEN hWhitePen;
HBRUSH hBlackBrush;
HBRUSH hWhiteBrush;
HDC hGlobalDC;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    HWND hWnd;
    MSG msg;
    WNDCLASS wcl;
    
    // Register window class
    
    wcl.style = 0;
    wcl.lpfnWndProc = WndProc;
    wcl.cbClsExtra = 0;
    wcl.cbWndExtra = 0;
    wcl.hInstance = hInstance;
    wcl.hIcon = LoadIcon(NULL, IDI_WINLOGO);
    wcl.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcl.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wcl.lpszMenuName = NULL;
    wcl.lpszClassName = "WinPongClass";
    RegisterClass(&wcl);
    
    // Create window
    
    hWnd = CreateWindow("WinPongClass", "WinPong", WS_VISIBLE | WS_POPUPWINDOW | WS_CAPTION,
        (GetSystemMetrics(SM_CXFULLSCREEN) - 500) / 2, (GetSystemMetrics(SM_CYFULLSCREEN) - 400) / 2,
        500, 400, NULL, NULL, hInstance, NULL);
    
    // Get window's device context
        
    hGlobalDC = GetDC(hWnd);
    
    // Create drawing pens and brushes
        
    hBlackPen = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));
    hWhitePen = CreatePen(PS_SOLID, 0, RGB(255, 255, 255));
    hBlackBrush = (HBRUSH)GetStockObject(BLACK_BRUSH);
    hWhiteBrush = (HBRUSH)GetStockObject(WHITE_BRUSH);

    // Draw playing blocks
    
    SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
    SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
    RoundRect(hGlobalDC, x1, 10, x1 + 50, 24, 10, 10);
    RoundRect(hGlobalDC, x2, 350, x1 + 50, 364, 10, 10);
    
    // Create timer
    
    SetTimer(hWnd, TIMER, 40, NULL);
    
    // Message loop
        
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    return 0;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
{
    switch (message)
    {
        // Process timer and move the ball
        
        case WM_TIMER:
            SelectObject(hGlobalDC, (HGDIOBJ)hBlackPen);
            SelectObject(hGlobalDC, (HGDIOBJ)hBlackBrush);
            Ellipse(hGlobalDC, Ballx, Bally, Ballx + 15, Bally + 15);
            if (Ballx > 470) movingright = FALSE;
            if (Ballx < 10) movingright = TRUE;
            if (Bally < 30)
            {
                if ((Ballx > x1 - 5) && (Ballx < x1 + 55)) movingdown = TRUE; else SendMessage(hwnd, WM_CLOSE, 0, 0);
            }
            if (Bally > 320)
            {
                if ((Ballx > x2 - 5) && (Ballx < x2 + 55)) movingdown = FALSE; else SendMessage(hwnd, WM_CLOSE, 0, 0);
            }
            if (movingright == TRUE) Ballx += 6; else Ballx -= 6;
            if (movingdown == TRUE) Bally += 6; else Bally -= 6;
            SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
            SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
            Ellipse(hGlobalDC, Ballx, Bally, Ballx + 15, Bally + 15);
            break;
            
        // Process keyboard and move playing blocks
            
        case WM_CHAR:
            if ((TCHAR)wparam == 'a')
            {
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackPen);
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackBrush);
                RoundRect(hGlobalDC, x1, 10, x1 + 50, 24, 10, 10);
                x1 -= 10;
                SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
                SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
                RoundRect(hGlobalDC, x1, 10, x1 + 50, 24, 10, 10);
            }
            if ((TCHAR)wparam == 's')
            {
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackPen);
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackBrush);
                RoundRect(hGlobalDC, x1, 10, x1 + 50, 24, 10, 10);
                x1 += 10;
                SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
                SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
                RoundRect(hGlobalDC, x1, 10, x1 + 50, 24, 10, 10);
            }
            if ((TCHAR)wparam == '1')
            {
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackPen);
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackBrush);
                RoundRect(hGlobalDC, x2, 350, x2 + 50, 364, 10, 10);
                x2 -= 10;
                SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
                SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
                RoundRect(hGlobalDC, x2, 350, x2 + 50, 364, 10, 10);
            }
            if ((TCHAR)wparam == '2')
            {
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackPen);
                SelectObject(hGlobalDC, (HGDIOBJ)hBlackBrush);
                RoundRect(hGlobalDC, x2, 350, x2 + 50, 364, 10, 10);
                x2 += 10;
                SelectObject(hGlobalDC, (HGDIOBJ)hWhitePen);
                SelectObject(hGlobalDC, (HGDIOBJ)hWhiteBrush);
                RoundRect(hGlobalDC, x2, 350, x2 + 50, 364, 10, 10);
            }
            break;
            
        // Process the close signal
        
        case WM_CLOSE:
            DeleteObject((HGDIOBJ)hBlackPen);
            DeleteObject((HGDIOBJ)hWhitePen);
            DeleteObject((HGDIOBJ)hBlackBrush);
            DeleteObject((HGDIOBJ)hWhiteBrush);
            KillTimer(hwnd, TIMER);
            MessageBox(hwnd, "See ya...", "WinPong", MB_OK);
            DestroyWindow(hwnd);
            PostQuitMessage(0);
    }
    return DefWindowProc(hwnd, message, wparam, lparam);    
}