Cómo dibujar "líneas temporales" en VC
que leas todo el código! De hecho, el programa que utilicé fue un programa de plantilla, un programa de plantilla diseñado específicamente para desarrollar videojuegos, animados... usando
. No lo entenderás, pero hay bastantes operaciones de dibujo GDI involucradas (aunque normalmente uso la tecnología DirectX).
Repito, no te dejé ver el código completo, pero te dejé ver:
Las variables globales y macros que declaré;
La función mypcluna_Init( ) , mypcluna_Main(), mypcluna_Shutdown()!!!!
Estas tres funciones contienen todas las ideas que podrías desear, así que si no quieres quedarte estancado con esas variables "extrañas", toma una mirada más cercana ¡Todas las variables globales que declaré
y algunas macros!
Especialmente mypcluna_Main(), es la "función principal del juego/animación", tal vez deberías recordarla, al menos es el núcleo del programa.
En realidad, podría haberte enviado el código fuente de las variables globales, macros y estas tres funciones, sin embargo, para permitirte obtener la mayor cantidad de información posible del programa, planeo utilizarlo; la pregunta anterior (¡por supuesto, esto no es para que me des 30 puntos extra!). Voy a escribir el código completo (tienes que entender, realmente no quiero hacer eso, ¡no soy un "chico de código abierto"!). ¡No soy un "entusiasta del código abierto"! Nuevamente: lo que debes hacer no es leer el código completo
, sino leer los puntos que mencioné anteriormente. No quiero que te rindas antes de leer la función mypcluna_Main().
Además, el algoritmo es realmente muy simple, pero se basa en el "Dibujo dinámico de círculos", lo cual no es muy útil cuando se trata de elipses o curvas más complejas (que es también la razón principal por la que Decidí abrir el código uno). Pero puedo ofrecerte una manera de aprenderlos: lee Computer Graphics, ¡tiene todo lo que necesitas! (¡¡Pero no son fáciles de dominar!!)
//Dibuja círculos dinámicamente, usando arcos blancos para representar el contorno del círculo y relleno rojo para representar el interior del círculo.
//El radio de "Draw" se muestra en azul (¡porque siempre se está moviendo, como si lo estuvieran dibujando!).
#define WIN32_LEAN_AND_MEAN
#include lt;windows.hgt;
#include lt;windowsx.hgt
#define WINDOW_CLASS_NAME; " WINCLASS1"
#define CIRCLE_CENTER_X 320
#define CIRCLE_CENTER_Y 240
#define Radio 100
HWND main_window_handle = NULL; p> p>
HINSTANCE hinstance_app = NULL
HDC hdc;
HPEN hpen
HBRUSH hbrush; pie_x, pie_y;
int pie_x1, pie_y1;
int círculo_arc;
LALLADA DE RESULTADO WindowProc(HWND hwnd,
mensaje UINT,
p>
WPARAM wparam,
LPARAM lparam)
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam){
PAINTSTRUCT ps
HDC hdc
switch(msg; )
{
caso WM_CREATE:
{
retorno(0);
} descanso; /p>
caso WM_PAINT:
{
hdc = BeginPaint(hwnd, amp; ps);
EndPaint(hwnd, amp; ps); ;
return(0);
} descanso
caso WM_DESTROY:
{
PostQuitMessage( 0);
retorno(0);
} descanso
valor predeterminado:
}
return ( DefWindowProc(hwnd, msg, wparam, lparam));
}
//////////////////// /////// ///////////////////////////////////
int mypcluna_Main(void *parms = NULL, int num_parms = 0)
{
DWORD start_time = GetTickCount();
// Dibuja el centro del círculo en (CIRCLE_CENTER_X, CIRCLE_CENTER_Y), el radio es el radio
hpen = CreatePen(PS_SOLID, 1, RGB (255, 255
, 255));
hdc=GetDC(main_window_handle);
SelectObject(hdc, hpen);
SelectObject(hdc, hbrush); >
Pie(hdc, CIRCLE_CENTER_X-Radius, CIRCLE_CENTER_Y-Radius,
CIRCLE_CENTER_X Radio, CIRCLE_CENTER_Y Radio,
CIRCLE_CENTER_X, CIRCLE_CENTER_Y-Radius,
pie_x1 , pie_y1);
if(hpen)
EliminarObjeto(hpen);
hpen=CreatePen(PS_SOLID, 3, RGB(0, 0, 255) );
SelectObject(hdc, hpen);
MoveToEx(hdc, CIRCLE_CENTER_X, CIRCLE_CENTER_Y, NULL);
LineTo(hdc, pie_x1, pie_y1) ;
cambiar(circle_arc)
{
caso 1:
pie_x1--;
pie_ y1 ;
if(pie_x1 == CIRCLE_CENTER_X-Radius)
circle_arc = 2;
ruptura;
caso 2:
pie_x1;
pie_y1;
if(pie_y1 == CIRCLE_CENTER_Y Radio)
círculo_arc = 3;
romper; /p>
caso 3:
pie_x1;
pie_y1--;
if(pie_x1 == CIRCLE_CENTER_X Radio)
círculo_arc = 4;
ruptura;
caso 4:
pie_x1--;
if(pie_y1 == CIRCLE_ CENTER_Y-Radius)
círculo_arc = 0;
ruptura
predeterminado:
ruptura;
}
ReleaseDC(main_window_handle, hdc);
mientras((start_time - GetTickCount() lt; 33)); >retorno(1);
}
////////////////////////////// /////////////////////////// //////
int mypcluna_Init(void *parms = NULL, int num_parms = 0)
{
hbrush = CreateSolidBrush(RGB(255,0,0));
p>
circle_arc = 1;
pie_x = CIRCLE_CENTER_X; pie_y = CIRCLE_CENTER_Y-Radius;
pie_x1 = pie_x-1; pie_y1 = pie_y 1;
return(1);
}
//////////////////////////// / ///////////////////////////////////
int mypcluna_Shutdown(void *parms = NULL, int num_parms = 0)
{
if(hbrush)
DeleteObject(hbrush);
if(hpen)
DeleteObject(hpen);
return(1);
}
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASSEX winclass
HWND hwnd;
mensaje MSG;
winclass.cbSize = sizeof(WNDCLASSEX
winclass.style = CS_DBLCLKS | > CS_HREDRAW | CS_VREDRAW;
winclass.lpszClassName = WINDOW_CLASS_NAME;
winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
hinstance_app=hinstance;
if (! RegisterClassEx(amp;winclass))
return(0);
if (!(hwnd = CreateWindowEx(NULL,
WINDOW_CLASS_NAME,
"mypcluna DEMO",
WS_OVERLAPPEDWINDOW,
0, 0,
640, 480,
NULL,
NULL,
hinstance,
NULL)))
return(0);
main_window_handle = hwnd;
mypcluna_ Init();
while(TRUE)
{
if (PeekMessage( amp; msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break
Traducir mensaje(amp;msg);
DispatchMessage(amp;msg);
}
mypcluna_Main()
}
mypcluna_ Shutdown();
return(msg.wParam);
}
////////////////////// / ////////////////////////////////////////
Nota:
Si desea hacer una demostración del programa y ver cómo funciona, cree un proyecto de aplicación Win32, agregue un archivo fuente C y pegue todo el código anterior
, pasará después de F7 , luego Ctrl F5 ¡Funcionará!
Además, para fines de demostración, en lugar de crear MFC, cree un proyecto de aplicación Win32 para poder obtener una demostración visual.