Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ARKANOID - odbijanje

[es] :: Pascal / Delphi / Kylix :: ARKANOID - odbijanje

[ Pregleda: 4056 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon ARKANOID - odbijanje19.06.2003. u 16:46 - pre 233 meseci
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;
 
Odgovor na temu

Che-Lik
Milan Milosavljevic
Novi Sad, Kragujevac

Član broj: 11392
Poruke: 15
*.ptt.yu

Sajt: www.MilanChe.tk


Profil

icon Re: ARKANOID - odbijanje20.06.2003. u 03:31 - pre 233 meseci
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
__________________
Che-gevara
Che-mpres
Che-kic
Che-LIK
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: ARKANOID - odbijanje20.06.2003. u 21:55 - pre 233 meseci
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...
 
Odgovor na temu

Lale23
Milos Lazarevic
Nis

Član broj: 10921
Poruke: 4
*.bankerinter.net

ICQ: 145628651


Profil

icon Re: ARKANOID - odbijanje21.06.2003. u 00:23 - pre 233 meseci
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).
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: ARKANOID - odbijanje22.06.2003. u 01:03 - pre 233 meseci
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.
 
Odgovor na temu

Voodoo
Novi Beograd

Član broj: 3508
Poruke: 488
*.sr.gov.yu



+1 Profil

icon Re: ARKANOID - odbijanje28.06.2003. u 17:08 - pre 233 meseci
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);    
}
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: ARKANOID - odbijanje

[ Pregleda: 4056 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.