Problème délimiter déplacement vaisseau

aalexislg Messages postés 3 Date d'inscription lundi 25 mai 2015 Statut Membre Dernière intervention 25 mai 2015 - 25 mai 2015 à 01:16
aalexislg Messages postés 3 Date d'inscription lundi 25 mai 2015 Statut Membre Dernière intervention 25 mai 2015 - 25 mai 2015 à 15:06
Bonjour tout le monde !
J'ai pour projet de faire un jeu, un shoot them up. Cependant je rencontre des problèmes.
Mon vaisseau se déplace exclusivement sur une seule ordonnée (il peut aller que à droite ou a gauche) et le problème est que quand il va trop a gauche ou a droite il sort de la fenêtre. Je voudrais qu'il soit bloqué aux 2 extrémités de la fenêtre et qu'il reste visible sur l'écran.
Après de nombreuses recherches et essais sans succès je m'en remet à vous : savez vous quelles lignes de code écrire ?:)

#!/usr/bin/env python
#_*_ coding:utf-8 _*_
# -*- coding: cp1252 -*-

###################################
# #
# Programme : Space invaders #
# Auteur :SteevenBaptisteAlexis #
# Date de creation : 2015 #
# #
###################################

##########################################
# #
# Importations des fonctions nécessaires #
# #
##########################################
from Tkinter import * #CHoisi la librairie Tkinter
##########################################
# #
# fonctions personnelles #
# #
##########################################

# définition des gestionnaires
# d'événements :
def move():
"déplacement de la balle"
global x1, y1, dx, dy, flag #x1,y1=coord ennemis - x2,y2=vaisseau - x3,y3=missile - dx, dy
x1, y1 = x1 +dx, y1 + dy
if x1 >600:
x1, dx, dy = 600, -15, 0
if y1 >600:
y1, dx, dy = 600, -15, 0
if x1 <10:
x1, dx, dy = 10, 15, 0
if y1 <10:
y1, dx, dy = 10, 15, 0
canevas.coords(boule_bleue,x1,y1,x1+30,y1+30)
if flag >0:
root.after(50,move) # =>



def move_tir():
"déplacement de la balle"
global y3, laser, flag_tir, boule_bleue, x1, y1, boule_vert, x10, y10
y3 = y3 + dy3
canevas.coords(laser,x3-5,y3-5,x3+5,y3+5)
if y3>0:
root.after(30,move_tir) # =>
if abs(x3-x1)<30 and abs(y3-y1)<30:
canevas.delete(boule_bleue) #disparition de la boule au contact du missile
x1, y1 = 10, 10 ###################################
boule_bleue = canevas.create_oval(x1, y1, x1+30, y1+30, width=2, fill='blue') ##################
if y3 < 0:
flag_tir = 1

def stop_it():
"arret de l'animation"
global flag
flag =0

def start_it():
"démarrage de l'animation"
global flag
if flag ==0: # pour ne lancer qu'une seule boucle
flag =1
move()



# procédure générale de déplacement :
def avance(gd, hb): #maj de l'interface avc le vaisseau qui bouge (ses coordonnées
global x2, y2
x2, y2 = x2 +gd, y2 +hb
canevas.coords(mon_vaisseau, x2, y2)


# gestionnaires d'événements :
def depl_gauche(event):
avance(-10, 0) #a chaque clique - 10 pxl sur la gauche

def depl_droite(event):
avance(10, 0)

def tir (event):
global x3, y3, laser, flag_tir
if flag_tir == 1:
x3 , y3 = x2 , y2
flag_tir = 0
laser = canevas.create_oval(x3, y3, x3+30, y3+30, width=2, fill='red')
move_tir()




#######################
# #
# Programme principal #
# #
#######################

# les variables suivantes seront utilisées de manière globale :
x1, y1 = 10, 10 # coordonnées initiales monstre
dx, dy = 15, 0 # 'pas' du déplacement
dy3 = -30 #vitesse tir
flag =0 # commutateur
x2, y2 = 320, 430 # coordonnées initiales vaisseau
flag_tir = 1

