Bonsoir à tous !

Je suis actuellement étudiant en école d'ingénieur et j'ai un projet à faire sous Matlab/Simulink.

Je m'explique, je dois m'occuper de créer un pong et actuellement, j'ai un fichier m.file qui fonctionne au poil (bien que le jeu ne soit pas encore complet), j'ai réussi à modéliser la balle, ses rebonds, le terrain (limites et taille) ainsi que les raquettes et tout ça en "code" pure.

Seulement voilà, mon professeur veut à tout prix que nous lui rendons tout ça sous forme de fichier .mdl, c'est à dire sous Simulink.

C'est pourquoi je viens vous demander votre aide, mon fichier m.file est composé de plusieurs fonctions mais je ne sais guère comment mettre tout ça sous Simulink, la plus grosse difficulté étant de gérer les nombreuses variables prises en compte. J'ai songé aux Embedded Function de Simulink mais je ne suis pas sur que cela fonctionner.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
function pong[] = Projet_Matlab()
 
close all
clear all
 
%----------------------Constantes----------------------
 
temps_img = .01; 
mini_vitesse_balle = .8; 
max_vitesse_balle = 3; 
balle_acceleration = 0.05; 
param_rebond = 1;
param_rebond1 =0.1;
Balle_rayon_calcul = 1.5; 
epaisseur_mur = 3;
epaisseur_figure = 1024; 
hauteur_figure = 800;
plot_epaisseur = 150; 
plot_hauteur = 100; 
taille_but = 30;
haut_but = (plot_hauteur+taille_but)/2;
bas_but = (plot_hauteur-taille_but)/2;
couleur_figure = [0, 0, 0]; 
couleur_axe = [0, 0, 0];
balle_rayon = 10; 
balle_couleur = [1, 1, 1];
balle_lim = [1, 1, 1];
balle_forme = 'o';
mur_couleur = [1, 1, 1];
raquette_hauteur = 20;
raquette_largeur = 5;
raquette = [0 raquette_largeur raquette_largeur 0 0; raquette_hauteur raquette_hauteur 0 0 raquette_hauteur];
raquette_espace = 10;
raquette_couleur = [1, 1, 1];
raquette_ligne_epaisseur = 2;
 
 
%----------------------Variables----------------------
 
fig = [];
quitter_jeu = false; 
plot_balle = []; 
balle_vecteur=[];
balle_vitesse=[];
balle_X = []; 
balle_Y = [];
plot_raquette1 = [];
plot_raquette2 = [];
raquette1 = [];
raquette2 = [];
score(1) = 0;
score(2) = 0;
but=false;
 
%-----------------------Fonctions----------------------
 
%------------creer_Figure------------
 
  function creer_Figure
    scrsz = get(0,'ScreenSize');
    fig = figure('Position',[(scrsz(3)-epaisseur_figure)/2 ...
      (scrsz(4)-hauteur_figure)/2 ...
      epaisseur_figure, hauteur_figure]);
    set(fig, 'Resize', 'off');
    axis([0 plot_epaisseur 0 plot_hauteur]);
    axis manual;
    set(gca, 'color', couleur_axe, 'YTick', [], 'XTick', []);
    set(fig, 'color', couleur_figure);
    hold on;
    haut_murXs = [0,0,plot_epaisseur,plot_epaisseur];
    haut_murYs = [haut_but,plot_hauteur,plot_hauteur,haut_but];
    bas_murXs = [0,0,plot_epaisseur,plot_epaisseur];
    bas_murYs = [bas_but,0,0,bas_but];
    plot(haut_murXs, haut_murYs, '-', ...
      'LineWidth', epaisseur_mur, 'Color', mur_couleur);
    plot(bas_murXs, bas_murYs, '-', ...
      'LineWidth', epaisseur_mur, 'Color', mur_couleur);
    plot_balle = plot(0,0);
    set(plot_balle, 'Marker', balle_forme);
    set(plot_balle, 'MarkerEdgeColor', balle_lim);
    set(plot_balle, 'MarkerFaceColor', balle_couleur);
    set(plot_balle, 'MarkerSize', balle_rayon);
    plot_raquette1 = plot(0,0, '-', 'LineWidth', raquette_ligne_epaisseur);
    plot_raquette2 = plot(0,0, '-', 'LineWidth', raquette_ligne_epaisseur);
    set(plot_raquette1, 'Color', raquette_couleur);
    set(plot_raquette2, 'Color', raquette_couleur);
 
  end
 
 
  function nouveau_jeu
 
    raquette1 = [raquette(1,:)+raquette_espace; ...
      raquette(2,:)+((plot_hauteur - raquette_hauteur)/2)];
    raquette2 = [raquette(1,:)+ plot_epaisseur - raquette_espace - raquette_largeur; ...
      raquette(2,:)+((plot_hauteur - raquette_hauteur)/2)];
    rebond([1-(2*rand), 1-(2*rand)]);
    balle_vitesse=mini_vitesse_balle;
     balle_X = plot_epaisseur/2;
     balle_Y = plot_hauteur/2;
    Affichage;
    if ~quitter_jeu;
    end
  end
