Volledige versie bekijken : [AS2.0] 2 classes hebben elkaar nodig
Jordy
%Europe/Berlin %626 %2006, 16:02
He all,
Tijd geleden had ik een topic geopend over hoe je een method uit een andere class opvraagt, deze vraag gaat weer iets in deze trant. Ik ben black-jack aan het maken en t ziet er zo uit. Ik heb 4 classes:
- player
- dealer
- card
- game
In "player" en "dealer" staan methods die een nieuwe "card" maken. Daarvan krijg ik dus een kaartnummer, in "player" en "dealer" wordt ook bijgehouden welke kaarten ze hebben getrokken.
Nu in de game class hou ik bij wie er gewonnen heeft e.d.
In de "dealer" class staat een while() lus omdat de dealer steeds een kaart moet kopen als het totaal aantal punten onder de 17 is. Als ie over de 17 is of gelijk is aan 17 wil ik checken wie de winnaar is. En die method staat in de Game class.
Daarvoor heb ik dus in de Dealer class, een link naar de Game class nodig, maar ook vanuit de Game class heb ik een link naar de Dealer class nodig. Dit lukt me niet om het allebei te doen.
var cards:Card;
var player:Player;
var dealer:Dealer;
var game:Game;
cards = new Card();
player = new Player(cards);
dealer = new Dealer(cards);
game = new Game(player, dealer);
Hoe krijg ik het goed werkend ?
juaron
%Europe/Berlin %676 %2006, 17:13
in player
public var dealer:Dealer;
en in dealer
public var player:Player;
en dan in de constructor functie van game
player.dealer = dealer;
dealer.player = player;
of begrijp ik nou je probleem niet goed?
[edit]
niet goed gelezen; je wilt in dealer een referentie naar game.
kun je dan niet dealer een public var game:Game geven
en dan in de game constructor
dealer.game = this?
Jordy
%Europe/Berlin %695 %2006, 17:42
[edit]
niet goed gelezen; je wilt in dealer een referentie naar game.
kun je dan niet dealer een public var game:Game geven
en dan in de game constructor
dealer.game = this?
Ik zal het eens proberen, tnx
Roenes
%Europe/Berlin %696 %2006, 17:42
Simpel voorbeeldje:
Game class
class Game
{
private var dealer:Dealer;
public function Game()
{
this.dealer = new Dealer(this);
}
}
Dealer class:
class Dealer
{
private var gameObj:Game;
public function Dealer(game:Game)
{
this.gameObj = game;
}
}
Nu kun je dus vanuit dealer toch het game object bereiken en de instantie van dealer wordt gecreëerd in game en is dus daar ook beschikbaar. Op die manier zijn de instanties op 2 manieren aan elkaar gelinkt..
Deze methode door een 'parent' mee te geven aan een classe wordt heel veel gebruikt :)
@juaron:
Waarom een public var gebruiken? Die kunt je gerust private houden hoor, een stukje data-hiding :)
Jordy
%Europe/Berlin %705 %2006, 17:56
Oke bedankt, maar ik liet voorheen vanuit m'n fla de beginsituatie tot stand komen. Dus er werden een aantal kaarten getrokken dmv dealer.getCard(); Dat kan nu dus niet meer, en het past niet in de Game class.
Roenes
%Europe/Berlin %714 %2006, 18:09
Je kunt het wel vanuit je fla doen, maar dan moet je zorgen dat 1 van beide classes een methode heeft die je van buitenaf kan benaderen om ze aan elkaar te koppelen :) Denk aan een methode als setDealer(dealer); in de Game classe (of andersom, het gaat even om het idee :))
Jordy
%Europe/Berlin %771 %2006, 19:31
maar ze zijn nu toch al aan elkaar gekoppeld (die code die jij gaf) ? die setDealer() method staat in mn Game classe, en in die method doe ik dus dealer = new Dealer();
btw, toevallig had ik die methodnaam ook al ;)
Roenes
%Europe/Berlin %773 %2006, 19:34
maar ze zijn nu toch al aan elkaar gekoppeld (die code die jij gaf)?Klopt, maar omdat jij ook code in de fla wilde houden moet je dus zo'n soort oplossing creëeren :)
Jordy
%Europe/Berlin %790 %2006, 19:57
oke ik begrijp het, ik ga er mee verder. tnx
juaron
%Europe/Berlin %795 %2006, 20:05
@Roenes: ik gebruikte een public vars omdat je ze in mijn oplossing vanuit een andere class een waarde moest toekennen
Jordy
%Europe/Berlin %811 %2006, 20:27
Hm, ik denk dat ik het verkeert begrijp..
game class
//variabele
public function Game(p_player:Player, p_dealer:Dealer) {
this.player = p_player
this.dealer = p_dealer
}
public function setDealer(card, game) {
dealer = new Dealer(card, game)
}
//andere methods
dealer classe
public function Dealer(p_card:Card, p_game:Game) {
this.card = p_card;
this.game = p_game;
trace("INITTTT");
}
public function getCard() {
trace("init2")
newCard = card.getCard();
cards.push(newCard);
drawTotalPoints(newCard);
return (newCard);
}
fla
var cards:Card;
var player:Player;
var dealer:Dealer;
var game:Game;
cards = new Card();
player = new Player(cards);
game = new Game(player, dealer, cards);
game.setDealer(cards, game);
Maar als ik in de fla
dealer.getCard() doe, dan krijg ik undefined, en ik zie ook geen trace, die wel in die method staat :S
Roenes
%Europe/Berlin %824 %2006, 20:46
Maar in bovenstaande code wordt in je fla dealer alleen gedeclareerd maar niet geinstantieerd. Dus in je fla bestaat op dit moment geen instantie van dealer. Die bestaat in de game classe nadat je setDealer hebt aangeroepen :)
Jordy
%Europe/Berlin %831 %2006, 20:57
dat doe ik toch hiermee?
game.setDealer(cards, game);
Roenes
%Europe/Berlin %841 %2006, 21:11
Met die regel maak je idd wel een nieuwe dealer aan maar die bestaat alleen in de game classe aangezien die daar wordt aangemaakt. In je fla wil jij dealer.getCard() doen maar dat kan dus niet omdat er geen dealer instantie aanwezig is in je fla. Die instantie zit dus in je game classe en daar kun je die bereiken :)
Jordy
%Europe/Berlin %436 %2006, 11:28
Oke, ik snap het (half ;) ), hoe zou ik dat dan moeten oplossen?
je hoeft niet code te geven, maar misschien heb je nog wat tips oid :)
Roenes
%Europe/Berlin %800 %2006, 20:12
Waarom wil je die dealer in je fla kunnen benaderen? Is het niet makkelijker om 1 algemene classe te hebben die de hoofdfunctionaliteiten van het spel regelt? In het algemeen is zoiets de 'Game' classe. Waarvoor wil jij die gaan gebruiken? :)
Jordy
%Europe/Berlin %802 %2006, 20:16
Waarom wil je die dealer in je fla kunnen benaderen? Is het niet makkelijker om 1 algemene classe te hebben die de hoofdfunctionaliteiten van het spel regelt? In het algemeen is zoiets de 'Game' classe. Waarvoor wil jij die gaan gebruiken? :)
hm daar heb je een punt....
Game classe wilde ik dus de winnaar laten uitrekenen en uhmmm.....
Maar als de player stopt, dan moet de dealer een kaart pakken, dan is het toch overzichtelijker om in de fla.
dealer.getCard() aan te roepen dan game.dealerGetCard() ? Of moet ik dat gewoon negeren :)
Roenes
%Europe/Berlin %812 %2006, 20:30
Ik zou een Game classe laten fungeren als 'main' classe die dus alles voor het spel regelt wat niet direct te maken heeft met een andere classe. Dus de Game classe bevat een dealer, een aantal speler instanties, een deck met kaarten enz enz..
De speler houdt intern bij welke kaarten die heeft en hoeveel punten dat is. De dealer doet hetzelfde voor hem. De game classe regelt alleen wie er aan de beurt is, wie een kaart mag pakken, wie er uitbetaalt moet krijgen en wanneer een volgend spel gestart moet worden :)
Jordy
%Europe/Berlin %819 %2006, 20:39
ik heb nu een player class, daarin een method die roept de card class aan. Daaruit krijg je een return met welke kaart getrokken is.
Alle kaarten staan in een array, als er een kaart gepakt is wordt ie uit de array verwijderd.
En dan wat jij zeg met die game class, ik denk dat ik dan aardig op de goede weg zit kwa layout van de classes, ofniet?
Roenes
%Europe/Berlin %834 %2006, 21:02
En dan wat jij zeg met die game class, ik denk dat ik dan aardig op de goede weg zit kwa layout van de classes, ofniet?Wat ik zou voorbij heb zien komen wel jah, het enige wat mijn toen wel opviel is dat je geen classe 'Deck' of zoiets had voor het pak kaarten, maar volgens mij zit dat bij je dealer erbij in of niet? :)
Jordy
%Europe/Berlin %840 %2006, 21:10
nee, alle kaarten (de waarde van de kaarten) staan in een Array in de class Card. In die class zitten de volgende methods
getCard() // returned de waarde van de kaart aan de hand van random getallen
removeCard() // wordt opgeroepen in de getCard(), zo wordt de getrokken kaart uit de array gehaald, zodat er geen dubbele kaart kan worden getrokken
in de player en dealer class worden de kaarten getrokken dmv een method die de getCard() method aanroept in de class Card. Ook in dealer en player worden de scores bij gehouden
Natuurlijk word het spel met veel kaarten gespeeld, maar ik heb nu een kleine array, als de game helemaal lukt zal ik alles volgens de officiele spelregels doe ;)
Roenes
%Europe/Berlin %922 %2006, 23:08
En waarom niet een classe maken die Card heet die het type (harten, klaveren...) en de waarde (2 t/m 10, plaatje) bijhoudt? En een classe Deck maken die 52 kaarten bevat en van iedere kaart precies 1? Dan kun je heel makkelijk Card objecten in een array stoppen in de classe Deck en als je een Card trekt, haal je het object uit de array en die voeg je toe in de dealer/player class.
Je hebt dan niet meer losse waardes die je uit de array haalt maar echte objecten waardoor je meer mogelijkheden creëert :)
Jordy
%Europe/Berlin %309 %2006, 08:26
En waarom niet een classe maken die Card heet die het type (harten, klaveren...) en de waarde (2 t/m 10, plaatje) bijhoudt? En een classe Deck maken die 52 kaarten bevat en van iedere kaart precies 1? Dan kun je heel makkelijk Card objecten in een array stoppen in de classe Deck en als je een Card trekt, haal je het object uit de array en die voeg je toe in de dealer/player class.
Je hebt dan niet meer losse waardes die je uit de array haalt maar echte objecten waardoor je meer mogelijkheden creëert :)
Hm, ik zal het vanmiddag nog eens doorlezen, ben nu nog een beetje moe P)
Roenes
%Europe/Berlin %455 %2006, 11:56
Oke, mocht je nog dingen willen weten dan hoor ik het wel :)
vBulletin® v3.8.1, Copyright ©2000-2012, Jelsoft Enterprises Ltd.