Skip to content

Instantly share code, notes, and snippets.

@schlompf
Created October 4, 2012 18:27
Show Gist options
  • Save schlompf/1238847cfd5e1e510b56 to your computer and use it in GitHub Desktop.
Save schlompf/1238847cfd5e1e510b56 to your computer and use it in GitHub Desktop.
gameLoop for indesign script
#targetengine "gameTime"
//app.scriptPreferences.enableRedraw = true;
var debug = false;
var ID_GAME = {};
ID_GAME.game = (function () {
var xPos = 10;
var yPos = 10;
var player;
var board;
var bg;
var doc
var w;
var colorRandom;
ID_GAME.dimensions = 200; // board is square, size 200
var frameLength = 33; // let's hope for 30 fps ;)
function init() { // initialize some stuff
w = new Window ("palette", "super ascii");
var stopButton = w.add ("button", undefined, "stop it!");
stopButton.onClick = function () {stop();};
var restartButton = w.add("button", undefined, "restart");
restartButton.onClick = function () {stop();init();}
t = w.add ("statictext", undefined, "blibablub");
t.characters = 40;
w.show ();
w.onClose = function () {stop(true);};
bindEvents();
doc = app.documents.add({ // create new document for the game
documentPreferences:{
pageWidth : ID_GAME.dimensions,
pageHeight : ID_GAME.dimensions,
facingPages: false
}
});
setupColors();
board = doc.pages[0]; // first page is our gameboard
bg = board.rectangles.add({geometricBounds:[0, 0, ID_GAME.dimensions, ID_GAME.dimensions]}); //add rectangle to fill whole page
bg.fillColor = "Black"; //fill black
bg.strokeWeight = 0; // no stroke
bg.locked = true; // lock rect, so no one messes with it ;)
app.activeWindow.screenMode = ScreenModeOptions.PREVIEW_TO_PAGE; // switch to preview-mode
app.activeWindow.viewDisplaySetting = ViewDisplaySettings.HIGH_QUALITY; // we want high-quality!
app.activeWindow.zoom(ZoomOptions.ACTUAL_SIZE); // zoom to 100%
//add center point for reference
board.rectangles.add({fillColor: "Paper", strokeWeight: 0, geometricBounds:[ID_GAME.dimensions/2-0.5, ID_GAME.dimensions/2-0.5, ID_GAME.dimensions/2+0.5, ID_GAME.dimensions/2+0.5]});
player = ID_GAME.player();
}
function setupColors() {
try{
colorRandom = doc.colors.item("randomColor");
//If the color does not exist, trying to get its name will generate an error.
cName = c1.name;
} catch (error){
//The color style did not exist, so create it.
colorRandom = doc.colors.add({name:"randomColor", model:ColorModel.process,
colorValue:[Math.random()*100, Math.random()*100, Math.random()*100, Math.random()*100]});
}
}
function bindEvents() {
var gameLoopTask = app.idleTasks.add({name:"gameLoop", sleep: frameLength}); //HACK: create idleTask for a gameloop, setTimeout/setInterval not available
var gameLoopTaskEventListener = gameLoopTask.addEventListener(IdleEvent.ON_IDLE, gameLoop, false);
$.writeln("Created gameLoop/idle task " + gameLoopTask.name + "; added event listener on " + gameLoopTaskEventListener.eventType);
w.addEventListener ("keydown", function (key) {
keyDown(key);
});
//~ w.addEventListener ("keyup", function (key) {
//~ keyUp(key);
//~ });
}
function keyDown (k){
var direction = k.keyName;
if (direction) {
player.move(direction);
}
}
//~ function keyUp (k){
//~
//~ }
function stop(onClose) {
if (app.idleTasks.length == 0) {
alert("There is no idle task.");
} else {
var idleTaskName = "gameLoop";
var idleTask = app.idleTasks.itemByName(idleTaskName);
if (idleTask != null) {
idleTask.remove();
alert("idle task removed!");
} else {
alert("There is no idle task named " + idleTaskName);
}
}
w.removeEventListener ("keydown", function (key) {keyDown (key)});
//w.removeEventListener ("keyup", function (key) {keyUp(key);});
if(onClose != true) {
w.close(); //close "console"-panel
}
if(app.activeDocument == doc){
doc.close(SaveOptions.no); //close document without saving
}
}
var angle = 0;
function gameLoop() { //gameLoop Code
var radians = angle * (Math.PI/180);
var radius = 30;
player.pos.x = ID_GAME.dimensions/2 + Math.cos(radians) * radius;
player.pos.y = ID_GAME.dimensions/2 + Math.sin(radians) * radius;
angle += 6;
t.text = "pos.x: " + (Math.round(player.pos.x*100)/100) + " pos.y: " + (Math.round(player.pos.y*100)/100);
if(angle%6 == 0) {
colorRandom.colorValue = [Math.random()*100, Math.random()*100, Math.random()*100, Math.random()*100];
}
bg.locked = false;
bg.fillColor = "randomColor"; //fill black
bg.locked = true;
player.draw(board);
}
return {
init: init
};
})();
ID_GAME.player = function () {
var size = 5;
var pos = {};
pos.x = 10;
pos.y = 10;
var square;
function draw(board) {
if( typeof square == 'undefined' ) { //square doesn't exist? No?
square = board.textFrames.add({name: "player", label: "player", contents: "H", geometricBounds: [pos.y-size/2, pos.x-size/2, pos.y+size/2, pos.x+size/2]});
//square = board.rectangles.add({name: "player", label: "player", geometricBounds: [pos.y-size/2, pos.x-size/2, pos.y+size/2, pos.x+size/2]}); // add little square
square.paragraphs.item(0).fillColor = "Paper"; // fill white/paper
square.paragraphs.item(0).pointSize = 14;
square.paragraphs.item(0).justification = Justification.centerAlign;
square.locked = true;
} else {// yes, it does!
square.locked = false;
square.geometricBounds = [pos.y-size/2, pos.x-size/2, pos.y+size/2, pos.x+size/2]; // draw rect around center-position pos.y pos.x, (y1,x1,y2,x2)
square.locked = true;
}
if(debug == true) {
$.writeln("drawn!");
}
}
//~ function setDirection(direction) {
//~ switch(direction) {
//~ case "Up":
//~ pos.y -= 1;
//~ break;
//~ case "Down":
//~ pos.y += 1;
//~ break;
//~ case "Left":
//~ pos.x -= 1;
//~ break;
//~ case "Right":
//~ pos.x += 1;
//~ break;
//~ }
//~ }
function move(direction) {
switch(direction) {
case "Up":
pos.y -= 1;
break;
case "Down":
pos.y += 1;
break;
case "Left":
pos.x -= 1;
break;
case "Right":
pos.x += 1;
break;
}
}
return {
draw: draw,
move: move,
pos: pos
};
};
app.doScript(ID_GAME.game.init, ScriptLanguage.javascript, undefined,
UndoModes.fastEntireScript, "Game started");
@ff6347
Copy link

ff6347 commented Oct 4, 2012

Okay. Das sieht ja schonmal fleissig aus. Ich freu mich drauf!
Beste Grüsse
:fab

@ff6347
Copy link

ff6347 commented Oct 6, 2012

Wenn das Spiel zu Ende ist, sollte ein Chart mit Scores stehen bleiben als Ergebnis.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment