Tuto Tir pour un shoot

Discussion forum for the French Hollywood community
Post Reply
ArtBlink
Posts: 484
Joined: Mon Nov 01, 2010 10:37 am
Location: Albert - France
Contact:

Tuto Tir pour un shoot

Post by ArtBlink »

Modifiez et amusez-vous bien les ami(e)s

Code: Select all


/*
************************************************************
**
** Created by: CodeBench 0.23 (17.09.2011)
**
** Project: Routine de Tir Sous Hollywood
**
** File: Tir.hws
**
** Date: 12-02-2012 12:29:40
**
************************************************************
*/
; C'est important de bien préparer un script
; Voici donc l'une des façon de bien identifié son programme
@VERSION 5,0 ; Version d'hollywood minimum à avoir
@APPTITLE "Shoot Test" ; Titre du programme
@APPAUTHOR "ArtBlink" ; Auteur du programme... Moi ;-)
@APPVERSION "$VER : 0.1" ; Numéro de version, pour craner j'en ai mis une :-P
@APPDESCRIPTION "Routine qui peut être utilisé dans vos propres jeux" ; tout est dit
; Attention, le code à proprement parler commence
; On créer un écran, sur la fenêtre sera écrit se que l'on indique dans Title = "Bla Bla"
; Width = Largeur de la fenêtre et Height = La hauteur de la fenêtre
; On peut ouvrir un écran UNIQUE en full screen ou plusieurs fenêtre, tout dépend
; de se que l'on recherche
@DISPLAY {Title = "Shoot Test - ArtBlink - Utilisé cette routine pour vos futures Jeux ;-)", Width = 640, Height = 480}
; Je créé mes propres sprites, ou plutôt des Brush (Brosses comme sous DPaint)
; Je préfère les Brosses qui permettent plus de liberté, un meilleur moteur
; de rendu et une plus grande vitesse d'affichage surtout depuis l'insertion
; dans Hollywood d'un Moteur DoubleBuffer en Hardware...
; SetFillStyle défini le type de remplissage de mes formes vectorielles
; que je vais tracer dans les Brosses (Brush)
SetFillStyle(#FILLCOLOR) ; #FILLCOLOR = Remplissage par une couleur (Unie, pas d'effet)
; Ici, je créé la Brosse 1 qui est le triangle Bleu = le vaisseau
CreateBrush(1,32,32,$000000,{HardWare=True})
; Createbrush créé une forme rectangulaire ou un carré
; Ici je créé un carré de 32x32 pixel de couleur noir et je le sauvegarde
; directement dans la mémoire GFX (plus rapide)
; Pour sauvegarder ma Brosse, j'utilise l'item {Hardware=True}
; Pour les couleurs, c'est du RVB, un code hexadécimale, le $ est important
SelectBrush(1)
; SelectBrush me permet d'ouvrir ma brosse pour y faire n'importe quelle modification
; N'oublier pas que pour l'instant, j'ai une brosse qui est de la forme :
; Carré Noir de 32x32 pixels, plutôt sommaire le vaisseau ;-)
; Donc j'ouvre ma brosse pour y ajouter un triangle Bleu
Polygon(0,0,{0,32,16,0,32,32},3,$0000ff)
; Ah! une commande de traçage, polygon est une commande qui permet de tracer
; autant de droite que l'on veut
; ATTENTION : Polygon reliera toujours la première coordonnée à la dernière par un trait
EndSelect
; Je referme ma Brosse 1 pour ne plus y faire de modification
;
; Ici, la Brosse 2 qui est le triangle vert = Missile
CreateBrush(2,16,16,$000000,{HardWare=True})
SelectBrush(2)
Polygon(0,0,{0,16,8,0,16,16},3,$00FF00)
EndSelect
; C'est la même chose qu'avec la création de la Brosse Vaisseau
; Evidemment, on peut remplacer facilement mes Brosses... euh... pas belles
; Par de belle Images Bmp,Iff,etc... avec la commande LoadBrush tout en gardant en tête
; de rajouter l'item {Hardware=True}, sinon pas d'accélération 2D
;
; Je dois finaliser mes 2 brosses, et pour cela, je dois enlever le fond de la brosse,
; C'est à dire la couleur Noir, seul le triangle Bleu dois être visible, important si vous
; Mettez une image de fond ;-)
;
; Une boucle de 2 car j'ai 2 Brosses
For I=1 To 2
    ; Je configure la couleur Noir comme une couleur Transparente donc invisible ;-)
    SetBrushTransparency(I,$000000)
