[模拟炉石](二)下一步要解决的问题

下一步,我们要在上一篇的基础上解决这么几个问题:

1.使用opengl绘图。利用pyglet.gl来绘制箭头,后面会使用到。

2.如何判断选中。使用collision manage

3.需要实现一个数组和图形node的绑定。



opengl绘图

试着绘制一个跟随鼠标指针的直线。

  1. class MainLayer(Layer):
  2.    is_event_handler = True
  3.    def __init__(self):
  4.        super(Layer, self).__init__()
  5.        self.isDraggin = False
  6.    def draw(self, *args, **kwargs):
  7.        if self.isDraggin:
  8.            glLineWidth = 3
  9.            glColor3ub(255, 255, 255)
  10.            glBegin(GL_LINE_STRIP)
  11.            glVertex2f(self.ox, self.oy)
  12.            glVertex2f(self.x, self.y)
  13.            glEnd()
  14.    def on_mouse_release(self, x, y, button, modifiers):
  15.        self.isDraggin = False
  16.    def on_mouse_press(self, x, y, button, modifiers):
  17.        self.ox = x
  18.        self.oy = y
  19.    def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
  20.        self.x = x
  21.        self.y = y
  22.        self.isDraggin = True


CollisionManage

在上面的代码基础上,对一个sprite进行拖动

  1. class Ball(cocos.sprite.Sprite):
  2.    def __init__(self, center_x, center_y, radius):
  3.        super(Ball, self).__init__(‘circle6.png‘)
  4.        self.position = (center_x, center_y)
  5.        self.cshape = cm.CircleShape(eu.Vector2(center_x, center_y), radius)

创建一个collman对象:

  1.        self.collman = cm.CollisionManagerBruteForce()
  2.        self.collman.add(self.ball)
  3.        self.isSelected = False

改动一下之前的事件handler, 对对象的选择可以使用cm的objs_touching_point方法或者cshape的touches_point方法

  1.    def on_mouse_release(self, x, y, button, modifiers):
  2.        self.isDraggin = False
  3.        if self.isSelected:
  4.            self.ball.do(MoveTo((x, y), duration = 2))
  5.            self.ball.cshape.center = eu.Vector2(x, y)
  6.    def on_mouse_press(self, x, y, button, modifiers):
  7.        self.ox = x
  8.        self.oy = y
  9.        under_mouse = self.collman.objs_touching_point(x, y)
  10.        if len(under_mouse) == 0:
  11.            print("touch none")
  12.            self.isSelected = False
  13.        else:
  14.            print("touch :{}".format(under_mouse))
  15.            self.isSelected = True
  16.        if self.ball.cshape.touches_point(x, y):
  17.            print("ball is touched")


绑定

在之前的代码时有问题的:

  1.    def draw_field(self):
  2.        for child in self.field1.get_children():
  3.            if hasattr(child, "card"):
  4.                child.kill()
  5.        for child in self.field2.get_children():
  6.            if hasattr(child, "card"):
  7.                child.kill()
  8.        for index,card in enumerate(self.ctrl.field1):
  9.            cocoscard = CocosCard(card)
  10.            cocoscard.position = 50 + index*110,0
  11.            self.field1.add(cocoscard)
  12.        for index,card in enumerate(self.ctrl.field2):
  13.            cocoscard = CocosCard(card)
  14.            cocoscard.position = 50 + index*110,0
  15.            self.field2.add(cocoscard)

我是先把原来绘制的删除了之后,又重新生成了相应的Card对象。实际上应该是,没有变化就不用重新绘制了。

现在的问题是,图形界面上有这一组组的Card对象,它们是根据fireplace引擎中的一个个数组来变化的。所以需要将数组里的对象与图形界面中的Card对象绑定起来。

这里我使用python的dict, 当原来数组中的对象不再存在的时候,将对应的Card删除。

  1.    def draw_field(self):
  2.        for child in self.field1.get_children():
  3.            if hasattr(child, "card"):
  4.                #child.kill()
  5.                if child.card not in self.ctrl.field1:
  6.                    child.kill()
  7.        for child in self.field2.get_children():
  8.            if hasattr(child, "card"):
  9.                #child.kill()
  10.                if child.card not in self.ctrl.field2:
  11.                    child.kill()
  12.        for card in self.ctrl.field1:
  13.            if card not in self.field1dict:
  14.                cocoscard = CocosCard(card)
  15.                self.field1.add(cocoscard)
  16.                self.field1dict[card] = cocoscard
  17.        for card in self.ctrl.field2:
  18.            if card not in self.field2dict:
  19.                cocoscard = CocosCard(card)
  20.                self.field2.add(cocoscard)
  21.                self.field2dict[card] = cocoscard
  22.        for index, card in enumerate(self.field1.get_children()):
  23.            card.position = 50 + index*110,0
  24.        for index, card in enumerate(self.field2.get_children()):
  25.            card.position = 50 + index*110,0
  26.    
