Tout est dans le titre , je me demande comment on peut avoir une perspective en faisant des zoom sur les lignes , en faite je sais faire mais les calcul que j'avais effectuer n'ont pas marché du coup je n'ai aucun idée du calcul mathématique qu'il faut faire :/
J’espère que ici quelqu'un a une idée vu que moi je sèche la ^^
Donc j'ai décidé d'y aller de manière empirique c'est long et fastidieux mais au moins j'ai un peu une idée du résultat attendu.
Cela fait un moment que je suis dessus donc du coup je me demande si j'ai pas besoin d'un petit recul pour réussir
Voila un screen :
Il faut regarde le bas , pas le haut (je remplacerais ceci par un jolie ciel bleu je présume).
Ma première semaine de test je faisais les calcul en asm et c'était vraiment très pénible avec l'assembleur de la SNES (assez limité pour faire des calcul a vrai dire).
Pour tes raisons de facilité j'ai décidé de precalculer tout ça en C et de test , donc voici la code :
La variable zoom ces valeurs correspond a que 0X100 (256) ne fait aucun zoom , en faire cela n'est pas tout a fait une valaur de zoom mais l'indication du nombre de pixel sur une ligne.
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 #include <stdlib.h> #include <stdio.h> #include <math.h> #include <time.h> int main(int argc, char** argv) { int i; FILE *fichier; fichier = fopen("main.smc","rb+"); if(fichier == NULL) return 0; char chaine[200]; int bt = 0; int n,zoom,sub; fseek(fichier,0x8000*14,SEEK_SET); //on commence a cet valeur de zoom zoom = 0x278; for(i = 0; i < 0x80;i++) //0x80 soit 128 ligne { //n c'est 8 lines n = i/8; // valeur completement arbitraire if(n == 0) sub = 0x10; if(n == 1) sub = 0x0C; if(n == 2) sub = 0x08; if(n == 3) sub = 0x06; if(n == 4) sub = 0x05; if(n == 5) sub = 0x04; if(n == 6) sub = 0x03; if(n == 7) { //Nt : pour simuler la virgule ici c'est 2.5 bt++; if(bt == 2) bt = 0; if(bt == 0) sub = 0x02; else sub = 0x03; } if(n == 8) sub = 0x02; if(n == 9) { bt++; if(bt == 4) bt = 0; if(bt == 0) sub = 0x01; else sub = 0x02; } if(n == 10) { bt++; if(bt == 3) bt = 0; if(bt == 0) sub = 0x01; else sub = 0x02; } if(n == 11) { bt++; if(bt == 2) bt = 0; if(bt == 0) sub = 0x02; else sub = 0x01; } if(n == 13) { bt++; if(bt == 3) bt = 0; if(bt == 0) sub = 0x02; else sub = 0x01; } if(n == 15) { bt++; if(bt == 4) bt = 0; if(bt == 0) sub = 0x02; else sub = 0x01; } if(n == 16) sub = 0x01; fputc(zoom&0xFF,fichier); fputc((zoom>>8)&0xFF,fichier); printf("%d\n",zoom); zoom -= sub; } fclose(fichier); return 0; }
Je m'explique si zoom = 256 , et on a une résolution sur SNES de (256x224) , ben 256 pixel sur 256 ben on a aucun zoom , par exemple si zoom = 512 , on a un équivalent de 0.5 (vu qu'on demande d'afficher 512 pixel sur 256 de réso).
Et donc un 0x80 (128) on a un x2 en zoom.
Par observation je dirait que le fond est un zoom sur 0x300 et le devant de 0x60.
Un zoom lineaire ne marche pas deja testé ^^
La difficulté supplémentaire c'est cette basse résolution , je dois faire la perspective sur 128 pixel :/ (et le reste 128 pour le ciel).
Et donc les résultats doit être assez 'précis' , surtout qu'on est la ligne est proche de l'écran il faut que les valeurs soit toujours différente (je dirait que -1 est le minimum).
Si vous testez vous remarquez une légère ''bosse' mais j'ai parce que j'ai pas mal frignolé les valeurs , mais a la base c'était beaucoup plus marqué.
Pour ceux qui veulent compiler+test (la rom du jeu est include) :
http://www.mediafire.com/download/nc.../snesmode7.zip
NT : si vous avez code block + linux compiler et exécuter lancera l'émulateur snes9x (si vous l'avez) sur windows faudra changer la config de C::B ou de choisir l"émulateur de votre choix manuellement.
Voila
Partager