def set_angle_action(self, proportion, max_duration=4, min_duration=2): angle = 360 - proportion * 360 delta = abs(self.angles - angle) if delta <= 10: return self.right_ring, Delay(min_duration) duration = min(1, delta / 90) * (max_duration - min_duration) if self.angles > angle: # right rotation if angle >= 180: return self.right_ring, (Delay(0.5) + RotateTo(180, duration + min_duration) + CallFunc(self.change_angle, angle)) elif self.angles <= 180: return self.right_ring, (Delay(0.5) + RotateTo(angle, duration + min_duration) + CallFunc(self.change_angle, angle)) else: d1 = (duration + min_duration) * (self.angles - 180) / delta d2 = duration + min_duration - d1 return self.right_ring, (Delay(0.5) + RotateTo(180, d1) + RotateBy(angle - 180, d2) + CallFunc(self.change_angle, angle)) else: # if angle <= 180: return self.right_ring, (Delay(0.5) + RotateTo(angle, duration + min_duration) + CallFunc(self.change_angle, angle)) elif self.angles >= 180: return self.right_ring, (Delay(0.5) + RotateTo(angle, duration + min_duration) + CallFunc(self.change_angle, angle)) else: d1 = (duration + min_duration) * (180 - self.angles) / delta d2 = duration + min_duration - d1 return self.right_ring, (Delay(0.5) + RotateBy(180 - self.angles, d1) + RotateBy(angle - 180, d2) + CallFunc(self.change_angle, angle))
def __init__(self): super(Pic, self).__init__(0, 0, 0, 0, width=160, height=160) # self.addsprite('image/pic.png') # self.cp = cocos.sprite.Sprite('image/cp.png') # self.cp.scale = 160 / self.cp.height # self.cp.position = (80, 80) # self.add(self.cp) self.addcp() self.cp.do(Repeat(RotateBy(360, duration=10))) self.gz = cocos.sprite.Sprite('image/gz.png') self.gz.scale = 0.3 self.gz.image_anchor = (117, 204) self.gz.position = (80, 170) self.add(self.gz, z=1) self.gz.do(RotateBy(25, duration=0.5))
def main(): director.init() main_scene = cocos.scene.Scene() main_scene.add(ColorLayer(255, 0, 0, 255)) main_scene.add(TestLayer()) main_scene.do(RotateBy(360, 2)) director.run(main_scene)
def __init__(self): #将层的背景调成蓝色 super(HelloWorld, self).__init__(64, 64, 224, 255) # 新建文字标签用于显示Hello World label = cocos.text.Label( 'Hello,World', # 如果要显示中文,需要使用支持中文的字体,比如"微软雅黑" font_name='Times New Roman', font_size=32, # 设置锚点为正中间 anchor_x='center', anchor_y='center') # 设置文字标签在层的位置.由于锚点为正中间,即"用手捏"标签的正中间,放到(320,240)的位置 label.position = 320, 240 # 把文字标签添加到层 self.add(label) # 新建一个精灵,在这里是一个小人(英文文档没有给示范图片,所以这个icon.png请自行找个q版小人图片,放在代码同目录下) sprite = cocos.sprite.Sprite('black.png') # 精灵锚点默认在正中间,只设置位置就好 sprite.position = 320, 240 # 放大三倍,添加到层,z轴设为1,比层更靠前 sprite.scale = 3 self.add(sprite, z=1) # 定义一个动作,即2秒内放大三倍 scale = ScaleBy(3, duration=2) # 标签的动作:重复执行放大三倍缩小三倍又放大三倍...Repeat即为重复动作,Reverse为相反动作 label.do(Repeat(scale + Reverse(scale))) # 精灵的动作:重复执行缩小三倍放大三倍又缩小三倍.. sprite.do(Repeat(Reverse(scale) + scale)) # 层的动作:重复执行10秒内360度旋转 self.do(RotateBy(360, duration=10))
def __init__(self): # 层调成蓝色 super(HelloWorld, self).__init__(64, 64, 224, 255) label = cocos.text.Label('Hello, World!', font_name='Times New Roman', font_size=32, anchor_x='center', anchor_y='center') label.position = 320, 240 self.add(label) # 新建一个精灵,在这里是一个小人(英文文档没有给示范图片,所以这个icon.png请自行找个q版小人图片,放在代码同目录下) sprite = cocos.sprite.Sprite('icon.jpg') # 精灵锚点默认在正中间,只设置位置就好 sprite.position = 320, 240 # 放大三倍,添加到层,z轴设为1,比层更靠前 sprite.scale = 1 self.add(sprite, z=1) # 定义一个动作,即2秒内放大三倍 scale = ScaleBy(2, duration=2) # 标签的动作:重复执行放大三倍缩小三倍又放大三倍...Repeat即为重复动作,Reverse为相反动作 label.do(Repeat(scale + Reverse(scale))) # 精灵的动作:重复执行缩小三倍放大三倍又缩小三倍... sprite.do(Repeat(Reverse(scale) + scale)) # 层的动作:重复执行10秒内360度旋转 self.do(RotateBy(360, duration=10))
def __init__(self): super(Game, self).__init__(102, 102, 225, 255) self.collision_manager = cm.CollisionManagerBruteForce() self.player = cocos.sprite.Sprite('eleph2.png') self.player.position = 400, 25 self.player.velocity = 0, 0 self.player.speed = 150 self.player.scale = .5 self.add(self.player, z=2) self.player.cshape = cm.AARectShape(self.player.position, self.player.width // 2, self.player.height // 2) self.collision_manager.add(self.player) self.boss = cocos.sprite.Sprite('flaregun.png') self.boss.position = 400, 600 self.boss.scale = 0.4 self.add(self.boss, z=1) self.boss.cshape = cm.AARectShape(self.boss.position, self.boss.width // 2, self.boss.height // 2) self.collision_manager.add(self.boss) self.batch = cocos.batch.BatchNode() self.enemies = [cocos.sprite.Sprite('compass.png') for i in range(6)] positions = ((250, 125), (550, 125), (300, 325), (500, 325), (150, 475), (650, 475)) for num, enem in enumerate(self.enemies): enem.position = positions[num] enem.cshape = cm.AARectShape(enem.position, enem.width // 2, enem.height // 2) self.collision_manager.add(enem) self.batch.add(enem) self.add(self.batch, z=1) self.player.do(Move()) move_basic = MoveBy((120, 0), 1) self.enemies[0].do(Repeat(move_basic + Reverse(move_basic))) self.enemies[1].do(Repeat(Reverse(move_basic) + move_basic)) move_complex = (MoveBy((-75, 75), 1) + Delay(0.5) + MoveBy( (-75, -75), 1) + Delay(0.5) + MoveBy( (75, -75), 1) + Delay(0.5) + MoveBy((75, 75), 1) + Delay(0.5)) self.enemies[2].do(Repeat(move_complex)) self.enemies[3].do(Repeat(Reverse(move_complex))) move_jump = AccelDeccel(JumpBy((200, 0), 75, 3, 3)) move_jump_rot = AccelDeccel(RotateBy(360, 3)) self.enemies[4].do(Repeat(move_jump + Reverse(move_jump))) self.enemies[4].do(Repeat(move_jump_rot + Reverse(move_jump_rot))) self.enemies[5].do(Repeat(Reverse(move_jump) + move_jump)) self.enemies[5].do(Repeat(Reverse(move_jump_rot) + move_jump_rot)) self.schedule(self.update)
def main(): director.init() main_scene = cocos.scene.Scene() test_layer = ColorLayer(64, 64, 64, 255) test_layer.scale = 0.75 main_scene.add(test_layer) test_layer.do(RotateBy(360, 2)) director.run(main_scene)
def step(self, dt): """ :param dt: delta time: difference in time between previous frame and next frame """ cm = self.collision_manager # add each player to the collision manager. If player is big, set flag to dirty # and reset player to small for player in self.target.players: cm.add(player) if player.big: player.dirty = True player.big = False # add each robot to the collision manager. If robot is big, set flag to dirty # and reset robot to small for robot in self.target.robots: cm.add(robot) if robot.big: robot.dirty = True robot.big = False # add projectile to collision manager for projectile in self.target.projectiles: cm.add(projectile) # todo castle needs a smaller collision box # cm.add(self.target.castle) # self.target.castle.big = True # go through all collisions for the frame for collision in cm.iter_all_collisions(): # debug print(collision[0].coord.xy, collision[1].coord.xy) # check each colliding item for a in collision: other = collision[0] if collision[0] != a else collision[1] # if other not a projectile, set it to big and dirty if other not in self.target.projectiles or other.owner != self: # don't need the second condition # just here for completeness a.big = True a.dirty = True # if other is a projectile and the other object is not the owner of the projectile # remove projectile from layer and list of projectiles and stops the action if a in self.target.projectiles and a.owner != other: self.target.remove(a) self.target.projectiles.remove(a) a.stop() other.do(RotateBy(360, 0.5)) cm.clear()
def take_damage(self, damage): self._life -= damage if self._life <= 0: self._life = 0 self.is_alive = False elif self._life < 1500 and not self.bonus_type: self._game.remove(self.sprite) self.sprite = Sprite("enemy_damaged.png") self.sprite.do(Repeat(RotateBy(360, 1))) self._game.add(self.sprite)
def on_mouse_press(self, x, y, buttons, modifiers): # print(self.x, self.y) if (self.x-self.width//2) <= x <= (self.x+self.width//2) and\ self.y <= y <= (self.y+self.height): # print('right') # print('play', x, y) if self.pause_flag: self.remove(self.play_hl) self.add(self.pause_hl) self.mpg123.pause() self.pic.cp.do(Repeat(RotateBy(360, duration=10))) self.pic.gz.do(RotateBy(25, 0.5)) else: self.remove(self.pause_hl) self.add(self.play_hl) self.mpg123.pause() self.pic.stopcp() self.pic.gz.do(Reverse(RotateBy(25, 0.5))) self.pause_flag = False if self.pause_flag else True
def __init__(self): super(Fly, self).__init__() rocket = cocos.sprite.Sprite('rocket.png') rocket.position = 128, 128 rocket.scale = 0.5 #在5秒内往右上方西东,最终横竖坐标分别增加50 #rocket.do( MoveBy( (320,240), duration=2) ) #move = MoveTo( (200,200),2 ) + MoveTo( (400,400),3 ) move = Repeat(RotateBy(360, 2)) rocket.do(move) self.add(rocket, z=0)
def __init__(self): super(Title, self).__init__() label = cocos.text.Label('测试Cocos2d的适应性', font_size=32, anchor_x='center', anchor_y='center') label.position = 320, 260 self.add(label) sprite = cocos.sprite.Sprite('horngirl.png') sprite.position = 320, 320 sprite.scale = 3 self.add(sprite, z=1) scale = ScaleBy(3, duration=2) label.do(Repeat(scale + Reverse(scale))) self.do(RotateBy(360, duration=10))
def __init__(self): super(Rotate, self).__init__(64, 64, 224, 255) label = cocos.text.Label('haha!', font_name = 'miaomiaomiao', font_size = 32, anchor_x = 'center', anchor_y = 'center') label.position = 320, 240 self.add(label) sprite = cocos.sprite.Sprite('b.png') sprite.position = 320, 240 sprite.scale = 3 self.add(sprite, z=1) scale = ScaleBy(3, duration=2) label.do(Repeat(scale + Reverse(scale))) sprite.do(RotateBy(360, duration=10))
def __init__(self): super(Game, self).__init__(102, 102, 225, 255) self.player = cocos.sprite.Sprite(resources.player) self.player.position = 400, 25 self.player.velocity = 0, 0 self.player.speed = 150 self.add(self.player, z=2) self.boss = cocos.sprite.Sprite(resources.boss) self.boss.position = 400, 600 self.boss.scale = 0.4 self.add(self.boss, z=1) self.batch = cocos.batch.BatchNode() self.enemies = [cocos.sprite.Sprite(resources.enemy) for i in range(6)] positions = ((250, 125), (550, 125), (300, 325), (500, 325), (150, 475), (650, 475)) for num, enem in enumerate(self.enemies): enem.position = positions[num] self.batch.add(enem) self.add(self.batch, z=1) self.player.do(Move()) move_basic = MoveBy((120, 0), 1) self.enemies[0].do(Repeat(move_basic + Reverse(move_basic))) self.enemies[1].do(Repeat(Reverse(move_basic) + move_basic)) move_complex = (MoveBy((-75, 75), 1) + Delay(0.5) + MoveBy( (-75, -75), 1) + Delay(0.5) + MoveBy( (75, -75), 1) + Delay(0.5) + MoveBy((75, 75), 1) + Delay(0.5)) self.enemies[2].do(Repeat(move_complex)) self.enemies[3].do(Repeat(Reverse(move_complex))) move_jump = AccelDeccel(JumpBy((200, 0), 75, 3, 3)) move_jump_rot = AccelDeccel(RotateBy(360, 3)) self.enemies[4].do(Repeat(move_jump + Reverse(move_jump))) self.enemies[4].do(Repeat(move_jump_rot + Reverse(move_jump_rot))) self.enemies[5].do(Repeat(Reverse(move_jump) + move_jump)) self.enemies[5].do(Repeat(Reverse(move_jump_rot) + move_jump_rot))
def set_angle_action(self, prop, max_duration=4, min_duration=2): delta = abs(self.prop - prop) angle = delta * 360 duration = min( 1, delta * 4) * (max_duration - min_duration) + min_duration if prop > self.prop: # a right rotation, blood will be more if self.prop > 0.5: return Sequencial([(self.left, reversed(RotateBy(angle, duration)))]) elif prop <= 0.5: return Sequencial([(self.right, reversed(RotateBy(angle, duration)))]) else: _angle = (0.5 - self.prop) * 360 _duration = _angle / angle * duration return Sequencial([ (self.right, reversed(RotateBy(_angle, _duration))), (self.right, CallFunc(self.set_visible, False)), (self.left, reversed(RotateBy(angle - _angle, duration - _duration))) ]) else: if self.prop <= 0.5: return Sequencial([(self.left, RotateBy(angle, duration))]) elif prop > 0.5: return Sequencial([(self.right, RotateBy(angle, duration))]) else: _angle = (self.prop - 0.5) * 360 _duration = _angle / angle * duration return Sequencial([ (self.left, RotateBy(_angle, _duration)), (self.right, CallFunc(self.set_visible, True)), (self.right, RotateBy(angle - _angle, duration - _duration)) ]) pass pass
def __init__(self, game, pos, bonus_type=0): self._game = game self.is_alive = True self._life = constants.ENEMY_ARMOR self.bonus_type = bonus_type # Mouse pointer 'body' self.aim = pymunk.Body(1, 1) self.aim_shape = pymunk.Circle(self.aim, 1, (0, 0)) self.aim_shape.layers = 0b000 # The 'aim' should not collide with any objects self.aim.position = pos # Enemy body mass = 3 radius = 15 inertia = pymunk.moment_for_circle(mass, 0, radius, (0, 0)) self.body = pymunk.Body(mass, inertia) shape = pymunk.Circle(self.body, radius, (0, 0)) shape.elasticity = 0.9 shape.friction = 0.8 shape.collision_type = 3 self.shape = shape if not bonus_type: self.sprite = Sprite("enemy.png") elif bonus_type == constants.HEALTH_BONUS_TYPE: animation = pyglet.resource.animation("bonus_enemy_green.gif") self.sprite = Sprite(animation) elif bonus_type == constants.KILLALL_BONUS_TYPE: animation = pyglet.resource.animation("bonus_enemy_yellow.gif") self.sprite = Sprite(animation) self.sprite.do(Repeat(RotateBy(360, 2))) self.body.position = self.sprite.position = pos self.body.apply_force(-(self.body.mass + self.aim.mass) * game.space.gravity) # Connect aim and body with a DampedSpring - this should create the effect of flying through the air to the # player self.move = pymunk.constraint.DampedSpring(self.aim, self.body, (0, 0), (0, 0), 1, 600.0, 100) game.space.add(self.body, self.shape, self.aim, self.move)
def step(self, dt): cm = self.collision_manager for player in self.target.players: cm.add(player) if player.big: player.dirty = True player.big = False for robot in self.target.robots: cm.add(robot) if robot.big: robot.dirty = True robot.big = False for fruit in self.target.projectiles: cm.add(fruit) #todo castle needs a smaller collision box #cm.add(self.target.castle) #self.target.castle.big = True for collision in cm.iter_all_collisions(): print(collision[0].coord.xy, collision[1].coord.xy) for a in collision: other = collision[0] if collision[0] != a else collision[1] if other not in self.target.projectiles or other.owner != self: a.big = True a.dirty = True if a in self.target.projectiles and a.owner != other: self.target.remove(a) self.target.projectiles.remove(a) other.do(RotateBy(360, 0.5)) cm.clear()
def wiggle(self): foot = random.choice([self.left, self.right]) foot.do((RotateBy(-10, 0.1) + RotateBy(10, 0.1)) * 3)
import cocos from cocos.director import director from cocos.actions import RotateBy from cocos.sprite import Sprite from cocos.layer import * import pyglet class TestLayer(cocos.layer.Layer): def __init__(self): super(TestLayer, self).__init__() x, y = director.get_window_size() sprite1 = Sprite('grossini.png', (x / 4, y / 2)) sprite2 = Sprite('grossinis_sister1.png', (x / 2, y / 2)) sprite3 = Sprite('grossinis_sister2.png', (x / (4 / 3.0), y / 2)) self.add(sprite2) self.add(sprite1) self.add(sprite3) if __name__ == "__main__": director.init() main_scene = cocos.scene.Scene() main_scene.add(ColorLayer(255, 0, 0, 255)) main_scene.add(TestLayer()) main_scene.do(RotateBy(360, 2)) director.run(main_scene)
import cocos from cocos.actions import ScaleBy, Repeat, Reverse, RotateBy class HelloWorld(cocos.layer.ColorLayer): def __init__(self): super().__init__(64, 64, 224, 255) label = cocos.text.Label('Hello, World!', font_name='Times New Roman', font_size=32, anchor_x='center', anchor_y='center') label.position = 320, 240 self.add(label) sprite = cocos.sprite.Sprite('grossini.png') sprite.position = 320, 240 sprite.scale = 3 self.add(sprite, z=1) scale = ScaleBy(3, duration=2) label.do(Repeat(scale + Reverse(scale))) sprite.do(Repeat(Reverse(scale) + scale)) cocos.director.director.init() hello_layer = HelloWorld() hello_layer.do(RotateBy(360, duration=10)) main_scene = cocos.scene.Scene(hello_layer) cocos.director.director.run(main_scene)
# This code is so you can run the samples without installing the package import sys import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) # import cocos from cocos.director import director from cocos.actions import RotateBy from cocos.sprite import Sprite from cocos.layer import * import pyglet if __name__ == "__main__": director.init() main_scene = cocos.scene.Scene() test_layer = ColorLayer(64, 64, 64, 255) test_layer.scale = 0.75 main_scene.add(test_layer) test_layer.do(RotateBy(360, 2)) director.run(main_scene)
def step_right(self): self.right.do(MoveBy((50, 100), 0.3) | RotateBy(40, 0.3) | HOP)
def pressService(self, params): print(params[CoreLayer.DATA]) self.circle.do(RotateBy(360, duration=.5))
def rotate(self): if (self.can_rotate(90)): action = RotateBy(90, 0) self.do(action) self.update_blk_cshape()
def step_left(self): self.left.do(MoveBy((-50, 100), 0.3) | RotateBy(-40, 0.3) | HOP)