final int players = 2; float[][] pos = { {100,100} , {300,300} }; float[][] last_pos = { {100,100} , {300,300} }; float[] rot = { 0.0 , 0.0 }; int[][] keys = { {37,39} , {65,68} }; int[] colors = { #ff0000 , #00ff00 }; int[] open_count = { 0 , 0 }; int[] score = new int[players]; boolean[] dead; int players_left; boolean[] keys_down = new boolean[256]; boolean[][] walls; int left_offset = 27; int size_width = 320; int size_height = 240; int counter_lo = 50; int counter_hi = 100; int open_for = 6; final int MENU = 0; final int WAIT = 1; final int GAME = 2; int state = WAIT; int wait_counter = 0; final int wait_time = 50; PFont font12; PFont font16; void setup () { size (size_width, size_height); frameRate (50); font12 = loadFont ("MS-Mincho-12.vlw"); font16 = loadFont ("MS-Mincho-16.vlw"); background (0); fill (#ffffff); rect (left_offset - 2, 0, 2, size_height); create_menu (); } void create_menu () { state = MENU; fill (#ffffff); textAlign (CENTER); textFont (font16); text ("Achtung die Kurve!", size_width / 2 + left_offset / 2, 50); textFont (font12); text ("Press to start game", size_width / 2 + left_offset / 2, 70); if (!online) text ("Press to exit game", size_width / 2 + left_offset / 2, 83); textAlign (LEFT); for (int i = 0; i < players; i ++) score[i] = 0; } void new_game () { walls = new boolean[size_width][size_height]; dead = new boolean[players]; wait_counter = 0; players_left = players; state = WAIT; noStroke (); fill (0); rect (left_offset, 0, size_width, size_height); for (int i = 0; i < players; i ++) { draw_score (i); open_count[i] = int(random (counter_lo, counter_hi)); rot[i] = random (0, PI); pos[i][0] = random (left_offset + 20, size_width - 20); pos[i][1] = random (20, size_height - 20); walls[int(pos[i][0] - sin (rot[i])*5)][int(pos[i][1] + cos (rot[i])*5)] = true; stroke (colors[i]); line (pos[i][0], pos[i][1], pos[i][0] - sin (rot[i])*5, pos[i][1] + cos (rot[i])*5); arrayCopy (pos[i], last_pos[i]); } } void draw () { switch (state) { case MENU: break; case WAIT: wait_counter ++; if (wait_counter > wait_time) { state = GAME; wait_counter = 0; } break; case GAME: noStroke (); for (int i = 0; i < players; i ++) { if (dead[i]) continue; if (players_left <= 1) { score [i] ++; draw_score (i); if (score [i] >= 10) create_menu (); else new_game (); break; } if (keys_down[keys[i][0]]) rot[i] = rot[i] - 0.05; else if (keys_down[keys[i][1]]) rot[i] = rot[i] + 0.05; pos[i][0] += sin (rot[i]); pos[i][1] -= cos (rot[i]); float x = pos[i][0]; float y = pos[i][1]; float old_x = last_pos[i][0]; float old_y = last_pos[i][1]; if (x <= left_offset || x >= size_width || y <= 0 || y >= size_height) { kill (i); continue; } else if (walls[int(x)][int(y)]) { kill (i); continue; } open_count[i]--; if (open_count[i] > open_for) { walls[int(old_x)][int(old_y)] = true; stroke (colors [i]); line (last_pos[i][0], last_pos[i][1], pos[i][0], pos[i][1]); } else if (open_count[i] <= 0) { open_count[i] = int(random (counter_lo, counter_hi)); } arrayCopy (pos[i], last_pos[i]); } break; } } void kill (int i) { dead[i] = true; players_left --; } void draw_score (int i) { noStroke (); textFont (font12); fill (0); rect (7, 10 + (i*15), 16, 11); fill (colors[i]); text (score[i], 10, 20 + (i*15)); } void keyPressed () { // shortcuts switch (keyCode) { case 10: if (state == MENU) new_game (); break; case 113: create_menu (); break; } keys_down[keyCode] = true; } void keyReleased () { keys_down[keyCode] = false; }