以下是部分代码预览:
"""
用arcade+pymunk制作的简单的愤怒的小鸟程序,由于使用了物理引擎并结合arcade,相比用海龟画图模块制作的,它有逼真的物理效果。
由于相对于展示的是基本制作原理,配音封面等都是次要的,所以此版本没有配音,没有设计封面与游戏结束画面,
"""
__author__ = "lixingqiu"
__date__ = "2019/4/6"
import os
import math
import arcade
import pymunk
import timeit
from PIL import Image
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 800
SCREEN_TITLE = "愤怒的小鸟"
class PhysicsSprite(arcade.Sprite):
def __init__(self, pymunk_shape, filename):
super().__init__(filename, center_x=pymunk_shape.body.position.x, center_y=pymunk_shape.body.position.y)
self.pymunk_shape = pymunk_shape
class CircleSprite(PhysicsSprite):
def __init__(self, pymunk_shape, filename):
super().__init__(pymunk_shape, filename)
self.width = pymunk_shape.radius * 2
self.height = pymunk_shape.radius * 2
class BoxSprite(PhysicsSprite):
def __init__(self, pymunk_shape, filename, width, height):
super().__init__(pymunk_shape, filename)
self.width = width
self.height = height
class MyGame(arcade.Window):
""" 最顶层的游戏类,继承自窗口 """
def __init__(self, width, height,title):
super().__init__(width, height,title)
arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)
# -- Pymunk的重力空间
self.space = pymunk.Space()
self.space.gravity = (0.0, -900.0)
# 所有角色列表
self.background = arcade.Sprite("images/background.png")
self.background.left = self.background.bottom = 0
self.sprite_list = arcade.SpriteList()
self.static_lines = []
def on_mouse_press(self, x, y, button, modifiers):
if button == arcade.MOUSE_BUTTON_LEFT :
self.shape_being_dragged = self.virtual_bird
def on_mouse_release(self, x, y, button, modifiers):
physic_bird_position = self.physic_bird.pymunk_shape.body.position
distance = (physic_bird_position.get_distance(self.shoot_position))
if distance > 1 :return
if button == arcade.MOUSE_BUTTON_LEFT:
# 松开
self.shape_being_dragged = None
dx = x - self.shoot_position[0]
dy = y - self.shoot_position[1]
self.physic_bird.pymunk_shape.body.force = -dx*10000, -dy*10000
self.reset_shoot = False
def on_mouse_motion(self, x, y, dx, dy):
if self.shape_being_dragged is not None:
# 抓住了某个物体,让它跟随鼠标指针
self.virtual_bird.center_x = x
self.virtual_bird.center_y = y
def update(self, delta_time):
start_time = timeit.default_timer()
self.virtual_bird.update()
# 检测每一个角色,移除y坐标小于0的
for sprite in self.sprite_list:
if self.physic_bird == sprite:continue # 排除物理小鸟
if sprite.pymunk_shape.body.position.y < 0:
# 从重力空间中移除
self.space.remove(sprite.pymunk_shape, sprite.pymunk_shape.body)
# 从列表中删除
sprite.kill()
self.space.step(1 / 60.0)
# 把角色统统移到它的物理坐标
for sprite in self.sprite_list:
sprite.center_x = sprite.pymunk_shape.body.position.x
sprite.center_y = sprite.pymunk_shape.body.position.y
sprite.angle = math.degrees(sprite.pymunk_shape.body.angle)
# 保存时间
self.processing_time = timeit.default_timer() - start_time
def main():
MyGame(SCREEN_WIDTH, SCREEN_HEIGHT,SCREEN_TITLE)
arcade.run()
if __name__ == "__main__":
main()
需要浏览更多吗?
成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

