首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

Android游戏开发 - NancyGLines设计

今天把之前用Python实现的NancyGLines游戏迁移到了Android中,虽然现在还只是算个毛坯版,界面比较丑陋,功能也不够完善,但是整个框架已经建立好,并且,游戏的基本功能已经实现了。见下图: 游戏规则: 1. 触摸某个球,然后选择一个需要移动到的没有球的地方。 2. 球移动过去后,如果满足横,竖,斜同颜色的球大于等于5个,则消去这些同颜色的球得分。 3. 如果没有消去,则会落下三个新的球。 4. 直到棋盘没有位置容下新的球,游戏结束。 下面是layout: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <? xmlversion="1.0"encoding="utf-8" ?> < FrameLayout xmlns:android ="http://schemas.android.com/apk/res/android" android:layout_width ="fill_parent" android:layout_height ="fill_parent" > < com.coderzh.nancyglines.GLinesView android:id ="@+id/glines" android:layout_width ="fill_parent" android:layout_height ="fill_parent" /> < RelativeLayout android:layout_width ="fill_parent" android:layout_height ="fill_parent" > < TextView android:id ="@+id/text" android:text ="@string/app_name" android:visibility ="visible" android:layout_width ="wrap_content" android:layout_height ="wrap_content" android:layout_centerInParent ="true" android:gravity ="center_horizontal" android:textColor ="#88ffffff" android:textSize ="24sp" /> </ RelativeLayout > </ FrameLayout > 嗯,我使用了自定义的View - GLinesView,在GLinesView的原型是这样的: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> public class GLinesView extends SurfaceView implements SurfaceHolder.Callback{ } 在这里继承了SurfaceView ,因为SurfaceView 在游戏制作上有一些优势。接着,我参考了Sample里的LunarLander代码,在建立了一个SurfaceView内部线程类,用来处理游戏的逻辑和绘制游戏画面。 Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> public class GLinesView extends SurfaceView implements SurfaceHolder.Callback{ class GLinesThread extends Thread{ public void initGame(){ } public void setRunning( boolean running){ mRun = running; } @Override public void run(){ updateCanvas(); } } public GLinesView(Contextcontext,AttributeSetattrs){ super (context,attrs); SurfaceHolderholder = getHolder(); holder.addCallback( this ); thread = new GLinesThread(holder,context, new Handler(){ @Override public void handleMessage(Messagem){ mStatusText.setVisibility(m.getData().getInt( " viz " )); mStatusText.setText(m.getData().getString( " text " )); } }); } @Override public void surfaceCreated(SurfaceHolderholder){ thread.initGame(); thread.setRunning( true ); thread.start(); } } 当surfaceCreated事件发生时,触发游戏开始,initGame()做一些游戏的初始设置,setRunning设置游戏的当前状态,start将线程运行起来。 因为我不需要实时的刷新画面,所以,我没有在线程的run方法中使用一个while循环,而只是调用了一个刷新画面的方法updateCanvas(); 当用户触摸屏幕时,触发GLinesView 的onTouchEvent方法,因此,添加代码: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> @Override public boolean onTouchEvent(MotionEventevent){ float x = event.getX(); float y = event.getY(); thread.doTouch(x,y); return super .onTouchEvent(event); } 然后,实现GLinesThread的doTouch方法: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> public void doTouch( float posX, float posY){ // 激活或移动某个球 } 我会使用一个二维数组来保存棋盘上每个格子的状态: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private int mStatus[][]; 比如,mStatus[0][1] = Color.BLUE ,表示,第一行第二列的格子放置了一个蓝色的球。 当我需要移动某个球时,首先需要实现最短路径算法,因为如果有其他球的阻碍,是不能移动的。因此,我使用了一个类似的Dijkstra 最短路径算法,实现了球的移动函数: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private void moveBall( int currentX, int currentY, int targetX, int targetY){ } 然后,球移动过去后,还需要实现判断是否满足横竖斜大于等于5个的情况,如果满足,则消除那些球。因此,添加clearBalls方法: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private boolean clearBalls(Ballball){ } 在没有满足得分条件时,需要落下新的三个球,因此,实现getThreeBalls方法: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> private void getThreeBalls(){ } 其实到这里,整个框架已经搭建起来了。整个的原理在与通过一些操作修改棋盘状态的mStatus数据结构,操作完成后,调用updateCanvas()刷新屏幕。 实现好上面的方法后,游戏已经可以运行起来了。就是上面截图中看到的效果了。之后我还需要做一些界面美化,加入菜单,关卡的操作。 最后附上: 完整代码:/Files/coderzh/Code/NancyGLines.rar 体验apk文件:/Files/coderzh/Code/NancyGLines.apk.rar 希望大家提宝贵意见,同时,我也会继续完善这个游戏。

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

nginx开发(一) 源码-编译

1:获取源码 http://nginx.org/download/nginx-1.8.0.tar.gz 2:编译 解压之后,进入根目录,执行 ./configuer.sh make make install 3:nginx执行 编译完之后,可以进入 /usr/local/nginx,进入sbin目录。 执行 ./nginx -v,就会看到 nginx version: nginx/1.8.0 。 补充:如果提示需要安装pcre,可参考如下方法: 从官网下载链接:http://www.pcre.org/ ./configure --prefix=/usr/local --enable-utf8makesudo make install 提示缺少open ssl: http://www.openssl.org/source/ ./configure ----prefix=/usr/local make sudo make install MAC编译补充: 今天在mac os 上编译安装Nginx时候,报错:ld: symbol(s) not found for architecture x86_64, 经过一番折腾之后发现,由于Nginx依赖openssl库,查看openssl的./config 文件发现,这个问题应该是 openssl/config脚本猜对你的系统是64位,但是 会根据$KERNEL_BITS来判断是否开启x86_64编译,默认不开启,他会给你5秒时间确认是否停止编译,手动设置x86_64编译,所以默认你生成的openssl库文件是32位的,最后静态链接到nginx会出错。目前看来没有很好的方法把x86_64的参数传到openssl配置文件中 (openssl/config 猜测os架构,设置编译的参数是32位还是64位,默认是32位,然后调用openssl/Configure生成Makefile), 解决办法就是: 先运行nginx源码目录下运行$ ./configure 然后在objs里,打开Makefile, 找到:./config --prefix=xxx.openssl no-shared (注释:XXX是已存在的openssl源码路径) 把该段的./config 改成 ./Configure darwin64-x86_64-cc 其他后面参数不变,保存 然后再make就编译通过了

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

iOS开发之MQTT探究

1、 什么是MQTT? MQTT(MessageQueueing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是由IBM公司推出的一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。由于其开放、简单和易于实现所以能够应用在资源受限的环境中,对于M2M和物联网应用程序来说是一个相当不错的选择。 2、 为什么要用MQTT? MQTT协议是针对如下情况设计的: M2M(Machine to Machine) communication,机器端到端通信,比如传感器之间的数据通讯 因为是Machine to Machine,需要考虑: Machine,或者叫设备,比如温度传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等 M2M可能是无线连接,网络不稳定,带宽也比较小 MQTT的特点: 1.发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。这一点很类似于1. 这里是列表文本XMPP,但是MQTT的信息冗余远小于XMPP. 2.对负载内容屏蔽的消息传输。 3.使用TCP/IP提供网络连接。主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。 4.三种消息传输方式QoS: 0代表“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。 1代表“至少一次”,确保消息到达,但消息重复可能会发生。 2代表“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。 备注:由于服务端采用Mosca实现,Mosca目前只支持到QoS 1 如果发送的是临时的消息,例如给某topic所有在线的设备发送一条消息,丢失的话也无所谓,0就可以了(客户端登录的时候要指明支持的QoS级别,同时发送消息的时候也要指明这条消息支持的QoS级别),如果需要客户端保证能接收消息,需要指定QoS为1,如果同时需要加入客户端不在线也要能接收到消息,那么客户端登录的时候要指定session的有效性,接收离线消息需要指定服务端要保留客户端的session状态。 mqtt基于订阅者模型架构,客户端如果互相通信,必须在同一订阅主题下,即都订阅了同一个topic,客户端之间是没办法直接通讯的。订阅模型显而易见的好处是群发消息的话只需要发布到topic,所有订阅了这个topic的客户端就可以接收到消息了。 发送消息必须发送到某个topic,重点说明的是不管客户端是否订阅了该topic都可以向topic发送了消息,还有如果客户端订阅了该主题,那么自己发送的消息也会接收到。 5.小型传输,开销很小(固定长度的头部是2字节),协议交换最小化,以降低网络流量。这就是为什么在介绍里说它非常适合“在物联网领域,传感器与服务器的通信,信息的收集”,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。 6.使用Last Will和Testament特性通知有关各方客户端异常中断的机制。Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。Testament:遗嘱机制,功能类似于Last Will 。 3、 怎么使用MQTT 在mac上搭建MQTT服务器 $brewinstallmosquitto 等待下载完成,服务会自动运行起来 mosquittohasbeeninstalledwithadefaultconfigurationfile. Youcanmakechangestotheconfigurationbyediting: /usr/local/etc/mosquitto/mosquitto.conf Tohavelaunchdstartmosquittonowandrestartatlogin: brewservicesstartmosquitto Or,ifyoudon'twant/needabackgroundserviceyoucanjustrun: mosquitto-c/usr/local/etc/mosquitto/mosquitto.conf iOS client注册 #import"ViewController.h" #definekMQTTServerHost@"iot.eclipse.org" #definekTopic@"MQTTExample/Message" @interfaceViewController() @property(weak,nonatomic)IBOutletUILabel*showMessage; @property(nonatomic,strong)MQTTClient*client; @end @implementationViewController -(void)viewDidLoad { [superviewDidLoad]; //1.在app登录后,后台返回name+password+topic //2.name+password用于连接主机 //3.topic用于订阅主题 UILabel*tempShowMessage=self.showMessage; NSString*clientID=[UIDevicecurrentDevice].identifierForVendor.UUIDString; self.client=[[MQTTClientalloc]initWithClientId:clientID]; //连接服务器连接后,会通过block将连接结果code返回,然后执行此段代码块 //这个接口是修改过后的接口,修改后抛出了name+password [self.clientconnectToHost:kMQTTServerHostandName:@"cbt"andPassword:@"1223"completionHandler:^(MQTTConnectionReturnCodecode){ if(code==ConnectionAccepted)//连接成功 { //订阅 [self.clientsubscribe:kTopicwithCompletionHandler:^(NSArray*grantedQos){ //Theclientiseffectivelysubscribedtothetopicwhenthiscompletionhandleriscalled NSLog(@"subscribedtotopic%@",kTopic); NSLog(@"return:%@",grantedQos); }]; } }]; //MQTTMessage里面的数据接收到的是二进制,这里框架将其封装成了字符串 [self.clientsetMessageHandler:^(MQTTMessage*message) { dispatch_async(dispatch_get_main_queue(),^{ //接收到消息,更新界面时需要切换回主线程 tempShowMessage.text=message.payloadString; }); }]; } -(void)dealloc8 { //disconnecttheMQTTclient [self.clientdisconnectWithCompletionHandler:^(NSUIntegercode) { //Theclientisdisconnectedwhenthiscompletionhandleriscalled NSLog(@"MQTTisdisconnected"); }]; } @end server向client推送消息 #import"ViewController.h" #import"MQTTKit.h" #definekMQTTServerHost@"iot.eclipse.org" #definekTopic@"MQTTExample/Message" @interfaceViewController() @property(weak,nonatomic)IBOutletUITextField*pushMessage; @property(nonatomic,strong)MQTTClient*client; @end @implementationViewController -(void)viewDidLoad{ [superviewDidLoad]; NSString*clientID=[UIDevicecurrentDevice].identifierForVendor.UUIDString; self.client=[[MQTTClientalloc]initWithClientId:clientID]; [self.clientconnectToHost:kMQTTServerHostandName:@"cbt"andPassword:@"1223"completionHandler:^(MQTTConnectionReturnCodecode){ if(code==ConnectionAccepted) { NSLog(@"服务器启动成功"); } }]; } -(IBAction)push:(id)sender{ NSString*payload=self.pushMessage.text; [self.clientpublishString:payload toTopic:kTopic withQos:AtMostOnce retain:YES completionHandler:nil]; NSLog(@"推送内容:%@",payload); } 作者:Frida芥末 来源:51CTO

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

Android 开发实用小技巧

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/75647437 本文出自【赵彦军的博客】 Android Studio 实用插件传送门:http://blog.csdn.net/zhaoyanjun6/article/details/75646540 1、查看依赖包的方法数 网址: http://www.methodscount.com/ 2、在线把 layout 布局文件转为Java代码 网址:http://android.lineten.net/layout.php 3、在线生成 shapes 代码 网址: http://shapes.softartstudio.com/ 4、在线生成 Button 的样式 网址:http://angrytools.com/android/button/ 5、根据 packname 下载 GooglePlay 上的应用 网址: https://apps.evozi.com/apk-downloader/ 个人微信号:zhaoyanjun125 , 欢迎关注

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

iOS开发-UIActionSheet简单介绍

UIActionSheet和UIAlertView都是ios系统自带的模态视图,模态视图的一个重要的特性就是在显示模态视图的时候可以阻断其他视图的事件响应。一般情况下我们对UIAlertView使用的比较多,UIActionSheet相对来说情况少一点,偶尔作为一个上拉菜单来展示还是非常有用的。通常如果显示一个模态的视图,可以自定义一个UIViewController,不过里面的内容和动画实现起来工作量还是非常多的。 UIActionSheet介绍 介绍UIActionSheet之前需要简单的看下效果实现: 这是最基本的UIActionSheet,标题和按钮,不过有的时候为了美观可以不用标题,效果看起来是非常赞的,先上代码之后讲解: 1 2 3 4 5 6 7 8 UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@ "博客园" delegate: self cancelButtonTitle:@ "取消" destructiveButtonTitle:@ "确定" otherButtonTitles:@ "keso" , @ "FlyElephant" , nil ]; actionSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque; [actionSheet showInView: self .view]; 大家可以明显感觉到确定是白底红字,其他的按钮是白底蓝字,因为确定在这里是destructiveButton,相当于销毁就是给用户一个明显的提示,这里的显示是直接在View中显示,当然也有其他的地方显示,调用方法如下: 1 2 3 4 5 - ( void )showFromToolbar:(UIToolbar *)view; - ( void )showFromTabBar:(UITabBar *)view; - ( void )showFromBarButtonItem:(UIBarButtonItem *)item animated:( BOOL )animated NS_AVAILABLE_IOS (3_2); - ( void )showFromRect:(CGRect)rect inView:(UIView *)view animated:( BOOL )animated NS_AVAILABLE_IOS (3_2); - ( void )showInView:(UIView *)view; 跟大多数控件一下,UIActionSheet也是有代理的,实现UIActionSheetDelegate可以在按钮之后执行自己需要执行的事件: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 -( void )actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:( NSInteger )buttonIndex{ NSString *result=@ "" ; switch (buttonIndex) { case 0: result=@ "确定" ; break ; case 1: result=@ "keso" ; break ; case 2: result=@ "FlyElephant" ; break ; case 3: result=@ "取消" ; break ; } UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@ "测试" message:result delegate: self cancelButtonTitle:@ "确定" otherButtonTitles: nil ]; [alertView show]; } -( void )actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:( NSInteger )buttonInde{ NSLog (@ "didDismissWithButtonIndex-FlyElphant" ); } -( void )actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:( NSInteger )buttonIndex{ NSLog (@ "willDismissWithButtonIndex-FlyElphant" ); } -( void )actionSheetCancel:(UIActionSheet *)actionSheet{ NSLog (@ "Home键执行此方法" ); } 四个方法都是比较常见的使用,一般情况下只需要调用第一个方法即可,actionSheetCancel网上说的比较少,这个方法一般是点击Home键的时候执行,不是点击取消的按钮的执行,详情可参考文档解释: 1 2 // Called when we cancel a view (eg. the user clicks the Home button). This is not called when the user clicks the cancel button. // If not defined in the delegate, we simulate a click in the cancel button UIActionSheet的样式默认样式,黑色半透明和黑色不透明三种样式: 1 2 3 4 5 6 typedef NS_ENUM ( NSInteger , UIActionSheetStyle) { UIActionSheetStyleAutomatic = -1, // take appearance from toolbar style otherwise uses 'default' UIActionSheetStyleDefault = UIBarStyleDefault, UIActionSheetStyleBlackTranslucent = UIBarStyleBlackTranslucent, UIActionSheetStyleBlackOpaque = UIBarStyleBlackOpaque, }; 如果你觉得系统的不爽,可以自定义,完全取决于个人需求~ 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4521610.html,如需转载请自行联系原作者

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

