在上篇中,如果运行了fireplace的tests/full_game.py,这个程序将一个游戏过程在终端上运行完成,可以看到整个过程,那么第一步要做的就是将这个过程显示到cocos2d创建的场景中去。

创建一个游戏菜单场景。在testcocos.py中添加菜单,以及对应的方法。这个将是我们程序的入口。将后面需要用到的view,都放到gameview.py中。

class MainMenu(Menu):
def __init__(self):
super(MainMenu, self).__init__("HearthStone")
self.font_title['font_size'] = 72
self.font_title['color'] = (204,164,164,255)
self.font_item['color'] = (255,255,255,255)
self.font_item['font_size'] = 32
self.font_item_selected['color'] = (255,255,255,255)
self.font_item_selected['font_size'] = 46 self.menu_anchor_y = CENTER
self.menu_anchor_x = CENTER
items = []
items.append(MenuItem('StartGame',self.newGame))
items.append(MenuItem('Quit',self.on_quit))
self.create_menu( items, shake(), shake_back())
def newGame(self):
import gameview
director.push(FlipAngular3DTransition(
gameview.get_newgame(), 1.5))
def on_quit(self):
pyglet.app.exit()

入口:

if __name__ == "__main__":
pyglet.resource.path.append('data')
pyglet.resource.reindex() director.init(width = 800, height=600)
#scene
scene = Scene()
scene.add(MultiplexLayer(MainMenu(),),z=1) director.run(scene)

在看看gameview.py, 有一个get_newgame()方法:

def get_newgame():
scene = Scene()
scene.add(BackgroundLayer(), z=0, name = "background")
field1 = Field()
field1.position = 50,190
scene.add(field1, z=1, name="field1")
field2 = Field()
field2.position = 50,310
scene.add(field2, z=1, name="field2") hand1 = Hand()
hand1.position = 50,85
scene.add(hand1, z=1, name="hand1")
hand2 = Hand()
hand2.position = 50,415
scene.add(hand2, z=1, name="hand2") #model
model = GameModel()
#controller
ctrl = GameCtrl(model)
model.set_control(ctrl)
model.set_field(field1, field2)
model.set_hand(hand1, hand2)
scene.add(ctrl, z=1, name = "controller") return scene

这个方法创建了这个游戏很多的相关的东西。比如手牌hand,场地field, 模型model, 控制器ctrl

控制器是写在了gamectrl.py中,

class GameCtrl(Layer):
is_event_handler = True
def __init__(self, model):
super(GameCtrl, self).__init__()
self.model = model
#prepare game
self.deck1 = random_draft(hero=MAGE)
self.deck2 = random_draft(hero=WARRIOR)
player1 = Player(name="Player1")
player1.prepare_deck(self.deck1, MAGE)
player2 = Player(name="Player2")
player2.prepare_deck(self.deck2, WARRIOR) self.game = Game(players=(player1, player2))
self.players = self.game.players
self.player1 = self.players[0]
self.field1 = self.player1.field
self.hand1 = self.player1.hand
self.player2 = self.players[1]
self.field2 = self.player2.field
self.hand2 = self.player2.hand
self.game.start()
#draw hero
hero1 = self.game.players[0].hero
cocosHero1 = CocosCard(hero1)
cocosHero1.position = 350,-50
self.add(cocosHero1, z =1) hero2 = self.game.players[1].hero
cocosHero2 = CocosCard(hero2)
cocosHero2.position = 350,450
self.add(cocosHero2, z =1) for player in self.game.players:
print("Can mulligan %r" % (player.choice.cards))
mull_count = random.randint(0, len(player.choice.cards))
cards_to_mulligan = random.sample(player.choice.cards, mull_count)
player.choice.choose(*cards_to_mulligan)
#draw cards in hand
for player in self.game.players:
print ("%r" % player)
for card in player.hand:
print("%r" % card) self.elapsed = 0
self.schedule(self.step)
self.elapsed2 = 0
self.schedule(self.drawHandsAndFields)
def step(self, dt):
#print("step %r" % dt)
self.elapsed += dt
#control step time
if self.elapsed > 1:
self.elapsed = 0
try:
self.nextStep()
except GameOver:
print ("GAME OVER")
self.unschedule(self.step)
def nextStep(self):
player = self.game.current_player
heropower = player.hero.power
if heropower.is_usable() and percent_chance(10):
if heropower.has_target():
heropower.use(target=random.choice(heropower.targets))
else:
heropower.use()
# iterate over our hand and play whatever is playable
for card in player.hand:
if card.is_playable() and percent_chance(50):
target = None
if card.choose_cards:
card = random.choice(card.choose_cards)
if card.has_target():
target = random.choice(card.targets)
print("Playing %r on %r" % (card, target))
card.play(target=target) # Randomly attack with whatever can attack
for character in player.characters:
if character.can_attack():
character.attack(random.choice(character.targets)) if player.choice:
choice = random.choice(player.choice.cards)
print("Choosing card %r" % (choice))
player.choice.choose(choice)
self.game.end_turn() def drawHandsAndFields(self, dt):
self.elapsed2 += dt
if self.elapsed2 > 1:
self.model.draw_field()
self.model.draw_hand()
self.elapsed2 = 0

