下一步,我们要在上一篇的基础上解决这么几个问题:
1.使用opengl绘图。利用pyglet.gl来绘制箭头,后面会使用到。
2.如何判断选中。使用collision manage
3.需要实现一个数组和图形node的绑定。
试着绘制一个跟随鼠标指针的直线。
class MainLayer(Layer): is_event_handler = True def __init__(self): super(Layer, self).__init__() self.isDraggin = False def draw(self, *args, **kwargs): if self.isDraggin: glLineWidth = 3 glColor3ub(255, 255, 255) glBegin(GL_LINE_STRIP) glVertex2f(self.ox, self.oy) glVertex2f(self.x, self.y) glEnd() def on_mouse_release(self, x, y, button, modifiers): self.isDraggin = False def on_mouse_press(self, x, y, button, modifiers): self.ox = x self.oy = y def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): self.x = x self.y = y self.isDraggin = True在上面的代码基础上,对一个sprite进行拖动
class Ball(cocos.sprite.Sprite): def __init__(self, center_x, center_y, radius): super(Ball, self).__init__(‘circle6.png‘) self.position = (center_x, center_y) self.cshape = cm.CircleShape(eu.Vector2(center_x, center_y), radius)创建一个collman对象:
self.collman = cm.CollisionManagerBruteForce() self.collman.add(self.ball) self.isSelected = False改动一下之前的事件handler, 对对象的选择可以使用cm的objs_touching_point方法或者cshape的touches_point方法
def on_mouse_release(self, x, y, button, modifiers): self.isDraggin = False if self.isSelected: self.ball.do(MoveTo((x, y), duration = 2)) self.ball.cshape.center = eu.Vector2(x, y) def on_mouse_press(self, x, y, button, modifiers): self.ox = x self.oy = y under_mouse = self.collman.objs_touching_point(x, y) if len(under_mouse) == 0: print("touch none") self.isSelected = False else: print("touch :{}".format(under_mouse)) self.isSelected = True if self.ball.cshape.touches_point(x, y): print("ball is touched")在之前的代码时有问题的:
def draw_field(self): for child in self.field1.get_children(): if hasattr(child, "card"): child.kill() for child in self.field2.get_children(): if hasattr(child, "card"): child.kill() for index,card in enumerate(self.ctrl.field1): cocoscard = CocosCard(card) cocoscard.position = 50 + index*110,0 self.field1.add(cocoscard) for index,card in enumerate(self.ctrl.field2): cocoscard = CocosCard(card) cocoscard.position = 50 + index*110,0 self.field2.add(cocoscard)我是先把原来绘制的删除了之后,又重新生成了相应的Card对象。实际上应该是,没有变化就不用重新绘制了。
现在的问题是,图形界面上有这一组组的Card对象,它们是根据fireplace引擎中的一个个数组来变化的。所以需要将数组里的对象与图形界面中的Card对象绑定起来。
这里我使用python的dict, 当原来数组中的对象不再存在的时候,将对应的Card删除。
def draw_field(self): for child in self.field1.get_children(): if hasattr(child, "card"): #child.kill() if child.card not in self.ctrl.field1: child.kill() for child in self.field2.get_children(): if hasattr(child, "card"): #child.kill() if child.card not in self.ctrl.field2: child.kill() for card in self.ctrl.field1: if card not in self.field1dict: cocoscard = CocosCard(card) self.field1.add(cocoscard) self.field1dict[card] = cocoscard for card in self.ctrl.field2: if card not in self.field2dict: cocoscard = CocosCard(card) self.field2.add(cocoscard) self.field2dict[card] = cocoscard for index, card in enumerate(self.field1.get_children()): card.position = 50 + index*110,0 for index, card in enumerate(self.field2.get_children()): card.position = 50 + index*110,0 原文:http://www.cnblogs.com/wenning/p/5096728.html