PDA

Volledige versie bekijken : Puzzle script probleem


moonwalker
%Europe/Berlin %700 %2006, 16:48
Hallo,

Ik heb een probleem met een scriptje. Niet dat het niet werkt...Het werkt perfect als je de muis gebruikt, maar ik wil juist pijltoetsen gebruiken.

De code op de eerste frame ziet er zo uit:

if (!initialized) {
Initialize();
initialized = true;
}

function PieceX(col)
{
return xBase + col * xSpace;
}

function PieceY(row)
{
return yBase + row * ySpace;
}

// Subroutine Initialize
// Puzzle Initialization Code
function Initialize()
{
Congratulations.stop();
// Set dimensions of game grid
numRows = 4;
numCols = 3;
numCells = numRows*numCols;

xBase = p0._x;
yBase = p0._y;
xSpace = p0._width * 1.025;
ySpace = p0._height * 1.025;

// Create pieces
var c = 1;
var r = 0;
for (var i=0; i<numCells-1; i++) {
var name = "p" + i;
var newPiece = eval(name);
newPiece._x = PieceX(c);
newPiece._y = PieceY(r);
newPiece.PieceNumber = i+1;
if (++c >= numCols) {
c = 0;
r++;
}
}

// Set initial positions of each cell, including empty space
posArray = [];
for (i=0; i<numCells-1; i++) {
posArray[i] = i;
}
empty = numCells-1;
}

// Subroutine Winner
// Tests whether the current piece positions is a winning position (that is, every piece in sequence)
function isWinner()
{
for (var i = 0; i<numCells-1; i++) {
if (posArray[i] != i) {
return false;
}
}
return true;
}

// Subroutine Click
// Puzzle click handler.When a piece is clicked, determine if it is adjacent to the empty space. if it is, move it into the empty space.
// Check if this is a winner
function Click(clicked)
{
clicked--;

if (isWinner()) {
// Start a new game
shuffle();
// Get rid of the congratulations message
Congratulations.gotoAndStop(1);
} else {
// Get the position of the clicked piece
pos = posArray[clicked];
// Get row, column of empty spot
emptyRow = Math.floor(empty/numCols);
emptyCol = empty-emptyRow*numCols;
// Get row, column of clicked piece
clickedRow = Math.floor(pos/numCols);
clickedCol = pos-clickedRow*numCols;
// Test adjacency
// adjacent(i, j) = i is above j or i is below j, or i is left of j or i is right of j
rowDiff = Math.abs(clickedRow-emptyRow);
colDiff = Math.abs(clickedCol-emptyCol);
adjacent = (rowDiff+colDiff) == 1;
if (adjacent) {
// Move the movie clip for the piece
var piece = eval("/p" + clicked);
piece._x = PieceX(emptyCol);
piece._y = PieceY(emptyRow);
// Swap the clicked piece with the empty space
posArray[clicked] = empty;
empty = pos;
// If this is a winner, start the winning movie clip
if (isWinner()) {
Congratulations.play();
}
}
}
}

function Shuffle()
{
// We want to arrange the cells in a random
// order. We do this by generating a random
// number r(i) for each cell i, and sorting
// the pairs (i, r(i)) using r(i) as the key.

// Comparison function for the sort
var cf = function (x, y) {
if (x[1] < y[1]) {
return -1;
} else if (x[1] > y[1]) {
return 1;
} else {
return 0;
}
}
var i;
var cell = [];
for (i=0; i<numCells; i++) {
cell.push([i, Math.random()]);
}
cell.sort(cf);

// We've sorted the ordered pairs...
// Now position the pieces according
// to the new order.
var r = 0, c = 0;
for (i=0; i<numCells; i++) {
var piece = cell[i][0];
if (piece == numCells-1) {
empty = i;
} else {
posArray[piece] = i;
var p = eval("/p" + piece);
p._x = PieceX(c);
p._y = PieceY(r);
}
if (++c >= numCols) {
c = 0;
r++;
}
}
}

In elke movieclipje zit de volgende code:
onClipEvent (mouseDown) {
if (hitTest(_root._xmouse, _root._ymouse, false)) {
var MovNum = Number(substring(this._name,2,1)) + 1;
_root.Click(MovNum);
}
}

Ik heb geprobeerd om het op te lossen met de code in de movieclipjes te veranderen naar:

onClipEvent (keyDown) {
if (Key.getCode() == Key.RIGHT) {
var MovNum = Number(substring(this._name, 2, 1))+1;
_root.Click(MovNum);
} else if (Key.getCode() == Key.LEFT) {
var MovNum = Number(substring(this._name, 2, 1))+1;
_root.Click(MovNum);
} else if (Key.getCode() == Key.UP) {
var MovNum = Number(substring(this._name, 2, 1))+1;
_root.Click(MovNum);
} else if (Key.getCode() == Key.DOWN) {
var MovNum = Number(substring(this._name, 2, 1))+1;
_root.Click(MovNum);
}
}

Alleen beginnen alle stukjes mee te bewegen. Bovendien beweegt het sowieso alle kanten op of je nou op links, rechts, boven of beneden klikt.

En nog een laatste opmerking. De code schijnt alleen maar te werken als je hem draait onder Flash 5. Probeer ik hem onder Flash 8 te draaien met actionscript 2 doet ie niets...

Alvast bedankt voor de hulp.

mw

Pimm
%Europe/Berlin %744 %2006, 17:52
Je vraagt om te veel. Als je de code zelf had geschreven zou je weten hoe het moet, je hebt de code dus ergens vandaan en wilt 'm nu geëdit hebben. Misschien heb je geluk en komt er iemand langs met goede zin die het voor je doet, anders moet je misschien hier (http://flashfocus.nl/forum/forumdisplay.php?f=22) maar eens meer geluk gaan zoeken...

P.S. Bij mij doet hij het in Flash 8 hoor...

moonwalker
%Europe/Berlin %749 %2006, 17:59
Was ook niet mijn bedoeling om te veel te vragen. Als het teveel is, dan vraag ik hierbij aan een moderator om het te verwijderen. Ik zoek het wel eff uit zelf...

Als je beneden kijkt bij properties staat daar Publish ==> settings. Daar staat Flash 5. Als je het naar 8 verandert doet ie het niet meer, dat is wat ik bedoelde.

Bedankt voor je reactie in ieder geval. Ik ga er wel mee aan de slag. En ja het klopt dat ik de code van iemand anders heb. Ben nog niet zover om zo een script uit mijn hoofd te kunnen schrijven.

mw

Pimm
%Europe/Berlin %753 %2006, 18:05
Ik zie het, tot Flash MX (6) doet hij het, export je 'm hoger werkt hij niet meer.

Oh, en mijn post was ook niet offensief bedoelt, ik denk gewoon dat je te hoog grijpt door een schuifpuzzel te maken.

B.t.w. Schuifpuzzels zijn het leukste als ze 4 x 4 of 5 x 5 zijn, zei de schuifpuzzel verslaafde ;)

moonwalker
%Europe/Berlin %762 %2006, 18:17
Ik neem je helemaal niets kwalijk Pimm. Heb ik ook niet als offensief ervaart, maak je geen zorgen. Ben zelf een PHP programmeur en ben net begonnen me te verdiepen in actionscript. Ik weet hoe het is om een script van iemand anders te pakken en het proberen te editen, maar doordat we een project hebben die we deze week moeten inleveren had ik geen keus.

mvg,

mw