1

Après avoir vu l'RPG de deeph j'ai pensé à "annoncer" quelque chose à ce que je me dédique pour le moment. Bon, voici un jeu que j'ai passé quelques semaines en l'écrivant. Je suppose que ce sera un RPG, si est-ce qu'un jour je le finis.

Je vous laisse une image:
tromb Fichier joint : Ts7R (juego.gif)

Quand il va plus rapide c'est que le mapper saute 2 pixels (en appuyant sur [ALPHA]). Maintenant je suis en traîn d'écrire la routine de texte, qui est un peu compliquée avec des charactères de tailles variables...

2

Cool :-)

3

Merci smile

Voici que j'ai terminé la première partie de la routine de texte:
UrGC (texte.gif)

w7y0 (texte2.gif)

tL0m (texte3.gif)
Je sais que quelques lettres sont absolument hideuses, si quelqu'un a des suggestions je suis tout ouïe !

4

C'est magnifique, bravo !!!!!

Pour le texte, mis à part le "s" je trouve que c'est très beau smile

En tout cas ton jeu est dejà une vraie merveille, keep the good work !

5

Wow ça a l'air excellent !

Les maps sont encodées ? Tu prévois d'ajouter une animation lorsque le personnage marche ?

En tout cas bravo, ça a l'air prometteur smile

6

Thanks smile

Oui, le "s" est assez... laid. Je ne sais pas comment le faire plus attractif. Le S dans le TI-OS est aussi très laid :/

deeph: oui, mais pour le moment je veux faire d'autres choses. Maintenant je suis en traîn d'organiser les maps/tiles pour afficher des tiles animées.

Mes maps sont ainsi:
map:
.db 1,1,1,1,1,1,1
.db 1,0,0,0,0,0,1
.db 1,0,0,0,2,0,1
.db 1,0,3,0,0,0,1
.db 1,0,0,0,0,0,1
.db 1,1,1,1,1,1,1

brush:
.dw brush0
.dw brush1
.dw brush2
.dw brush3

brush0:
.db %00000000 ;des renseignements sur la tile, si on peut la traverser, si elle est animée, si on peut interagir avec elle, etc.
.db 0 ;nombre de tile

brush1:
.db %00000001
.db 1

