首页 文章 精选 留言 我的

精选列表

搜索[MCP头号玩家],共4046篇文章
优秀的个人博客,低调大师

雷蛇(Razer)数据泄漏暴露了游戏玩家的个人信息

游戏硬件制造商雷蛇(Razer)在线商店的一个不安全的数据库在网上被曝光后,遭遇了数据泄露。 Razer是一家新加坡裔美国游戏硬件制造商,以其鼠标,键盘和其他高端游戏设备而闻名。 8月19日左右,安全研究员 Bob Diachenko 发现了一个不安全的数据库,该数据库暴露了大约10万人从Razer在线商店购买商品的信息。 暴露的信息包括客户的姓名、电子邮件地址、电话号码、订单号、订单明细以及帐单和送货地址,如下所示。 不安全数据库公开的Razer数据 几周以来,Diachenko试图联系Razer的人,以使他们可以保护暴露的数据库。 Razer对Diachenko在LinkedIn(领英)的文章发表的声明中说,他们最终于在9月9日保护了数据库服务器,并感谢研究人员的帮助。 Volodymyr先生让我们意识到服务器配置错误,可能会暴露订单详细信息、客户和发货信息。没有其他敏感数据(如:信用卡号码或密码)被曝光。服务器的错误配置已经在9月9日被修复,之后才被公之于众。 我们非常感谢您,对于此问题已深表歉意,并已采取一切必要措施解决该问题,并对我们的IT安全性和系统进行了彻底的审查。我们将继续致力于确保所有客户的数字安全性。 Razer用户应该怎么做? 如果威胁行为者访问了这些数据,他们可以在有针对性的网络钓鱼活动中使用这些信息来收集更敏感的信息,如密码和信用卡详细信息。 虽然尚不确定是否有威胁行动者在修补之前就已获得了暴露的数据,但对于用户来说,对潜在的鱼叉式网络钓鱼活动保持警惕是至关重要的。 如果您曾经从Razer的在线商店购买过东西,请小心任何来自游戏公司的电子邮件。 此外,如果您收到声称来自Razer的电子邮件,请确认登录的是razer.com网站,千万不要在其他域名下进行操作。 本文翻译自: https://www.bleepingcomputer.com/news/security/razer-data-leak-exposes-personal-information-of-gamers/ 【责任编辑: 赵宁宁 TEL:(010)68476606】

优秀的个人博客,低调大师

【Android游戏开发十七】让玩家自定义手势玩转Android游戏!

