Haciendo un puzzle- Cuarta parte: Manejando grupos de piezas

1
  • 0 favourites

Index

Tagged

Attached Files

The following files have been attached to this tutorial:

.capx

tutorial-puzzle-3.capx

Download now 2.56 MB
.capx

tutorial-puzzle-final.capx

Download now 2.59 MB
.capx

tutorial-puzzle-final-manycomments.capx

Download now 2.59 MB

Stats

8,385 visits, 11,008 views

Tools

License

This tutorial is licensed under CC BY 4.0. Please refer to the license text if you wish to reuse, share or remix the content contained within this tutorial.

Uniendo grupos entre ellos

Pero queda algo más por hacer. Ejecutemos de nuevo el proyecto.

Habiendo unido en un solo grupo las piezas 1,2 y 3, arrastramos la pieza 4 para que se encaje, y después volvemos a arrastrar "tirando" de la pieza 4. Las piezas 3 y 4 se separarán de las piezas 1 y 2. ¿Por qué? Estamos metiendo la pieza 3 en el grupo de la pieza 4, pero no estamos metiendo el resto de las piezas (anteriormente unidas a la pieza 3) en ese grupo.

Expandamos de nuevo todos los eventos si no lo hemos hecho antes.

Vamos al evento con esta condición:

    Pick All ActualPiece
    For Each ActualPiece
    System ((ActualPiece.PlaceX=CompareX) & (abs(CompareY- ActualPiece.PlaceY)=1))  ((ActualPiece.PlaceY=CompareY) & (abs(CompareX- ActualPiece.PlaceX)=1)) <>0

Añadimos esta condición y la movemos bajo el "For Each...":

    ActualPiece.Group≠MyGroup

(Variable local Actualpiece.Group distinta de MyGroup)

Esto impedirá que se itere dentro del propio grupo que se está probando, lo que podría causar un bucle infinito.

Añadimos una variable local llamada "Group2" (grupo2) entre el evento anterior y el evento que lleva la condición:

    System compare distance(ActualPiece.X,ActualPiece.Y,IdealX,IdealY)<5

Ahora, en el evento con la condición "distance(ActualPiece.X,ActualPiece.Y,IdealX,IdealY)<5", añadimos la acción:

    System => Set Group2 to ActualPiece.Group

    (Sistema => Guarda en Group2 el valor ActualPiece.Group) 

Esta acción almacena el grupo de la pieza unida en una variable local, de modo que podemos seleccionar piezas del mismo grupo.

Añadimos un sub-evento con la condición:

System Pick All ActualPiece

Esto vaciará nuestra selección, de modo que buscaremos las piezas del grupo Group2 entre todas las piezas (y no solo dentro de las ya seleccionadas).

Añadimos otro subevento (un sub-subevento) con las condiciones:

System Pick All ActualPiece

       System For each actualpiece
       Actualpiece.Group=Group2

    (Sistema: Elija todos los objetos ActualPiece. Por cada Actualpiece donde el grupo de ActualPiece sea Grupo 2...)

Este sub-subevento buscará piezas dentro de Group2. Esas piezas estarán "unidas" a la pieza que estamos uniendo a MyGroup, de manera que tenemos que unir también esas piezas.

Ponemos las siguientes acciones dentro:

    Set ActualPiece group to Mygroup
    Set  ActualPiece position to (ActualPiece.PlaceX-CompareX)[i]PieceStepX+MyX, (ActualPiece.PlaceY-CompareY)[/i]PieceStepY+MyY
 
    (Establece la variable local "Grupo" de Actualpiece en "MyGroup" y la posición en (ActualPiece.PlaceX-CompareX)[i]PieceStepX+MyX, (ActualPiece.PlaceY-CompareY)[/i]PieceStepY+MyY )

Todas las piezas cuyo grupo es el de la pieza con la que nos estamos encajando (la pieza "encajada" y todas las unidas a ella) cambiarán al grupo de la pieza que estamos moviendo, y se alinearán con el grupo. Observe que los cálculos en "Set Position to..." son los mismos que empleamos para calcular las posiciones ideales "IdealX" e "IdealY". Si no podemos usar "IdealX" e "IdealY" es porque esas coordenadas solo son válidas para la primera pieza "unida", y no para todo su grupo.

  • 0 Comments

  • Order by
Want to leave a comment? Login or Register an account!