corona渲染器 idk怎样点击屏幕

Corona中文站-五分钟学会Corona(七) - 基本运动与变换
强大、易学的跨平台(iOS/Android)开发框架。QQ群1:(满) 群2:
关于Corona SDK最强大的一件事,就是任何display object,都可以动画之。这足以证明Corona的图像模型的超级灵活性。动画允许你创建一个视觉丰富,引人入胜的使用体验。动画是通过生成一个帧序列来完成的,在帧到帧之间平滑的演变。术语“补间”(简称 inbetween)就是说这种中间帧的生成过程的。它通常用来略称,一个对象在动画期间一个属性的改变,比如位置补间。变换transition允许你很容易的只用一行代码来创建动画,这通过允许你补间一个display object的一个或多个属性来实现。例如你可以淡出一个display object,通过补间其alpha属性(这个alpha属性从1.0到0)。做到这一点最简单的方法是,用 transition.to 方法,第一个参数是一个display object,第二个参数是一个table包含控制参数。这个控制参数指定了动画的时间,动画开始的延时(可选),这个display object最终的属性值。一个属性的中间值,是由一个指定的变化函数作为控制参数产生的。默认是一个线性函数。下面是一些关于如何让一个矩形动画化的例子。(see Transition2 in the sample code):12345678910111213141516 local square = display.newRect( 0, 0, 100, 100 )square:setFillColor( 255,255,255 ) local w,h = display.contentWidth, display.contentHeight local square = display.newRect( 0, 0, 100, 100 )square:setFillColor( 255,255,255 ) local w,h = display.contentWidth, display.contentHeight -- (1) 移动square到右下角;大小减半--
以square的中心为本地原点; 淡出transition.to( square, { time=1500, alpha=0, x=(w-50), y=(h-50) } ) -- (2) 在2.5秒后, square 淡入回来transition.to( square, { time=500, delay=2500, alpha=1.0 } ) 在第一个补间中,请注意多个值会改变:位置和alpha值。这是因为在控制参数中我们指明,x、y和alpha属性的最终值。对控制参数中指定的每个属性,这个库会读取当前值,并且在指定的时间内(这里是1.5秒)逐步改变属性直到最终值。在最后一个补间里,我们使用delay控制参数,让之前淡出补间完成之后,再开始后一个补间动画。注意 transition 库的操作是基于时间轴的规则。transition.to( target, params )随时间,返回target显示对象的动画属性的补间。最终属性值再参数table中指定了。为了自定义补间,你可以可选的使用下列非动画属性参数:o params.time 指定 transition的时间周期(毫秒)。默认,这个值是500ms(0.5秒)o params.transition 默认值是 easing.linear . 参看 Easing 来获取更多信息。o params.delay 指定在补间动画开始前的延时 (没默认值)o params.delta 是一个布尔值,指明是否非控制参数,被解释为最终值,或作为值的改变。默认是nil,意味着false。o params.onStart i是一个函数或者table listener(在补间动画开始前被调用)。table Listener们必须有一个onStart方法。当被调用时,这个listener作为目标,而不是一个event。o
params.onComplete 是一个函数或者table listener,在补间动画完成后被调用,异步的。transition.from( target, params )和 transition.to 相似,不同在于属性值的开始值,在参数table中被指定,而最终值是在调用时相应的属性值。这个 transition 库,消除了手动操作动画对象的必要性。比较下面两个例子代码,都是让一个白色矩形在一秒钟淡出:The transition library eliminates the need for manually animating objects. Compare the following code that causes a white rectangle to fade out in 1 second:Manual animation Using transition local rect = display.newRect(
0, 0, 100, 100 )rect:setFillColor(255,255,255) local tMax =1000+system.getTimer()local function fadeOut(event)
local t = event.time
local rect = event.target
if t < tMax then
rect.alpha = 1 - t/tMax
rect.alpha = 0
-- 完成,则删除 listener
Runtime:removeEventListener
("enterFrame", fadeOut )
endend -- Add listener to begin animationRuntime:addEventListener(
"enterFrame", fadeOut ) local rect = display.newRect(
0, 0, 100, 100 )rect:setFillColor(255,255,255) transition.to(
rect, {time=1000, alpha=0}) transition.cancel( tween )取消这个补间动画。transition.dissolve( src, dst, duration, delayDuration )EasingEasing 库是一个中值函数的集合,被 transition库使用:easing.linear( t, tMax, start, delta )easing.inQuad( t, tMax, start, delta )easing.outQuad( t, tMax, start, delta )easing.inOutQuad( t, tMax, start, delta )easing.inExpo( t, tMax, start, delta )easing.outExpo( t, tMax, start, delta )easing.inOutExpo( t, tMax, start, delta )Y你可以创建你自己的easing函数,来在开始和最终值之间,生成中间值。这个函数必须具备下列参数:t从 transition 开始的瞬间,到现在经历过的时间tMaxtransition所用的时间周期start开始时的值delta改变的变化量。(最终值 = start + delta)Movieclips扩展的 movieclip库允许你从image序列,创建sprite动画(有时候叫“movieclips”),它可以使用和其他任何Corona display object同样的奇数,在屏幕上移动。有一些函数可以用来播放这些动画帧,或者这些帧当中的部分序列;比如向前或向后播放;跳到指定帧;向前或向后跳过帧;在序列完成后自动删除动画;让动画可以被拖放,通过press,drag和release事件来完成。这个框架提供一个快速轻量级的方法,来创建动画,并有助于移植现有的flash内容到Corona中来。这个 movieclip库是一个扩展模块,比需要在你的工程里包括 movieclip.lua文件,并且使用require命令。(参看 Loading external libraries 来获取关于require的细节)注意,这个库是基于旧的sprite库。这个库的名字被改成了“movieclip”,因为“sprite”这个名字被sprite-sheet特性所保留,参看 Corona Game Edition. 后面讨论两者的不同。使用 movieclip 的范例工程,见 Graphics/Movieclip project,或在 Ansca Mobile网站上代码。Movieclip functionsmovieclip.newAnim( frames )用一个image文件名数组提供帧table,来创建一个动画sprite:myAnim = movieclip.newAnim{ "img1.png", "img2.png", "img3.png", "img4.png" }object:play()开始向后播放一个animated sprite。当到达image列表的终点,它将会循环回来重新播放第一个image,并继续播放。如果一个特定帧序列已经被构造,调用play()而不带参数,将会简单地用那个序列恢复播放。object:play{ startFrame=a, endFrame=b, loop=c, remove=shouldRemove }开始向后播放一个animated sprite。当endFrame数字指定的帧到达时,它将会循环回 startFrame数字指定的帧来继续播放。myAnim:play{ startFrame=1, endFrame=6, loop=3, remove=true }loop参数接收一个数字,表示序列被循环的次数。0(默认值)表示永远循环下去。The remove 参数时一个布尔标志,如果设置为true,这个 movieclip将会在指定序列播放完成后自动删除自己。这是件很有用的事,比如你要用一个爆炸动画或者一次性的动画。注意,这个object只有在你的lua代码没有任何引用指向它时,才会被垃圾手机。默认值是false。所有参数都是可选的,但是 startFrame和 endFrame 默认被设置为第一和最后一个image上。所以显式地提供这两个值,来避免未预期的行为,也是个很好的实践。穿参数给play()表示一个新序列将被构造,并且所有当前的序列信息将被重置。如果你只是想恢复播放当前序列,可以不带参数调用play()。object:reverse()反方向播放这个 animated sprite。当image集合的开始到达,它将会循环回最后的image,继续反向播放。如果一个指定的帧序列已经被构造,无参数调用reverse(),将只简单恢复向前播放这个序列。object:reverse{ startFrame=a, endFrame=b, loop=c, remove=shouldRemove }开始向前播放一个animated sprite。当endFrame数字指定的帧到达时,它将会循环回 startFrame数字指定的帧来继续播放。loop参数接收一个数字,表示序列被循环的次数。0(默认值)表示永远循环下去。The remove 参数时一个布尔标志,如果设置为true,这个 movieclip将会在指定序列播放完成后自动删除自己。这是件很有用的事,比如你要用一个爆炸动画或者一次性的动画。注意,这个object只有在你的lua代码没有任何引用指向它时,才会被垃圾手机。默认值是false。所有参数都是可选的,但是 startFrame和 endFrame 默认被设置为最后和第一个image上。所以显式地提供这两个值,来避免未预期的行为,也是个很好的实践。穿参数给reverse()表示一个新序列将被构造,并且所有当前的序列信息将被重置。如果你只是想恢复播放当前序列,可以不带参数调用reverse()。object:nextFrame()在进程中重置任何动画序列,移动动画到整个序列中下一个image,并停止。这可以被一个2帧movieclip使用,来使一个image在2个状态间切换。object:previousFrame()在进程中重置任何动画序列,移动动画到整个序列中前一个image,并停止。object:stop()在当前帧中,停止sprite动画。object:stopAtFrame( frame )把动画跳到指定帧,给一个帧的数字编号,或者一个可选的帧标签(参看后面的 setLabels函数)。注意:从一个特定帧实现“go to and play”,可以简单发出一个 stopAtFrame命令,之后跟一个play或reverse命令。两个命令都将在显示更新前执行,所以这个变换将会立刻开始:myAnim:stopAtFrame(4)myAnim:play()再比如: myAnim:stopAtFrame("label")myAnim:reverse()object:setLabels( labels )为之前创建的Anim对象添加一个可选的标签,用一个table来附加标签名到选好的帧号上:(firstLabel和anotherLabel是任意字符串)myAnim:setLabels{ firstLabel=1, anotherLabel=3 }object:setDrag当 drag 被设置为true,任何 movieclip 就变成了一个可拖放的对象。 limitX和 limitY参数限制是否可以在x和y轴方向上拖动,还有bounds参数可以用来指定对象的拖放范围 {left, top, width, height}。onPress和onDrag,还有onRelease参数都需要一个当那些事件发生后会调用的函数名。所有参数都是可选的。myAnim:setDrag{ drag=true, limitX=false, limitY=false, onPress=myPressFunction, onDrag=myDragFunction,
onRelease=myReleaseFunction, bounds={ 10, 10, 200, 50 }}为了再关闭可拖放属性,设置"drag" to false:myAnim:setDrag{ drag=false }注意上面的例子,大括号是lua中的简略用法,就是直接通过一个名值组合的table穿参数给函数。换句话说,这个函数实际上收到一个单值,实际就是一个lua table,比如:funtion({values})。这个简略用法允许小括号被省略,以提高代码的可读性。movieclips 和 sprite sheets的区别Corona Game Edition 包括了一个 “sprite sheet”特性,即通过从内存中一个大纹理图片中拷贝小的矩形区块,来构造animated sprite。Sprite sheets对纹理内存的使用是非常高效率的,因为无论源图片有多大尺寸,OpenGL-ES为所有纹理分配的内存大小,都是其向上到2的N次方对齐的。例如,一个大小80X300的单个图片,将需要一个128X512像素的纹理内存的分配。因此, sprite sheets被推荐用于制作复杂的角色动画,或者任何有大量动画状态的程序。然而, sprite sheets需要更多编码和更多设置;例如,你必须构造一个动画帧的很大的sheet。 当然movieclip库更容易使用,也可以更快速的移植flash内容,因为 movieclip的帧可以从flash中,作为PNG序列被导出。为获取更多关于 sprite sheets的信息,参看 Game Edition: Sprite Sheets.自定义/可编程动画通常你需要创建你自己的动画,这时候可能没法使用transition库。这时候你就不得不取编写自定义的代码来产生动画序列,这就是常说的可编程动画。为了创建这样的动画,你需要随时间变化而改变屏幕上的内容。某些情况下,在例如一个for或while循环中修改对象属性,这是很自然的。然而在Corona里,你不可能用这样的循环生产动画,因为在你的代码块执行完成之前,屏幕是绝对不会刷新的(参看 Screen Updates)。相反,动画的产生,是借助重复的调用listener。这些listener修改屏幕上的display object,然后退出,然后允许屏幕刷新。这样的listener例如“enterFrame”,你可以注册你的listener到“enterFrame”事件上。在绘图循环中,“enterFrame”事件在屏幕刷新之前被分发,使得你的代码有机会修改屏幕上的内容(参见 Drawing Cycle)。通过“enterFrame”事件,你可以产生各种动画。事实上,transition库也是用这些事件构建的。下面是一个如何制作弹球动画的例子:listener函数animate每当一次“enterFrame”事件发生就会被调用一次。它负责在小球碰到屏幕边缘的时候,让其反弹以及改变其位置。因为“enterFrame”事件发生在全局级别,所以你需要向全局运行时对象注册listener。帧频"enterFrame"事件发生有一个固定的时间间隔,这就是我们说的帧频。所以你的listener将会在每个帧频时间开始时被调用。然而,如果你的listener消耗太久的时间而没有退出的话,那么实际帧频将小于所需的帧频。基于时间 vs 基于帧在上面的例子中,动画是基于帧的方式。如果实际帧频变慢下来,因为中间帧的渲染也是在每次事件调用发生的,所以小球会看起来移动的越来越慢;也没有中间帧会跳过。如果你打算让声音和动画同步,这样就变得有点糟糕了。解决这个问题的方案是采用基于时间的动画。通过计算我们listener每次被调用之间的时间,和适当的改变速度,我们把上面的例子,改为基于时间的方式。这将导致下面的改变:注意我们是如何利用“enterFrame”事件包含一个存储毫秒数的参数属性的。我们通过之前保存的时间来确定小球应该运动到多远处。另外,我们上一个例子中的x,y方向的速度(2.8和2.2)显式的假设是用帧来测量的。默认情况下,它会被设置成30fps,或33.3毫秒。所以我们可以用原来的速度(30/1000)来获得新的基于时间的速度。Lost or Missing Time看上去,基于时间的动画有一个问题,就是当设备挂起app以后,你需要计算“丢失”的时间。在模拟器中,你可以模拟挂起,通过使用键盘上的 ?↓ (command-down arrow),这表示硬件挂起/恢复你的app。(注意你需要知道,通过菜单导致一个app挂起,就好像被挂起但是并不产生挂起事件)在弹球的动画里,如果app被挂起半秒钟,球就会看起来象在屏幕上跳跃一样。在上面的例子里,解决的方案就是调节 tPrevious,把丢失的时间算上。
&&( 8:43:11)&&( 20:45:16)&&( 20:44:9)&&( 20:43:10)&&( 20:41:29)&&( 20:37:53)
Powered By
BuildApp.Net. All Rights Reserved.教程说明:
使用工具: Corona SDK
执行难度: 普通
操作时间: 30分钟到60分钟
步骤一: 应用程序概述
在Lua与Corona SDK API的帮助下,我们将利用预先准备好的图像素材制作出一款有趣的小游戏。
玩家需要利用设备自身配备的陀螺仪操控小球避开障碍物,并最终到达目的地。大家可以通过修改游戏参数对内容进行自定义。
步骤二: 目标开发平台
首先,我们要选择应用程序作品所依托的运行平台,确定了这一点后我们才能选择与设备相匹配的图像显示尺寸。
iOS系统平台具体参数如下:
iPad: 分辨率, 132ppi
iPhone/iPodTouch: 320x480分辨率, 163 ppi
iPhone4: 960x640分辨率, 326 ppi
由于Android平台的开放特性,我们需要面对各种各样不同参数的设备及分辨率。这里我们选择几款人气产品作为主要参考对象:
谷歌 NexusOne: 480x800分辨率, 254 ppi
摩托罗拉 DroidX: 854x480分辨率, 228 ppi
HTC Evo: 480x800分辨率, 217 ppi
在这篇指南文章中,我们主要以iOS平台——尤其是iPhone/iPod为基准进行图像设计工作。不过下文中所使用的代码理论上也同样适用于Android系统上的Corona SDK开发。
步骤三: 用户界面
一款简洁而友好的用户界面会帮助我们的应用作品顺利打开市场,而在指南针应用中,用户界面的构成元素主要有背景图案及指针图形。
本指南中所涉及的一切界面图形资源都汇总在压缩包内,大家可以点击以下链接获取并使用。
下载链接:https://mobiletuts.s3.amazonaws.com/Corona-SDK_Compass/source.zip
步骤四: 导出图像
根据大家所选择的设备平台,我们需要将图像资源以合适的PPI及尺寸进行导出。这项工作非常简单,任何一款主流图像编辑工具都能实现,大家根据自己 的习惯处理即可。我个人使用AdjustSize,这是一款Mac OS
X系统自带的图像预览应用。导出完成后,请记得给文件起一个清晰准确的名称,并保存在项目文件夹当中。
步骤五: 声音
为了给玩家带来更愉悦的游戏体验,我们需要为事件设定各种音效。在本实例中涉及到的各种音效资源都能够在Soungle.com网站中找到,搜索关键字“bell”及“buzz”即可。
步骤六: 应用程序配置
首先创建一个外部文件config.lua,它的作用是保证应用程序在设备上以全屏方式运行。这个文件中会明确出现应用程序的原始分辨率,并提供一套缩放方案,保证应用能够在各种不同设备的独特分辨率下正确显示。
application = {
width = 320,
height = 480,
scale = "letterbox"
步骤七: Main.lua
好,准备工作就绪,现在我们开始编写应用!
打开大家最喜爱的Lua编辑器(任何一款文本编辑工具都能胜任,不过并不是每种都支持Lua语法高亮显示功能),准备着手编写满载自己汗水的应用吧!请记住,一定把文件保存在项目文件夹中,并命名为Main.lua。
步骤八: 代码结构
我们要将代码以类的形式进行结构整理。如果大家熟悉ActionScript或者Java,肯定会发现我所推荐的这套结构基本上符合二者的构造特点。
Necessary Classes Variables and Constants Declare Functions
contructor (Main function)
class methods (other functions) call Main function
步骤九: 隐藏状态栏
display.setStatusBar(display.HiddenStatusBar)
这条代码的作用是隐藏状态栏。状态栏在任何一款移动系统平台上都会出现,一般位于屏幕上方,主要显示时间、信号强度等提示信息。
步骤十: 导入物理引擎
要还原真实的碰撞反应,我们需要在应用中使用物理效果库,通过以下代码将库导入程序:
local physics = require('physics') physics.start() physics.setGravity(0, 0)
步骤十一: 游戏背景图案
既然是练手用的小作品,我们就姑且使用上面这幅图片作为背景图案。以下几行代码用于将图片引入应用程序。
-- Graphics -- [Background] local bg = display.newImage('bg.png')
步骤十二: 标题视图
上图所示即为标题视图,它是我们进入游戏后所面对的第一个互动界面,按照下列变量将内容设定并保存。
-- [Title View] local titleBg local playBtn local creditsBtn local titleView
步骤十三: 制作人员视图
上图所示为开发者姓名及游戏版权归属信息,利用以下变量对其加以保存。
-- [CreditsView] local creditsView
步骤十四: 游戏视图
游戏视图所涉及的要素较多,包括玩家、障碍物及目的地。利用下面列出的代码完成游戏界面的基本创建。
-- [Game View] -- [Player] local player -- [Bars Table] local bars = {} -- [Holes Table] local holes = {} -- [Goal] local goal
步骤十五: 声音
以下代码将游戏中用到的声音加以保存。
local bell = audio.loadSound('bell.caf') local buzz = audio.loadSound('buzz.caf')
步骤十六: 代码审查
以下列出的是本教程所提到全部代码纲要,大家可以从宏观角度对作品进行核查,确定所有要素都已经包含在程序成品当中:
-- Teeter like Game -- Developed by Carlos Yanez
-- Hide Status Bar
display.setStatusBar(display.HiddenStatusBar)
-- Physics
local physics = require('physics') physics.start() physics.setGravity(0, 0)
-- Graphics
-- [Background]
local bg = display.newImage('bg.png')
-- [Title View]
local titleBg local playBtn local creditsBtn local titleView
-- [Credits]
local creditsView
-- [Player]
local player
-- [Bars Table]
local bars = {}
-- [Holes Table]
local holes = {}
local goal
local bell = audio.loadSound('bell.caf') local buzz = audio.loadSound('buzz.caf')
步骤十七: 函数声明
应用启动之初声明所有函数的基本状态。
local Main = {} local startButtonListeners = {} local showCredits = {} local hideCredits = {} local showGameView = {} local gameListeners = {} local movePlayer = {} local onCollision = {} local alert = {} local dragPaddle = {}
步骤十八: 游戏构造函数
接下来,我们要创建一套运行逻辑的初始化机制,具体内容如下:
function Main()
-- code... end
步骤十九: 添加标题视图
现在我们将标题视图放置在主界面中,同时调用用于监听按钮“触摸”动作的函数。
function Main()
titleBg = display.newImage('titleBg.png')
playBtn = display.newImage('playBtn.png', display.contentCenterX - 35.5, display.contentCenterY + 10)
creditsBtn = display.newImage('creditsBtn.png', display.contentCenterX - 50.5, display.contentCenterY + 65)
titleView = display.newGroup(titleBg, playBtn, creditsBtn)
startButtonListeners('add') end
步骤二十: 开始按钮监听
此函数的作用是为标题视图按钮添加所需的监听器。
function startButtonListeners(action)
if(action == 'add') then
playBtn:addEventListener('tap', showGameView)
creditsBtn:addEventListener('tap', showCredits)
playBtn:removeEventListener('tap', showGameView)
creditsBtn:removeEventListener('tap', showCredits)
步骤二十一: 显示开发人员名单
当用户点击对应按钮时,应用会显示开发人员名单。此时要额外添加一个监听器,这样用户再次点击时程序将中止名单显示并返回主界面。
function showCredits:tap(e)
playBtn.isVisible = false
creditsBtn.isVisible = false
creditsView = display.newImage('credits.png', 0, display.contentHeight+40)
transition.to(creditsView, {time = 300, y = display.contentHeight-20, onComplete = function() creditsView:addEventListener('tap', hideCredits) end}) end
步骤二十二: 隐藏开发人员名单
当用户在开发人员名单显示过程中点击屏幕,显示将以动画形式中断并返回主界面。
function hideCredits:tap(e)
playBtn.isVisible = true
creditsBtn.isVisible = true
transition.to(creditsView, {time = 300, y = display.contentHeight+creditsView.height, onComplete = function() creditsView:removeEventListener('tap', hideCredits) display.remove(creditsView) creditsView = nil end}) end
步骤二十三: 显示游戏视图
当用户点击“开始游戏”(Play)按钮时,标题视图将以动画形式消去并显示游戏视图。
function showGameView:tap(e)
transition.to(titleView, {time = 300, x = -titleView.height, onComplete = function() startButtonListeners('rmv') display.remove(titleView) titleView = nil end})
步骤二十四: 目的地
在这里我们要为小球设定目的地。另外,我们还要为其设定名称,以便小球触碰到目的地时顺利触发预定事件。
goal = display.newImage('goal.png') goal.x = 439 goal.y = 31 goal.name = 'g'
步骤二十五: 墙体
我们要在游戏界面中设置墙体,这样才能保证小球始终在预定的游戏场地内活动。
local left = display.newLine(-1, 0, -1, display.contentHeight)
local right = display.newLine(display.contentWidth+1, 0, display.contentWidth+1, display.contentHeight)
local top = display.newLine(0, -3, display.contentWidth, -3)
local bottom = display.newLine(0, display.contentHeight, display.contentWidth, display.contentHeight)
步骤二十六: 障碍物
这些条形障碍物是提升游戏乐趣的关键所在,利用以下代码在游戏中实现此类设置。
local b1 = display.newImage('bar.png', 92, 67) local b2 = display.newImage('bar.png', 192, -2) local b3 = display.newImage('bar.png', 287, 67) local b4 = display.newImage('bar.png', 387, -2)
步骤二十七: 陷阱
这些充当陷阱的洞是我们为小球设计的“敌人”,一旦小球触碰到它们,游戏即宣告结束。
local h1 = display.newImage('hole.png', 62, 76) local h2 = display.newImage('hole.png', 124, 284) local h3 = display.newImage('hole.png', 223, 224) local h4 = display.newImage('hole.png', 356, 114) local h5 = display.newImage('hole.png', 380, 256) -- Name holes for collision detection h1.name = 'h' h2.name = 'h' h3.name = 'h' h4.name = 'h' h5.name = 'h'
步骤二十八: 小球(玩家)
接下来我们要在游戏中添加主角——小球。在设备陀螺仪的帮助下,小球会随着玩家的操作而自然滚动。
player = display.newImage('player.png') player.x = 49 player.y = 288 player:setReferencePoint(display.CenterReferencePoint)
在本系列指南教程的第一部分,我们共同探讨了如何为游戏设计用户界面及基本设置。希望大家继续关注第二部分,届时我们将一道学习如何处理应用程序的逻辑、按钮、操作等细节。咱们下期再见!
原文链接:
http://mobile.tutsplus.com/tutorials/corona/corona-sdk-create-a-teeter-like-game-setup-interface-creation/
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至: 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。
回顾“被动方式”开发
在C#对游戏手柄的编程开发-API篇(1)这篇文章中我们介绍了“被动方式”的开发。在此方式下,我们的程序只扮演一个消息接}

我要回帖

更多关于 coronacolour皮草怎样 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信