负责控制整个游戏过程。本身继承了Layer, 然后利用schedule()方法来实现调用绘制的逻辑。

但是绘制的具体实现是在gamemodel.py中。其中包含了两个类, 一个是GameModel,这个实现了绘制卡牌。但是卡牌本身有事放在了CocosCard这个类中。

具体代码见https://github.com/htwenning/mystone

这就是运行的效果。

为了好看点,我给每张卡牌添加了一个背景。

[模拟炉石](一)让游戏过程显示到cocos2d中的更多相关文章

  1. C# WinForm 异步执行耗时操作并将过程显示在界面中

    private void button3_Click(object sender, EventArgs e)        {            RunAsync(() =>         ...

  2. Python之模拟职场人生游戏

    题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...

  3. 【转载】【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

    [游戏开发]在Lua中实现面向对象特性——模拟类.继承.多态   阅读目录 一.简介 二.前提知识 三.Lua中实现类.继承.多态 四.总结 回到顶部 一.简介 Lua是一门非常强大.非常灵活的脚本语 ...

  4. Socket编程之聊天程序 - 模拟Fins/ModBus协议通信过程

    设备控制软件编程涉及到的基本通信方式主要有TCP/IP与串口,用到的数据通信协议有Fins与ModBus. 更高级别的通信如.net中的Remoting与WCF在进行C/S架构软件开发时会采用. 本篇 ...

  5. spring-mvc实现模拟数据到网页展示过程代码

    spring-mvc实现模拟数据到网页展示过程代码 先看看我们的3种模拟数据到网页展示的思路图: 1.当mybatis的环境配置完成.一个动态Web项目建立好.开始导入jar包. -spring的ao ...

  6. 常用Java API之Ramdom--用代码模拟猜数小游戏

    常用Java API之Ramdom Ramdom类用来生成随机数字.使用起来也是三个步骤: 1.导包 import java.util.Random; 2.创建 Random r = new Rand ...

  7. Spring学习笔记(七)模拟实际开发过程的调用过程XML版-Setter方式注入

    模拟实际开发过程的调用过程XML版-Setter方式注入 源码获取github [TOC] 1.项目结构 2.jar包跟上个一样 3.重写set方法 UserServiceImpl.java 1234 ...

  8. Unity 如何在窗口大小可以随意改变的情况下让游戏世界完整的显示在镜头中

    当我们开发游戏时,如果是开发手机游戏,屏幕窗口的比例是固定的,不会说在运行时改变的. 但是,PC端的游戏就不一定,我希望它能被用户随意拉扯,但完整的内容还是能显示出来,这里我直接放例子: 请注意黑色的 ...

  9. Java/C++实现装饰模式---模拟手机功能的升级过程

    用装饰模式模拟手机功能的升级过程:简单的手机(SimplePhone)在接收来电时,会发出声音提醒主人:而JarPhone除了声音还能振动:更高级的手机(ComplexPhone)除了声音.振动外,还 ...

随机推荐

  1. Linux基础知识入门

    [Linux基础]Linux基础知识入门及常见命令.   前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1: ...

  2. (转)Linux监控工具

    需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧. 大多数Linux发行版本都装备了大量的监控工具,这些工具提供了能用作取得相关信息和系统活动的量度指标. 你能使用这些工具发现造 ...

  3. (一)一个简单的Web服务器

    万丈高楼平地起,首先我们必须了解 超文本传输协议(HTTP) 以后才能够比较清晰的明白web服务器是怎么回事. 1. 浅析Http协议 HTTP是一种协议,允许web服务器和浏览器通过互联网进行来发送 ...

  4. js设计模式系列之(一)请节约你的请求-代理模式

    What’s the proxy pattern? 代理模式其实就是将违反单一性原则的类给抽离出来,尽量满足开放和封闭的原则. 相当于一个类的行为只是一种,但是你可以给这个类添加额外的行为.比如: 一 ...

  5. Gwt ListBox选中自动触发事件

    以前用TreeView显示,需求更改 需要做一个ListBox控件显示数据,和HTML中的<Select>标签一样 编辑时候自动触发选中的数据子类: 1.只要自动触发了rootListBo ...

  6. Mybatis 开发中遇见的异常及处理

    1 异常信息: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bin ...

  7. Ubuntu 无线连接能上网,但是有线连接不能上

    这两天装Ubuntu,遇到小问题.最头疼的还是上网,过去我装了Ubuntu时,都是插上网线就能直接上网,这次就不行了. 我刚点开一个网页,接下来点就不能上了,但是无线连接就可以正常上网. 我在一个论坛 ...

  8. poj 1286 Necklace of Beads (polya(旋转+翻转)+模板)

      Description Beads of red, blue or green colors are connected together into a circular necklace of ...

  9. python calendar标准库基础学习

    # -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...

  10. HDU 3622 Bomb Game(2-sat)

    HDU 3622 Bomb Game 题目链接 题意:求一个最大半径,使得每一个二元组的点任选一个,能够得到全部圆两两不相交 思路:显然的二分半径,然后2-sat去判定就可以 代码: #include ...