brush2:
.db %00000101
.db 2
.dw texte ;des renseignements additionels (pour exemple, si c'est un panneau ou quelque chose de pareil, le label du texte à afficher)

brush3:
.db %00000011
.db 3
Merci à vous tous pour les remarques !

7

voilà des tiles animées:
AS2P (animé.gif)

Il me reste encore beaucoup à faire, on va voir quand on pourra entrer dans les maisons smile

8

Ayy j'ai récrit et restructuré beaucoup de choses, et j'ai réussi enfin à implémenter des tiles avec des hauteurs variables. J'ai aussi effacé les horribles espaces blancs autour des tiles qui n'occupent pas la case complète (regardez les maisons) en affichant un tile par défaut en dessous. Chaque carte aura un tile par défaut qui sera quelque chose comme le sol de la carte. Je voulais aussi faire la même chose avec les côtès, mais je suis très fatigué après avoir passé tant de temps en programmant l'hauteur que je crois que je vais me reposer un peu :P Par la suite, je sais pas, peut-être c'est l'heure d'ajouter des objets interactifs ? J'ai déjà écrit le code...
2PFu (nouveau tilemap.gif)
Le mapper est assez lourd maintenant, mais qu'y faire?

9

Bravo ça rend super bien je trouve (manque plus que l'animation lorsque le perso marche tongue).

Oui après l’interaction avec les objets (et npc ?) est nécessaire.

En tout cas ta solution de tiles à hauteur variable me semble plus optimisée que d'utiliser plusieurs couches pour le mapper smile

10

Comment fais tu pour gérer le scrolling?
Comment gères tu techniquement les hauteurs variables?


Est-ce que tout l'écran est effacé entre chaque mouvement du joueur?
En gros comment marche ton jeu ??? (l'affichage)
Parce que y a des moments (très souvent) ou tu affiches juste un tout petit morceau de sprite et ça je trouve que ce n'est pas évident à gérer.

En tout cas bravo, je trouve que ton jeu est déjà magnifique...

11

Comment fais tu pour gérer le scrolling?
Je le fait pendant l'affichage de l'écran. J'ai un buffer où je dessine un morceau de la carte que je veut afficher qui est une colonne et un rang plus grand que l'écran, c'est-à-dire 7 sprites de large et 5 d'haut. Ici c'est un mapper (plus ou moins) normale, aligné. Où je fais le scrolling c'est en affichant le buffer à l'écran. Je décale chaque octet (avec un peu de SMC) avant de l'afficher:
drawGbuf:		
	ld a,$80
	out ($10),a		;establecer row ($80: 0, a $BF:63)
	ld hl,saferam1-14+(14*64)	;al pasar tenemos que restar 14x64 (12 columnas en la pantalla, dos fuera/parcialmente fuera)
xOff = $+1
	ld a,0
	cp 8
	jr c,noSkip
	inc hl
noSkip:
yOff = $+1
	ld a,0
	or a
	jr z,noSkip2
	ld b,a
	ld de,14
	add hl,de
	djnz $-4
noSkip2:
	ld a,$20		;$20: col 0, $2E: col 14
	ld c,a
fastCopyAgain:
	ld b,64			;64 filas
	inc c			;avanzar a proxima fila
	ld de,-(14*64)
	out ($10),a		;actualizar columna
	add hl,de
	ld de,13
	inc hl
fastCopyLoop:
	add hl,de
	ld a,(hl)		;cargar valor en gbuf a a
rotLeft:
 .db 0,0,0,0			;rotar valores que necesitamos
maskLeft = $+1
	and $FF			;necesitamos los valores a la izquierda
 	ld (byteUno),a
 	inc hl
 	ld a,(hl)		;el proximo byte que llena el resto del primero
rotRight:
 .db 0,0,0,0
maskRight = $+1
	and 0
byteUno = $+1
	or 0
	out ($11),a
	djnz fastCopyLoop
	
	ld a,c
	cp $2B+1
	jr nz,fastCopyAgain
	ret

Comment gères tu techniquement les hauteurs variables?
Ça c'est un peu plus compliqué. Chaque tile que tu vois a son propre groupe de données qui disent au mapper ce qu'il faut faire avec lui. Par exemple, ici la partie gauche du toit de la maison:
brush026:
;bit 0: si la tile est animée ou non
;bit 1: si on peut marcher sur la tile
;bit 2: si la tile a une hauteur différente
.db %00000110	;elle n'est pas animée, on peut pas y passer, et elle a une hauteur variable
.db 26			;l'offset du sprite (26ème sprite)
.db 0			;masque #0
.db 12			;on peut marcher 12 bits derrière le sprite 

Quand je vois si le joueur va heurter une tile "nonpassable", je dois aussi voir si cette tile a une hauteur spéciale. Puis, je calcule:
joueur_Y + 15 + le nombre de pixels que le joueur va avancer vers le bas
+15 car nous voulons savoir où est ses pieds, pas sa tête wink
Puis:
	exx
		ld a,e	;e = jouer_y+15+combien à avancer
	exx
	and $0f		;l'offset: si on a passé de 16 (à une nouvelle tile)
	jr nz,$+3		;si a = 0, il faut changer à $FF (ou n'importe quel grand nombre)
	dec a
	ld e,a

	ld a,(hl)		;hl = nombre de bits/hauteur
	cp e			;si joueur_y > hauteur, on ne peut pas y passer
	ld a,0
	rla			;alors, a va être 1 si j_Y > hauteur, 0 si j_Y <= hauteur
	ret

Si a = 1, nous ne pouvons pas passer. Si a=0, tout va bien.

[cite]Est-ce que tout l'écran est effacé entre chaque mouvement du joueur?[cite]En effet. Bon, non, pas effacer, mais je dessine tout constamment (remplaçant tout ce qu'il y avait avant à chaque boucle).

Et merci smile Mais vous ne trouvez pas que tout avance trop lentement ?

deeph: j'ai dessiné les sprites de l'animation du personnage wink

12

Bof pas besoin d'un scroll super rapide pour un RPG, à la limite tu peux scroller de 2 pixels en 2 pixels mais ça doit être un peu plus compliqué pour gérer les collisions.

Cool pour les sprites tongue

13

Non, tout est déjà fait, on peut scroller comme on veut, 1 en 1, 2 en 2, 8 en 8, et pas de problème. Bon, les tiles avec une hauteur variable auraient quelques problèmes si on scrolle beaucoup... De toute façon on pourra courir (2 en 2 ou 3 en 3, je ne sais pas encore) en appuyant sur [ALPHA].

Quant aux sprites, si j'ai le temps demain, je les ajouterai smile (3 sprites pour chaque direction, chaqu'un avec son masque c'est 12 sprites et 12 masque: 768 octets!)

14

J'ai ajouté les sprites samedi mais j'ai trouvé une bogue assez ennuyeuse avec ma formule pour détecter des collisions avec les petits objets (comme le petit panneau hors du magasin d'armes), alors ça m'a distrait jusqu'à aujourd'hui quand j'ai eu le temps (et la volonté) de m'en occuper.
K5EA (on marche!.gif)
Je ne sais pas comment vous trouvez les animations. Moi, je n'aime pas beaucoup celles de la droite/gauche, quelque chose avec les pieds...

15

L'animation est parfaite je trouve smile

16

C'est de toute beauté !!! wink

17

Très chouette! Ton projet avance bien

18

Merci ! Aujourd'hui j'ai commencé à programmer les tiles interactives et à vrai dire c'est assez agréable de ne pas avoir des tas de problèmes grin la routine de texte est intégrée maintenant aussi:
[/b] M0EE (des tiles interactives.gif)

Il me semble que la plupart du mapper est faite (bon, presque faite). Il y a quelques trucs encore que je veux y ajouter, quelques idées que j'ai, mais pour le moment je ne suis pas sûr comment le faire sans tout compliquer.

19

Waouh magnifique !!

Que veux-tu ajouter?

Concernant le mapper, comment geres-tu les sprites coupés sur les bords??
Car j'ai compris le principe de copier dans un buffer plus grand avant de copier dans le graphbuffer, mais comment fais-tu pour ecrire une sprite de 7 bits de longueur a gauche et 1 bits à droite lorsque tu deplaces le personnage d'un pixel à droite par exemple?

Comment fais-tu pour l'animation du personnage? Un timer ou tu copies une sprite dans une sprite de base?

Comment est faites la map? Une suite de valeurs pointant l'offset des sprites?

En tout cas ton jeu est une vraie merveille...

20

Que veux-tu ajouter?

Je veux d'abord essayer les programmer, car je ne sais pas comment ils vont résulter, quelques trucs utilisant les interruptions pour la routine de texte. grin
Concernant le mapper, comment geres-tu les sprites coupés sur les bords??

Bon, ce que je fais est assez simple. Premièrement j'affiche le map comme s'il était aligné (comme le map dans oilcap) et le mapper ne fait rien de plus. Ensuite, quand je vais afficher le buffer à l'écran, je décale chaque octet comme il faut. Voyons ton exemple:
Notre sprite a 15 bits (mes sprites sont 16x16) dans un octet, 1 bit dans celui d'à droite.
Pour afficher notre sprite (2):
12222222|22222222|23333333 etc
1 = le sprite à gauche, 3 = le sprite à droite

1. décaler (rrca) sprite 1 un bit à droite, le masquer (%10000000)
2. décaler sprite 2 un bit à droite et le masquer (%01111111)
3. OR sprite 1 avec sprite 2
répéter avec tous les autres octets/sprites

updateRotation:
	ld a,(xOff)		;a = 15
	and 7			;a = $7, nous voulons savoir combien il faut décaler les octets
	ld hl,gbufMask	;une table (voir plus bas)
	ld e,a
	ld d,0
	add hl,de		;hl = gbufMask+7
	ex af,af'
		ld a,(hl)	;a = %10000000
		ld hl,maskLeft	;dans ma routine pour afficher le buffer à l'écran: masque à gauche
		ld (hl),a
		ld hl,maskRight
		cpl		;xor $FF
		ld (hl),a	;masque à droite (%01111111)
	ex af,af'
	ld hl,rotateRight	;si l'offset X est 4 ou plus (nc), il est plus vite de décaler vers la droite
	cp 4		;(a=7)
	jr nc,rotarDer
	ld hl,rotateLeft	;sinon, vers la gauche
rotarDer:
	and %00000011	;effacer bit 2 (c'est comme faire: a - 4) a = 3
	ld e,a		;de = 3
	ld d,0
	add hl,de	;hl = rotateRight +3
	push hl
	ld de,rotLeft	;je fais le décalage dans ma routine "fastcopy"
	ldi		;rrca
	ldi		;nop
	ldi		;nop
	ldi		;nop
	pop hl		;hl = rotateRight+3
	ld de,rotRight
	ldi		;la même chose
	ldi
	ldi
	ldi
	ret

rotateRight:       ;si l'offset et plus de ou égal à 4, décaler gbuf à droite d'1 à 4 fois
 rrca 
 rrca 
 rrca 
 rrca 
rotateLeft:       ;les nops aide à qu'il n'y aie pas de délai (rrca/rlca utilisent 4 cycles, nop aussi)
 nop
 nop 
 nop 
 nop 
 rlca 
 rlca 
 rlca 
 rlca

gbufMask:
.db %11111111	;0
.db %11111110	;1
.db %11111100	;2
.db %11111000	;3
.db %11110000	;4
.db %11100000	;5
.db %11000000	;6
.db %10000000	;7

Comment fais-tu pour l'animation du personnage? Un timer ou tu copies une sprite dans une sprite de base?

J'ai un variable que j'augmente si on appuie sur une des touches flèche (et que je remets à zéro si on n'appuie sur rien). Chaque 4 pas j'affiche le prochain sprite.

	ld hl,playerAnimation	;counter de l'animation
	ld bc,64		;chaque sprite = 64 octets, 32 pour le sprite et 32 pour son masque
	ld a,(flechaPulsada)	;si une touche flèche est enfoncée
	or a
	ld a,(pulsado)		;combien à avancer (pulsado = 1 normalement, 2 si [ALPHA] est enfoncé)
	jr nz,$+5
		xor a		;remettre counter à zéro (bon, à 2)
		ld (hl),2
	add a,(hl)
	ld (hl),a
	ld hl,playerSprite	;l'addresse des sprites du personnage
	bit 2,a
	jr z,normalStance
	add hl,bc		;1ª animacion
	bit 3,a
	jr z,$+3
	add hl,bc		;2ª
normalStance:
;hl = l'address du sprite

Comment est faites la map? Une suite de valeurs pointant l'offset des sprites?

Oui, et chaque map a quelques octets d'informations:
larguer, hauteur, tile par défaut (le "sol"), et pour les coordonnées X/Y ou le personnage doit commencer

J'étais pressé quand j'ai écrit cela, désolé s'il y a quelque chose que je n'ai pas décrit bien. Si tu as des questions, n'hesite pas à demander. J'essayerai à mieux l'expliquer smile

21

Que veux-tu ajouter?

BDw8 (magasind'armes.gif)
En jouant avec des interruptions grin

22

On peut maintenant changer de carte:
dbTx (juego mapas.gif)

Maintenant il faut que je passe un peu de temps à écrire une autre carte pour le "overworld" (pour qu'on puisse sortir de la ville !), mais je ne sais pas comment je veux le faire, si je veux écrire un autre mapper avec des tiles 8x8 ou utiliser l'actuel. Je préférerais me mettre à écrire plus de code, mais il faut le faire avant de continuer :/

J'ai aussi quelques questions pour vous: je ne sais pas un bon moyen de gérer les objets, les npcs, les événements, etc. Avez-vous des idées sur/de l'expérience avec tout ça ? Maintenant tous les objets sont partie de la carte.

23

Beaucoup de RPG n'ont pas de carte du monde, et je pense que recréer un mapper rien que pour ça n'est pas forcément utile.

En ce qui concerne la gestion des objets et npc je pense qu'il faut les regrouper en définissant plusieurs types généraux (objet immobile, qui déclenche l'évènement programmé à telle adresse ou bien alors objet aléatoire qui déclenche telle ou telle conversation...), et les définir avec la carte dans une liste un peu du style :
ev:
	.db 1,2,0	;X,Y,Type,Adresse
	.dw obj1
	.db 4,4,1
	.dw conv1

ev_end:


Et pour les évènements ça dépend de ce que tu veux faire, la plupart étant à mon avis déclenchés après interaction avec un objet/npc, sauf si s'agit de quelque chose d'aléatoire comme le déclenchement d'un combat.

En tout cas bravo, c'est magnifique top

24

Oui, quelque chose comme ça j'avais pensé, mais ça va prendre du temps, de chercher chaque objet et s'il faut l'afficher ou non. Pour les npcs peut-être il faudra l'organiser comme ça (bon si je veux qu'ils puissent se déplacer). Et avec les évènement je parlais des choses "pas régulaires" qui ne se produisent pas chaque boucle, je sais pas... par exemple la pluie ou le déplacement d'un npc, des choses qui font que le monde apparaisse un peu plus réel ou vivant. Quelque chose qui commence et termine, comme les panneaux: quand le panneau a disparu de l'écran, l'évènement est fini et n'occupe plus d'espace.

Merci pour la réponse, c'est vrai que mes questions étaient assez vague, je vais me mettre à dessiner la carte du monde pour le moment, peut-être je pense à quelque chose pendant que je la dessine. J'ai entendu parler des "couches", une pour la carte, une pour les objets, une pour je ne sais pas quoi, mais comment le faire sans beaucoup de ralentissement ?

25

C'est vrai que ça peut paraitre laborieux de devoir vérifier s'il faut afficher chaque objet/npc tout le temps mais je ne vois pas comment optimiser ça... Auquel cas c'est pareil pour les évènements, il faut s'en occuper dans la boucle principale (selon les conditions de déclenchement).

26

Pourquoi tu veux faire un mapper special overworld?? Tu veux qu'il soit d'une taille différente (comme par exemple une minimap le ferait?).


Sinon pour les objets, plutôt que de tester à chaque tour de boucle il vaudrait peut-être mieux indiquer dans la map s'il y a un objet ou npc.
Et du coup faire bouger les npc ou gerer les objets seulement lorsqu'ils sont à proximité du joueur...
Dans c ecas tu n'as qu'a tester le flag (des emplacements à proximité) dans les infos de la map pour savoir s'il y a eventuellement quelque chose à faire bouger/gerer.

Je ne sais pas si je comprends bien ce que tu veux faire mais voila ce qui me vient à l'esprit.

En tout cas bravo bravo bravo c'est magnifique!!

27

Bon je ne savais pas si le overworld serait trop grand avec des tiles 16x16. De toute façon j'ai eu un peu de malchance avec mon portable, que j'ai laissé tomber hier et qui ne veut se démarrer. J'ai une copie des sources assez récente (sans quelques choses que j'ai ajoutées cette semaine, mais ce n'est pas grave). Ce qui est grave c'est que je n'ai pas d'ordinateur pour coder :/ Je sais pas si on me le réparera ou s'il faudra en acheter un autre (si c'est ça je n'ai pas l'argent).

Sinon pour les objets, plutôt que de tester à chaque tour de boucle il vaudrait peut-être mieux indiquer dans la map s'il y a un objet ou npc. Et du coup faire bouger les npc ou gerer les objets seulement lorsqu'ils sont à proximité du joueur...
Je ne sais pas si je te suivre... Je crois que si je fais cela il faudra encore les tester tous à chaque boucle, n'est-ce pas ? pour savoir s'ils sont près du joueur/de la joueuse ou non ?

EDIT: Voici le code source que j'avais sauvegardé si on veux le voir:
http://www.mediafire.com/?t044ddur48pfi6l (j'espère pouvoir extraire mon code avec les tiles/maps de mon portable, mais je ne sais pas comment le faire)

28

Erf c'est dommage pour ton portable... Il est encore sous garantie ?

J'ai eu le même problème avec mon 1er portable, enfaite c'était le disque dur (mécanique) qui avait morflé, mais bon le service après-vente a pu me le remplacer.

29

Merci, et oui, il est assez neuf. Tu penses qu'on me le remplacera ? Je suppose que je vais me communiquer avec eux. Je voudrais d'abord sauvegarder mon code, mais je crois qu'il est complètement bousillé.

30

Oui théoriquement s'il est encore sous garantie ils te le remplacent. Par contre si tu as des données à récupérer dans le disque dur là c'est un peu plus compliqué... Je pense que ce n'est malheureusement pas faisable...