Cette fois, j'ai créé un processus de défilement pour les actions 2D avec Pythonista + scene.
Faites défiler l'écran lorsque le personnage se déplace. Lorsque vous vous déplacez vers le bord de l'écran, arrêtez de faire défiler pour pouvoir vous déplacer librement.
Le traitement mis en œuvre est le suivant. ・ Défilement d'écran ・ Traitement des bords de l'écran
C'est un processus pour faire défiler l'écran lorsque le personnage se déplace. Pendant le défilement, la position du caractère reste la même, et le défilement est exprimé en déplaçant l'arrière-plan et les éléments dans la direction opposée du mouvement du personnage.

Le code est comme suit. Ajoutez à la méthode update ().
python
def update(self):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	#Mouvement à gauche et à droite
	if abs(g.x) > 0.05:
		max_speed = 40
		self.update_position(max_speed)
	else:
		self.player.texture = standing_texture
		self.walk_step = -1
		
def update_position(self, max_speed):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	distance = g.x * max_speed 
		
	x = self.size.w/2
	self.player.position = (x, y)
	for t in self.tiles:
		t['tile1'].position = (t['tile1'].position.x - distance, t['tile1'].position.y)
		t['tile2'].position = (t['tile2'].position.x - distance, t['tile2'].position.y)
	for item in self.items:
		item.position = (item.position.x - distance, item.position.y)
	for item in self.stars:
		item.position = (item.position.x - distance, item.position.y)
	for item in self.mushrooms:
		item.position = (item.position.x - distance, item.position.y)
Si vous ne préparez pas de bordure, le personnage se déplacera indéfiniment vers une position sans arrière-plan, une bordure est donc requise au bord de l'écran.
Lorsque vous atteignez le bord de l'écran, arrêtez le défilement et passez au déplacement du personnage. Faites défiler à nouveau lorsque vous vous éloignez du bord de l'écran.
Le code est comme suit. Jugez "si le personnage est au bord de l'écran" et s'il est au bord, interrompez le défilement et passez au déplacement du personnage.
python
def update(self):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	#Mouvement à gauche et à droite
	if abs(g.x) > 0.05:
		max_speed = 40
		self.update_position(max_speed)
	else:
		self.player.texture = standing_texture
		self.walk_step = -1
		
def update_position(self, max_speed):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	distance = g.x * max_speed 
#Ajouter à partir d'ici--------------------------------------------------------------------------
	self.move_count = max(0, min(self.move_count + distance, self.stage_size))
	if self.move_count < self.size.w/2 or self.move_count >= self.stage_size - self.size.w/2:
		self.player.x_scale = cmp(g.x, 0)
		step = int(self.player.position.x / 40) % 2
		if step != self.walk_step:
			self.player.texture = walk_textures[step]
			self.walk_step = step
		#Mouvement à gauche et à droite
		x = max(0, min(self.size.w, x + distance))
		self.player.position = (x, y)
	else:
#Ajouter ici--------------------------------------------------------------------------
		x = self.size.w/2
		self.player.position = (x, y)
		for t in self.tiles:
			t['tile1'].position = (t['tile1'].position.x - distance, t['tile1'].position.y)
			t['tile2'].position = (t['tile2'].position.x - distance, t['tile2'].position.y)
		for item in self.items:
			item.position = (item.position.x - distance, item.position.y)
		for item in self.stars:
			item.position = (item.position.x - distance, item.position.y)
		for item in self.mushrooms:
			item.position = (item.position.x - distance, item.position.y)
Je vais omettre l'explication du traitement qui n'est pas lié au défilement.
python
# coding: utf-8
from scene import *
from sound import *
def cmp(a, b):
	return ((b > a) - (b < a))
	
	
