Jump to content
Search Community

NightlyFly

Members
  • Posts

    5
  • Joined

  • Last visited

Posts posted by NightlyFly

  1. 18 hours ago, Cassie said:

    Heya!

     

    I had a little crack at this for you.

     

    The cool thing about the helper function from the docs is that it returns a timeline, and you can animate the progress of timelines.

    I've created a new timeline where we animate the progress of the horizontalLoop timeline from 0 to 1 a few times to create a 'spin', then we animate the progress to a certain index value based on which element has the winning class.  🥳 This won't look great though as all the tweens are linear in order to space everything out nicely. 🤔

    To add the nice velocity that a spinning wheel would have, fast at first and easing to a stop, we can animate the progress of this new timeline and add an ease to it. 

    There is likely a better solution out there but this is the route my brain took and...well, It works. That's usually my criteria for judging a solution

     

    Hope this helps you!
     

     

    Hi thanks for this! this is amazing, now the question is can the totalloops be stopped earlier to prevent going full rotation to find the winning number? because as shown in your post it stops directly, but it doesn't do that if the number is before or after the full totalloops ended.

     

    Basically if after the full rotations the number it stops on is 0 but it has to go to 10 it will speed up randomly.

     

    Thanks in advance!

     

    Sorry for all these questions, I cant find to see answers on the web regarding these issues.

     

    edit: You can see what I mean when you put winner class on 10.

  2. Hi, I am working on a box system that users can open and have an animation to show what they have won. At the moment it is not working.

     const wrapper = document.querySelector(".c-container");
    
          const boxes = gsap.utils.toArray(".c-item");
          const wins = gsap.utils.toArray(".win");
    
          let itemWidth = boxes[0].clientWidth;
          let wrapWidth = boxes.length * itemWidth;
    
          function getRandomInt(min, max) {
            return Math.floor(Math.random() * (max - min + 1)) + min;
          }
    
          function getPosWinner(winner) {
            const boxes = gsap.utils.toArray(".c-item");
            const index = boxes.findIndex((box) => (box = winner));
            console.log(index);
            let itemWidth = boxes[0].clientWidth;
            let wrapWidth = boxes.length * itemWidth;
            let desiredStart;
    
            if (index === 0) {
              desiredStart = 0;
            } else {
              desiredStart = index * itemWidth;
            }
    
            let minDistanceToEdgeAllowed = 4;
    
            var desired = winner;
            var minPos = desiredStart + minDistanceToEdgeAllowed;
            var maxPos = desiredStart + itemWidth - minDistanceToEdgeAllowed;
    
    
            return getRandomInt(minPos, maxPos);
          }
    
          var spin;
    
          spin = gsap.timeline({
            smoothChildTiming: true,
            autoRemoveChildren: true,
            //onComplete: openModal
          });
    
          spin.set(boxes, {
            x: (i) => i * itemWidth,
          });
          
          var pos = getPosWinner(wins[0]);
    
          spin.to(boxes, {
            duration: 7,
            delay: 0.2,
            ease: "circ.inOut",
            x: "-=10000",
            modifiers: {
              x: (x, target) => {
                const s = gsap.utils.wrap(
                  -itemWidth,
                  wrapWidth - itemWidth,
                  parseInt(x)
                );
                return `${s}px`;
              },
            },
          })
          .to(boxes, {
            duration: 3,
            ease: "none",
            x: pos * -1,
          });
          console.log(wins[0]);
          function openModal() {
            var myModal = document.getElementById("WinItem");
            const modal = new Modal(myModal);
            modal.show();
          }

    The JS code

        <div class="slider-container shadow rounded">
          <BIconCaretDownFill class="fs-2 trigger" />
          <BIconCaretUpFill class="fs-2 triggerTwo" />
          <div class="c-container pt-1">
            <div class="boxes">
              <div v-for="item in lootItems" :key="item">
                <div class="c-item" :class="{ win: item._id === winningItem }">
                  <LootboxContent class="lootboxItem text-light" :loot="item" />
                </div>
              </div>
            </div>
          </div>
        </div>

    The container with items

     

     

     

    I start with making a array of items that people can win these items are inside the container.

     

    then I get the pos of the winning item. when I got that I spin the boxes a couple of times and then it should stop at the winning object (in the middle of the container)

     

    unknown.png

    how it looks right now

    image.thumb.png.8e456c3fa66d2d36b69912eb883ff07e.png

    How it looks after its finished

     

    Hope you can help me. Thanks in advance

     

     

    edit:

     

    simplified codepen:

    See the Pen OJQvGzN by nightfly-student (@nightfly-student) on CodePen

×
×
  • Create New...