Next
;---------------------
;-  variable globale -
;---------------------
;
; Ces variables sont quasi inutile, mais efficace pour comprendre le script
; on peut facilement transformer ces variables globales en locale et ainsi
; faire gagner ENORMEMENT de temps au script et donc accélérer le rendu
; grâce a cette otpimisation, on pourrait rajouter bien plus d'ennemis ou d'effets
; à l'écran
;
; Largeur d'écran du jeux (Peut être plus petit que la Taille de l'écran ou fenêtre
; Principale, ici, j'ai prix la taille de la résolution
LargeurDEcran=640
HauteurDEcran=480
;
; === Variable pour le vaisseau ===
;
; Position de départ en X du Triangle Bleu = Vaisseau
XTriangleBleu=320
; Position de départ en Y du Triangle Bleu = Vaisseau
YTriangleBleu=420
; Vitesse de déplacement du Triangle Bleu = Vaisseau (4 pixels par 4 pixels)
VitesseDuTriangleBleu=4
;
; === Variable pour les Missiles ===
;
; Nombre maximum de missile visible à l'écran
NombreDeTirMaxiSurLEcran=4
; Hauteur maximum du missile = après c'est effacement de la Brosses missiles
; On créé une frontière car si on ne touche pas d'ennemis, celui ci ne sera jamais
; initialisé et il n'arrêtera pas de monter jusqu'a -l'infinie
; Ici je définie 100 pixels à partir du haut de l'écran
HauteurMaxiDuTir=100
; Vitesse de déplacement des missiles (2 pixels par 2 pixels)
VitesseDuTir=2
; J'initialise le numéro de missile
NumeroDeMissile=0
; Et ici le temps entre chaque tir, sinon, si on reste appuyé sur la barre espace,
; les missiles partiraient quasi tous en même temps
TempDeRechargement=25
;
; === Tables pour les Missiles ===
;
; On initialise 3 tables, pourquoi je n'ai pas fait une table avec 3 types de données?
; Eh! Oh! c'est qui qui code?
; Oui, j'aurai pu, mais j'ai pas voulu, car le code aurait était pas très facile à
; comprendre, rien ne vous empêche de faire une seule table à 3 dimensions, mais attention
; 3 tables, en accès, c'est plus rapide qu'une table à 3 dimensions... et oui, et l'optimisation
; Alors? un?
;
; Table 1 : Pour le numéro des Missiles
NumeroDuMissile={}
; J'initialise car une table initialisée est une table plus rapide ;-)
For NombreDeTirSurLEcran=0 To NombreDeTirMaxiSurLEcran-1 Do NumeroDuMissile[NombreDeTirSurLEcran]=0
; Table 2 : Pour la coordonnée en X des missiles
MissileEnX={}
; J'initialise car une table initialisée est une table plus rapide ;-)
For NombreDeTirSurLEcran=0 To NombreDeTirMaxiSurLEcran-1 Do MissileEnX[NombreDeTirSurLEcran]=0
; Table 3 : Pour la coordonnée en Y des missiles
MissileEnY={}
; J'initialise car une table initialisée est une table plus rapide ;-)
For NombreDeTirSurLEcran=0 To NombreDeTirMaxiSurLEcran-1 Do MissileEnY[NombreDeTirSurLEcran]=YTriangleBleu
; Pourquoi j'utilise NombreDeTirMaxiSurLEcran-1 pour faire la boucle?
; Si je dit que je veux 4 missiles, tous le monde compte comme sa:
; 1,2,3 et 4
; Or, les tables commencent à 0 donc les tables se présentent comme cela :
; 0,1,2 et 3 => donc c'est 4-1=3 pour avoir 4 missiles
; Voici un petit schéma de mes tables
;
;                 Table 1          Table  2       Table  3
;             NumeroDuMissile     MissileEnX     MissileEnY
; Ligne [0]          0                0              0
; Ligne [1]          0                0              0
; Ligne [2]          0                0              0
; Ligne [3]          0                0              0
;
; J'espère que se schéma vous fais comprendre un peu mieux le système que je met en place
;
; - Fonction principale que je Boucle à l'infinie -
;
Function Tir()
; Impératif et de suite ;-)
; Je flip l'écran
Flip(True)
; et je l'efface
Cls
; ------------------------------------------------------------------------
; Hors Tuto
Box (0,YtriangleBleu+32,LargeurDEcran,HauteurDEcran-YTriangleBleu,$226622)
Box (0,0,LargeurDEcran,YtriangleBleu+32,$000044)
TextOut (0,0,"Appuyez sur Flèche gauche pour aller à gauche")
TextOut (0,10,"Appuyez sur Flèche Droite pour aller à Droite")
TextOut (0,20,"Appuyez sur Barre espace pour Tirer")
TextOut (0,30,"Appuyez sur Ctrl+C pour QUITTER")
; Fin Hors Tuto
; ------------------------------------------------------------------------
; Maitenant sa commence :
;
; Et hop, je met en route mon compteur qui défini l'intervalle entre chaque tir
TempDeRechargement=TempDeRechargement-1
; Evidement, si celui-ci descend en dessous de 0, je le bloque à 0 sinon, ma routine
; ne se validerait jamais du fait que je test si TempDeRechargement=0 alors je valide
; un tir, voir la commande suivante
If TempDeRechargement<0 Then TempDeRechargement=0
; Ici, c'est assez simple à comprendre, je test les touches du clavier :
Local Tir=IsKeyDown("SPACE")
Local Droite=IsKeyDown("RIGHT")
Local Gauche=IsKeyDown("LEFT")

