From 24e43d785897f94a63d5af0b120ae39afb6ee24a Mon Sep 17 00:00:00 2001 From: davemds Date: Mon, 11 Oct 2010 21:43:19 +0000 Subject: [PATCH] And finally one funny (at least to code) edje example: a super-simple (but full featured) pong game, fully written in embryo, in the style of the original game. To run it, like all the other examples, just go in the doc/examples folder and do: edje_cc embryo_pong.edc && edje_player embryo_pong.edj Have fun ...beating the ""AI"" is really difficult ;) git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@53278 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- doc/examples/embryo_pong.edc | 273 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 273 insertions(+) create mode 100644 doc/examples/embryo_pong.edc diff --git a/doc/examples/embryo_pong.edc b/doc/examples/embryo_pong.edc new file mode 100644 index 0000000..863b564 --- /dev/null +++ b/doc/examples/embryo_pong.edc @@ -0,0 +1,273 @@ + +#define DEBUG_ENABLE 0 +#define FPS 30 +#define COLOR_BG 50 50 50 255 +#define COLOR_FG 222 222 222 255 +#define PAD_SIZE 60 +#define PAD_DISTANCE 20 +#define BALL_SPEED 5.0 +#define BALL_SPEEDUP 0.1 +#define BALL_SIZE 10 + +#if DEBUG_ENABLE +#define DBG(...) { \ + new _buf[128]; \ + snprintf(_buf, sizeof(_buf), __VA_ARGS__); \ + set_text(PART:"dbg", _buf); } +#else +#define DBG(...) +#endif + +collections { + group { name: "main"; + min: 500 300; + script { + public ballx, bally; + public ballspeedx, ballspeedy; + public player_score, ai_score; + + public game_reset() { + set_int(ai_score, 0); + set_int(player_score, 0); + set_text(PART:"score1", "0"); + set_text(PART:"score2", "0"); + game_init(); + } + + public game_init() { + set_float(ballspeedx, 0.0); + set_float(ballspeedy, 0.0); + set_float(ballx, 100); + set_float(bally, 100); + } + + public start_game() { + set_float(ballspeedx, BALL_SPEED); + set_float(ballspeedy, BALL_SPEED * randf()); + } + + public player_wins() { + new buf[16] + set_int(player_score, get_int(player_score) + 1); + snprintf(buf, sizeof(buf), "%d", get_int(player_score)); + set_text(PART:"score1", buf); + game_init(); + } + + public ai_wins() { + new buf[16] + set_int(ai_score, get_int(ai_score) + 1); + snprintf(buf, sizeof(buf), "%d", get_int(ai_score)); + set_text(PART:"score2", buf); + game_init(); + } + + public game_loop(count) { + count++; + + /* get field geometry */ + new fx, fy, fw, fh; + get_geometry(PART:"bg", fx, fy, fw, fh); + + /* get mouse coords */ + new mx, my; + get_mouse(mx, my); + + /* get the ball info */ + new Float:bx = get_float(ballx); + new Float:by = get_float(bally); + new Float:speedx = get_float(ballspeedx); + new Float:speedy = get_float(ballspeedy); + + /* move the player pad */ + new pady = my - PAD_SIZE / 2; + if (pady < 0) pady = 0; + else if (pady + PAD_SIZE > fh) pady = fh - PAD_SIZE; + custom_state(PART:"pad1", "default", 0.0); + set_state_val(PART:"pad1", STATE_REL1_OFFSET, 20, pady); + set_state(PART:"pad1", "custom", 0.0); + + /* move the AI pad */ + new pad2y = round(by) - PAD_SIZE / 2 - BALL_SIZE / 2; + if (pad2y < 0) pad2y = 0; + else if (pad2y + PAD_SIZE > fh) pad2y = fh - PAD_SIZE; + custom_state(PART:"pad2", "default", 0.0); + set_state_val(PART:"pad2", STATE_REL1_OFFSET, 20, pad2y); + set_state(PART:"pad2", "custom", 0.0); + + /* calc new ball position */ + bx += speedx; + by += speedy; + + /* check walls collision */ + if (by < 0) + { + speedy = -speedy; + by = 0; + } + else if (by + BALL_SIZE > fh) + { + speedy = -speedy; + by = fh - BALL_SIZE - 1; + } + + /* check player pad collision */ + if ((speedx < 0) && + (bx < PAD_DISTANCE + 10) && (bx > 0) && + (by + BALL_SIZE > pady) && (by < pady + PAD_SIZE)) + { + new Float:dy = by - pady - PAD_SIZE / 2; + speedy += dy / 10; + speedx = -speedx + BALL_SPEEDUP; + } + + /* check AI pad collision */ + else if ((bx + BALL_SIZE > fw - PAD_DISTANCE - 10) && + (bx + BALL_SIZE < fw) && + (by + BALL_SIZE > pad2y) && (by < pad2y + PAD_SIZE)) + { + new Float:dy = by - pad2y - PAD_SIZE / 2; + speedy += dy / 10; + speedx = -speedx - BALL_SPEEDUP; + } + + /* apply the new ball position */ + custom_state(PART:"ball", "default", 0.0); + set_state_val(PART:"ball", STATE_REL1_OFFSET, round(bx), round(by)); + set_state(PART:"ball", "custom", 0.0); + + /* update global vars */ + set_float(ballx, bx); + set_float(bally, by); + set_float(ballspeedx, speedx); + set_float(ballspeedy, speedy); + + /* AI score a point */ + if (bx < 0) ai_wins(); + /* player score a point */ + if (bx + BALL_SIZE > fw) player_wins(); + + /* show debug info (if debug enabled) */ + DBG("loop:%d [speed %f %f] [mouse: %d %d] [ball: %f %f]", + count, speedx, speedy, mx, my, bx, by) + + /* recall the loop in n seconds */ + timer(1.0 / FPS, "game_loop", count); + } + } + parts { + part { name: "bg"; + type: RECT; + description { state: "default" 0.0; + color: COLOR_BG; + } + } + part { name: "net"; + type: RECT; + description { state: "default" 0.0; + color: COLOR_FG; + max: 10 9999; + } + } + part { name: "score1"; + type: TEXT; + description { state: "default" 0.0; + color: COLOR_FG; + rel2.relative: 0.5 0.5; + rel2.offset: -20 0; + text { + text: "0"; + font: "Sans"; + size: 50; + align: 1.0 0.0; + } + } + } + part { name: "score2"; + type: TEXT; + description { state: "default" 0.0; + color: COLOR_FG; + rel1.relative: 0.5 0.0; + rel1.offset: 20 0; + text { + text: "0"; + font: "Sans"; + size: 50; + align: 0.0 0.0; + } + } + } + part { name: "pad1"; + type: RECT; + description { state: "default" 0.0; + color: COLOR_FG; + max: 10 PAD_SIZE; + fixed: 1 1; + align: 0.0 0.0; + rel1.offset: PAD_DISTANCE 0; + } + } + part { name: "pad2"; + type: RECT; + description { state: "default" 0.0; + color: COLOR_FG; + max: 10 PAD_SIZE; + fixed: 1 1; + align: 1.0 0.0; + rel2.offset: -PAD_DISTANCE 0; + } + } + part { name: "ball"; + type: RECT; + description { state: "default" 0.0; + color: COLOR_FG; + max: BALL_SIZE BALL_SIZE; + fixed: 1 1; + align: 0.0 0.0; + rel1.offset: 100 100; + } + } + #if DEBUG_ENABLE + part { name: "dbg"; + type: TEXT; + description { state: "default" 0.0; + color: 255 255 255 200; + text { + font: "Sans"; + size: 12; + align: 1.0 1.0; + } + } + } + #endif + } + programs { + /* on load: reset the game and start the game loop */ + program { + signal: "load"; + source: ""; + script { + game_reset(); + timer(0.1 , "game_loop", 0); + } + } + /* mouse left click: start the game, if not yet started */ + program { + signal: "mouse,down,1"; + source: "bg"; + script { + if (get_float(ballspeedx) == 0.0) + start_game(); + } + } + /* mouse right click: restart the game*/ + program { + signal: "mouse,down,3"; + source: "bg"; + script { + game_reset(); + } + } + } + } +} -- 2.7.4