Hi, I have created a simple snake game in GTK C#. Everything works, except for the keyboard control.
I have tried everything I have come to. I did the [GLib.ConnectBefore], I have overridden the default handler, I have experimented with the focus. Nothing worked for me. http://www.nabble.com/file/p21592773/apple.png apple.png http://www.nabble.com/file/p21592773/dot.png dot.png // snake.cs ------------------------------------ using Gtk; using System; class Snake : Window { public Snake() : base("Snake") { SetDefaultSize(300, 270); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; Add(new Board()); ShowAll(); } public static void Main() { Application.Init(); new Snake(); Application.Run(); } } // board.cs -------------------------------------- using System; using Gtk; using Cairo; public class Board : DrawingArea { private const int WIDTH = 300; private const int HEIGHT = 300; private const int DOT_SIZE = 10; private const int ALL_DOTS = 900; private const int RAND_POS = 29; private int[] x = new int[ALL_DOTS]; private int[] y = new int[ALL_DOTS]; private int dots; private int apple_x; private int apple_y; private bool left = false; private bool right = true; private bool up = false; private bool down = false; private bool inGame = true; private ImageSurface dot; private ImageSurface apple; private ImageSurface head; public Board() { //BackColor = Color.Black; //DoubleBuffered = true; ModifyFg(StateType.Normal, new Gdk.Color(0, 0, 0)); SetSizeRequest(320, 310); KeyReleaseEvent += OnKeyUp; DeleteEvent += delegate { Application.Quit(); }; Show(); //GrabFocus(); ExposeEvent += OnExpose; try { dot = new ImageSurface("dot.png"); head = new ImageSurface("head.png"); apple = new ImageSurface("apple.png"); } catch { Console.WriteLine("Images not found"); Environment.Exit(1); } initGame(); } bool OnTimer() { if (inGame) { checkApple(); checkCollision(); move(); QueueDraw(); return true; } else { return false; } } private void initGame() { dots = 3; for (int z = 0; z < dots; z++) { x[z] = 50 - z * 10; y[z] = 50; } locateApple(); //KeyUp += new KeyEventHandler(OnKeyUp); //KeyPressEvent += OnKeyUp; GLib.Timeout.Add(100, new GLib.TimeoutHandler(OnTimer)); ExposeEvent += OnExpose; } void OnExpose(object sender, ExposeEventArgs e) { DrawingArea area = (DrawingArea) sender; Cairo.Context cr = Gdk.CairoHelper.Create(area.GdkWindow); if (inGame) { cr.SetSourceRGB(0, 0, 0); cr.Paint(); cr.SetSourceSurface(apple, apple_x, apple_y); cr.Paint(); for (int z = 0; z < dots; z++) { if (z == 0) { cr.SetSourceSurface(head, x[z], y[z]); cr.Paint(); } else { cr.SetSourceSurface(dot, x[z], y[z]); cr.Paint(); } } ((IDisposable) cr.Target).Dispose(); ((IDisposable) cr).Dispose(); } else { gameOver(cr); } } void gameOver(Cairo.Context cr) { string message = "Game Over"; //StringFormat format = new StringFormat(); //format.Alignment = StringAlignment.Center; //format.LineAlignment = StringAlignment.Center; //g.DrawString(msg, Font, Brushes.White, ClientRectangle, format); //cr.ShowText(); int x = Allocation.Width / 2; int y = Allocation.Height / 2; TextExtents extents = cr.TextExtents(message); cr.MoveTo(x - extents.Width/2, y); cr.TextPath(message); cr.Clip(); cr.Stroke(); inGame = false; } void checkApple() { if ((x[0] == apple_x) && (y[0] == apple_y)) { dots++; locateApple(); } } void move() { for (int z = dots; z > 0; z--) { x[z] = x[(z - 1)]; y[z] = y[(z - 1)]; } if (left) { x[0] -= DOT_SIZE; } if (right) { x[0] += DOT_SIZE; } if (up) { y[0] -= DOT_SIZE; } if (down) { y[0] += DOT_SIZE; } } void checkCollision() { for (int z = dots; z > 0; z--) { if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) { inGame = false; } } if (y[0] > HEIGHT) { inGame = false; } if (y[0] < 0) { inGame = false; } if (x[0] > WIDTH) { inGame = false; } if (x[0] < 0) { inGame = false; } } void locateApple() { Random rand = new Random(); int r = (int) (rand.Next(RAND_POS)); apple_x = ((r * DOT_SIZE)); r = (int) (rand.Next(RAND_POS)); apple_y = ((r * DOT_SIZE)); } //protected override bool OnKeyReleaseEvent(Gdk.EventKey e) [GLib.ConnectBefore] void OnKeyUp(object sender, KeyReleaseEventArgs args) { //int key = (int) e.KeyValue; //base.OnKeyPressEvent(e); Console.WriteLine("key"); //Gdk.Key key = e.Key; Gdk.Key key = args.Event.Key; if ((key == Gdk.Key.Left) && (!right)) { left = true; up = false; down = false; } if ((key == Gdk.Key.Right) && (!left)) { right = true; up = false; down = false; } if ((key == Gdk.Key.Up) && (!down)) { up = true; right = false; left = false; } if ((key == Gdk.Key.Down) && (!up)) { down = true; right = false; left = false; } //return true; } } -- View this message in context: http://www.nabble.com/Keyboard-problem-in-a-Snake-game-tp21592773p21592773.html Sent from the Mono - Gtk# mailing list archive at Nabble.com. _______________________________________________ Gtk-sharp-list maillist - [email protected] http://lists.ximian.com/mailman/listinfo/gtk-sharp-list