standing_texture = Texture('emj:Ghost')
walk_textures = [Texture('emj:Ghost'), Texture('emj:Ghost')]
class Game (Scene):
	def setup(self):
		#Paramètres d'arrière-plan
		self.background_color = '#004f82'
		ground = Node(parent=self)
		x = 0
		#Hauteur du sol
		self.base_height = 50
		self.stage_size = self.size.w * 5
		#Paramètres d'arrière-plan
		self.tiles = []
		while x <= self.stage_size + 128:
			tile1 = SpriteNode('plf:Ground_GrassHalf_mid', position=(x - 50, self.base_height))
			ground.add_child(tile1)
			
			tile2 = SpriteNode('plf:Ground_GrassCenter', position=(x - 50, self.base_height-32))
			ground.add_child(tile2)
			x += 64
			self.tiles.append(
				{
					'tile1' : tile1,
					'tile2' : tile2
				}
			)
			
		#Paramètres initiaux du lecteur
		self.player_height = self.base_height + 32
		self.player = SpriteNode('emj:Ghost')
		self.player.anchor_point = (0.5, 0)
		self.player.position = (self.size.w/2, self.player_height)
		self.add_child(self.player)
		#Paramètres initiaux du bouton de saut
		self.jump = 'ready'
		self.jump_button = SpriteNode('emj:Blue_Circle', position=(320,50))
		self.add_child(self.jump_button)
		#Réglage initial du bouton d'attaque
		self.attack_button = SpriteNode('emj:Blue_Circle', position=(250,50), color='red')
		self.add_child(self.attack_button)
		
		self.bullet = SpriteNode('shp:sun')
		self.bullet.position = -1000, -1000
		self.add_child(self.bullet)
		
		mushroom = SpriteNode('emj:Mushroom')
		mushroom.anchor_point = (0.5, 0)
		mushroom.position = (self.size.w * 3, self.player_height)
		self.add_child(mushroom)
		self.mushrooms = [mushroom]
		
		star = SpriteNode('plc:Star')
		star.anchor_point = (0.5, 0)
		star.position = (self.size.w + self.size.w/2, self.player_height + 300)
		self.add_child(star)
		self.stars = [star]
		
		self.items = []
		for i in range(0, 5):
			for j in range(0,2):
				item = SpriteNode('plf:HudCoin')
				item.anchor_point = (0.5, 0)
				item.position = (self.size.w + 80 + i * 50, self.player_height + 100 + 60 * j)
				self.add_child(item)
				self.items.append(item)
		self.charge = False
		self.power = 0
		self.disp_lock = False
		self.move_count = self.size.w/2
		
		score_font = ('Futura', 40)
		self.score_label = LabelNode('0', score_font, parent=self)
		# The label is centered horizontally near the top of the screen:
		self.score_label.position = (self.size.w/2, self.size.h - 70)
		# The score should appear on top of everything else, so we set the `z_position` attribute here. The default `z_position` is 0.0, so using 1.0 is enough to make it appear on top of the other objects.
		self.score_label.z_position = 1
		self.score = 0
		self.walk_step = -1
		
		
	def update(self):
		g = gravity()
		x = self.player.position.x
		y = self.player.position.y
		#Mouvement à gauche et à droite
		if abs(g.x) > 0.05:
			max_speed = 40
			self.update_position(max_speed)
		else:
			self.player.texture = standing_texture
			self.walk_step = -1
		self.check_jump(x,y)
		if self.charge and self.power < 100:
			self.power += 1
			
		for item in self.mushrooms:
			item.position = (item.position.x -1, item.position.y)
		#Détection de collision
		self.check_item_hit(self.mushrooms, score=500)
		self.check_item_hit(self.items)
		self.check_item_hit(self.stars, score=1500)
		
		
	def update_position(self, max_speed):
		g = gravity()
		x = self.player.position.x
		y = self.player.position.y
		distance = g.x * max_speed 
		
		self.move_count = max(0, min(self.move_count + distance, self.stage_size))
		if self.move_count < self.size.w/2 or self.move_count >= self.stage_size - self.size.w/2:
			self.player.x_scale = cmp(g.x, 0)
			step = int(self.player.position.x / 40) % 2
			if step != self.walk_step:
				self.player.texture = walk_textures[step]
				self.walk_step = step
			#Mouvement à gauche et à droite
			x = max(0, min(self.size.w, x + distance))
			self.player.position = (x, y)
		else:
			x = self.size.w/2
			self.player.position = (x, y)
			for t in self.tiles:
				t['tile1'].position = (t['tile1'].position.x - distance, t['tile1'].position.y)
				t['tile2'].position = (t['tile2'].position.x - distance, t['tile2'].position.y)
			for item in self.items:
				item.position = (item.position.x - distance, item.position.y)
			for item in self.stars:
				item.position = (item.position.x - distance, item.position.y)
			for item in self.mushrooms:
				item.position = (item.position.x - distance, item.position.y)
		
	def touch_began(self, touch):
		self.power = 0
		self.charge = True
		
	def touch_ended(self, touch):
		#Obtenez la position tapée
		touch_loc = self.point_from_scene(touch.location)
		#Sauter si la position tapée est un bouton
		if touch_loc in self.jump_button.frame:
			if self.jump == 'ready':
				play_effect('game:Boing_1')
				self.jump = 'up'
		if touch_loc in self.attack_button.frame:
			if self.jump == 'ready':
				x, y = self.player.position
				self.bullet.position = x, y + 50
				move = Action.move_to(x, self.player_height +1000, 0.5 ,TIMING_LINEAR)
				self.bullet.run_action(move)
				
	def check_jump(self, x, y):
		#Traitement en montant
		if self.jump == 'up':
			max_height = 180 + self.power
			up_speed = 10
			y = max(self.player_height, min(self.size.h, y + up_speed))
			self.player.position = (x, y)
			if y > max_height + self.player_height:
				self.jump = 'down'
				
		#Traitement en cas de chute
		if self.jump == 'down':
			down_speed = 10
			y = max(self.player_height, min(self.size.h, y - down_speed))
			self.player.position = (x, y)
			if y == self.player_height:
				self.jump = 'ready'
				self.charge = False
				
				
	#Détection de collision
	def check_item_hit(self, items, score=100):
		#S'il y a une correspondance verticale et horizontale, ajoutez le score et supprimez l'élément.
		for item in items:
			if abs(self.player.position.x - item.position.x) < 30 and abs(self.player.position.y - item.position.y) < 30:
				item.remove_from_parent()
				self.score += score
				items.remove(item)
				self.score_label.text = str(self.score)
			if abs(self.bullet.position.x - item.position.x) < 30 and abs(self.bullet.position.y - item.position.y) < 30:
				item.remove_from_parent()
				self.score += score
				items.remove(item)
				self.score_label.text = str(self.score)
				
if __name__ == '__main__':
	run(Game(), PORTRAIT, show_fps=True)
L'utilisation de Pythonista est également résumée dans le blog. Les actions autres que le défilement du code ci-dessus sont expliquées sur le blog. Résumé de l'utilisation de Pythonista
Recommended Posts