%------------mouvement_balle------------
 
  function mouvement_balle
 
    r1T = raquette1(2,1);
    r1B = raquette1(2,3);
    r1L = raquette1(1,1);
    r1R = raquette1(1,3);
    r1Centre = ([r1L r1B] + [r1R r1T]) ./ 2;
    r2T = raquette2(2,1);
    r2B = raquette2(2,3);
    r2L = raquette2(1,1);
    r2R = raquette2(1,3);
    r2Centre = ([r2L r2B] + [r2R r2T]) ./ 2;
 
    n_balle_X = balle_X + (balle_vitesse * balle_vecteur(1));
    n_balle_Y = balle_Y + (balle_vitesse * balle_vecteur(2));
 
    % test mur droit
    if (n_balle_X > (plot_epaisseur - Balle_rayon_calcul) ...
        && (balle_Y<bas_but+Balle_rayon_calcul || n_balle_Y>haut_but-Balle_rayon_calcul))
      %mur droit
      if (n_balle_Y > bas_but && n_balle_Y < haut_but - Balle_rayon_calcul)
        %but_front_bas
        rebond([n_balle_X - plot_epaisseur, n_balle_Y - bas_but]);
      elseif (n_balle_Y < haut_but && n_balle_Y > bas_but + Balle_rayon_calcul)
        %but_front_haut
        rebond([n_balle_X - plot_epaisseur, n_balle_Y - haut_but]);
      else
        %mur_droit
        rebond([-1 * abs(balle_vecteur(1)), balle_vecteur(2)]);
      end
 
      %test mur gauche
    elseif (n_balle_X < Balle_rayon_calcul ...
        && (n_balle_Y<bas_but+Balle_rayon_calcul || n_balle_Y>haut_but-Balle_rayon_calcul))
      %mur gauche
      if (n_balle_Y > bas_but && n_balle_Y < haut_but - Balle_rayon_calcul)
        %but_front_bas
        rebond([n_balle_X, n_balle_Y - bas_but]);
      elseif (n_balle_Y < haut_but && n_balle_Y > bas_but + Balle_rayon_calcul)
        %but_front_haut
        rebond([n_balle_X, n_balle_Y - haut_but]);
      else
        rebond([abs(balle_vecteur(1)), balle_vecteur(2)]);
      end
 
      %test mur_haut
    elseif (n_balle_Y > (plot_hauteur - Balle_rayon_calcul))
      % mur_haut
      rebond([balle_vecteur(1), -1 * (param_rebond1 + abs(balle_vecteur(2)))]);
      %test mur_bas
    elseif (n_balle_Y < Balle_rayon_calcul)
      % mur_bas
      rebond([balle_vecteur(1), (param_rebond1 + abs(balle_vecteur(2)))]);
            %test raquette 1
    elseif ( n_balle_X < r1R + balle_rayon/6 ...
        &&  n_balle_X > r1L - balle_rayon/6 ...
        &&  n_balle_Y < r1T + balle_rayon/6 ...
        &&  n_balle_Y > r1B - balle_rayon/6)
      rebond([(balle_X-r1Centre(1)),  n_balle_Y-r1Centre(2)]);
 
      %test raquette 2
    elseif ( n_balle_X< r2R + balle_rayon/6 ...
        &&  n_balle_X > r2L - balle_rayon/6 ...
        &&  n_balle_Y < r2T + balle_rayon/6 ...
        &&  n_balle_Y> r2B - balle_rayon/6)
      rebond([(balle_X-r2Centre(1)),  n_balle_Y-r2Centre(2)]);
    else
      %pas de rebond
    end
 
 
    balle_X = n_balle_X;
    balle_Y = n_balle_Y;
 
  end
 
%------------Affichage------------
 
  function Affichage
    set(plot_balle, 'XData', balle_X, 'YData', balle_Y);
    set(plot_raquette1, 'Xdata', raquette1(1,:), 'YData', raquette1(2,:));
    set(plot_raquette2, 'Xdata', raquette2(1,:), 'YData', raquette2(2,:));
    drawnow;
    pause(temps_img);
  end
%------------rebond------------
 
  function rebond (tempV)
    % changer le rebond
    tempV(1) = tempV(1) * ((rand/param_rebond) + 1);
    %normaliser le vecteur
    tempV = tempV ./ (sqrt(tempV(1)^2 + tempV(2)^2));
    balle_vecteur = tempV;
    %accelerer les rebonds de la balle
    if (balle_vitesse + balle_acceleration < max_vitesse_balle)
      balle_vitesse = balle_vitesse + balle_acceleration;
    end
  end
 
 
%------------but_but------------
 
  function but_but
    but = false;
    if balle_X > plot_epaisseur + balle_rayon + 10
      score(1) = score(1) + 1;
      but = true;
    elseif balle_X < 0 - balle_rayon - 10
      score(2) = score(2) + 1;
      but = true;
    end
 if but 
      pause(100*temps_img);
     nouveau_jeu;
 end
  end
%----------------------Main----------------------
 
creer_Figure;
nouveau_jeu;
while ~quitter_jeu
  mouvement_balle;
  Affichage;
  but_but;
end
close(fig);
 
  end
Merci d'avance pour votre aide.

Julien.