Я создаю игру на запоминание на Angular. Я прикрепил логику компонента, css и html ниже. Я пытаюсь перевернуть карты, но онлайн-методы не работают. Любые предложения о том, как это осуществить? Обратите внимание, что в структуре данных карты свойство isFlipped имеет значение false. Был бы признателен за любую помощь, спасибо.
// angular
import { Component } from "@angular/core";
// services
import { CardService } from "../app/services/cards.service";
@Component({
selector: "app-root",
templateUrl: "./app.component.html",
styleUrls: ["./app.component.css"]
})
export class AppComponent {
title: string = "the tech memory game";
tagline: string = "Time to sharpen up those memory cells!";
cards = [];
total_cards_count: number = 3;
prevCard = null;
isProcessing: boolean = false;
flippedCouplesCount: number = 0;
constructor(public cardService: CardService) {}
ngOnInit() {
this.cards = this.cardService.getCards();
console.info(this.cards);
}
playGame(card, cardDiv) {
if (this.isProcessing) return;
// flip card
card.isFlipped = !card.isFlipped;
cardDiv.classList.add('flipped');
// compare cards and check
if (this.prevCard) {
if (card.name === this.prevCard.name) {
this.prevCard = null;
this.flippedCouplesCount++;
} else {
this.isProcessing = true;
// if no match- flip cards in 1 sec
setTimeout(() => {
this.prevCard.isFlipped = false;
card.isFlipped = false;
this.isProcessing = false;
this.prevCard = null;
}, 1000);
}
} else {
this.prevCard = card;
}
if (this.total_cards_count === this.flippedCouplesCount) {
console.info('game over');
}
}
}.container {
display: flex;
flex-direction: row;
justify-content: space-between;
/* width: 100%; */
/* transform: rotateY(180deg); */
}
.front {
position: absolute;
}<!--The content below is only a placeholder and can be replaced.-->
<section>
<div style = "text-align:center">
<h1>
Welcome to {{ title }}!
</h1>
<h3>{{ tagline }}</h3>
<!-- <img width = "300" alt = "Angular Logo" src = "> -->
</div>
<!-- game board -->
<div class = "container">
<div *ngFor = "let card of cards" #cardDiv (click) = "playGame(card, cardDiv)" class = "cardholder">
<img src = "{{ card.img }}" class = "front" *ngIf = "card.isFlipped"/>
<img src = "{{ card.cover }}" class = "back"/>
</div>
</div>
</section>Plunker не будет показывать какие-либо входящие данные, включая карты ... Но в основном у меня есть логика игры, и это всего лишь проблема css: как красиво переворачивать карты. Я осмотрелся и попробовал transform: rotateY (180deg) для некоторых классов, добавив backface-visibility: hidden для других. Кажется, ничего не работает.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте использовать [class.active] = "card.isFlipped" для добавления класса, если карта перевернулась. После того, как вы можете привязать анимацию CSS к этим дочерним узлам: https://github.com/daneden/animate.css/tree/master/source/flippers
flipOutY и flipInY с задержкой в половину времени анимации.
Кажется, не работает. У вас есть где-нибудь работающий пример этой штуки?
Вам понадобится комбинация анимации Angular и анимации css. Адаптируйте следующую демонстрацию к своим потребностям:
Машинопись:
...
animations: [
trigger('flipCard', [
state('true', style({
transform: 'rotateY(180deg)'
})),
state('false', style({
transform: 'rotateY(0)'
})),
transition('true => false', animate('800ms ease-out')),
transition('false => true', animate('800ms ease-out'))
])
]
...
flip(index) {
this.cards[index].isFlipped = !this.cards[index].isFlipped;
}
HTML
<div class = "container">
<div *ngFor = "let card of cards; let i=index" #cardDiv class = "cardholder">
<div class = "card" (click) = "flip(i)" [@flipCard] = "card.isFlipped">
<div class = "card-title front">
{{card.name}} Front
</div>
<div class = "card-title back">
{{card.name}} Back
</div>
</div>
</div>
</div>
CSS:
.container {
display: flex;
flex-direction: row;
justify-content: space-around;
margin-top: 200px;
width: 100%;
/* transform: rotateY(180deg); */
}
.card-wrapper {
perspective: 800px;
}
.card {
border-radius: 8px;
position: relative;
height: 200px;
width: 120px;
transform-style: preserve-3d;
}
.card-title {
backface-visibility: hidden;
height: 100%;
position: absolute;
text-align: center;
border-radius: 8px;
color: white;
user-select: none;
cursor: pointer;
line-height: 100px;
font-size:30px;
}
.front {
background-color: #255C85;
}
.back {
background-color: #ED254E;
transform: rotateY(180deg);
}
Это почти все, но не совсем. По какой-то причине обложка не отображается изначально, и при переворачивании я вижу вспышку карты, но затем она переворачивается на обложку ... очевидно, не желаемый эффект. Это репо, если вы хотите взглянуть: github.com/CharlesMarlow/Angular5--memory-game
Гордон, проверь демо еще раз. Если это по-прежнему не работает, не могли бы вы сделать демо?
Можете ли вы создать Plunker? Чтобы увидеть реальное приложение и решить проблему.