Final Project
What is Allegro?
- Allegro = Allegro Low-Level GameRoutines
- Created in
Written in C and supporting several platform, like windows, macos, linux-like platform and so on.
- booltype
- A kind of data type in lots of programminglanguages
- Like c++, java and so
- It can only be assigned by twovalues:
- 0 – means
- 1 – means
- You can just assign true or false to a bool variable. (e.g. bool a =true;)
- Allegro implements a bool data type in
- A kind of data type in lots of programminglanguages
- In this section, we will learn how to program our firstallegro program.
- For each allegro with display, we need to initial allegro, initial display, set and show the display, and finally, destroy allthings have been initialized or
C++ Allegro代写
- Let’s doit!!
- Initialallegro
- Step 1:#include<allegro5/allegro.h>
- Step 2:
- It’s necessary to call the initialization function before doing anythingelse with the
- After you callingal_init():
- Great!!! The allegro is initialized. Now you can use any function youwant in <allegro5/allegro.h>.
- Initialdisplay
- Step 1: Declare a pointer fordisplay:
- ALLEGRO_DISPLAY*display=NULL;
- Step 1: Declare a pointer fordisplay:
- Step 2: Construct thedisplay:
- ALLEGRO_DISPLAY*al_create_display(intwidth,intheight);
- g.:
- ALLEGRO_DISPLAY* display = NULL; //declare a displaypointer
- display =al_create_display(30, 50); // construct the display
- Step 3: Set and show thedisplay
- To getcolor:
- ALLEGRO_COLORal_map_rgb(unsignedcharr,unsignedcharg,unsignedcharb);
- r, g, b are the integers belonging to [0,255]
- To set the whole window into thecolor:
- voidal_clear_to_color(ALLEGRO_COLORcolor);
- To showit:
- voidal_flip_display(void);
- To getcolor:
- Step 4:Destroy
- Using function below to destroy yourdisplay:
- voidal_destroy_display(ALLEGRO_DISPLAY*display)
- Please destroy all things we have initialized or created beforethe program
- Using function below to destroy yourdisplay:
- In this task, we will program our first allegro project — helloworld!!
- Please accomplish the task_1.c
- There’s lots of hint, hoping it might help
- Feel free to ask us if there’s any
- In this section, we will learn how to show some words, graphicsor even images in our
- draw text on thewindow:
- Step 1: include the following headfiles:
- #include<allegro5/allegro_font.h>#include<allegro5/allegro_ttf.h>
- Step 2: call the following function toinitial:
- al_init_font_addon(); // initialize the fontaddon
- Step 1: include the following headfiles:
al_init_ttf_addon(); // initialize the ttf (True Type Font) addon
- draw text on thewindow:
- Step3:
- voidal_draw_text(constALLEGRO_FONT*font, ALLEGRO_COLORcolor,floatx,floaty,intflags, charconst*text)
- ALLEGRO_FONT*font:the font of text will be
- Using this toconstruct:
- ALLEGRO_FONT*al_load_ttf_font(charconst*filename,intsize,intflags)
- filename = the address of your own .ttffile
- size = the size of
- Notice: You have to construct 2 kinds of font if you want use the same .ttf file but in different
- flags = 0 is
- draw text on thewindow:
- voidal_draw_text(constALLEGRO_FONT*font, ALLEGRO_COLORcolor,floatx,floaty,intflags, charconst*text)
- ALLEGRO_COLOR color: The same as we mentioned
- ALLEGRO_COLORal_map_rgb(unsignedcharr,unsignedcharg,unsignedcharb)
- r, g, b are the integers belonging to [0,255]
- draw text on thewindow:
- voidal_draw_text(constALLEGRO_FONT*font, ALLEGRO_COLORcolor,floatx,floaty,intflags, charconst*text)
- Float x and y: the coordiate of our
- Flags: The flags parameter can be 0 or one of the followingflags:
- ALLEGRO_ALIGN_LEFT – Draw the text left-aligned (same as0).
- ALLEGRO_ALIGN_CENTRE – Draw the text centered around the given
- ALLEGRO_ALIGN_RIGHT – Draw the text right-aligned to the given
- Text: The words you want to draw on the
- draw graphic onwindow:
- Step 1:#include<allegro5/allegro_primitives.h>
- Step 2: call the following function to initialize thelibrary:
- boolal_init_primitives_addon(void)
- Step 3: call the function corresponding to the graphic you want todraw
- Using rectangle as anexample:
- voidal_draw_rectangle(floatx1,floaty1,floatx2,floaty2,ALLEGRO_COLORcolor, floatthickness)
- x1, y1, x2, y2 – Upper left and lower right points of therectangle
- color – Color of therectangle
- thickness – Thickness of the lines, pass <= 0 to draw hairlinelines
- There’s bunch of functions drawing different graphics filled or
- Using Google to explore if you needthem!
- draw aimage
- Step 1: including the following headfile:
- #include<allegro5/allegro_image.h>
- Step 1: including the following headfile:
- Step 2: call the following function to initialize thelibrary:
- al_init_image_addon();
- Step 3: declare a variable in ALLEGRO_BITMAP* type to containour image:
- ALLEGRO_BITMAP*img=NULL;
- draw aimage
- Step 4: loading the image into our variable (e.g.img):
- ALLEGRO_BITMAP*al_load_bitmap(constchar*filename)
- Filename: the address of your image
- g:
- ALLEGRO_BITMAP * img =NULL;
- img =al_load_bitmap(“image.jpg”);
- We can judge whether the variable img is NULL to determine whether the loadingis success.
- ALLEGRO_BITMAP*al_load_bitmap(constchar*filename)
- Step 4: loading the image into our variable (e.g.img):
- draw aimage
- Step 5: display theimage
- voidal_draw_bitmap(ALLEGRO_BITMAP*bitmap,floatdx,floatdy,intflags)
- bitmap: the variable containing theimage
- dx dy: the location of theimage
- flags canbe:
- ALLEGRO_FLIP_HORIZONTAL – flip the bitmap about they-axis
- ALLEGRO_FLIP_VERTICAL – flip the bitmap about thex-axis
- 0 – donothing
- Step 5: display theimage
- Step 6: don’t forget to destroy all things you create andload
- voidal_destroy_bitmap(ALLEGRO_BITMAP*bitmap)
- In this task, you are asked to draw something, including at least some words, one graphic and one
- A sample font and image has already provided for
- We also provided a sample code for you, filled with hint. You can either use it to design your own program, or coding from
- Feel free to ask us if there’s anyquestion!!!!
- You should show something likethis:
- In this section, we will learn how to set up a basic interactive mechanism and deal with some interaction which is calledevent in the
- For reach our goal, we need to initial event queue to record the event, and then process the event caught from event
- Now we share the method for you step by
- Queue
- Queue
- The one that enters the queue first will also exit first (becausehe/she gets serviced first)
- Queue vsArray
- Event
- Event is something happened during the gamerunning
- Like keyboard input, click mouse, close display and so
- Event_queue
- Event_queue is a queue containing all event, and is the only sourcewe catch any
- Therefore, to let the code know what has happened, we must createa event queue first:
- ALLEGRO_EVENT_QUEUE*event_queue=NULL;
- event_queue=al_create_event_queue();
- Event_queue –cont.
- To set the type of event (keyboard, mouse, display, etc)recorded:
- voidal_register_event_source(ALLEGRO_EVENT_QUEUE*queue,ALLEGRO_EVENT_SOURCE*source)
- g.al_register_event_source(event_queue,al_get_display_event_source(display));
- To set the type of event (keyboard, mouse, display, etc)recorded:
- Then we can get event from
- More specific, the event we get from it must belongs to one of the source wehave already
- If you can not get the event you expect (e.g. keyboard input), please checkwhether you register your keyboard as one of your event source before smashing your keyboard or your
- Getevent.
- To know whether there is any event inevent_queue:
- boolal_is_event_queue_empty(ALLEGRO_EVENT_QUEUE*)
- It will return a boolvalue:
- 1 (true) means the queue isempty;
- 0 (false) means there’s some event in the
- To get the event out of thequeue:
- ALLEGRO_EVENTevent;(declare a variable to record theevent)
- voidal_wait_for_event(ALLEGRO_EVENT_QUEUE*queue,ALLEGRO_EVENT*event); The program will be blocked here until the data of the earliest event have been duplicated into the allegro event we
- To know whether there is any event inevent_queue:
- Eventtype
- How can we know what the event is (keyboard pressed, mouse.)
- Usetype
- g.event.type==ALLEGRO_EVENT_DISPLAY_CLOSE
- The function is used to find whether the display is closed just
- Have you ever noticed that in the 2 tasks before, the window can not be closed in normal way (click the cross symbol at thecorner)?
- In this task, we will make it possible!!!
- In this section, we will learn how to use keyboard and mouseas input source to interact with our
- Step 1: declare and create the event_queue and event as
- Step 2: call boolal_init_primitives_addon(void)first then
boolal_install_keyboard(void)to initial the keyboard
- Step 3: register keyboard as event source to the eventqueue
- Using ALLEGRO_EVENT_SOURCE*al_get_keyboard_event_source(void)toget the event source of keyboard
- Using voidal_register_event_source(ALLEGRO_EVENT_QUEUE*queue,ALLEGRO_EVENT_SOURCE*source)to register the source to event
- Step 4: To find if there’s some key being pressed or bouncingup:
- Compare the event.type with keyboard
- There are 2 event types for thekeyboard:
- ALLEGRO_EVENT_KEY_DOWN – indicating some keys being
- ALLEGRO_EVENT_KEY_UP – indicating some keys bouncing up just
- Using event.type to judge the type of
- Step 4: get the specifickey:
- keycode to each button of keyboard:https://allegro.cc/manual/5/keyboard.html (e.g. A = ALLEGRO_KEY_A)
- keyboard.keycodecapsules the keycode of the key causing the event.
- Comparing it with the keycode you design to get the
- Using up, down, left, right button to control the box move inthe same
- The box should move to the direction whenever the corresponding button is pressed, and stop whenever the corresponding button is
- Press ESC to terminate theprogram
- In this section, we will learn how to use mouse as input sourceto interact with our
- Register the source of mouse to theevent_queue
- Using ALLEGRO_EVENT_SOURCE*al_get_mouse_event_source()toget the source of mouse.
- Callboolal_init_primitives_addon(void)first then bool al_install_mouse(void)to initial the
- To find whether the mouse is clicked justnow
- Compare the event.type withALLEGRO_EVENT_MOUSE_BUTTON_DOWN
- mouse.button capsules the information of the pressedbutton
- 1 for left button. 2 for right one, and so on soforth
- To find whether the mouse ismoving:
- Compare the event.type withALLEGRO_EVENT_MOUSE_AXES
- Using event.mouse.x and event.mouse.y to get the position of
- Using mouse to determinate the location of the
- The box should be the same place as the cursor wheneverthe cursor is in the
- Press left button to make the box disappear and press it again to make it
- Press right button to terminate theprogram
1.语言及环境:用C语言的Allegro 5套件写一个类似雷电的2D射击小游戏(大一课设水平),
须使用提供的template(后面有关于template的说明
2.内容:
(1)游戏主选单:
Start
About
Exit
(2)游戏主体:
外观:战机,血条(蓝条),子弹…
游戏性:射击子弹,移动,击中扣血等…
(3)游戏结束画面:
Win
Game Over
Restart
End
4.以下几样选5样做就行:
(1)开头+人物动画(可截取多张图片连续display
(2)厉害的AI(比如子弹追踪等…
(3)道具
(4)商店系统
(5)存档,读档
(6)背景音乐
-and so on
对于Template中所提供code中各func的解释:
game_init():初始化所有控制器
game_begin():初始游戏介面
game_run():游戏主体(while循环内,会持续刷新接收queue指令)
game_destroy():对queue,display等的摧毁,防占用内存
process_event():控制各式event(键盘 鼠标)
show_err_msg(int msg):方便debug
范例:
#include <stdio.h> #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <allegro5/allegro_image.h> #include <allegro5/allegro_audio.h> #include <allegro5/allegro_acodec.h> #include <allegro5/allegro_font.h> #include <allegro5/allegro_ttf.h> #define GAME_TERMINATE -1 // ALLEGRO Variables ALLEGRO_DISPLAY* display = NULL; ALLEGRO_EVENT_QUEUE *event_queue = NULL; ALLEGRO_BITMAP *image = NULL; ALLEGRO_BITMAP *image2 = NULL; ALLEGRO_BITMAP *image3 = NULL; ALLEGRO_BITMAP *background = NULL; ALLEGRO_KEYBOARD_STATE keyState ; ALLEGRO_TIMER *timer = NULL; ALLEGRO_TIMER *timer2 = NULL; ALLEGRO_TIMER *timer3 = NULL; ALLEGRO_SAMPLE *song=NULL; ALLEGRO_FONT *font = NULL; //Custom Definition const char *title = "Final Project 10xxxxxxx"; const float FPS = 60; const int WIDTH = 400; const int HEIGHT = 600; typedef struct character { int x; int y; ALLEGRO_BITMAP *image_path; }Character; Character character1; Character character2; Character character3; int imageWidth = 0; int imageHeight = 0; int draw = 0; int done = 0; int window = 1; bool judge_next_window = false; bool ture = true; //true: appear, false: disappear bool next = false; //true: trigger bool dir = true; //true: left, false: right void show_err_msg(int msg); void game_init(); void game_begin(); int process_event(); int game_run(); void game_destroy(); int main(int argc, char *argv[]) { int msg = 0; game_init(); game_begin(); while (msg != GAME_TERMINATE) { msg = game_run(); if (msg == GAME_TERMINATE) printf("Game Over\n"); } game_destroy(); return 0; } void show_err_msg(int msg) { fprintf(stderr, "unexpected msg: %d\n", msg); game_destroy(); exit(9); } void game_init() { if (!al_init()) { show_err_msg(-1); } if(!al_install_audio()){ fprintf(stderr, "failed to initialize audio!\n"); show_err_msg(-2); } if(!al_init_acodec_addon()){ fprintf(stderr, "failed to initialize audio codecs!\n"); show_err_msg(-3); } if (!al_reserve_samples(1)){ fprintf(stderr, "failed to reserve samples!\n"); show_err_msg(-4); } // Create display display = al_create_display(WIDTH, HEIGHT); event_queue = al_create_event_queue(); if (display == NULL || event_queue == NULL) { show_err_msg(-5); } // Initialize Allegro settings al_set_window_position(display, 0, 0); al_set_window_title(display, title); al_init_primitives_addon(); al_install_keyboard(); al_install_audio(); al_init_image_addon(); al_init_acodec_addon(); al_init_font_addon(); al_init_ttf_addon(); // Register event al_register_event_source(event_queue, al_get_display_event_source(display)); al_register_event_source(event_queue, al_get_keyboard_event_source()); } void game_begin() { // Load sound song = al_load_sample( "hello.wav" ); if (!song){ printf( "Audio clip sample not loaded!\n" ); show_err_msg(-6); } // Loop the song until the display closes al_play_sample(song, 1.0, 0.0,1.0,ALLEGRO_PLAYMODE_LOOP,NULL); al_clear_to_color(al_map_rgb(100,100,100)); // Load and draw text font = al_load_ttf_font("pirulen.ttf",12,0); al_draw_text(font, al_map_rgb(255,255,255), WIDTH/2, HEIGHT/2+220 , ALLEGRO_ALIGN_CENTRE, "Press 'Enter' to start"); al_draw_rectangle(WIDTH/2-150, 510, WIDTH/2+150, 550, al_map_rgb(255, 255, 255), 0); al_flip_display(); } int process_event(){ // Request the event ALLEGRO_EVENT event; al_wait_for_event(event_queue, &event); // Our setting for controlling animation if(event.timer.source == timer){ if(character2.x < -150) dir = false; else if(character2.x > WIDTH+50) dir = true; if(dir) character2.x -= 10; else character2.x += 10; } if(event.timer.source == timer2){ ture = false; next = true; } if(event.timer.source == timer3){ if(next) next = false; else ture = true; } // Keyboard if(event.type == ALLEGRO_EVENT_KEY_UP) { switch(event.keyboard.keycode) { // Control case ALLEGRO_KEY_W: character1.y -= 30; break; case ALLEGRO_KEY_S: character1.y += 30; break; case ALLEGRO_KEY_A: character1.x -= 30; break; case ALLEGRO_KEY_D: character1.x += 30; break; // For Start Menu case ALLEGRO_KEY_ENTER: judge_next_window = true; break; } } // Shutdown our program else if(event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) return GAME_TERMINATE; return 0; } int game_run() { int error = 0; // First window(Menu) if(window == 1){ if (!al_is_event_queue_empty(event_queue)) { error = process_event(); if(judge_next_window) { window = 2; // Setting Character character1.x = WIDTH / 2; character1.y = HEIGHT / 2 + 150; character2.x = WIDTH + 100; character2.y = HEIGHT / 2 - 280; character1.image_path = al_load_bitmap("tower.png"); character2.image_path = al_load_bitmap("teemo_left.png"); character3.image_path = al_load_bitmap("teemo_right.png"); background = al_load_bitmap("stage.jpg"); //Initialize Timer timer = al_create_timer(1.0/15.0); timer2 = al_create_timer(1.0); timer3 = al_create_timer(1.0/10.0); al_register_event_source(event_queue, al_get_timer_event_source(timer)) ; al_register_event_source(event_queue, al_get_timer_event_source(timer2)) ; al_register_event_source(event_queue, al_get_timer_event_source(timer3)) ; al_start_timer(timer); al_start_timer(timer2); al_start_timer(timer3); } } } // Second window(Main Game) else if(window == 2){ // Change Image for animation al_draw_bitmap(background, 0,0, 0); if(ture) al_draw_bitmap(character1.image_path, character1.x, character1.y, 0); if(dir) al_draw_bitmap(character2.image_path, character2.x, character2.y, 0); else al_draw_bitmap(character3.image_path, character2.x, character2.y, 0); al_flip_display(); al_clear_to_color(al_map_rgb(0,0,0)); // Listening for new event if (!al_is_event_queue_empty(event_queue)) { error = process_event(); } } return error; } void game_destroy() { // Make sure you destroy all things al_destroy_event_queue(event_queue); al_destroy_display(display); al_destroy_timer(timer); al_destroy_timer(timer2); al_destroy_bitmap(image); al_destroy_sample(song); }