Erstellen Sie eine Bildlaufrolle mit Pythonista + -Szene

Dieses Mal habe ich einen Bildlaufprozess für 2D-Aktionen mit Pythonista + -Szene erstellt.

Programmübersicht

Scrollen Sie durch den Bildschirm, wenn sich der Charakter bewegt. Wenn Sie sich zum Bildschirmrand bewegen, hören Sie auf zu scrollen, damit Sie sich frei bewegen können.

Implementierung implementiert

Die implementierte Verarbeitung ist die folgenden zwei. ・ Bildschirm scrollen ・ Bildschirmkantenverarbeitung

Bildschirm scrollen

Es ist ein Vorgang, den Bildschirm zu scrollen, wenn sich der Charakter bewegt. Während des Bildlaufs bleibt die Position des Zeichens gleich, und das Bildlauf wird durch Verschieben des Hintergrunds und der Elemente in die entgegengesetzte Richtung der Bewegung des Zeichens ausgedrückt.

Pythonista_scroll.png

Der Code lautet wie folgt. Zur update () -Methode hinzufügen.

python



def update(self):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	#Bewegung nach links und rechts
	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)

Bildschirmkantenverarbeitung

Wenn Sie keinen Rahmen vorbereiten, bewegt sich das Zeichen endlos an eine Position ohne Hintergrund, sodass am Rand des Bildschirms ein Rand erforderlich ist.

Wenn Sie den Bildschirmrand erreicht haben, hören Sie auf zu scrollen und wechseln Sie zum Bewegen des Zeichens. Scrollen Sie erneut, wenn Sie sich vom Bildschirmrand entfernen.

Der Code lautet wie folgt. Beurteilen Sie "ob sich das Zeichen am Rand des Bildschirms befindet" und unterbrechen Sie das Scrollen, wenn es sich am Rand befindet, und wechseln Sie zum Verschieben des Zeichens.

python



def update(self):
	g = gravity()
	x = self.player.position.x
	y = self.player.position.y
	#Bewegung nach links und rechts
	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 
#Von hier aus hinzufügen--------------------------------------------------------------------------
	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
		#Bewegung nach links und rechts
		x = max(0, min(self.size.w, x + distance))
		self.player.position = (x, y)
	else:
#Addiere hier--------------------------------------------------------------------------
		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)

Aufgabe

  1. Das Springen am Bildschirmrand kann sich in die Mitte des Bildschirms verziehen.
  2. Die Laufanimation wird angehalten, da das Bildlaufzeichen nicht als bewegend behandelt wird.

Vollständiger Code

Ich werde die Erklärung der Verarbeitung weglassen, die nicht mit dem Scrollen zusammenhängt.

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):
		#Hintergrundeinstellungen
		self.background_color = '#004f82'
		ground = Node(parent=self)
		x = 0
		#Bodenhöhe
		self.base_height = 50
		self.stage_size = self.size.w * 5
		#Hintergrundeinstellungen
		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
				}
			)
			
		#Grundeinstellungen des Players
		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)
		#Grundeinstellungen der Sprungtaste
		self.jump = 'ready'
		self.jump_button = SpriteNode('emj:Blue_Circle', position=(320,50))
		self.add_child(self.jump_button)
		#Grundeinstellung der Angriffstaste
		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
		#Bewegung nach links und rechts
		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)
		#Kollisionserkennung
		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
			#Bewegung nach links und rechts
			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):
		#Holen Sie sich die getappte Position
		touch_loc = self.point_from_scene(touch.location)
		#Springe, wenn die getippte Position eine Taste ist
		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):
		#Verarbeitung beim Aufstieg
		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'
				
		#Verarbeitung beim Fallen
		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
				
				
	#Kollisionserkennung
	def check_item_hit(self, items, score=100):
		#Wenn es eine vertikale und horizontale Übereinstimmung gibt, fügen Sie die Punktzahl hinzu und löschen Sie das Element.
		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)

Ausführungsbeispiel (GIF-Animation)

Die Verwendung von Pythonista wird auch im Blog zusammengefasst. Andere Aktionen als das Scrollen des obigen Codes werden im Blog erklärt. Zusammenfassung der Verwendung von Pythonista

Recommended Posts

Erstellen Sie eine Bildlaufrolle mit Pythonista + -Szene
Erstellen Sie mit Django Updateview einen Update-Bildschirm
Spielen Sie mit der Implementierung der Pythonista-Benutzeroberfläche [Bildschirmelemente]
Erstelle Spiele mit Pygame
Erstellen Sie einen Filter mit scipy
[Python] Erstellen Sie mit tkinter einen Bildschirm zur Datei- und Ordnerpfadspezifikation
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Erstellen Sie eine Umgebung mit virtualenv
Erstellen Sie Cloud-TPU mit tf-nightly
Erstellen Sie eine API mit Django
Erstellen / Suchen / Erstellen einer Tabelle mit PynamoDB
Erstellen Sie ein 3D-GIF mit Python3
Plotly Erstellen Sie ein Diagramm mit einer Schaltfläche
Erstellen Sie eine Homepage mit Django
Bildschirmumschaltung / Bildschirmübergang mit Tkinter
Erstellen Sie den Image Viewer mit Tkinter
Bidirektionale Dateiübertragung in Pythonista 3
Erstellen Sie benutzerdefinierte Regeln mit ElastAlert
Erstellen Sie eine Patentkarte mit Streamlit
Erstellen Sie einen Django-Anmeldebildschirm
Erstellen Sie ein Verzeichnis mit Python
Erstellen Sie eine Xlsx-Datei mit XlsxWriter
Teilen Sie den Bildschirm mit Keyhac in 3 Teile