|
[ 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);
}
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|