Miscellaneous functions
Miscellaneous functions.
- Enumerations and Structures
- VG_SETTINGS
- struct VG_RectCent
- Functions for angles and object moving
- vg4->misc->angle_from_xy
Return angle according to a given x-/y-direction. - vg4->misc->xy_from_angle
Return x-/y-direction (based on 1 pixel) of a given angle. - vg4->misc->sin
Return sinus-value from angle as integer multiplied with 10000. - vg4->misc->cos
Return cosinus-value from angle as integer multiplied with 10000. - vg4->misc->line_positions
Get positions when moving on a line. - vg4->misc->moving_one_step
Get positions when moving in x-/y-direction. - vg4->misc->move_and_check_collisions
Move an object-instance checking for collisions. - vg4->misc->rect2position
Set a centered position from a rectangle. - Background positioning
- vg4->misc->bgposition_init
Initialize. - vg4->misc->bgposition_getbg
Calculate position of background-image. - vg4->misc->bgposition_getobj
Return window-position of object's background-position. - Functions for strings
- vg4->misc->strcpy
Copy string into a buffer with a maximal size. - vg4->misc->strscpy
Copy string with a maximal size into a buffer with a maximal size. - vg4->misc->strccat
Concatenate all strings into a buffer with a maximal size. - Base64
- vg4->misc->base64_encode
Encode data into base64-data. - vg4->misc->base64_decode
Decode data from base64-data. - UTF-8
- vg4->misc->utf8_next
Find next UTF8-character in an UTF8-string. - vg4->misc->utf8_from_codepoint
Get UTF8-character from an Unicode-codepoint. - vg4->misc->utf8_tolower
Convert UTF8-character to lowercase. - vg4->misc->utf8_toupper
Convert UTF8-character to uppercase. - Settings
- vg4->misc->settings_load
Set settings from string. - vg4->misc->settings_save
Return actual settings as allocated string for saving to file. - Other functions
- vg4->misc->wait_time
Sleep the rest of a defined time. - vg4->misc->pause
Pause game (locally). - vg4->misc->colorbrightness
Change color brightness according to percent-value. - vg4->misc->fadeout
Fade out window. - vg4->misc->time_delta
Return the time-difference in milliseconds since last call. - vg4->misc->version
Return VgaGames4 version.
Example 

