187 lines
4.5 KiB
C
187 lines
4.5 KiB
C
/*
|
|
* Copyright (c) LSE
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY LSE AS IS AND ANY
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
* DISCLAIMED. IN NO EVENT SHALL LSE BE LIABLE FOR ANY
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
#include <graphic.h>
|
|
#include <sound.h>
|
|
#include <stdlib.h>
|
|
|
|
static void splash_screen(void)
|
|
{
|
|
struct image *yaka = load_image(RES_PATH "/res/yaka.bmp");
|
|
int blink = 0;
|
|
unsigned long t;
|
|
|
|
while (getkey() < 0) {
|
|
t = gettick();
|
|
draw_begin();
|
|
draw_text("YAKANOID", 160 - 4 * 8, 10, 23, 0);
|
|
//draw_image (yaka, 105, 30); // For YAKA2008
|
|
draw_image(yaka, 60, 20); // For YAKA2009
|
|
if (blink > 5)
|
|
draw_text("Any key to start", 160 - 8 * 8, 170, 184, 0);
|
|
draw_text("Kernel option - LSE - 2007-2008", 5, 190, 208, 0);
|
|
draw_end();
|
|
blink = (blink + 1) % 10;
|
|
while (gettick() - t < 66) ;
|
|
}
|
|
}
|
|
|
|
static void game_loop(void)
|
|
{
|
|
struct image *brick_blue = load_image(RES_PATH "/res/blue.bmp");
|
|
struct image *brick_red = load_image(RES_PATH "/res/red.bmp");
|
|
struct image *brick_green = load_image(RES_PATH "/res/green.bmp");
|
|
struct image *ball = load_image(RES_PATH "/res/ball.bmp");
|
|
struct image *bar = load_image(RES_PATH "/res/bar.bmp");
|
|
struct image *current = brick_blue;
|
|
int i, line, pos, k;
|
|
int mtrx[5][10];
|
|
int x, y, dx, dy;
|
|
int bx, bx2, by;
|
|
int score = 0;
|
|
int lives = 3;
|
|
unsigned long t;
|
|
char buf[12] = { 0 };
|
|
|
|
for (line = 0; line < 5; line++)
|
|
for (i = 0; i < 10; i++)
|
|
mtrx[line][i] = 1;
|
|
pos = 105;
|
|
x = 105;
|
|
y = 180;
|
|
dx = 1;
|
|
dy = -1;
|
|
while (1) {
|
|
t = gettick();
|
|
draw_begin();
|
|
|
|
draw_line(10, 0, 10, 199, 18);
|
|
draw_line(210, 0, 210, 199, 18);
|
|
|
|
for (line = 0; line < 5; line++) {
|
|
if (line == 0 || line == 3)
|
|
current = brick_red;
|
|
if (line == 1 || line == 4)
|
|
current = brick_green;
|
|
if (line == 2)
|
|
current = brick_blue;
|
|
for (i = 0; i < 10; i++) {
|
|
if (mtrx[line][i])
|
|
draw_image(current, 10 + i * 20, line * 12);
|
|
}
|
|
}
|
|
|
|
k = getkey();
|
|
if (k > 0) {
|
|
if (k == 77)
|
|
pos += 10;
|
|
if (k == 75)
|
|
pos -= 10;
|
|
if (k == 1)
|
|
return;
|
|
if (pos - 25 < 10)
|
|
pos = 35;
|
|
if (pos + 25 >= 210)
|
|
pos = 185;
|
|
}
|
|
|
|
x += dx;
|
|
y += dy;
|
|
|
|
if (x + 5 >= 210)
|
|
dx = -dx;
|
|
if (x - 5 < 10)
|
|
dx = -dx;
|
|
|
|
//draw_fillrect (x - 5, y - 5, x + 5, y + 5, 21, 21);
|
|
draw_image(ball, x - 5, y - 5);
|
|
//draw_fillrect (pos - 25, 190, pos + 25, 199, 20, 20);
|
|
draw_image(bar, pos - 25, 190);
|
|
|
|
draw_text("score:", 240, 40, 20, 0);
|
|
sprintf(buf, "%d", score);
|
|
draw_text(buf, 240, 50, 20, 0);
|
|
|
|
draw_text("lives:", 240, 150, 20, 0);
|
|
sprintf(buf, "%d", lives);
|
|
draw_text(buf, 240, 160, 20, 0);
|
|
|
|
if (y + 5 < 6 * 12) {
|
|
bx = (x - 5 - 10) / 20;
|
|
bx2 = (x + 5 - 10) / 20;
|
|
by = (y - 12) / 12;
|
|
if (mtrx[by][bx] || mtrx[by][bx2]) {
|
|
dy = -dy;
|
|
if (mtrx[by][bx] && mtrx[by][bx2])
|
|
score += 25;
|
|
else
|
|
score += 10;
|
|
mtrx[by][bx] = mtrx[by][bx2] = 0;
|
|
}
|
|
}
|
|
if (y + 5 >= 190) {
|
|
if (x + 5 >= pos - 25 && x - 5 <= pos + 25)
|
|
dy = -dy;
|
|
else {
|
|
lives--;
|
|
if (!lives) {
|
|
draw_text("GAME OVER", 90, 90, 20, 0);
|
|
draw_end();
|
|
for (i = 0; i < 10; i++) {
|
|
t = gettick();
|
|
while (gettick() - t < 100)
|
|
continue;
|
|
}
|
|
return;
|
|
}
|
|
draw_text("try again !", 90, 90, 20, 0);
|
|
draw_end();
|
|
for (i = 0; i < 10; i++) {
|
|
t = gettick();
|
|
while (gettick() - t < 100)
|
|
continue;
|
|
}
|
|
pos = 105;
|
|
x = 105;
|
|
y = 180;
|
|
dx = 1;
|
|
dy = -1;
|
|
}
|
|
}
|
|
|
|
while (gettick() - t < 8)
|
|
continue;
|
|
draw_end();
|
|
}
|
|
}
|
|
|
|
void entry(void)
|
|
{
|
|
switch_graphic();
|
|
|
|
while (1) {
|
|
splash_screen();
|
|
game_loop();
|
|
}
|
|
}
|