有童鞋问我为什么不用SDK2.1 ,2.2来进行游戏开发,那我这里稍微说两句: 1.Android SDK 属于向下兼容!那么低版本可以运行的,高版本基本上更是没问题!(当然每次SDK的更新也会带来新功能,或者修改了一些原来的BUG等等,那么其实对于游戏开发来说,如果你的游戏中不需要更高的SDK版本的支持情况下,完全不必去追求最新的SDK!) 2.使用低版本进行游戏开发这样能兼顾更多的机型,获取更多的用户! 3.大家都知道Android SDK 每次版本的更新,底层代码也会更健壮和优化了!比如我们公司的网游Android版在G2(SDK1.5)上跑起来稍微有些卡,而在我的手机上(SDK2.2)运行起来流畅的没说的~各种舒坦~~但是这样也会带来一些弊端,比如我们自己游戏如果上来就用高版本SDK进行开发,那么对于性能、内存上到底如何,我们都不会很容易的看出其效果,如果我们用低版本的SDK则会让我们明显的感受到性能到底如何~你想想如果你的游戏在1.5 ,1.6上跑起来很流畅,那放在更高版本的SDK机器上更是没说的啦~ 总结:游戏开发中,如果你游戏不需要更高的API的支持,那么推荐基于SDK 1.5和1.6来开发! 在上一篇中我给大家介绍了触摸屏手势操作,但是这种触屏手势的操作比较有局限性;比如我们都知道Android可以利用手势来解锁,比如九宫格形式的,通过自定义的一个单笔画手势可以解开屏幕锁,还可以自定义笔画手势来启动一个应用等,那么这种所谓的笔画手势其实就是今天我要给大家讲解的输入法手势识别技术!这种手势是我们可以自己来自定义,而不像之前的触屏手势操作只是利用Android 对一些触屏动作的封装罢了。下面上几张手机自定义笔划手势解锁的的截图: 左图中最后一个是自定义解锁的输入法手势~ OK,那么既然利用手势既然能进行解锁等操作,那么我们游戏开发中,更是可以加入这一亮点了,比如在游戏中我画个圆形执行换背景操作,画个X表示退出游戏等等,等等、哈哈 是不是感觉很有意思了?好的,下面就开始进入讲解! 首先本篇主要学习两点: 1. 如何创建输入法手势、删除输入法手势、从SD卡中读取出手势文件! 2.当输入法手势创建后,如何来匹配出我们的自定义手势! 下面我们来熟习两个类和几个概念: 1. 什么是 GestureOverlayView ?简单点说其实就是一个手写绘图区; 2. 什么是 GestureLibrary ?这个类是对手势进行保存、删除等操作的,一个存放手势的小仓库! 3. 笔划是什么,字体笔画? 是的,其实就是跟我们写字的笔划一个概念! 4.什么是笔划类型?输入法手势操作中,笔划类型有两种;一种是:单一笔划,另外一种是:多笔划 所谓单一笔划笔划就是一笔划画出一个手势,从你手指接触屏幕开始到你离开屏幕笔画就会立刻形成一个手势!一气呵成! 而多笔划则是可以在一定紧凑时间内随意几笔划都可!然后超过这个紧凑时间后便会形成一个手势! 先出项目截图,简单说下其功能和操作: 【图1】 【图2】 图1界面中分为3块,从上到下依次是:TextView ,EditText,SurfaceView;然后在SurfaceView后面还有一个覆盖全屏的GestureOverlayView! 图2界面是在创建好的手势中匹配手势的界面,这里很清晰看出来,找的很对 ~嘿嘿~ 先看下main.xml: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextViewandroid:id="@+id/himi_tv"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="@string/hello" android:textSize="15sp"android:textColor="#FFFFFF00"/> <EditTextandroid:id="@+id/himi_edit"android:layout_width="fill_parent" android:layout_height="wrap_content"/> <RelativeLayoutandroid:layout_width="fill_parent" android:layout_height="wrap_content"android:layout_weight="1"> <com.himi.MySurfaceViewandroid:id="@+id/view3d" android:layout_width="fill_parent"android:layout_height="fill_parent"/> <android.gesture.GestureOverlayView android:id="@+id/himi_gesture"android:layout_width="fill_parent" android:layout_height="fill_parent"android:layout_weight="1.0"/> </RelativeLayout> </LinearLayout> xml中注册的有我们自定义的surfaceview,对此不太熟悉可以去看下【Android2D开发之六】,不多解释了。关于GestureOverlayView这里也只是简单的定义了宽高,还有一些重要的属性设置在代码中设置了,当然xml也可以设置的; 下面看MainActivity.java ** *@authorHimi *@输入法手势识别 *@注意:android.gesture这个类在api-4(SDK1.6)才开始支持的! *@提醒:默认存到SD卡中,所以别忘记在AndroidMainfest.xml加上SD卡读写权限! */ publicclassMainActivityextendsActivity{ privateGestureOverlayViewgov;//创建一个手写绘图区 privateGesturegesture;//手写实例 privateGestureLibrarygestureLib;//创建一个手势仓库 privateTextViewtv; privateEditTextet; privateStringpath;//手势文件路径 privateFilefile;// @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); tv=(TextView)findViewById(R.id.himi_tv); et=(EditText)findViewById(R.id.himi_edit); gov=(GestureOverlayView)findViewById(R.id.himi_gesture); gov.setGestureStrokeType(GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE);//设置笔划类型 //GestureOverlayView.GESTURE_STROKE_TYPE_MULTIPLE设置支持多笔划 //GestureOverlayView.GESTURE_STROKE_TYPE_SINGLE仅支持单一笔划 path=newFile(Environment.getExternalStorageDirectory(),"gestures").getAbsolutePath(); //得到默认路径和文件名/sdcard/gestures file=newFile(path);//实例gestures的文件对象 gestureLib=GestureLibraries.fromFile(path);//实例手势仓库 gov.addOnGestureListener(newOnGestureListener(){//这里是绑定手写绘图区 @Override //以下方法是你刚开始画手势的时候触发 publicvoidonGestureStarted(GestureOverlayViewoverlay,MotionEventevent){ tv.setText("请您在紧凑的时间内用两笔划来完成一个手势!西西~"); } @Override //以下方法是当手势完整形成的时候触发 publicvoidonGestureEnded(GestureOverlayViewoverlay,MotionEventevent){ gesture=overlay.getGesture();//从绘图区取出形成的手势 if(gesture.getStrokesCount()==2){//我判定当用户用了两笔划 //(强调:如果一开始设置手势笔画类型是单一笔画,那你这里始终得到的只是1!) if(event.getAction()==MotionEvent.ACTION_UP){//判定第两笔划离开屏幕 //if(gesture.getLength()==100){}//这里是判定长度达到100像素 if(et.getText().toString().equals("")){ tv.setText("由于您没有输入手势名称,so~保存失败啦~"); }else{ tv.setText("正在保存手势..."); addGesture(et.getText().toString(),gesture);//我自己写的添加手势函数 } } }else{ tv.setText("请您在紧凑的时间内用两笔划来完成一个手势!西西~"); } } @Override publicvoidonGestureCancelled(GestureOverlayViewoverlay,MotionEventevent){ } @Override publicvoidonGesture(GestureOverlayViewoverlay,MotionEventevent){ } }); //----这里是在程序启动的时候进行遍历所有手势!------ if(!gestureLib.load()){ tv.setText("Himi提示:手势超过9个我做了删除所有手势的操作,为了界面整洁一些!" +"输入法手势练习~(*^__^*)~嘻嘻!/n操作介绍:(画手势我设置必须画两笔划才行哦~)/n1."+ "添加手势:先EditText中输入名称,然后在屏幕上画出手势!/n2.匹配手势:" +"在EditText输入/"himi/",然后输入手势即可!"); }else{ Set<String>set=gestureLib.getGestureEntries();//取出所有手势 Objectob[]=set.toArray(); loadAllGesture(set,ob); } } } 这个就是MainActivity主要代码了,其中添加手势、匹配手势、遍历手势、将手势转成图片这些我都单独写成了函数,这样让各位童鞋更清晰思路一些。 从以上代码中我们看出在创建手势之前,手写绘图区(GestureOverlayView)肯定先被创建出来,然后我们就可以在其区域中进行笔划绘画手势了,当然绘画手势前,我们也需要设置了笔划类型,也就是我一开始给大家介绍的~其后最重要的就是手写绘图区的手势监听器绑定,增加OnGestureListener这个监听器重写了四个函数,这里最重要的就两个函数: onGestureStarted 和 onGestureEnded ; 手势开始和手势结束的监听函数! 尤其是手势结束监听这个函数尤为重要,在其中我设置好几个条件语句,这么几个条件一方面是让大家了解Gesture中一些比较重要常用的方法,另一方面我要提醒各位童鞋: 如果你设置笔划类型是多笔划类型的,那么理想状态下,应该是在一段紧凑时间内,不管你使用了几笔划来绘制手势,系统都应该在判定你在一定短暂时间内没有再进行笔划的时候才应该创建手势,并且系统响应此函数; 其实错了,一开始我也这么想,但是发现,不管你设置的笔划类型是单一的还是多笔划当你手指离开屏幕,不管你当前是第几笔,Android都会去响应这个完成函数,so~ 我在这里调用手势Gesture类中的getStrokesCount()函数,这个函数会记录在紧凑时间内你绘制手势的笔划数,那么根据这个函数我们就可以解决手指离开屏幕总被响应的问题了,因为单一笔划类型永远这个值不会大于1! 而 if (event.getAction() == MotionEvent.ACTION_UP) {}写这个只是给大家演示第二个参数按键动作该怎么用; 那么我们下面就来看如何创建一个手势: publicvoidaddMyGesture(Stringname,Gesturegesture){ try{ if(name.equals("himi")){ findGesture(gesture); }else{ //关于两种方式创建模拟器的SDcard在【Android2D游戏开发之十】有详解 if(Environment.getExternalStorageState()!=null){//这个方法在试探终端是否有sdcard! if(!file.exists()){//判定是否已经存在手势文件 //不存在文件的时候我们去直接把我们的手势文件存入 gestureLib.addGesture(name,gesture); if(gestureLib.save()){////保存到文件中 gov.clear(true);//清除笔画 //注意保存的路径默认是/sdcard/gesture,so~别忘记AndroidMainfest.xml加上读写权限! //这里抱怨一下,咳咳、其实昨天就应该出这篇博文的,就是因为这里总是异常,今天仔细看了 //才发现不是没写权限,而是我虽然在AndroidMainfest.xml中写了权限,但是写错了位置..哭死! tv.setText("保存手势成功!因为不存在手势文件,"+"所以第一次保存手势成功会默认先创"+ "建了一个手势文件!然后将手势保存到文件中."); et.setText(""); gestureToImage(gesture); }else{ tv.setText("保存手势失败!"); } }else{//当存在此文件的时候我们需要先删除此手势然后把新的手势放上 //读取已经存在的文件,得到文件中的所有手势 if(!gestureLib.load()){//如果读取失败 tv.setText("手势文件读取失败!"); }else{//读取成功 Set<String>set=gestureLib.getGestureEntries();//取出所有手势 Objectob[]=set.toArray(); booleanisHavedGesture=false; for(inti=0;i<ob.length;i++){//这里是遍历所有手势的name if(((String)ob[i]).equals(name)){//和我们新添的手势name做对比 isHavedGesture=true; } } if(isHavedGesture){//如果此变量为true说明有相同name的手势 //----备注1-------------------//gestureLib.removeGesture(name,gesture);//删除与当前名字相同的手势 /*----备注2-----------------*/gestureLib.removeEntry(name); gestureLib.addGesture(name,gesture); }else{ gestureLib.addGesture(name,gesture); } if(gestureLib.save()){ gov.clear(true);//清除笔画 gestureToImage(gesture); tv.setText("保存手势成功!当前所有手势一共有:"+ob.length+"个"); et.setText(""); }else{ tv.setText("保存手势失败!"); } ////---------以下代码是当手势超过9个就全部清空操作-------- if(ob.length>9){ for(inti=0;i<ob.length;i++){//这里是遍历删除手势 gestureLib.removeEntry((String)ob[i]); } gestureLib.save(); if(MySurfaceView.vec_bmp!=null){ MySurfaceView.vec_bmp.removeAllElements();//删除放置手势图的容器 } tv.setText("手势超过9个,已全部清空!"); et.setText(""); } ob=null; set=null; } } }else{ tv.setText("当前模拟器没有SD卡--。"); } } }catch(Exceptione){ tv.setText("操作异常!"); } } 这里也都很好理解,套路类似之前File文件存储的套路,先判断SD是否存在,然后是文件是否存在: 如果文件不存在就先直接添加到手势到手势仓库中,然后手势仓调用gestureLib.save()才算把手势存到SD卡的手势文件中。 文件存在的话还要去判定是否文件中包含了相同名字的手势;当然这里可以不判定是否有相同手势名存在,然后进行删除操作!其实也可不删除,直接添加进去当前新建的手势;原因看了下面的备注解释就明白了; 备注 1:因为gestureLib保存的手势是个HashMap, key=手势的名字,value=手势,所以gestureLib.removeGesture(name, gesture);这种删除方式只是删除了手势,该手势名字依旧保存在hashmap中,下次还有相同的name手势存入的时候Hashmap就直接覆盖本条目了。所以根据Hashmap的特征,我们可以不进行删除操作,可以直接gestureLib.addGesture(name, gesture);因为如果出现相同的手势名字的手势,Hashmap就会根据key(手势的名字)直接覆盖其条目的value(手势)滴~ 备注2:这里也是一种删除手势的方式,但是这种方式跟备注1的不同,这里是将Hashmap中的条目删除,也就是说key和value都被删去! 下面看下如何把手势转成bitmap! publicvoidgestureToImage(Gestureges){//将手势转换成Bitmap //把手势转成图片,存到我们SurfaceView中定义的Image容器中,然后都画出来~ if(MySurfaceView.vec_bmp!=null){ MySurfaceView.vec_bmp.addElement(ges.toBitmap(100,100,12,Color.GREEN)); } } 下面是如何遍历手势! publicvoidloadAllGesture(Set<String>set,Objectob[]){//遍历所有的手势 if(gestureLib.load()){//读取最新的手势文件 set=gestureLib.getGestureEntries();//取出所有手势 ob=set.toArray(); for(inti=0;i<ob.length;i++){ //把手势转成Bitmap gestureToImage(gestureLib.getGestures((String)ob[i]).get(0)); //这里是把我们每个手势的名字也保存下来 MySurfaceView.vec_string.addElement((String)ob[i]); } } } 下面最后来看看手势的匹配!(超重要的!自己也搞了许久才找到解决的方法) publicvoidfindGesture(Gesturegesture){ try{ //关于两种方式创建模拟器的SDcard在【Android2D游戏开发之十】有详解 if(Environment.getExternalStorageState()!=null){//这个方法在试探终端是否有sdcard! if(!file.exists()){//判定是否已经存在手势文件 tv.setText("匹配手势失败,因为手势文件不存在!!"); }else{//当存在此文件的时候我们需要先删除此手势然后把新的手势放上 //读取已经存在的文件,得到文件中的所有手势 if(!gestureLib.load()){//如果读取失败 tv.setText("匹配手势失败,手势文件读取失败!"); }else{//读取成功 List<Prediction>predictions=gestureLib.recognize(gesture); //recognize()的返回结果是一个prediction集合, //包含了所有与gesture相匹配的结果。 //从手势库中查询匹配的内容,匹配的结果可能包括多个相似的结果, if(!predictions.isEmpty()){ Predictionprediction=predictions.get(0); //prediction的score属性代表了与手势的相似程度 //prediction的name代表手势对应的名称 //prediction的score属性代表了与gesture得相似程度(通常情况下不考虑score小于1的结果)。 if(prediction.score>=1){ tv.setText("当前你的手势在手势库中找到最相似的手势:name="+prediction.name); } } } } }else{ tv.setText("匹配手势失败,,当前模拟器没有SD卡--。"); } }catch(Exceptione){ e.printStackTrace(); tv.setText("由于出现异常,匹配手势失败啦~"); } } 那么最后给各位童鞋说一下,其实输入法手势操作很是适合游戏中使用,不管是触摸屏手势操作还是今天讲的输入法手势操作如果加到游戏中那都是相当赞的!但是我们公司网游引擎和框架不适合插入手势 - -、唉~ 其实前两天应该发这篇的,但是因为工作忙了几天,让大家久等了,挺不好意思的,所以今天熬夜给大家写了出来,现在都凌晨 7:00 了~ 源码下载地址:http://www.himigame.com/android-game/340.html 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/606792,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册