Bonjour à tous,

Voilà, j'ai en tete un petit jeu tout bete pour le fun, et apprendre à manipuler pygame (surtout). L'idée doit pas etre mauvaise car j'apprend plein de choses, cependant, je but sur un probleme.

J'ai un tank (mon perso). A terme, il sera constitué de 2 images superposées (1 pour la tourelle/canon; 1 pour le corps). Le but est de pouvoir dirigé le tank via les fleches, et orienté le canon via le curseur de la souris.

A l'heure actuelle, je n'ai qu'une seule image représentant le tank en entier, pour simplifier mon dev/apprentissage.

Mes constats sont les suivants:
-Si je ne fait que déplacer le char avec les fleches, cela fonctionne.
-Si je ne fait que tourner l'image (en bougeant simplement la souris), cela fonctionne.
-Si j'enchaine ces deux actions, l'image bouge légèrement (les coordonnées bougent).
-Si j'essaie de faire les deux actions en meme temps (canon + mouvement), tel que cela devra fonctionner à terme, ça part en vrille totale.

Je ne comprend pas pourquoi en séparé cela fonctionne, mais pas en simultané. J'ai déjà fait pas mal de manip sans succès. Quelqu'un aurait une idée? Merci

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
#!/usr/bin/env python
# -*-coding:utf-8 -*
 
import pygame
import math
from pygame.locals import *
 
def rot_center(image, rect, angle):
	"""rotate an image while keeping its center"""
	rot_image = pygame.transform.rotate(image, angle)
	w = math.sqrt(rect.width**2 + rect.height**2)
	rot_rect = rot_image.get_rect(center=rect.center, size=(w,w))
	return rot_image,rot_rect
 
 
pygame.init()
pygame.key.set_repeat(30, 50)
#Ouverture de la fenêtre Pygame
fenetre = pygame.display.set_mode((640, 480))
 
#Chargement et collage du fond
fond = pygame.image.load("/home/sg/Images/background.jpg").convert()
fenetre.blit(fond, (0,0))
 
#Chargement et collage du personnage
perso = pygame.image.load("/home/sg/Images/tank2.png").convert_alpha()
perso = pygame.transform.scale(perso, (50,80))
position_perso = perso.get_rect()
perso2 = perso
position_perso2 = position_perso
 
fenetre.blit(perso, position_perso)
 
#Rafraîchissement de l'écran
pygame.display.flip()
 
#BOUCLE INFINIE
continuer = 1
x=0
y = 0
i = 0
while continuer:
	pygame.time.Clock().tick(10)
	for event in pygame.event.get():    #Attente des événements
		if event.type == QUIT:
			continuer = 0
		if event.type == KEYDOWN:
			if event.key == K_DOWN: #Si "flèche bas"
				#On descend le perso
				if position_perso2.bottom + 10 <= 480:
					position_perso2 = position_perso2.move(0,10)
			if event.key == K_UP: #Si "flèche haut"
				#On monte le perso
				if position_perso2.top - 10 >= 0:
					position_perso2 = position_perso2.move(0,-10)
			if event.key == K_LEFT: #Si "flèche gauche"
				#On gauche le perso
				position_perso2 = position_perso2.move(-10,0)
			if event.key == K_RIGHT: #Si "flèche droite"
				#On droite le perso
				position_perso2 = position_perso2.move(10,0)
 
			position_perso[0] = position_perso2[0]
			position_perso[1] = position_perso2[1]
			print "p1=",position_perso2
 
 
		if event.type == MOUSEBUTTONDOWN and event.button == 3:
			position_perso2[0] = event.pos[0]
			position_perso2[1] = event.pos[1]
			position_perso[0] = event.pos[0]
			position_perso[1] = event.pos[1]
			print "p2=",position_perso2
 
 
		#if event.type == MOUSEMOTION and event.buttons[0] == 1:
		if event.type == MOUSEMOTION:
			x = event.pos[0]
			y = event.pos[1]
 
			dx = x - position_perso2.center[0]
			dy = y - position_perso2.center[1]
			hyp = math.sqrt(dx**2 + dy**2)
 
			rads = math.atan2(-dy,dx)
			degs = math.degrees(rads) - 90 #decalage de 90° de l'image rapport au 0°
			angle = degs
 
			perso2, position_perso2 = rot_center(perso, position_perso, angle)
			print "p3=",position_perso2
 
			#perso2 = pygame.transform.scale(perso, (500,500))
 
	#Re-collage
	fenetre.blit(fond, (0,0))  
	fenetre.blit(perso2, (position_perso2[0],position_perso2[1]))
	#Rafraichissement
	pygame.display.flip()