/*広告*/
/*ブロック崩しの作り方 完成ソース*/
#include "DxLib.h" #define BALL_SIZE 5 #define BALL_SPEED 5 #define BAR_SPEED 5 #define BAR_WIDTH 50 #define BAR_HEIGHT 10 #define BLOCK_WIDTH 50 #define BLOCK_HEIGHT 10 #define COLLISION_SIZE 3 #define MAX_BLOCK 36 #define BLOCK_MAP_INDEX_X 6 #define BLOCK_MAP_INDEX_Y 6 #define FIELD_WIDTH 300 #define FIELD_HEIGHT 480 #define X_POSI 170 void my_init_variable(void); void my_init_blocks(void); void my_op(void); void my_ed(void); void my_gameover(void); void my_move_bar(void); void my_move_ball(void); void my_collision_detection(void); void my_count_block(void); void my_draw_back(void); void my_draw_score_box(void); void my_draw_ball(void); void my_draw_bar(void); void my_draw_block(void); void my_draw_field(void); int my_get_key(void); struct BLOCKS{ int x; int y; int flag; int color; }; struct BLOCKS blocks[MAX_BLOCK]; int block_map[BLOCK_MAP_INDEX_Y][BLOCK_MAP_INDEX_X] = { {1,2,3,1,2,3}, {2,3,1,2,3,1}, {3,1,2,3,1,2}, {1,2,3,1,2,3}, {2,3,1,2,3,1}, {3,1,2,3,1,2} }; int game_state; int bar_x; int bar_y; int ball_x; int ball_y; int x_speed; int y_speed; int score; int Color_White; int Color_Black; int Color_Red; int Color_Green; int Color_Blue; /*背景画像用変数*/ int back_img; int key[256]; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){ ChangeWindowMode(TRUE); DxLib_Init(); SetDrawScreen(DX_SCREEN_BACK); my_init_variable(); my_init_blocks(); while (ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && my_get_key()==0){ switch(game_state){ case 0: my_draw_back(); my_draw_ball(); my_draw_bar(); my_draw_block(); my_draw_field(); my_op(); if(key[KEY_INPUT_RETURN] == 1){ game_state = 5; } break; case 5: my_move_bar(); my_move_ball(); my_collision_detection(); my_count_block(); my_draw_back(); my_draw_score_box(); my_draw_ball(); my_draw_bar(); my_draw_block(); my_draw_field(); break; case 10: my_draw_back(); my_draw_score_box(); my_draw_bar(); my_draw_block(); my_draw_field(); my_gameover(); break; case 15: my_draw_back(); my_draw_score_box(); my_draw_bar(); my_draw_block(); my_draw_field(); my_ed(); break; default: break; } } DxLib_End(); return 0; } void my_init_variable(){ game_state = 0; bar_x = 0; bar_y = FIELD_HEIGHT - BAR_HEIGHT; ball_x = BAR_WIDTH / 2; ball_y = (FIELD_HEIGHT - BAR_HEIGHT) - BALL_SIZE; x_speed = BALL_SPEED; y_speed = BALL_SPEED; score = 0; Color_White = GetColor(255,255,255); Color_Black = GetColor(0, 0, 0); Color_Red = GetColor(255,0,0); Color_Green = GetColor(0,255,0); Color_Blue = GetColor(0, 0, 255); /*背景画像読み込み*/ /*初期化時に一度読み込めば大丈夫です*/ back_img = LoadGraph("./back_img.jpg"); } void my_init_blocks(){ int i, j; int count = 0; for (i = 0; i < BLOCK_MAP_INDEX_Y; i++){ for (j = 0; j < BLOCK_MAP_INDEX_X; j++){ if (block_map[i][j] != 0){ blocks[count].x = (BLOCK_WIDTH * j); blocks[count].y = (BLOCK_HEIGHT * i); blocks[count].flag = 1; switch (block_map[i][j]){ case 1: blocks[count].color = Color_Red; break; case 2: blocks[count].color = Color_Green; break; case 3: blocks[count].color = Color_Blue; break; default: break; } } count++; } } } /*オープニング*/ void my_op(){ DrawFormatString(220, 210, Color_White, "THE BREAKOUT"); DrawFormatString(210, 230, Color_White, "press enter key to start"); } void my_ed(){ DrawFormatString(245, 210, Color_White, "Congratulations!!!"); } void my_gameover(){ DrawFormatString(280,240,Color_White,"GAME OVER"); } void my_move_ball(){ ball_x += x_speed; ball_y += y_speed; } void my_move_bar(){ if (key[KEY_INPUT_RIGHT] > 0 && (bar_x + BAR_WIDTH) < FIELD_WIDTH){ bar_x += BAR_SPEED; } if (key[KEY_INPUT_LEFT] > 0 && bar_x > 0){ bar_x -= BAR_SPEED; } } void my_collision_detection(){ int count = 0; if(ball_x >= FIELD_WIDTH){ ball_x = FIELD_WIDTH - BALL_SIZE; x_speed *= -1; } if(ball_x <= 0){ ball_x = BALL_SIZE; x_speed *= -1; } if(ball_y <= 0){ ball_y = BALL_SIZE; y_speed *= -1; } if(ball_y >= FIELD_HEIGHT){ game_state = 10; } if(ball_x > bar_x && ball_x < (bar_x + BAR_WIDTH) && ball_y >= bar_y){ ball_y = bar_y - BALL_SIZE; y_speed *= -1; } for (count = 0;count < MAX_BLOCK;count++){ if(blocks[count].flag == 1){ if (ball_x >= blocks[count].x && ball_x <= blocks[count].x + BLOCK_WIDTH){ if (ball_y >= blocks[count].y && ball_y <= blocks[count].y + COLLISION_SIZE){ ball_y = blocks[count].y; y_speed *= -1; blocks[count].flag = 0; score++; break; } else if (ball_y <= blocks[count].y + BLOCK_HEIGHT && ball_y >= blocks[count].y + BLOCK_HEIGHT - COLLISION_SIZE){ ball_y = blocks[count].y + BLOCK_HEIGHT; y_speed *= -1; blocks[count].flag = 0; score++; break; } } if (ball_y >= blocks[count].y && ball_y <= blocks[count].y + BLOCK_HEIGHT){ if (ball_x >= blocks[count].x && ball_x <= blocks[count].x + COLLISION_SIZE){ ball_x = blocks[count].x; x_speed *= -1; blocks[count].flag = 0; score++; break; } else if (ball_x <= blocks[count].x + BLOCK_WIDTH && ball_x >= blocks[count].x + BLOCK_WIDTH - COLLISION_SIZE){ ball_x = blocks[count].x + BLOCK_WIDTH; x_speed *= -1; blocks[count].flag = 0; score++; break; } } } } } void my_count_block(){ int count; for (count = 0;count < MAX_BLOCK;count++){ if(blocks[count].flag == 1){ break; } } if(count == MAX_BLOCK){ game_state = 15; } } /*背景画像表示*/ void my_draw_back(){ DrawGraph(0, 0, back_img, TRUE); } /*スコアボックス表示*/ void my_draw_score_box(){ DrawFormatString(500,20,Color_White,"■BREAKOUT■"); DrawFormatString(525,60,Color_White,"STAGE"); DrawFormatString(545,80,Color_White,"1"); DrawFormatString(525,100,Color_White,"SCORE"); DrawFormatString(545,120,Color_White,"%d",score); } void my_draw_ball(){ DrawCircle(X_POSI + ball_x,ball_y,BALL_SIZE,Color_White,false); } void my_draw_bar(){ DrawBox(X_POSI + bar_x,bar_y,X_POSI + bar_x + BAR_WIDTH,bar_y + BAR_HEIGHT,Color_Red,true); } void my_draw_block(){ int count = 0; for (count = 0;count < MAX_BLOCK;count++){ if (blocks[count].flag == 1){ DrawBox(X_POSI + blocks[count].x,blocks[count].y,X_POSI + blocks[count].x + BLOCK_WIDTH, blocks[count].y + BLOCK_HEIGHT,blocks[count].color,true); DrawBox(X_POSI + blocks[count].x,blocks[count].y,X_POSI + blocks[count].x + BLOCK_WIDTH, blocks[count].y + BLOCK_HEIGHT,Color_Black, false); } } } void my_draw_field(){ DrawBox(X_POSI + 0,0,X_POSI + FIELD_WIDTH,FIELD_HEIGHT,Color_White,false); } int my_get_key(){ char keys[256]; GetHitKeyStateAll(keys); for (int i = 0; i < 256; i++){ if (keys[i] != 0){ key[i]++; } else{ key[i] = 0; } } return 0; }/*Copyright 2016 K.N/petitetech.com*/
/*広告*/