环境: cocos2dx版本为2.1.4 目标: 游戏中一般有玩家和怪物,他们都有相同的动作状态,如:idle、walk、attack、defense等,我们需要抽象出玩家和怪物的代码实现中中相同的部分 方法: cocos2dx中其实已经提供了类继承的一下工具函数,在sdk中的samples/Lua
环境:
cocos2dx版本为2.1.4
目标:
游戏中一般有玩家和怪物,他们都有相同的动作状态,如:idle、walk、attack、defense等,我们需要抽象出玩家和怪物的代码实现中中相同的部分
方法:
cocos2dx中其实已经提供了类继承的一下工具函数,在sdk中的samples/Lua/TestLua/Resources/luaScript目录下有一个名为“extern.lua”,其中有段代码如下:
--Create an class. function class(classname, super) local superType = type(super) local cls if superType ~= "function" and superType ~= "table" then superType = nil super = nil end if superType == "function" or (super and super.__ctype == 1) then -- inherited from native C++ Object cls = {} if superType == "table" then -- copy fields from super for k,v in pairs(super) do cls[k] = v end cls.__create = super.__create cls.super = super else cls.__create = super end cls.ctor = function() end cls.__cname = classname cls.__ctype = 1 function cls.new(...) local instance = cls.__create(...) -- copy fields from class to native object for k,v in pairs(cls) do instance[k] = v end instance.class = cls instance:ctor(...) return instance end else -- inherited from Lua Object if super then cls = clone(super) cls.super = super else cls = {ctor = function() end} end cls.__cname = classname cls.__ctype = 2 -- lua cls.__index = cls function cls.new(...) local instance = setmetatable({}, cls) instance.class = cls instance:ctor(...) return instance end end return cls end
函数class的第一个参数就是我们要实现的类的名称,可以不传第二个参数或者给第二参数传一个function或者table。
我们从cocos2dx中的CCSprite继承,根据不同的状态播放不同的动画
实现:
玩家和怪物的基类可如下实现:
require "extern" Actor = class("Actor", function() return CCSprite:create() end) Actor.__index = Actor -- 常量 kActorStateUnkown = 0 kActorStateIdle = 1 kActorStateAttack = 2 kActorStateDefense = 3 kActorStateWalk = 4 -- 属性 Actor._state = kActorStateUnkown Actor._idle_action = nil Actor._attack_action = nil Actor._defense_action = nil Actor._walk_action = nil -- 方法 function Actor:idle() if self._state ~= kActorStateIdle then self:stopAllActions() pcall(self:runAction(self._idle_action)) self._state = kActorStateIdle end end function Actor:attack() if self._state ~= kActorStateAttack then self:stopAllActions() pcall(self:runAction(self._attack_action)) self._state = kActorStateAttack end end function Actor:defense() if self._state ~= kActorStateDefense then self:stopAllActions() pcall(self:runAction(self._defense_action)) self._state = kActorStateDefense end end function Actor:walk() if self._state ~= kActorStateWalk then self:stopAllActions() pcall(self:runAction(self._walk_action)) self._state = kActorStateWalk end end function Actor:create() local actor = Actor.new() return actor end
有了基类后,玩家的的实现可以如下:
1、玩家的数据单例
require "extern" PlayerData = class("PlayerData") PlayerData.__index = PlayerData PlayerData._inited = 0 PlayerData._idle_action = nil PlayerData._attack_action = nil PlayerData._defense_action = nil PlayerData._walk_action = nil function PlayerData:lazyInit() if (self._inited ~= 0) then return end local cache = CCSpriteFrameCache:sharedSpriteFrameCache() cache:addSpriteFramesWithFile("pd_sprites.plist") local frames = nil local frame = nil local anim = nil -- idle frames = CCArray:createWithCapacity(6) for i = 0, 5 do frame = cache:spriteFrameByName( string.format("hero_idle_%02d.png", i)) frames:addObject(frame) end anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0) self._idle_action = CCRepeatForever:create(CCAnimate:create(anim)) -- attack frames = CCArray:createWithCapacity(3) for i = 0, 2 do frame = cache:spriteFrameByName( string.format("hero_attack_00_%02d.png", i)) frames:addObject(frame) end anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0) self._attack_action = CCRepeatForever:create(CCAnimate:create(anim)) -- defense self._defense_action = self._idle_action -- walk frames = CCArray:createWithCapacity(8) for i = 0, 7 do frame = cache:spriteFrameByName( string.format("hero_walk_%02d.png", i)) frames:addObject(frame) end anim = CCAnimation:createWithSpriteFrames(frames, 1.0 / 12.0) self._walk_action = CCRepeatForever:create(CCAnimate:create(anim)) self._inited = 1 end function PlayerData:getAllAction() self:lazyInit() return self._idle_action, self._attack_action, self._defense_action, self._walk_action end
2、玩家类
require "actor" require "playerdata" Player = class("Player", function() return Actor:create() end) Player.__index = Player function Player:init() self._idle_action, self._attack_action, self._defense_action, self._walk_action = PlayerData:getAllAction() end function Player:create() local player = Player.new() player:init() return player end

MySQL和SQLite的主要区别在于设计理念和使用场景:1.MySQL适用于大型应用和企业级解决方案,支持高性能和高并发;2.SQLite适合移动应用和桌面软件,轻量级且易于嵌入。

MySQL中的索引是数据库表中一列或多列的有序结构,用于加速数据检索。1)索引通过减少扫描数据量提升查询速度。2)B-Tree索引利用平衡树结构,适合范围查询和排序。3)创建索引使用CREATEINDEX语句,如CREATEINDEXidx_customer_idONorders(customer_id)。4)复合索引可优化多列查询,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。5)使用EXPLAIN分析查询计划,避

在MySQL中使用事务可以确保数据一致性。1)通过STARTTRANSACTION开始事务,执行SQL操作后用COMMIT提交或ROLLBACK回滚。2)使用SAVEPOINT可以设置保存点,允许部分回滚。3)性能优化建议包括缩短事务时间、避免大规模查询和合理使用隔离级别。

选择PostgreSQL而非MySQL的场景包括:1)需要复杂查询和高级SQL功能,2)要求严格的数据完整性和ACID遵从性,3)需要高级空间功能,4)处理大数据集时需要高性能。PostgreSQL在这些方面表现出色,适合需要复杂数据处理和高数据完整性的项目。

MySQL数据库的安全可以通过以下措施实现:1.用户权限管理:通过CREATEUSER和GRANT命令严格控制访问权限。2.加密传输:配置SSL/TLS确保数据传输安全。3.数据库备份和恢复:使用mysqldump或mysqlpump定期备份数据。4.高级安全策略:使用防火墙限制访问,并启用审计日志记录操作。5.性能优化与最佳实践:通过索引和查询优化以及定期维护兼顾安全和性能。

如何有效监控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。1.使用mysqladmin查看连接数。2.用SHOWGLOBALSTATUS查看查询数。3.PMM提供详细性能数据和图形化界面。4.MySQLEnterpriseMonitor提供丰富的监控功能和报警机制。

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显着差异,选择时需考虑项目规模和未来扩展性。

在需要高可用性、高级安全性和良好集成性的企业级应用场景下,应选择SQLServer而不是MySQL。1)SQLServer提供企业级功能,如高可用性和高级安全性。2)它与微软生态系统如VisualStudio和PowerBI紧密集成。3)SQLServer在性能优化方面表现出色,支持内存优化表和列存储索引。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Linux新版
SublimeText3 Linux最新版

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载
最流行的的开源编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中