/* move a sunnyboy on a background greater than the window */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #include <vgagames4.h> /* keys */ struct { int k_quit; int k_left; int k_right; int k_forward; int k_backward; } kref; int main(int argc, char **argv) { const int sb_movefactor = 15; const int sb_turnfactor = 5; struct { /* sunnyboy's structure */ struct VG_Image *imgp; struct VG_RectCent rectc; int angle; } sb; struct VG_Image *bgimg; int bgwidth, bgheight; int do_move; (void)argc; (void)argv; /* initialize and open window */ if (!VG_init("test")) { exit(1); } if (!vg4->window->open(VG_WINDOW_SIZE_LOW, VG_WINDOW_SCALE_BEST)) { VG_dest(); exit(1); } /* set keys */ if ((kref.k_quit = vg4->input->key_insert("Quit", VG_FALSE, VG_FALSE)) == 0) { VG_dest(); exit(1); } vg4->input->key_setkbd(kref.k_quit, VG_INPUT_KBDCODE_Q); if ((kref.k_left = vg4->input->key_insert("Left", VG_FALSE, VG_FALSE)) == 0) { VG_dest(); exit(1); } vg4->input->key_setkbd(kref.k_left, VG_INPUT_KBDCODE_LCURS); if ((kref.k_right = vg4->input->key_insert("Right", VG_FALSE, VG_FALSE)) == 0) { VG_dest(); exit(1); } vg4->input->key_setkbd(kref.k_right, VG_INPUT_KBDCODE_RCURS); if ((kref.k_forward = vg4->input->key_insert("Forward", VG_FALSE, VG_FALSE)) == 0) { VG_dest(); exit(1); } vg4->input->key_setkbd(kref.k_forward, VG_INPUT_KBDCODE_UCURS); if ((kref.k_backward = vg4->input->key_insert("Backward", VG_FALSE, VG_FALSE)) == 0) { VG_dest(); exit(1); } vg4->input->key_setkbd(kref.k_backward, VG_INPUT_KBDCODE_DCURS); /* load background-image and get size */ bgimg = vg4->image->load("background.bmp"); if (bgimg == NULL) { VG_dest(); exit(1); } vg4->image->getsize(bgimg, NULL, &bgwidth, &bgheight); /* initialize background-positioning: velocity 2 pixels, centered rectangle 60% of the window */ vg4->misc->bgposition_init(bgwidth, bgheight, 2, 60); /* load sunnyboy and set its rectangle centered on the background */ sb.imgp = vg4->image->load("sunnyboy.bmp"); if (sb.imgp == NULL) { VG_dest(); exit(1); } vg4->image->getsize(sb.imgp, NULL, &sb.rectc.rect.w, &sb.rectc.rect.h); sb.rectc.rect.x = (bgwidth - sb.rectc.rect.w) / 2; sb.rectc.rect.y = (bgheight - sb.rectc.rect.h) / 2; sb.rectc.centx = sb.rectc.centy = 0; sb.angle = 0; /* game loop */ for (;;) { if (!vg4->input->update(VG_TRUE)) { break; } if (vg4->input->key_newpressed(kref.k_quit)) { break; } /* check for key-strokes */ do_move = 0; /* turn left */ if (vg4->input->key_pressed(kref.k_left)) { sb.angle -= sb_turnfactor; sb.angle %= 360; sb.angle += 360; sb.angle %= 360; } /* turn right */ if (vg4->input->key_pressed(kref.k_right)) { sb.angle += sb_turnfactor; sb.angle %= 360; sb.angle += 360; sb.angle %= 360; } /* go forward */ if (vg4->input->key_pressed(kref.k_forward)) { do_move++; } /* go backward */ if (vg4->input->key_pressed(kref.k_backward)) { do_move--; } /* move if requested */ if (do_move != 0) { int anz_rectcpos; struct VG_RectCent *rectc_pos; if (do_move > 0) { /* forward */ anz_rectcpos = vg4->misc->moving_one_step(&sb.rectc, sb.angle, sb_movefactor, &rectc_pos); } else { /* backward */ anz_rectcpos = vg4->misc->moving_one_step(&sb.rectc, sb.angle, -sb_movefactor, &rectc_pos); } /* we are only interested in the last position */ if (anz_rectcpos > 0) { sb.rectc = rectc_pos[anz_rectcpos - 1]; } if (rectc_pos != NULL) { free(rectc_pos); } /* check for boundaries */ if (sb.rectc.rect.x < 0) { sb.rectc.rect.x = 0; } if (sb.rectc.rect.x > bgwidth - sb.rectc.rect.w) { sb.rectc.rect.x = bgwidth - sb.rectc.rect.w; } if (sb.rectc.rect.y < 0) { sb.rectc.rect.y = 0; } if (sb.rectc.rect.y > bgheight - sb.rectc.rect.h) { sb.rectc.rect.y = bgheight - sb.rectc.rect.h; } } /* draw out */ vg4->window->clear(); /* draw background */ { struct VG_Position posi; /* get position of background according to sunnyboy */ vg4->misc->bgposition_getbg(&sb.rectc.rect, &posi, VG_FALSE); vg4->window->copy(bgimg, &posi, NULL); } /* draw sunnyboy */ { struct VG_ImagecopyAttr iattr; struct VG_Position posi; VG_IMAGECOPY_ATTR_DEFAULT(&iattr); iattr.image.rotate = sb.angle; /* set rotation */ /* get position from rectangle and correct it according to background-position */ vg4->misc->rect2position(&posi, &sb.rectc.rect); posi = vg4->misc->bgposition_getobj(posi); vg4->window->copy(sb.imgp, &posi, &iattr); } vg4->window->flush(); vg4->misc->wait_time(50); } /* destroy and exit */ VG_dest(); exit(0); }