#fenêtre et vaisseau placé
root = Tk()
root.title('Space invaders')

vaisseau = PhotoImage(file='blanco2.gif')

canevas = Canvas(root, width=640, height=480, bg='grey')

canevas.pack(fill=BOTH, expand=1)



# image
fond = PhotoImage(file="fondspace.gif")
bouton = PhotoImage (file="fondspace.gif")

#image de fond
#canevas.create_image(200, 200, image=fond)

# bouton cliquable (50, 50)
canevas.create_image(350, 250, image=bouton)
#création des objets
mon_vaisseau = canevas.create_image(320, 430, image = vaisseau)
boule_bleue = canevas.create_oval(x1, y1, x1+30, y1+30, width=2, fill='blue')




#------ Programme principal -------

# création des widgets "esclaves" :

canevas.pack(side=LEFT)
Button(root,text='Quit', width =8, font=("Fixedsys",16), command=root.destroy).pack(side=BOTTOM)

Button(root,text='Start', width =8, font=("Fixedsys",16), command=start_it).pack()
Button(root,text='Pause', width =8, font=("Fixedsys",16), command=stop_it).pack()
root.bind("<Right>",depl_droite)
root.bind("<Left>",depl_gauche)
root.bind("<Up>",tir)

#canevas.bind("<Left>",depl_gauche)
#canevas.bind("<Right>",depl_droite)


root.mainloop()

3 réponses

Mints Messages postés 69 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 1 juin 2018 7
25 mai 2015 à 09:26
Salut, pour faire cela il est préférable d'ancrer l'image du vaisseau par le coin supérieur gauche :
mon_vaisseau = canevas.create_image(320, 430, image = vaisseau,anchor=NW)


Ensuite dans la méthode 'avance' tu t'assures que le vaisseau restera dans les limite du caneva après l'ajout de sa vitesse :
- pour la limite gauche c'est facile
- pour la limite droite tu dois tenir compte de la largeur du vaisseau

def avance(gd, hb):			#maj de l'interface avc le vaisseau qui bouge (ses coordonnées
    global x2, y2

    x2, y2 = x2 +gd, y2 +hb

    if x2 < 0:
        x2 = 0
    elif x2+LARGEUR_VAISSEAU > 640:
        x2 = 640-LARGEUR_VAISSEAU

    canevas.coords(mon_vaisseau, x2, y2)
0
aalexislg Messages postés 3 Date d'inscription lundi 25 mai 2015 Statut Membre Dernière intervention 25 mai 2015
25 mai 2015 à 13:08
Salut Mints ! Merci pour ta réponse. Le problème est résolu par contre j'ai légèrement modifié ce que tu m'as conseillé
def avance(gd, hb):			#maj de l'interface avc le vaisseau qui bouge (ses coordonnées
global x2, y2

x2, y2 = x2 +gd, y2 +hb

if x2 < 20:
x2 = 20
elif x2+40 > 640:
x2 = 640-40

canevas.coords(mon_vaisseau, x2, y2)


je n'ai pas mis le "anchor = NW" car mon vaisseau n'était plus là où je le souhaitais. Merci beaucoup pour ta réponse.

Sinon je n'arrive pas aussi à changer l'icone de ma fenetre Tk quand je l'ouvre (remplacer le Tk rouge par une image de mon choix)
root = Tk()
root.title('Space invaders')
root.iconbitmap('icone')

L'image icone est en bitmap 40x40 (6.30 ko)
Vois-tu ce qui ne va pas ?
0
aalexislg Messages postés 3 Date d'inscription lundi 25 mai 2015 Statut Membre Dernière intervention 25 mai 2015
25 mai 2015 à 15:06
c'est bon j'ai résussi
0
Rejoignez-nous