Files
haiku-beta6/src/apps/pairs/PairsView.cpp
T
Stephan Aßmus 69e62e48b9 Added Pairs game contributed by Ralf Schuelke to the image! (Demo folder)
Thanks a lot, Ralf!


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25114 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-23 09:06:05 +00:00

159 lines
3.2 KiB
C++

/*
* Copyright 2008, Ralf Schülke, [email protected]. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <Application.h>
#include <Bitmap.h>
#include <Button.h>
#include "PairsTopButton.h"
#include "PairsView.h"
#include "PairsGlobal.h"
#include "Pairs.h"
#include "bitmaps/appearance.h"
#include "bitmaps/cortex.h"
#include "bitmaps/joystick.h"
#include "bitmaps/kernel.h"
#include "bitmaps/launchbox.h"
#include "bitmaps/people.h"
#include "bitmaps/teapot.h"
#include "bitmaps/tracker.h"
// TODO: support custom board sizes
PairsView::PairsView(BRect frame, const char* name, uint32 resizingMode)
: BView(frame, name, resizingMode, B_WILL_DRAW)
{
_PairsCards();
CreateGameBoard();
_SetPairsBoard();
}
void
PairsView::CreateGameBoard()
{
// Show hidden buttons
for (int32 i = 0; i < CountChildren(); i++) {
BView* child = ChildAt(i);
if (child->IsHidden())
child->Show();
}
_GenarateCardPos();
}
PairsView::~PairsView()
{
for (int i = 0; i < 8; i++)
delete fCard[i];
for (int i = 0; i < 16; i++)
delete fDeckCard[i];
}
void
PairsView::AttachedToWindow()
{
MakeFocus(true);
}
void
PairsView::_PairsCards()
{
for (int i = 0; i < 8; i++) {
fCard[i] = new BBitmap(BRect(0, 0, kBitmapSize - 1, kBitmapSize - 1),
B_RGBA32);
}
// TODO: read random icons from the files in /boot/beos/apps
// and /boot/beos/preferences...
memcpy(fCard[0]->Bits(), kappearanceBits, fCard[0]->BitsLength());
memcpy(fCard[1]->Bits(), kcortexBits, fCard[1]->BitsLength());
memcpy(fCard[2]->Bits(), kjoystickBits, fCard[2]->BitsLength());
memcpy(fCard[3]->Bits(), kkernelBits, fCard[3]->BitsLength());
memcpy(fCard[4]->Bits(), klaunchboxBits, fCard[4]->BitsLength());
memcpy(fCard[5]->Bits(), kpeopleBits, fCard[5]->BitsLength());
memcpy(fCard[6]->Bits(), kteapotBits, fCard[6]->BitsLength());
memcpy(fCard[7]->Bits(), ktrackerBits, fCard[7]->BitsLength());
}
void
PairsView::_SetPairsBoard()
{
for (int i = 0; i < 16; i++) {
fButtonMessage = new BMessage(kMsgCardButton);
fButtonMessage->AddInt32("ButtonNum",i);
int x = i % 4 * (kBitmapSize + 10) + 10;
int y = i / 4 * (kBitmapSize + 10) + 10;
fDeckCard[i] = new TopButton(x, y, fButtonMessage);
AddChild(fDeckCard[i]);
}
}
void
PairsView::_GenarateCardPos()
{
// TODO: when loading random icons, the would also have to be
// loaded here (or at least somewhere in the code path that creates
// a new game after one finished)
srand((unsigned)time(0));
int positions[16];
for (int i = 0; i < 16; i++)
positions[i] = i;
for (int i = 16; i >= 1; i--) {
int index = rand() % i;
fRandPos[16-i] = positions[index];
for (int j = index; j < i - 1; j++) {
positions[j] = positions[j + 1];
}
}
for (int i = 0; i < 16; i++) {
fPosX[i] = (fRandPos[i]) % 4 * (kBitmapSize+10) + 10;
fPosY[i] = (fRandPos[i]) / 4 * (kBitmapSize+10) + 10;
}
}
void
PairsView::Draw(BRect updateRect)
{
SetDrawingMode(B_OP_ALPHA);
// draw rand pair 1 & 2
for (int i = 0; i < 16; i++) {
DrawBitmap(fCard[i % 8], BPoint(fPosX[i], fPosY[i]));
}
}
int
PairsView::GetIconFromPos(int pos)
{
return fRandPos[pos];
}