If Droite=True Then XTriangleBleu=XTriangleBleu+VitesseDuTriangleBleu
; Je bloque le Triangle Bleu (Vaisseau) au bord droit de l'écran si je suis au bout de celui-ci
If XTriangleBleu>LargeurDEcran Then XTriangleBleu=LargeurDEcran

If Gauche=True Then XTriangleBleu=XTriangleBleu-VitesseDuTriangleBleu
; Je bloque le Triangle Bleu (Vaisseau) au bord gauche de l'écran si je suis au bout de celui-ci
If XTriangleBleu<0 Then XTriangleBleu=0
;
; - Test du tir -
;
If TempDeRechargement=0
    If Tir=True ; Si j'appuie sur espace
        ; Je fais une boucle pour tester la table MissileEnY
        For Local ValiderUnTir=0 To NombreDeTirMaxiSurLEcran-1
            ; Si dans la ligne de la table numéro ValiderUnTir = YTriangleBleu, sa veux dire
            ; que le missile ne bouge pas, c'est qu'il est donc activable pour un tir
            If MissileEnY[ValiderUnTir]= YTriangleBleu
                NumeroDuMissile[ValiderUnTir]=1
                ; J'utilise la table MissileEnX pour garder la position en X du vaisseau, la
                ; ou le missile dois partir, SI je n'utilisai pas cette table, les missiles
                ; suiverai mon vaisseau, se qui serait ridicule.
                MissileEnX[ValiderUnTir]=XTriangleBleu
                ; Dès que je trouve un Missile activable, je casse la boucle

                Break
            EndIf
        Next

EndIf
    ; Comme j'ai valider le tir, je remet le compteur à 25
    TempDeRechargement=25
EndIf
;
; Ah! Enfin, l'affichage des missiles
;
; Je boucle pour visualiser dans ma table NumeroDuMissile, lesquels sont activés
;
For Local Tir=0 To NombreDeTirMaxiSurLEcran-1
    ; SI dans la table NumeroDuMissile la ligne Tir = 1, cela veut dire que le missile Tir est
    ; lancé
    If NumeroDuMissile[Tir]=1
        ; Comme ils sont lancés, il faut décompter pour que ceux-ci montent jusqu'en haut de l'écran
        MissileEnY[Tir]=MissileEnY[Tir]-VitesseDuTir
        ; Si les missiles atteignent la limite de la hauteur alors ceux-ci sont initialisés
        If MissileEnY[Tir]<HauteurMaxiDuTir
            NumeroDuMissile[Tir]=0 ; hop, le missile numéro Tir est désactivé
            MissileEnY[Tir]= YTriangleBleu ; Hop, on initialise le point de départ de ce même missile
        EndIf
        ; Remarque : Lors d'une collision avec un ennemies ou un mur ou peux importe, la méthode est la même
        ;            qu'au dessus.
    ; Pour éviter de petits bugs graphiques, on affiche le missile que si sa coordonnées en Y est strictement
    ; INFERIEUR à la coordonnée en Y du triangle bleu
    If MissileEnY[Tir]< YTriangleBleu Then DisplayBrush (2,MissileEnX[Tir],MissileEnY[Tir],{AnchorX=0.5,AnchorY=1})
EndIf
Next
; On affiche le Vaisseau (Triangle Bleu)
DisplayBrush (1,XTriangleBleu,YTriangleBleu ,{AnchorX=0.5,AnchorY=0}); Hyper important, on contrôle le vaisseau depuit son centre
EndFunction
; On lance le moteur de rendue DoubleBuffer en Hardware
BeginDoubleBuffer(True)
; Un interval de temps entre chaque image bloqué a 50 FPS maxi
SetInterval(1, Tir, 20)
; Et la boucle infinie classique de Hollywood, sinon le programme s'arrête après la première image
Repeat
    WaitEvent
Forever
         
User avatar
Juan Carlos
Posts: 884
Joined: Mon Sep 06, 2010 1:02 pm

Re: Tuto Tir pour un shoot

Post by Juan Carlos »

Thanks for your routines, it is a good example to begin make a martians games or others.
ArtBlink
Posts: 484
Joined: Mon Nov 01, 2010 10:37 am
Location: Albert - France
Contact:

Re: Tuto Tir pour un shoot

Post by ArtBlink »

Thanks holyy-friend ;-)

But it's in French... Sorry.

Me + english = 0

lol
User avatar
Juan Carlos
Posts: 884
Joined: Mon Sep 06, 2010 1:02 pm

Re: Tuto Tir pour un shoot

Post by Juan Carlos »

No problem sometime neither I understand the english or my spanish language, the important a little base to make big games.
User avatar
Juan Carlos
Posts: 884
Joined: Mon Sep 06, 2010 1:02 pm

Re: Tuto Tir pour un shoot

Post by Juan Carlos »

No problem sometime neither I understand the english or my spanish language, the important a little base to make big games.
Post Reply