home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Freelog 17
/
Freelog017.iso
/
BeOS
/
ababelone
/
Sources
/
Deplacement.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2000-11-22
|
23KB
|
587 lines
/*
Copyright (C) 2000 by Hervé PHILIPPE <rv@bemail.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "Deplacement.h"
///////////////////////////////////
// CONSTRUCTEUR de "Deplacement" //
///////////////////////////////////-------------------
// Initialise les variables (et constantes) membres --
//----------------------------------------------------
Deplacement::Deplacement(PlateauDeJeuInterne* plateau_de_jeu_interne, PlateauDeJeuGraphique* plateau_de_jeu_graphique, int8 couleur, bool ordinateur)
// 4 PARAMETRES : ENTREE/SORTIE (modification par la suite) ENTREE/SORTIE (modification par la suite) ENTREE ENTREE
: m_kOrdinateur(ordinateur),
m_CouleurCourante(couleur)
{
BPath chemin;
BEntry entree;
entry_ref entree_ref;
app_info infos_application;
m_PlateauInterne = plateau_de_jeu_interne;
m_PlateauGraphique = plateau_de_jeu_graphique;
m_NombreBoulesSelectionnees = 0;
be_app->GetAppInfo(&infos_application);
chemin.SetTo(&(infos_application.ref));
chemin.GetParent(&chemin);
chemin.SetTo(chemin.Path(), "Sons/Pousser");
entree.SetTo(chemin.Path());
entree.GetRef(&entree_ref);
m_SonPousser = new BFileGameSound(&entree_ref, false);
if (m_SonPousser->InitCheck() == B_OK)
m_SonPousser->Preload();
chemin.GetParent(&chemin);
chemin.SetTo(chemin.Path(), "Tomber");
entree.SetTo(chemin.Path());
entree.GetRef(&entree_ref);
m_SonTomber = new BFileGameSound(&entree_ref, false);
if (m_SonTomber->InitCheck() == B_OK)
m_SonTomber->Preload();
}
///////////////////////////
// FONCTION "Ordinateur" //
///////////////////////////------------------------------------------
// Renvoie le type de joueur : ordinateur (true) ou humain (false) --
//-------------------------------------------------------------------
bool // VALEUR DE RETOUR
Deplacement::Ordinateur()
// AUCUN PARAMETRE
{
return m_kOrdinateur;
}
/////////////////////////
// FONCTION "CoupJoue" //
/////////////////////////-----------------------------
// Renvoie toutes les infos concernant le coup joué --
//----------------------------------------------------
type_deplacement // VALEUR DE RETOUR
Deplacement::CoupJoue()
// AUCUN PARAMETRE
{
return m_CoupJoue;
}
///////////////////////////////////
// FONCTION "JouerCoupPrecedent" //
///////////////////////////////////----------------------------------
// Joue le coup précédent (avec ou sans une mise à jour graphique) --
//-------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::JouerCoupPrecedent(type_deplacement coup_joue, bool mise_a_jour_buffer_ecran)
// 2 PARAMETRES : ENTREE ENTREE
{
BPoint delta;
BRect rect_mis_a_jour;
int8 boule;
int8 boule_actuelle;
int i;
int max = coup_joue.NombreBoulesADeplacer;
int8 direction_boule_suivante;
Coordonnees coord_boule;
BRect position_boule;
m_PremiereBouleSelectionnee = coup_joue.PremiereBouleSelectionnee;
m_Direction = (coup_joue.Direction+3)%6;
m_DirectionLaterale = coup_joue.DirectionLaterale;
delta = m_PlateauGraphique->DirectionGraphique(m_Direction);
if (m_DirectionLaterale < 0) {
m_NombreBoulesSelectionnees = 1;
direction_boule_suivante = coup_joue.Direction;
if (coup_joue.BouleEjectee != 0)
max--;
}
else {
m_NombreBoulesSelectionnees = coup_joue.NombreBoulesADeplacer;
direction_boule_suivante = coup_joue.DirectionLaterale;
}
boule = m_PremiereBouleSelectionnee;
for (i = 0; i < max; i++) {
if (coup_joue.BouleEjectee != 0 && i == (max-1)) {
coord_boule = m_PlateauInterne->CoordonneesBoule(boule);
position_boule = m_PlateauGraphique->Boule(boule);
}
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta.x, delta.y);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
boule_actuelle = boule;
boule = m_PlateauInterne->ValeurCaseSuivante(boule,direction_boule_suivante); // Se positionner sur la case suivante
m_PlateauInterne->DeplacerBoule(boule_actuelle, m_Direction); // Déplacer la boule dans le tableau interne
}
if (coup_joue.BouleEjectee != 0) {
rect_mis_a_jour = m_PlateauGraphique->Boule(coup_joue.BouleEjectee);
m_PlateauGraphique->SetBoule(coup_joue.BouleEjectee, position_boule);
if (mise_a_jour_buffer_ecran == true) {
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
m_PlateauGraphique->MiseAJourBuffer(position_boule);
}
m_PlateauInterne->SetCase(coord_boule, coup_joue.BouleEjectee);
m_PlateauInterne->DecrementerBoulesEjectees(m_CouleurCourante);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(RECT_SCORE);
}
m_NombreBoulesSelectionnees = 0;
}
//////////////////////////
// FONCTION "JouerCoup" //
//////////////////////////------------------------------------
// Rejoue un coup joué, avec un déplacement réaliste ou non --
// (avec ou sans une mise à jour graphique) --
//------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::JouerCoup(type_deplacement coup_joue, bool faire_glisser_les_boules, bool mise_a_jour_buffer_ecran)
// 3 PARAMETRES : ENTREE ENTREE ENTREE
{
m_PremiereBouleSelectionnee = coup_joue.PremiereBouleSelectionnee;
m_Direction = coup_joue.Direction;
m_DirectionLaterale = coup_joue.DirectionLaterale;
if (m_DirectionLaterale < 0) {
m_NombreBoulesSelectionnees = 1;
DeplacerBoulesPoussee(faire_glisser_les_boules, mise_a_jour_buffer_ecran);
}
else {
m_NombreBoulesSelectionnees = coup_joue.NombreBoulesADeplacer;
DeplacerBoulesLaterales(faire_glisser_les_boules, mise_a_jour_buffer_ecran);
}
m_NombreBoulesSelectionnees = 0;
}
///////////////////////////////////
// FONCTION "RangerBouleEjectee" //
///////////////////////////////////-----------------------------------------------------------------------------
// Range les boules éjectées, d'une façon réaliste : la boule éjectée fait le tour du plateau et va se placer --
// dans la goulotte du joueur qui l'a éjectée --
//--------------------------------------------------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::RangerBouleEjectee(int8 numero_boule)
// 1 PARAMETRE ENTREE
{
int8 direction_cote;
Coordonnees coord_boule = m_PlateauInterne->CoordonneesBoule(numero_boule);
int8 i, j, k, debut;
BPoint position_boule;
BPoint position_temp;
BRect rect_mis_a_jour;
bigtime_t temps;
position_boule = m_PlateauGraphique->Boule(numero_boule).LeftTop();
coord_boule = m_PlateauInterne->CoordonneesSuivantes(coord_boule, m_Direction);
if (coord_boule.y == 0) {
debut = 5-(coord_boule.x-5);
direction_cote = 0;
}
else
if (coord_boule.y == 10) {
debut = coord_boule.x;
direction_cote = 3;
}
else {
debut = coord_boule.y;
if (coord_boule.y > 5) {
debut -= 5;
direction_cote = 2;
}
else
direction_cote = 1;
if (coord_boule.x > 5)
debut = 5-debut;
else
direction_cote = 6 - direction_cote;
}
if (m_Direction == (direction_cote + 1)%6)
debut++;
for(i=direction_cote; i > -2; i--) {
if (i > -1) {
position_temp = m_PlateauGraphique->DirectionGraphique(i);
if (i == 0)
debut += m_CouleurCourante - 7;
}
else {
debut = m_PlateauInterne->BoulesEjectees(m_CouleurCourante);
position_temp.x = 0;
position_temp.y = HAUTEUR_CASE_BOULE+1;
}
for(j=debut; j < 6; j++)
for(k=0; k < 10; k++) {
temps = system_time();
position_boule.x += position_temp.x/10;
position_boule.y += position_temp.y/10;
// Déplacer les vues "Boule" (graphiquement)
rect_mis_a_jour = m_PlateauGraphique->SetPositionBoule(numero_boule, position_boule);
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
while ((system_time() - temps) < DELAI_POUR_POUSSER );
}
debut = 0;
}
}
/////////////////////////////////////////
// FONCTION "DirectionPousseePossible" //
/////////////////////////////////////////-------------------------------------------------------------------
// Renvoie "vrai" si une poussée est possible dans une direction. --
// Renseigne aussi éventuellement sur le nombre de boules qui doivent être poussées (les boules du joueur --
// courant et les boules adverses --
//----------------------------------------------------------------------------------------------------------
bool // VALEUR DE RETOUR
Deplacement::DirectionPousseePossible(int8 direction, int8* ptr_nombre_boules_joueur, int8* ptr_nombre_boules_adversaire)
// 3 PARAMETRES : ENTREE (ENTREE)/SORTIE (ENTREE)/SORTIE
{
// Création et initialisation éventuelle des variables locales
int8 i, nb_cases_meme_couleur, nb_cases_couleur_opposee;
bool direction_possible = true;
int8 numero_boule = m_PremiereBouleSelectionnee;
// Boucle pour déterminer le nombre de boules de la couleur du joueur
for (i = 0; i < 4 && numero_boule > 0 && m_PlateauInterne->CouleurBoule(numero_boule) == m_CouleurCourante; i++) {
numero_boule = m_PlateauInterne->ValeurCaseSuivante(numero_boule,direction); // Se positionner sur la case suivante
}
if (ptr_nombre_boules_joueur != NULL)
*ptr_nombre_boules_joueur = i;
if (i > 3) // Si le joueur veut pousser plus de 3 boules,
direction_possible = false; // le déplacement est impossible
else {
nb_cases_meme_couleur = i; // Nombre de cases de la couleur du joueur
// Boucle pour déterminer le nombre de boules de la couleur de l'adversaire
for (i = 0; i < 3 && numero_boule > 0 && m_PlateauInterne->CouleurBoule(numero_boule) != m_CouleurCourante; i++) {
numero_boule = m_PlateauInterne->ValeurCaseSuivante(numero_boule,direction); // Se positionner sur la case suivante
}
nb_cases_couleur_opposee = i; // Nombre de cases de la couleur de l'adversaire
if (ptr_nombre_boules_adversaire != NULL)
*ptr_nombre_boules_adversaire = nb_cases_couleur_opposee;
// Si le joueur veut pousser plus de 2 boules adverses OU s'il n'a pas la supériorité numérique,
if (i > 2 || nb_cases_couleur_opposee >= nb_cases_meme_couleur)
direction_possible = false; // le déplacement est impossible
else
if (numero_boule == -1) { // Si la prochaine case est une case hors du plateau de jeu,
if (nb_cases_couleur_opposee == 0) // et s'il n'y a aucune boule adverse à pousser
direction_possible = false; // le déplacement est impossible
}
else // Si la prochaine case est une case dans le plateau de jeu,
if (numero_boule != 0) // et si cette case n'est pas une case vide
direction_possible = false; // le déplacement est impossible
}
return direction_possible;
}
/////////////////////////////////////////////
// FONCTION "FaireGlisserLesBoulesPoussee" //
/////////////////////////////////////////////----------------------------------------------------------------
// Fait "glisser" les boules pour un déplacement en poussée, c'est-à-dire déplace graphiquement les boules --
// d'une façon réaliste --
//-----------------------------------------------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::FaireGlisserLesBoulesPoussee(int8 nombre_de_boules_a_deplacer, bool ejection)
// 2 PARAMETRES : ENTREE ENTREE
{
// Création et initialisation éventuelle des variables locales
float coef_dir = LARGEUR_CASE_BOULE / (2.0 * HAUTEUR_CASE_BOULE);
int delta_x;
int delta_y;
BPoint delta = m_PlateauGraphique->DirectionGraphique(m_Direction);
int i, j, compteur_max, translation;
int distance_entre_boules;
int8 nombre_de_boules_en_deplacement = 1;
bigtime_t temps;
int8 boule;
BPoint position_boule;
BRect rect_mis_a_jour;
delta_x = (int)delta.x;
delta_y = (int)delta.y;
position_boule = m_PlateauGraphique->Boule(m_PremiereBouleSelectionnee).LeftTop();
if (delta_y == 0) {
compteur_max = abs(delta_x);
distance_entre_boules = LARGEUR_ENTRE_BOULES;
}
else {
compteur_max = abs(delta_y);
delta_y /= abs(delta_y);
distance_entre_boules = OBLIQUE_HAUTEUR_ENTRE_BOULES;
}
delta_x /= abs(delta_x);
for (i = 1; i < 3*compteur_max/4; i++) {
temps = system_time();
boule = m_PremiereBouleSelectionnee;
for (j = 0; j < nombre_de_boules_en_deplacement; j++) {
if (delta_y == 0 || (int(coef_dir*(i-1)) != int(coef_dir*i)))
translation = 1;
else
translation = 0;
// Déplacer les vues "Boule" (graphiquement)
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta_x*translation, delta_y);
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_Direction); // Se positionner sur la case suivante
}
while ((system_time() - temps) < DELAI_POUR_POUSSER );
if (i % distance_entre_boules == 0
&& nombre_de_boules_en_deplacement < nombre_de_boules_a_deplacer) {
nombre_de_boules_en_deplacement++;
if (m_SonPousser->InitCheck() == B_OK)
m_SonPousser->StartPlaying();
}
}
boule = m_PremiereBouleSelectionnee;
for (j = 0; j < nombre_de_boules_en_deplacement; j++) {
position_boule += m_PlateauGraphique->DirectionGraphique(m_Direction);
if (j == (nombre_de_boules_en_deplacement-1) && ejection == true) {
position_boule += m_PlateauGraphique->DirectionGraphique(m_Direction);
// m_PlateauGraphique->SetBouleInvisible(boule); // Cacher la boule qui est éjectée
}
// Déplacer les vues "Boule" (graphiquement)
rect_mis_a_jour = m_PlateauGraphique->SetPositionBoule(boule, position_boule);
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
if (j != (nombre_de_boules_en_deplacement-1))
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_Direction); // Se positionner sur la case suivante
}
if (m_SonTomber->InitCheck() == B_OK)
m_SonTomber->StartPlaying();
}
//////////////////////////////////////
// FONCTION "DeplacerBoulesPoussee" //
//////////////////////////////////////-----------------
// Déplace les boules pour un déplacement en poussée --
// (avec ou sans une mise à jour graphique) --
//-----------------------------------------------------
bool // VALEUR DE RETOUR
Deplacement::DeplacerBoulesPoussee(bool faire_glisser_les_boules, bool mise_a_jour_buffer_ecran)
// 2 PARAMETRES : ENTREE ENTREE
{
// Création et initialisation éventuelle des variables locales
int8 i;
int8 nombre_de_cases_a_pousser;
bool case_vide = false;
bool ejection = false;
int8 boule = m_PremiereBouleSelectionnee;
int8 boule_precedente = m_PremiereBouleSelectionnee;
BPoint delta = m_PlateauGraphique->DirectionGraphique(m_Direction);
BPoint position;
BRect rect_mis_a_jour;
int8 boules_ejectees;
// Calculer le nombre de boules à pousser
// et déterminer s'il y a une éjection
for (i = 0; i < 5 && case_vide == false; i++) {
boule_precedente = boule;
// Se positionner sur la case suivante
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_Direction);
// Si on arrive à une case vide OU hors du plateau de jeu,
if (boule < 1) {
case_vide = true; // on arrête la boucle
if (boule == -1) // Si on arrive au bord du plateau
ejection = true; // de jeu, il y a une éjection
}
}
nombre_de_cases_a_pousser = i;
m_CoupJoue.PremiereBouleSelectionnee = m_PremiereBouleSelectionnee;
m_CoupJoue.NombreBoulesADeplacer = nombre_de_cases_a_pousser;
m_CoupJoue.Direction = m_Direction;
m_CoupJoue.DirectionLaterale = -1;
// Déplacer toutes les boules à pousser
if (faire_glisser_les_boules == true)
FaireGlisserLesBoulesPoussee(nombre_de_cases_a_pousser, ejection);
boule = boule_precedente;
if (ejection == true) {
if (faire_glisser_les_boules == true)
RangerBouleEjectee(boule);
else {
boules_ejectees = m_PlateauInterne->BoulesEjectees(m_CouleurCourante);
rect_mis_a_jour = m_PlateauGraphique->Boule(boule);
position = m_PlateauGraphique->DirectionGraphique(1);
position.x = 2*position.x + ORIGINE_X - LARGEUR_CASE_BOULE * (5-m_CouleurCourante);
position.y = 2*position.y + ORIGINE_Y + (HAUTEUR_CASE_BOULE+1) * (6-boules_ejectees);
m_PlateauGraphique->SetPositionBoule(boule, position);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
rect_mis_a_jour = m_PlateauGraphique->Boule(boule);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
}
m_CoupJoue.BouleEjectee = boule;
}
else
m_CoupJoue.BouleEjectee = 0;
for (i = 0; i < nombre_de_cases_a_pousser; i++) {
boule_precedente = m_PlateauInterne->ValeurCasePrecedente(boule,m_Direction); // Se positionner sur la case précédente
m_PlateauInterne->DeplacerBoule(boule, m_Direction); // Déplacer la boule dans le tableau interne
if (faire_glisser_les_boules == false) {
if (!(i == 0 && ejection == true)) {
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta.x, delta.y);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
}
}
boule = boule_precedente;
}
if (ejection == true) {
m_PlateauInterne->IncrementerBoulesEjectees(m_CouleurCourante);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(RECT_SCORE);
}
return ejection;
}
//////////////////////////////////////////
// FONCTION "DirectionLateralePossible" //
//////////////////////////////////////////----------------------------------------------------------
// Renvoie "vrai" si un déplacement latéral est possible dans une direction. --
// Renseigne aussi éventuellement sur le nombre de boules qui doivent être déplacées latéralement --
//--------------------------------------------------------------------------------------------------
bool // VALEUR DE RETOUR
Deplacement::DirectionLateralePossible(int8 direction, bool* ptr_deplacement_avec_2_boules)
// 2 PARAMETRES : ENTREE (ENTREE)/SORTIE
{
// Création et initialisation éventuelle des variables locales
bool possible = true;
int8 i;
int8 boule;
boule = m_PremiereBouleSelectionnee;
for (i = 0; i < m_NombreBoulesSelectionnees && possible == true; i++) {
possible = (m_PlateauInterne->ValeurCaseSuivante(boule,direction) == 0);
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_DirectionLaterale); // Se positionner sur la case suivante
}
if (ptr_deplacement_avec_2_boules != NULL)
*ptr_deplacement_avec_2_boules = (i == 3);
return possible;
}
///////////////////////////////////////////////
// FONCTION "FaireGlisserLesBoulesLaterales" //
///////////////////////////////////////////////-----------------------------------------------------------
// Fait "glisser" les boules pour un déplacement latéral, c'est-à-dire déplace graphiquement les boules --
// d'une façon réaliste --
//--------------------------------------------------------------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::FaireGlisserLesBoulesLaterales()
// AUCUN PARAMETRE
{
// Création et initialisation éventuelle des variables locales
float coef_dir = LARGEUR_CASE_BOULE / (2.0 * HAUTEUR_CASE_BOULE);
int delta_x;
int delta_y;
BPoint delta = m_PlateauGraphique->DirectionGraphique(m_Direction);
int i, compteur_max, translation;
int8 j;
int nbre_delta_x = 0;
bigtime_t temps;
BRect rect_mis_a_jour;
int8 boule;
delta_x = (int)delta.x;
delta_y = (int)delta.y;
if (delta_y == 0)
compteur_max = abs(delta_x);
else {
compteur_max = abs(delta_y);
delta_y /= abs(delta_y);
}
delta_x /= abs(delta_x);
for (i = 1; i < 3*compteur_max/4; i++) {
temps = system_time();
if (delta_y == 0 || (int(coef_dir*(i-1)) != int(coef_dir*i))) {
translation = 1;
nbre_delta_x++;
}
else
translation = 0;
// Déplacer les vues "Boule" (graphiquement)
boule = m_PremiereBouleSelectionnee;
for (j = 0; j < m_NombreBoulesSelectionnees; j++) {
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta_x*translation, delta_y);
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_DirectionLaterale); // Se positionner sur la case suivante
}
while ((system_time() - temps) < DELAI_POUR_POUSSER );
}
if (delta_y != 0)
coef_dir = 2;
else
coef_dir = 1;
delta_x *= (int)(LARGEUR_CASE_BOULE/coef_dir) - nbre_delta_x;
delta_y *= compteur_max - (3*compteur_max/4)+1;
// Déplacer les vues "Boule" (graphiquement)
boule = m_PremiereBouleSelectionnee;
for (j = 0; j < m_NombreBoulesSelectionnees; j++) {
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta_x, delta_y);
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
boule = m_PlateauInterne->ValeurCaseSuivante(boule,m_DirectionLaterale); // Se positionner sur la case suivante
}
if (m_SonTomber->InitCheck() == B_OK)
m_SonTomber->StartPlaying();
}
////////////////////////////////////////
// FONCTION "DeplacerBoulesLaterales" //
////////////////////////////////////////------------
// Déplace les boules pour un déplacement lateral --
// (avec ou sans une mise à jour graphique) --
//--------------------------------------------------
void // AUCUNE VALEUR DE RETOUR
Deplacement::DeplacerBoulesLaterales(bool faire_glisser_les_boules, bool mise_a_jour_buffer_ecran)
// 2 PARAMETRES : ENTREE ENTREE
{
// Création et initialisation éventuelle des variables locales
int8 i;
int8 boule;
int8 boule_suivante;
BPoint delta = m_PlateauGraphique->DirectionGraphique(m_Direction);
BRect rect_mis_a_jour;
m_CoupJoue.PremiereBouleSelectionnee = m_PremiereBouleSelectionnee;
m_CoupJoue.NombreBoulesADeplacer = m_NombreBoulesSelectionnees;
m_CoupJoue.Direction = m_Direction;
m_CoupJoue.DirectionLaterale = m_DirectionLaterale;
m_CoupJoue.BouleEjectee = 0;
if (faire_glisser_les_boules == true)
FaireGlisserLesBoulesLaterales();
boule = m_PremiereBouleSelectionnee;
for (i = 0; i < m_NombreBoulesSelectionnees; i++) {
boule_suivante = m_PlateauInterne->ValeurCaseSuivante(boule,m_DirectionLaterale); // Se positionner sur la case suivante
m_PlateauInterne->DeplacerBoule(boule, m_Direction); // Déplacer la boule dans le tableau interne
if (faire_glisser_les_boules == false) {
rect_mis_a_jour = m_PlateauGraphique->DeplacerBoule(boule, delta.x, delta.y);
if (mise_a_jour_buffer_ecran == true)
m_PlateauGraphique->MiseAJourBuffer(rect_mis_a_jour);
}
boule = boule_suivante;
}
}