时间: 2024-10-08 15:38:36

[模拟炉石](二)下一步要解决的问题的相关文章

[模拟炉石]开坑

国外有很多玩家做的模拟炉石的东西,都非常棒. 浏览了一些项目之后,觉得fireplace这个引擎不错. 使用fireplace来作为游戏的驱动,还需要一个不错的gui才行.我考虑使用网页或者桌面程序.网页的话有很多H5的游戏框架可以用:桌面程序的话python也有很多不错的. 这里我打算使用cocos2d. 使用fireplace+cocos2d制作一个模拟炉石的游戏.因为自己对python 以及 cocos2d不熟,所以进度可能会比较慢. fireplace 使用了https://github

TinyOS和Deluge的安装模拟(二)

TinyOS的安装 TinyOS的安装是一件麻烦的事情,它不像其他的开发环境那样配置简单.要想成功安装好TinyOS,需要选择好PC操作系统,TinyOS安装文件的版本,工具链的版本--.总之,安装过程中很容易失败,而且失败原因是无法得知的.因为就算出错了,你也很少有机会可以搜索得到相关资料. 准备工作 对于1.x: 成功的安装经验是:选择Windows XP作为PC操作系统,Cygwin模拟环境,TinyOS 1.1.14,nesc 1.1.1及JDK 1.4.x. 说明:(1)或许Windo

Android项目实战(十二):解决OOM的一种偷懒又有效的办法

原文:Android项目实战(十二):解决OOM的一种偷懒又有效的办法 在程序的manifest文件的application节点加入android:largeHeap=“true” 即可. 对,只需要一句话! 那么这行代码的意思是什么呢? 简单的说就是使该APP获取最大可分配的内存,以便解决OOM问题. 但是.OOM问题出现的原因总得来说有两点: 1.某个手机的内存真的很少 2.代码问题,比如没有处理好Bitmap图片的大小 可以说,出现OOM的情况基本都是第二种情况,那么就需要修改代码,看看哪

二、如何解决:python:Can't reopen .pyc file

如何解决:python:Can't reopen .pyc file pyc文件是python在编译过程中出现的主要中间过程文件.pyc文件以二进制形式存在,可以由python虚拟机直接执行的程序.通过生成.pyc文件可以提高程序运行的速度,编译过的.pyc程序代码也相当于转换了源代码,提高源码加密性.当然了,反编译还是存在的,但是还是可以一定程度上对程序进行包装,反编译程序也费时费力,工作量大. 我们可以使用如下格式运行*.py文件来生成*.pyc文件(*为文件名:path文根目录路径): p

微信 长按 无法 识别二维码 解决办法

也不知道是微信故意为之还是BUG, 一个有二维码图片的DIV 设置了 style="position:absolute; left:0x; top:200px;" 在微信的内置浏览器下怎么长按也不出字 但是设置 style="position:absolute; left:0x; top:0px;"  却有效, 无论我如何改变嵌入这个二维码图片的DIV的结构,无论在结构的哪一层设置 style 都不行. 经过无数测试当left 或top 值较小时有效. 那么解决办法

二十二 动态代理&解决网站的字符集编码问题

设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car 设计了汽车开发阅读 Interface Icar{  start  run  stop} final class GoogleCar implments ICar(){} 希望将谷歌Car接入到生态圈 装饰者设计模式 场景:二次开发的时候,无法获取源码GoogleCar,无法使用继承的情况下,要对已经存在的对象进行增强 前提:可以获取到被装饰的对象

微信自动加好友 模拟位置(二)

上篇没有上传demo 现在补上来 模拟位置 微信自动打招呼

AngularJS进阶(二十八)解决AngualrJS页面刷新导致异常显示问题

解决AngualrJS页面刷新导致异常显示问题 绪 俗话说,细节决定成败,编程亦是如此.编程过程中我们可能会不自觉的忽视一些细节问题,殊不知,这些细节正是导致页面显示出现问题的地方.今略举一例,与君共勉之. 页面正常加载后,显示如下: 按F5刷新之后,页面如下所示: 很明显,页面显示出现了异常.回过头再看看Chrome的错误提示, 具体代码如下: 正是以上代码导致了错误的发生. 追根溯源 让我们回顾一下,错误到底是如何发生的.正常加载情况下,页面正常显示很容易理解,程序是按照既定的数据流走的.但

菜鸟教程之工具使用(二十)——解决m2eclipse插件无法执行Maven命令

在使用m2eclipse编译的时候报错,错误信息如下: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match. Maven3.3.x才有这个问题,之前的版本并不会出现这个错误,所以想只要换成3.3.x以前的版本就可以避免这个问题.但是新版本就没法用了吗?当然不是,解决步骤具体如下: 设一个环境变量M2_HOME指