PDA

Просмотр полной версии : узнать грань игральной кости


Wadimir
16.04.2013, 13:41
Приветствую!

Есть игральная кость на 2д плоскости. И стрелки управления: вверх, вниз, влево, вправо. При клике на стрелку кость перекручивается в соответствующую сторону. Как узнать какую грань показывать?

Hauts
16.04.2013, 14:08
Зачем спрашивать вещи, которые с легкостью находится на просторах интернета?

Википедия (http://ru.wikipedia.org/wiki/%D0%98%D0%B3%D1%80%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D0%BA%D0%BE%D1%81%D1%82%D1%8C) в помощь же.

MoHaX
16.04.2013, 14:18
я бы сделал так :)

кубик у меня такой


[5]
[4][1][2]
[3]
[6]


import flash.ui.Keyboard;
import flash.events.KeyboardEvent;

var cub : Array = [[3,1,4,2],[0,5,4,2],[3,1,0,5],[5,0,4,2],[3,1,5,0],[1,3,2,4]];
var cubFace : int = 0;


stage.addEventListener(KeyboardEvent.KEY_DOWN, onKD);

function onKD (e: KeyboardEvent) : void {
if(e.keyCode == Keyboard.LEFT){
cubFace = cub[cubFace][0];
}
if(e.keyCode == Keyboard.RIGHT){
cubFace = cub[cubFace][1];
}
if(e.keyCode == Keyboard.UP){
cubFace = cub[cubFace][2];
}
if(e.keyCode == Keyboard.DOWN){
cubFace = cub[cubFace][3];
}
trace('cubFace:'+ (cubFace + 1));
}

Gaen
16.04.2013, 16:44
Насколько я помню, у кубика сумма противоположных граней должна равняться 7. Т.е будет вот так:

[5]
[4][1][3]
[2]
[6]

Wolsh
16.04.2013, 17:11
MoHaX, а ничего, что кубик поворачивается? Что под клавишу Up может попасть любая из четырех прилегающих сторон?

Wadimir
16.04.2013, 18:08
а как же быть тогда?

mikhailk
16.04.2013, 18:09
Хранить текущее состояние кубика?

Wadimir
16.04.2013, 18:25
Делаю так.

private var combination= [[0, 4, 0, 0],
[2, 1, 5, 6],
[0, 3, 0, 0],
[0, 6, 0, 0]];



public function changeDice(direct:String):void
{
var vertical:Array = [combination[0][1], combination[1][1], combination[2][1], combination[3][1]];
var horizontal:Array = [combination[1][0], combination[1][1], combination[1][2], combination[1][3]];
var index:int;

if(direct == "up") {
content.gotoAndStop(combination[2][1]);
index = combination[0][1];

combination[0][1] = vertical[1];
combination[1][1] = vertical[2];
combination[2][1] = vertical[3];
combination[3][1] = vertical[0];

combination[1][3] = index;
}

if(direct == "down") {
content.gotoAndStop(combination[0][1]);
index = combination[2][1];

combination[0][1] = vertical[3];
combination[1][1] = vertical[0];
combination[2][1] = vertical[1];
combination[3][1] = vertical[2];

combination[1][3] = index;
}

if(direct == "right") {
content.gotoAndStop(combination[1][0]);
index = combination[1][2];

combination[1][0] = horizontal[3];
combination[1][1] = horizontal[0];
combination[1][2] = horizontal[1];
combination[1][3] = horizontal[2];

combination[1][3] = index;

}

if(direct == "left") {
content.gotoAndStop(combination[1][2]);
index = combination[1][0];

combination[1][0] = horizontal[1];
combination[1][1] = horizontal[2];
combination[1][2] = horizontal[3];
combination[1][3] = horizontal[0];

combination[3][1] = index;
}
}

Но в один прекрасный момент кубик начинает переворачиватся на ту же грань. То есть не менять положение. Не могу понять в чём причина.

mikhailk
16.04.2013, 19:13
Вот мой вариант. :)
Работает как часы.


package
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;

public class Cube extends Sprite
{

private var cubeFaces:Array = new Array();
private var mainStage:Stage;

public function Cube(mainStage:Stage)
{
this.mainStage = mainStage;
init();
}

private function init() : void
{
cubeFaces['face'] = 1;
cubeFaces['back'] = 6;
cubeFaces['left'] = 4;
cubeFaces['right'] = 3;
cubeFaces['top'] = 5;
cubeFaces['bottom'] = 2;

traceCube();

mainStage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyPressed);
}

private function onKeyPressed(e: KeyboardEvent) : void
{
var keyPressed:String;
switch(e.keyCode)
{
case Keyboard.LEFT : // сдвиг face->left->back->right
faceShifter("face->left->back->right");
keyPressed = "LEFT";
break;

case Keyboard.RIGHT : // сдвиг face->right->back->left
faceShifter("face->right->back->left");
keyPressed = "RIGHT";
break;

case Keyboard.UP : // сдвиг face->top->back->bottom
faceShifter("face->top->back->bottom");
keyPressed = "UP";
break;

case Keyboard.DOWN : // сдвиг face->bottom->back->top
faceShifter("face->bottom->back->top");
keyPressed = "DOWN";
break;
}

if (keyPressed)
{
trace("keyPressed:", keyPressed);
traceCube();
}
}


private function faceShifter(shiftRule:String) : void
{
var facesForShift:Array = shiftRule.split("->");
var savingFace:int = cubeFaces[facesForShift[3]];
for (var i:int = 2; i > -1; i--)
{
cubeFaces[facesForShift[i+1]] = cubeFaces[facesForShift[i]];
}
cubeFaces[facesForShift[0]] = savingFace;
}

private function traceCube() : void
{
trace(" ", cubeFaces["top"], " ");
trace(cubeFaces["left"], cubeFaces["face"], cubeFaces["right"]);
trace(" ", cubeFaces["bottom"], " ");
trace(" ", cubeFaces["back"], " ");
}


}

}

MoHaX
16.04.2013, 23:11
MoHaX, а ничего, что кубик поворачивается? Что под клавишу Up может попасть любая из четырех прилегающих сторон?

ну не сложно дописать для каждого угла поворота как брать стороны из массива..