Aller à la page 1 2 3
Reprise du message précédent:
Ephy -
posté le 25/05/2015 à 13:05:59 (30102 messages postés)
- | [BIG SHOT] | Ouais je sais. J'aime pas trop discuter publiquement mais là je profitais de l'occasion avec tes images pour glisser un mot tant que j'y pensais.
Pour les guidelines elles ont toujours été là et plus ou moins les mêmes je crois (elles sont peut-être devenues un peu plus précise avec la recrudescence de fan-games sur danmakufu), c'est juste qu'elles sont peu connues et très souvent oubliée/ignorées/changées. Sans parler du fait qu'on dit beaucoup de conneries dessus.
|
Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14 | Suite du sujet:
HuLijin -
posté le 28/05/2015 à 20:15:30 (1004 messages postés)
| Yeoun, mage-archère-louve | Ça commence à prendre forme !
Spoiler (cliquez pour afficher)
Pendant que je m'amuse à faire des menus fonctionnels (même s'ils sont franchement moches), Ephy réfléchit aux modifications de gameplay qu'on va apporter. Du coup je n'ai pas encore touché à Reikon et à ses ennemis.
Question si des gens passent dans le coin. Vous jouez aux danmaku avec quelle résolution ?
Pour le moment c'est en 640x480 mais je trouve ça un peu beaucoup petit pour les écrans actuels.
|
M.V. |
Ephy -
posté le 28/05/2015 à 20:41:40 (30102 messages postés)
- | [BIG SHOT] | Ah c'est cool ça. Juste petit détail à noter, tu n'aurais peut-être pas du traduire Lunatic par Lunatique. Sauf si je me trompe (mais j'en doute), ça n'a pas du tout le même sens en anglais et en français. Là ce serait plus du sens fou (ce qui du coup fait plus sens que lunatique en fait).
J'en parle ici histoire de pas trop paumer le public (d'autant qu'en fait on s'en fout au final).
|
Power Level: 1 148 355,38|Mystic Slayer (Value!+)|Le monde d'Adélaïde|Reikon no Yume|★ H-Project|Toho Danmaku Arena|Loli versus Ponies|Mes vidéos|Ma galerie|Débuter sur VX:10, 11|Tuto: Importation de ressources|Mapper avec les RTP VX|Touhou|Fan de Omenides|Fan de Estheone|Eph'ille: 14 |
Falco -
posté le 29/05/2015 à 22:00:56 (19777 messages postés)
- | Indie game Developer | Je suis pas trop Manic Shooter ( j'ai beau essayé j'ai vraiment du mal :P), mais ça a l'air sympa, et surtout, assez sérieux.
Je te (vous) souhaite bon courage pour la suite, j'y jouerais quand même !
|
Inexistence Rebirth - Inexistence - Portfolio |
HuLijin -
posté le 30/05/2015 à 09:05:35 (1004 messages postés)
| Yeoun, mage-archère-louve | Dixit le mec qui a collé dans sa première démo une fleur qui crachait des bullets que j'ai jamais réussi à passer X)
Merci pour l'encouragement Falco !
Edit du 9 août
Bon, ben le projet n'est pas abandonné. Vu qu'on me pose la question parfois, je vais expliquer un peu le pourquoi du comment. C'est juste qu'entre la paperasse pour quitter ma boite, les difficultés avec Pole Emploi du fait du statut de la boite, le déménagement imminent, j'avais vraiment carrément autre chose sur le feu.
Et puis il y a aussi eu la fameuse "perte de projet" début juillet. Mais attention, chez moi ce n'est pas un formatage de disque dur, non non, trop banal. C'est la suppression pure et simple de toutes mes données sur le serveur par des hackers russes... "Récupérables" (mais bien sûr) contre 3k€...
Le serveur ne m'appartenant pas, je ne fais que squatter, et son proprio étant dans les mêmes galères administratives que moi, il n'a pas encore remis en route le serveur. Ça me sert d'excuse supplémentaire pour ne pas toucher de suite à ma copie locale. Alors que je pourrais bien me démerder sans le serveur...
En revanche, si je fiche que dalle en programmation, les dessins avancent bien, voir même très bien concernant les héroïnes et les personnages cachés. L'histoire a bien décollé aussi. Je viendrai poster tout ça ici quand j'aurai récupéré un scanner. Sauf les persos cachés.
Edit du 19 août
Si certains se demandent à quoi ça ressemble un script d'ennemi de Danmakufu :
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
| /***********************************************************************************************************************
* A LIRE Hu Lijin 18/08/2015
* ------
* Ce script contient la fiche d'ennemi standardisée, qui servira pour :
* - les ennemis basiques
* - les boss
* - les boss avec spellcards
* - les invocations
* ------
* Ce script n'est pas utilisable tel quel !
* À charge de l'utilisateur de supprimer toutes les parties non relatives au type d'ennemi visé
* Ces parties seront TOUJOURS indiquées
***********************************************************************************************************************/
/***********************************************************************************************************************
* PARTIE RESERVEE AUX SPELLCARDS
***********************************************************************************************************************/
#東方弾幕風[Single]
#ScriptVersion[3]
#Title["Nom de la spellcard (dans le menu)"]
#Text["Texte d'ambiance de la spellcard (dans le menu)"]
#Image["./NomDeLImage.jpg"]
#Background["script/system/bg/NomDuBackground.dnh"]
#BGM[DEFAULT]
#Player[DEFAULT]
#System["script/system/System.dnh"]
/**********************************************************************************************************************/
/* La ligne qui suit est absolument indispensable pour faire fonctionner ce script ! */
#include"script/system/common/ExtendedEnemy.dnh"
/* Ci-dessous sont à ajouter les scripts nécessaires pour les effets visuels améliorés ou le comportement de l'ennemi */
#include"script/system/shot/ShotConst.txt"
#include"script/system/anim/DisplaySprite3MvmtNoAnim.dnh"
#include"script/system/effects/Explosion.dnh"
/***********************************************************************************************************************
* CONFIGURATION DE L'ENNEMI (commun à tous les ennemis)
* ------
* sprite : chemin d'accès du fichier image de l'ennemi
* rect : le(s) rectangle(s) d'origine du sprite, sous forme de tableau (ou tableau de tableaux) :
* [coordonnée x haut gauche, coordonnée y haut gauche, coordonnée x bas droit, coordonnée y bas droit]
* borders : les limites horizontale et verticale du sprite (définissant le rectangle de destination du sprite)
* hitboxes : la première est la boite de collision avec le tir du joueur, la seconde avec la hitbox du joueur
* life : la vie de l'ennemi
* rates : le pourcentage de dommages fait par le joueur : le premier par les tirs, le second par les spellcards
* invincibility : fenêtre de temps (en frames) pendant lequel l'ennemi est invulnérable
* items : tableau des objets lâchés par l'ennemi à sa mort (ou tableau de tableaux) :
* [nom de l'objet, quantité, rayon du cercle de distribution, angle du premier objet sur le cercle]
* explosion : le premier est la vitesse d'évanouissement (transparence), le second la vitesse d'expansion
* life : vie de l'ennemi (nombre de dommages qu'il peut encaisser avant de mourir)
***********************************************************************************************************************/
let obj_enemy; // En définir un/plusieurs autre(s) pour générer des invocations
let sprite = GetCurrentScriptDirectory~"NomDuFichierImage.png";
let rect = [/*left*/[1 ,1, 64, 64],/*idle*/[65, 1, 128, 64],/*right*/[129, 1, 192, 64]];
let borders = [64,64];
let hitboxes = [32,24];
let rates = [100,100];
let invincibility = 60;
let items = [[ITEM_1UP_S,1,0,-90],[ITEM_POWER_S,3,20,+90],[ITEM_POINT,5,40,-90]];
let explosion = [16,16];
let life = 1000;
/***********************************************************************************************************************
* CONFIGURATION DE L'ENNEMI (réservé aux boss et aux spellcards)
* ------
* timer : durée de vie du boss/de la spellcard (en secondes, pas en frames)
* spellscore : points octroyés à la capture de la spellcard
***********************************************************************************************************************/
let timer = 100;
let spellscore = 10000;
/***********************************************************************************************************************
* INITIALISATION : CERTAINES PARTIES SONT RESERVEES A UN TYPE D'ENNEMI PRECIS
***********************************************************************************************************************/
@Initialize {
// COMMUN : chargement de la texture du sprite
LoadTexture(sprite);
// ENNEMI SIMPLE
obj_enemy = ObjEnemy_Create(OBJ_ENEMY);
ObjEnemy_SetLife(obj_enemy, life);
// BOSS OU SPELLCARD
obj_enemy = ObjEnemy_Create(OBJ_ENEMY_BOSS);
// COMMUN : configuration de l'ennemi
ObjEnemy_SetDamageRate(obj_enemy, rates[0], rates[1]);
ObjEnemy_Regist(obj_enemy);
ObjEnemy_SetCollisionCircle(obj_enemy, hitboxes[0], hitboxes[1]);
// ENNEMI SIMPLE, rarement pour boss et spellcards
ObjEnemy_SetBoundaries(obj_enemy, borders[0], borders[1], invincibility);
// COMMUN : mort de l'ennemi
ObjEnemy_OnKill(obj_enemy, invincibility);
// COMMUN : comportements particuliers de l'ennemi (voir plus bas)
ObjEnemy_RenderAnimation(param);
ObjEnemy_SetMoveRoute(param);
ObjEnemy_SetShot(param);
}
/***********************************************************************************************************************
* MAIN LOOP : NE RIEN AJOUTER ICI, INUTILE
***********************************************************************************************************************/
@MainLoop { yield; }
/***********************************************************************************************************************
* FINALIZE : COMMUN A TOUS LES ENNEMIS
***********************************************************************************************************************/
@Finalize {
RemoveTexture(sprite);
if (!Obj_IsDeleted(obj_enemy)) {Obj_Delete(obj_enemy);}
else {
DeleteShotAll(TYPE_ALL, TYPE_ITEM); // UNIQUEMENT POUR BOSS ET SPELLCARDS
ObjEnemy_DropAllItems(items);
TExplosionA(coordinates[0],coordinates[1],explosion[0],explosion[1]);
}
}
/***********************************************************************************************************************
* EVENT : RESERVE AUX BOSS ET SPELLCARDS
* EV_EQUEST_SPELL_SCORE est réservé uniquement aux spellcards, ligne à effacer pour un boss simple
***********************************************************************************************************************/
@Event {
alternative(GetEventType())
case (EV_REQUEST_LIFE) { SetScriptResult(life); }
case (EV_REQUEST_TIMER) { SetScriptResult(timer); }
case (EV_REQUEST_SPELL_SCORE) { SetScriptResult(spellscore); } // UNIQUEMENT POUR SPELLCARDS
}
/***********************************************************************************************************************
* FONCTIONS COMMUNES A TOUS LES ENNEMIS : comportement (mouvements, affichage, tirs)
* Il est fort probable que pour les ennemis les plus évolués, certaines variables globales communes à 2 ou aux 3
* fonctions soient nécessaires pour les coordonner.
* ------
* Il est prévu que j'enrichisse des bibliothèques de fonctions pour faciliter la création de ces comportements.
***********************************************************************************************************************/
task ObjEnemy_RenderAnimation (param) {
// appeler une des fonctions d'animation de system/anim/
yield;
}
task ObjEnemy_SetMoveRoute(param) {
ObjEnemyBossScene_StartSpell(GetEnemyBossSceneObjectID()); // UNIQUEMENT POUR SPELLCARDS
// appeler une/plusieurs des fonctions de déplacement de system/routes/
yield;
}
task ObjEnemy_SetShot(param) {
// appeler une/plusieurs des fonctions prédéfinies de system/shot/
yield;
} |
Et son petit frère :
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
| /***********************************************************************************************************************
* A LIRE Hu Lijin 19/08/2015
* ------
* Ensemble de fonctions regroupant un certain nombre de processus communs aux ennemis pour faciliter la maintenance.
* Facilite également la création d'ennemis basiques, en passant par des scripts propres à chacun d'entre eux.
* A utiliser avec le template BasicEnemy.dnh
* ------
* Pour les ennemis basiques, les appeler via les commandes suivantes :
let id = LoadScript("chemin_d_acces_du_script" ~ "nom_du_script");
loop (1) { yield; }
StartScript(id);
* Pour autoriser la poursuite du stage après la mort de l'ennemi / X frames après l'apaprition de l'ennemi
while (!IsCloseScript(id)) { yield; } / loop (X) { yield; }
***********************************************************************************************************************/
let coordinates = [0,0]; // Utilisé pour stocker les coordonnées de l'ennemi à sa mort, avant de le détruire
/***********************************************************************************************************************
* SetCollisionCircle
* ------
* obj : l'objet ennemi
* hitbox1 : cercle de collision avec les tirs du joueur (souvent, la moitié de la largeur du sprite)
* hitbox2 : cercle de collision avec le propre cercle de collision du joueur (souvent inférieur au précédent)
***********************************************************************************************************************/
task ObjEnemy_SetCollisionCircle (obj, hitbox1, hitbox2) {
while (!Obj_IsDeleted(obj)) {
ObjEnemy_SetIntersectionCircleToShot(obj, ObjMove_GetX(obj), ObjMove_GetY(obj), hitbox1);
ObjEnemy_SetIntersectionCircleToPlayer(obj, ObjMove_GetX(obj), ObjMove_GetY(obj), hitbox2);
yield;
}
}
/***********************************************************************************************************************
* DropItems et DropAllItems
* ------
* La fonction DropItems a pour but d'afficher des objets à la mort de l'ennemi, disposés en cercle
* dont le rayon et la position du premier objet sur ce cercle sont paramétrables.
* Cette fonction ne prend en compte qu'un seul type d'objets.
* Pour afficher plusieurs types d'objets, il faut utiliser la fonction DropAllItems.
* ------
* DropItems : items est un tableau construit comme suit :
* [ID de l'objet, quantité, rayon du cercle de distribution, angle du premier objet sur le cercle]
* DropAllItems : items est un tableau des items de DropItems (donc un tableau de tableaux)
***********************************************************************************************************************/
function ObjEnemy_DropAllItems (items) {
ascent(i in 0..length(items)) { ObjEnemy_DropItems(items[i]); }
}
function ObjEnemy_DropItems (items) {
let item = items[0];
let nb = items[1];
let x = coordinates[0];
let y = coordinates[1];
let r = items[2];
let angle = items[3];
ascent(j in 0..nb) { CreateItemA2(
item,
x,
y,
x+r*cos(360/nb*j-90+angle),
y+r*sin(360/nb*j-90+angle),
0
); }
}
/***********************************************************************************************************************
* OnKill
* ------
* Cette fonction a trois buts :
* - autoriser une période d'invincibilité où l'ennemi ne prend pas de dommages à son apparition
* - enregistrer ses coordonnées lorsqu'il meurt avant qu'il ne soit détruit
* - détruit l'ennemi.
* ------
* Ceci fonctionne comme un interrupteur pour la boucle Finalize : si l'ennemi a été correctement détruit par le joueur
* avant la fin du script, les événements définis dans la boucle Finalize se dérouleront, comme par exemple les
* récompenses en objets, ou l'appel d'un script spécial.
* ------
* obj : l'objet ennemi
* invincibility : période d'invincibilité à l'apparition (en frames)
***********************************************************************************************************************/
task ObjEnemy_OnKill(obj, invincibility) {
loop (invincibility) { yield; }
while (ObjEnemy_GetInfo(obj, INFO_LIFE) > 0) { yield; }
coordinates = [ObjMove_GetX(obj),ObjMove_GetY(obj)];
Obj_Delete(obj);
CloseScript(GetOwnScriptID());
}
/***********************************************************************************************************************
* IsBetweenX et IsBetweenY
* -------
* Permet de vérifier que les coordonnées du centre de l'ennemi sont comprises
* entre deux limites horizontales ou verticales
* -------
* obj : l'objet ennemi
* xmin/ymin : limite inférieure, souvent GetStgFrameLeft() et GetStgFrameTop()
* xmax/ymax : limite supérieure, souvent GetStgFrameLeft()+GetStgFrameWidth() et GetStgFrameTop()+GetStgFrameHeight()
* ------
* retourne true ou false
***********************************************************************************************************************/
function ObjEnemy_IsBetweenX(obj, xmin, xmax) {
return (ObjMove_GetX(obj) > xmin && ObjMove_GetX(obj) < xmax);
}
function ObjEnemy_IsBetweenY(obj, ymin, ymax) {
return (ObjMove_GetY(obj) > ymin && ObjMove_GetY(obj) < ymax);
}
/***********************************************************************************************************************
* SetBoundaries
* ------
* FONCTION PEU UTILE POUR LES BOSS ET SPELLCARDS, QUASI OBLIGATOIRE POUR LES ENNEMIS BASIQUES
* Sert à fermer le script de l'ennemi s'il est sorti de l'écran sans que le joueur parvienne à le tuer.
* Note : l'objet ennemi n'est pas détuit, par conséquent c'est la boucle Finalize qui s'en charge, bypassant tous les
* événements se produisant à la mort normale de l'ennemi.
* ------
* Cette fonction vérifie toutes les 60 frames, pour ne pas surcharger).
* ------
* obj : l'objet ennemi
* boundary1/2 : zone tampon horizontale (1) et verticale (2), pour s'assurer que le sprite n'est plus visible
* sur les bords de la fenêtre de jeu lorsqu'il sera détruit.
* Les boundaries correspondent au minimum à la moitié de la largeur et de la hauteur du sprite.
* delay : autorise une période d'invincibilité, si l'ennemi est créé hors screen et doit rester hors screen
* pendant un grand laps de temps (en frame)
***********************************************************************************************************************/
task ObjEnemy_SetBoundaries(obj, boundary1, boundary2, delay) {
loop (delay) { yield; }
let xmin = GetStgFrameLeft() - boundary1;
let xmax = GetStgFrameLeft() + GetStgFrameWidth() + boundary1;
let ymin = GetStgFrameTop() - boundary2;
let ymax = GetStgFrameTop() + GetStgFrameHeight() + boundary2;
while (ObjEnemy_IsBetweenX(obj,xmin,xmax) && ObjEnemy_IsBetweenX(obj,ymin,ymax)) { loop(60) { yield; } }
CloseScript(GetOwnScriptID());
} |
Up du 2 septembre.
J'ai enfin fini le système de dialogues (si des intéressés veulent le code, je le posterai à l'occasion). Reste plus qu'à finir le système de points et d'objets customs (qu'Ephy a bien entamé de son coté) et on va pouvoir sortir un peu plus qu'une démo technique.
Et je n'ai toujours pas de scanner sous la main pour mes dessins :/
|
M.V. |
Falco -
posté le 02/09/2015 à 13:19:13 (19777 messages postés)
- | Indie game Developer | Peut être as tu un téléphone portable avec une bonne qualité de photo, où même un appareil photo ?
Je procède ainsi pour mes dessins, une fois que c'est bidouillé sur Photoshop on a réellement l'impression que le rendu est scanné.
|
Inexistence Rebirth - Inexistence - Portfolio |
HuLijin -
posté le 02/09/2015 à 14:45:31 (1004 messages postés)
| Yeoun, mage-archère-louve | Techniquement j'ai le scanner, mais il est tellement vieux qu'il faut que je réinstalle un windows XP sur un pc :X
Sinon, avec le téléphone ça donne ça :
Spoiler (cliquez pour afficher)
(c'est la nouvelle Reikon dans son nouveau pyjama)
Mais comme je n’arrive pas à prendre la photo en étant bien parallèle ça déforme l'image :/
Sur l'image précédente on s'en moque royalement vu le peu de réalisme de la silhouette, mais sur d'autres dessins c'est vraiment gênant. Et je suis une quiche pour rattraper ça avec toshop.
|
M.V. | Aller à la page 1 2 3Index du forum > Jeux en développement > [Manic shooter] Reikon no Yume (v0.3c)
|