iOS开发-UITableView滑动视差

视差滚动是指让多层背景以不同的速度移动,形成立体的运动效果,在Web上应用的比较多,App中倒是见的相对比较少,主要在UITableView中的应用的比较多,尤其是当整个UITableViewCell的背景是图片的时候,描述内容较少,滑动视差可以增强视觉效果,可以考虑使用,先来简单的看一下效果: 实现起来也比较简单,UITableView定义: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #pragma mark - UITablViewDataSource -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 1; } -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [self.dataSource count]; } -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ MainTableViewCell *mainCell=[tableView dequeueReusableCellWithIdentifier:CELLIDENTIFIER forIndexPath:indexPath]; NSString *desc=[NSString stringWithFormat: @"FlyElephant-%ld" ,indexPath.row]; [mainCell setBackImage:self.dataSource[indexPath.row] description:desc]; return mainCell; } #pragma mark - UITableViewDelegate -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 150; } 滑动的时候修改单元格偏移量: 1 2 3 4 5 6 7 8 9 10 #pragma mark - UIScrollViewDelegate -( void )scrollViewDidScroll:(UIScrollView *)scrollView{ CGPoint offset=self.tableView.contentOffset; for (MainTableViewCell *cell in self.tableView.visibleCells) { //方式1 // [cell setImagOffset:offset tableView:self.tableView]; //方式2 [cell setAdjustOffset:(cell.frame.origin.y-offset.y)]; } } MainTableViewCell定义: 1 2 3 4 5 6 7 8 9 10 11 @ interface MainTableViewCell : UITableViewCell -( void )setBackImage:(NSString *)imageName description:(NSString *)desc; //视差滑动方式1 -( void )setImagOffset:(CGPoint)contentOffset tableView:(UITableView *)tablView; //视差滑动方式2 -( void )setAdjustOffset:(CGFloat)offset; @end 滑动视差调用方式: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 -( void )setImagOffset:(CGPoint)contentOffset tableView:(UITableView *)tablView{ //偏移量 CGFloat cellOffset = self.frame.origin.y - contentOffset.y; // 偏移量+单元格高度/tableview高度+单元格高度 CGFloat percent = (cellOffset+self.frame.size.height)/(tablView.frame.size.height+self.frame.size.height); //偏移比例(0-1) CGFloat extraHeight = self.frame.size.height*OFFSET_RATE; CGRect frame=self.backImageView.frame; frame.origin.y=extraHeight*percent; self.backImageView.frame=frame; } -( void )setAdjustOffset:(CGFloat)offset{ CGRect frame = self.backImageView.frame; frame.origin.y = (offset / 15.0); self.backImageView.frame = frame; } 实现起来比较简单,网上有各种各样的版本,这两种的方式算是最简单的实现~ 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5152828.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册