There's a snake in my flute!
-
Content.makeFrontInterface(700, 500); const var CANVAS_SIZE = 40 const var TILE_SIZE = 10; reg lastKey = 0; reg score = 0; const var drawCanvas = function(g) { g.fillAll(0xFFFFFFFF); g.setColour(0xFF000000); //Canvas is drawn as a grid of tiles for (i = 0; i < CANVAS_SIZE*TILE_SIZE; i++) { for (j = 0; j < CANVAS_SIZE*TILE_SIZE; j++) { g.fillRect([i*TILE_SIZE, j*TILE_SIZE, TILE_SIZE, TILE_SIZE]); } } } const var drawBoard = function(g) { reg segment; g.setColour(0xFF00FF00); for (i = 0; i < path.getLength(); i++) { segment = path.getElementAt(i); g.fillRect([segment.x*TILE_SIZE, segment.y*TILE_SIZE, TILE_SIZE, TILE_SIZE]); } //Draw food g.setColour(0xFFFF0000); g.fillRect([food.getX()*TILE_SIZE, food.getY()*TILE_SIZE, TILE_SIZE, TILE_SIZE]); } const var background = Content.addPanel("background", 0, 0) background.set("width", CANVAS_SIZE*TILE_SIZE+20); background.set("height", CANVAS_SIZE*TILE_SIZE+20); background.setPaintRoutine(function(g){g.fillAll(0xFFFFFFFF);}); const var canvas = Content.addPanel("canvas", 10, 10); canvas.set("width", CANVAS_SIZE*TILE_SIZE); canvas.set("height", CANVAS_SIZE*TILE_SIZE); canvas.setPaintRoutine(drawCanvas); //Snake and food drawn on another panel over canvas - this means the canvas doesn't have to be redrawn for each update const var board = Content.addPanel("board", 0, 0); board.set("width", CANVAS_SIZE*TILE_SIZE); board.set("height", CANVAS_SIZE*TILE_SIZE); board.set("parentComponent", "canvas"); board.setPaintRoutine(drawBoard); const var btnStart = Content.addButton("btnStart", 450, 0); btnStart.set("text", "Start/Pause"); const var lblScore = Content.addLabel("lblScore", 450, 50); lblScore.set("width", 150); lblScore.set("height", 50); lblScore.set("text", "Points: 0"); lblScore.set("textColour", 0xFF000000); lblScore.set("fontSize", 24); lblScore.set("alignment", "left"); const var knbSpeed = Content.addKnob("knbSpeed", 450, 100); knbSpeed.set("text", "Speed"); knbSpeed.setRange(1, 5, 1); const var gameLoop = Engine.createTimerObject(); inline function checkDirection() { switch(lastKey) { case controls.N: if (path.getDirection() != controls.S) path.setDirection(controls.N); break; case controls.S: if (path.getDirection() != controls.N) path.setDirection(controls.S); break; case controls.E: if (path.getDirection() != controls.W) path.setDirection(controls.E); break; case controls.W: if (path.getDirection() != controls.E) path.setDirection(controls.W); break; } switch(path.getDirection()) { case controls.N: path.moveHead(0, -1); break; //Keep moving n case controls.S: path.moveHead(0, 1); break; //Keep moving s case controls.E: path.moveHead(1, 0); break; //Keep moving e case controls.W: path.moveHead(-1, 0); break; //Keep moving w } } //Check for a collision with the edge of the canvas inline function checkBoundary() { reg head = path.getHead(); if (head.x < 0 || head.x+1 > canvas.get("width")/TILE_SIZE || head.y < 0 || head.y+1 > canvas.get("height")/TILE_SIZE) { return true; } return false; } //Check for a collision with food inline function checkFood() { reg head = path.getHead(); if (head.x == food.getX() && head.y == food.getY()) { return true; } return false; } //Check if the snake has eaten itself inline function checkCannibalism() { reg head = path.getHead(); reg segment; for (i = 1; i < path.getLength(); i++) //Start at 1 to skip head { segment = path.getElementAt(i); if (head.x == segment.x && head.y == segment.y) { return true; } } return false; } gameLoop.callback = function() { if (checkBoundary() == true || checkCannibalism() == true) { gameLoop.stopTimer(); path.reset(); lastKey = 0; btnStart.setValue(0); lblScore.set("text", "***GAME OVER***"); } else if (checkFood() == true) { food.changePosition(); path.grow(); lblScore.set("text", "Points: " + ++score); } path.ripple(); checkDirection(); board.repaint(); }; namespace controls { const var N = 60; const var S = 62; const var E = 65; const var W = 64; } namespace food { reg posX; reg posY; inline function changePosition() { posX = Math.randInt(0, CANVAS_SIZE-1); posY = Math.randInt(0, CANVAS_SIZE-1); } inline function getX() { return posX; } inline function getY() { return posY; } } namespace path { reg posX = []; reg posY = []; reg direction; inline function reset() { posX = [CANVAS_SIZE/2]; posY = [CANVAS_SIZE/2]; direction = 0; } function grow() { posX.push(0); posY.push(0); } inline function ripple() { for (i = posX.length-1; i > 0; i--) { posX[i] = posX[i-1]; posY[i] = posY[i-1]; } } inline function getHead() { return {"x":posX[0], "y":posY[0]}; } inline function moveHead(x, y) { posX[0] = posX[0]+x; posY[0] = posY[0]+y; } inline function getElementAt(i) { return {"x":posX[i], "y":posY[i]}; } inline function getLength() { return posX.length; } inline function getDirection() { return direction; } inline function setDirection(d) { direction = d; } }function onNoteOn() { if ([controls.N, controls.S, controls.E, controls.W].contains(Message.getNoteNumber())) { lastKey = Message.getNoteNumber(); } } function onNoteOff() { } function onController() { } function onTimer() { } function onControl(number, value) { if (number == btnStart) { if (value == 0) { gameLoop.stopTimer(); } else { path.setDirection(0); food.changePosition(); lblScore.set("text", "Points: 0"); gameLoop.startTimer(50*(6-knbSpeed.getValue())); } } }
-
omg bravo D.Healey!
-
Great! I need to dust off the Pong script then we can make a HISE Retro Games collection.
-
Just had a reason to fix this for the latest HISE, so here's the snippet (this is not my finest work and there is much room for improvement!)
HiseSnippet 2597.3ocsYztaaibjJIL4j5kCIEGJ5O25ebUN9CQ4ZmqHt4Z7GxWMhsiPTtj3ZXDrhbkzFSQRPtx1p476P+UeB56QA5STeCtNytbIWJQonXfSvFf678L6ryLbY63PWVRRXrUkpuYbDypxWa2YbfXvdCn7.qC22px2XeLMQvhIJP6NNhljv7rpT4t+HBnR06YI+8+9q6R8oAtrbPVVuMj6xNhOjKxg19Euj66e.0i8F9PCp27EG5FFrWne3HvdtqsiUD08BZe1ITjr6XaU49s73hv3NBpfk.zran23NCBuJPQ+a4I7t9LbQSqNffTfs1a.22qs1WSrrpbu14d9cUd92ZeL2imAOOB7HIBRNGlwfJ2YdlTyu.SphgIcOkI8X6Ntw7HQNFzd9M1GF.aH8nPn1zTTzZcmG86r2KDnHPr9P5ErChgEYbT+6cbVkrkiyxaWqFDtSDjKovl6Nm71c57gNG92aQdNYSGCTu4viZoQzzY6Zwr9DeHk3krw.jT.ItgwL0RCV8hoWsGM3RZBfp2n.WAOLnd+kq8op0p1e8dPZvN990ct9fzefQIwjvDp7.ING4ODWiFohimHEd.AdlR5Gy8Hg8HBtOKoV0dgwj5bo0P3j+hoy8jLuAPsxJKWq5mpUUwvGUL7wYyvGkLH4H05eMyUT+LdNQqR9n4hxd7bzQpdSM3ualLXsaHM1axXUspH5DV+gvV5LBP3+pf2jNeDULX89LwQrf9hA0W1zuSkIPrlpV9LDxNh5boYVqnmlxv5Wa5jZfiWHO+FzHazXevaI8BC8l1aTa3HslpFoEsv2WeYS8nAeZQvyR8Eh3cgxK8iCGEfgb8QFpmWaZ.yu9R4nWZUBbnwY4Z4fPat9RWw8DC.rklvrxFnSLIKCX79CDeI7zFJDIdc3HAOfU2Hy3SkeB5lhmrc0m+l1AUn.SooC9OvmBxB3aSP67cpBDWvaxKPfFciFcBfBVDJrgf6qoGwCgS4AghAPOnHzvIgWxx7q0HhAPwfgLZPB7HSC2KjkD7GEjAzKYDQHoKiDyTxCOgvntCHih7fh1lIDoG+JIW.wnSCfMHb4hElLH8yFkLnMhFCVvdgCiBCfG.lzaWlzMUvTV.oXBPWQ.zbJVTzu1cjP.YQKowBJXyszdWJLkkHXWKUuDTi1zQIrkJpA+t9cRq+angincwHmFoVAagZPCrXHrYI3xhYkfSaYsCgnPxyHNKUJIpRK3lmYujhz0Cr6N7+AZkar4TXo979ACS2F7Y8DSD.tHnamHFahTmWFD1s9RZbZ+uoT6ZnSDhkDNA5WSC5yp2Dh..yE0aeXvniBCi.81JnOjCrtaLCRow4pheU2OhENQN3A9.xrtJD2AL2K1mGyTkRj8XRthKbGTOsyN1fPV82kl.mo.mJNzOY8SdFg2iTW2svPDj+vyyIqyxpFJIljjKDnGTWvNuX6ojemES9mLW42Y1xu0hI+2MW42Z1x+cKl7aMW4+NC4C8qz6LkHzz13SsGIIcHTl7uwnd0gjt0ZlISRiFujwhH.ZdPeRPY6ASw+LYOorPbQ1aJKpTN6rxhfEYes4w+UoSQAyEhozxR6TPX99vX2PhND4FH6Jv75yjSHl0gn7CE6hMcowiUmIvIaG.Fgw.RRaBOSUE2nQjqeMLkkC4m+YhZ0JMI+PpNPFzk2VtQ9fzZZGWfywSwYZwOCVS2wiYhQwADQ7HlZjpT.8n9Irs+rQD4bWk5+G.XT9tenK0eVde0Bt+yeNwX5Lx28cZuy.woYYqy21ghNFVOWsikHGKX.zVGqtEP3hDleux8.Xbh.dWnhcxvEwQTXMGtNa.5lya.ZHQT0UkJHMwALRtfGI0xhNZcw.X1j0ECeYyVm8hGECep2iX5secmArDiravdTeebrx7AHkAGzHlHwGUKJcLub5HpFa5lYtdDgQREIipUkNcLC6tIWW3EFqV0bBi2R8Gwp6nHqz96O4IO4G243VjW81VuFddozWifANKIyATYtSXdxrO2AXGz1gIbkemYevH1WUeN5UOWwRjUHqrh7UbydCFkCxih7YfH..S1SEHTMlVLKBmRCgHGMO.BYIQvqhmUzC2HxapeBDjdJFkxA0AAsQAP3ai+zsJ.5cHnMka+45PNGstVVTXx62N6wSUmim5PTwnkJPhbBh+XoWCymeH3PNEFjEawnH7zEgvaJS2pBHEJSjZxyh7Sml7S2NsoPdP.2rLiAfAd14FABy0d5sPYM9IzXZFcgXxYF9ViMN2HHTBlLomdRP5W4NjLgLW5qGMJYP5QCTlFqKMfnyGMtUCrPlTT9xxWqIKp8CxKGXs0xJpfTbF+7TZOiuVSo0JUZF7SyfqJ5PHjR2ST0VKrs7oktdomIEsy4vAqwxEmBKtQ4Jk3KYC.b8pjwFwDfIsY5b9JWqCMYfwmVY7bRYLqCOCijaZjbsQVpzzcElJoMMfOGVMG.2jaiLvx4svXidoLalY4oNBjwPXvIgB1qLp4eV93hqZL5mwysLd9cmuN9LTFKo9wrjDZeF1QCE5IiF1EK5q6tmWneFDh0JuAaxOo00qmx7.TDCb6oLBej2RPm1yY1LVOPp3UgRj9Xegz.fBJ1tP2KZYhxCPrRZQjN4W32L5zgYuxNQYmklZxd0A3Y2Lp5B7ZsEs.vbUlvVNOo9SWK60E6qamB6G42xnUk6U7Rpu+hcI0tp2k0fvvfCC3hWEwRWePnuGd4y3ySek1VouLLd41o6F.oB4Ua+MoWscGetGK1hCBols1Orjw+7uLvidg0Oc39TAUKIPnfhhXwBN5OU1mcI2kotz7p16yRt.1jrpXmc+IfOqz6C0WoNduNR09014W2l00.SUPUNV+fb5cPp2+eWQYLpgxMgXsHp4qrUS1qTQMsJpYph+4TpPCAc6Lc7fYoiGXKG4XddwrUwD23jgEaMst0aepqQJc6SeRRo++aEC8i4zRKN+RjrRnWxNLnsrmJ98KXATHID+VKGwnwAHHSMWqnWKudoTEqO+Lgh2vzw+WVS53ajBQYaO1dhwLsxu6HjZfveAoVeSQHreepDxteHX+2FuenBgrGtHY7EsbOPnIhw3Qx6ai2ij0PtmmeVcCiu51+IQvhRMnruD2vheXtgzqyW9suHYTud7qkeQsdb+gIBvrNbHTq1pxu09mfRYdrdzQ9B7cZBrfdOWv7dSnjdUr5A1Ji1Z5OY0irONzajOUT7KngepvTDn4a9YqvOMU.3ViMs3ufOqlyb+rZKpI9X613srTtMdmRrQ3L4uF1X5Gi7g1s50CZejaf2y9f2ea+xieF0qt.49vL6wXZgMzptCj06x.sG.0VRvTx6f04Tqczmp6vB7jK9E3WJxl35JoHapQZMj5FG9A8DEPv6qjP.aJP90cqZeLtlzTW6211YcGLsm+AWWz8WCZwTNOabK34OcK3YyaAOacK34o2Bd99aAO+44xCVHdmQhvgpiC.f1sj8fqTokrRsLKz5+CXEpsEM
-
@d-healey I made one about a year ago, I'll look if I can find it back :)
It was part of a game bundle I planned to release for iOS but it'll probably never see the daylight...
It was using the MIDI keyboard but now keys are handled in panels I'll try an update :)