有时一边聊天一边看视频,需要和对方探讨视频里的动作,需要截屏。用这些播放器软件自带的截图未尝不可,但还要再发到qq聊天窗口里很麻烦,不如直接用qq截图。但发现截图下的全是黑乎乎的,近期的几个qq影音、暴风影音都有这个问题,早些时候暴风有这个问题,我就把他卸载了,安了qq影音。升级后发现qq影音也是这样。看来需要解决啊!方法如下:
依次点击:鼠标右键桌面——属性——设置——高级——疑难杂症——硬件加速调到无
相信大家一定见过这样的一个效果吧,也相信大家也在网上找到了许多的例子,但是大多的都是残缺不全的,没能真正的实现大家的一个效果吧,那么今天我就和大家分享我的这个完全的源代码,希望能对大家有所帮助吧,需要的人可以直接拿过去用,至于技术点嘛,其实没什么的,对于获取拼音的用到了一个pinyin4j-2.5.0.jar这个jar包,可以帮助我们实现效果。
还是直接上效果图,之后再上源码吧。
先看旁边的那个26个字母控件的实现:
自己画了出26个字母。
public class MySideBar extends View { OnTouchingLetterChangedListener onTouchingLetterChangedListener; // 26个字母 public static String[] b = { "#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; int choose = -1; Paint paint = new Paint(); public MySideBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MySideBar(Context context, AttributeSet attrs) { super(context, attrs); } public MySideBar(Context context) { super(context); } /** * 重写这个方法 */ protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBkg) { canvas.drawColor(Color.parseColor("#40000000")); } int height = getHeight(); int width = getWidth(); int singleHeight = height / b.length; for (int i = 0; i < b.length; i++) { paint.setColor(Color.BLACK); // paint.setColor(Color.WHITE); paint.setTypeface(Typeface.DEFAULT_BOLD); paint.setAntiAlias(true); paint.setTextSize(20); if (i == choose) { paint.setColor(Color.parseColor("#3399ff")); paint.setFakeBoldText(true); } float xPos = width / 2 - paint.measureText(b[i]) / 2; float yPos = singleHeight * i + singleHeight; canvas.drawText(b[i], xPos, yPos, paint); paint.reset(); } } private boolean showBkg = false; @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); final float y = event.getY(); final int oldChoose = choose; final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener; final int c = (int) (y / getHeight() * b.length); switch (action) { case MotionEvent.ACTION_DOWN: showBkg = true; if (oldChoose != c && listener != null) { if (c > 0 && c < b.length) { listener.onTouchingLetterChanged(b[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != c && listener != null) { if (c > 0 && c < b.length) { listener.onTouchingLetterChanged(b[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBkg = false; choose = -1; invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } /** * 向外公开的方法 * * @param onTouchingLetterChangedListener */ public void setOnTouchingLetterChangedListener( OnTouchingLetterChangedListener onTouchingLetterChangedListener) { this.onTouchingLetterChangedListener = onTouchingLetterChangedListener; } /** * 接口 * * @author coder * */ public interface OnTouchingLetterChangedListener { public void onTouchingLetterChanged(String s); } }
再看布局文件的实现,这里用到FrameLayout来实现
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/llParent" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/lvShow" android:layout_width="fill_parent" android:layout_height="fill_parent" /> <TextView android:id="@+id/tvLetter" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:background="@drawable/show_head_toast_bg" android:gravity="center" android:maxWidth="70dip" android:minWidth="70dip" android:padding="10dip" android:textColor="#99FFFFFF" android:textSize="50sp" > </TextView> <com.jiahui.view.MySideBar android:id="@+id/myView" android:layout_width="30dip" android:layout_height="fill_parent" android:layout_gravity="right" > </com.jiahui.view.MySideBar> </FrameLayout> </LinearLayout>
接下来再看Activity里的实现了,详细的请直接看代码吧,不懂的可以加Q
public class TestActivity extends Activity implements OnTouchingLetterChangedListener { private ListView lvShow; private List<UserInfo> userInfos; private TextView overlay; private MySideBar myView; private MyUserInfoAdapter adapter; private OverlayThread overlayThread = new OverlayThread(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); lvShow = (ListView) findViewById(R.id.lvShow); myView = (MySideBar) findViewById(R.id.myView); overlay = (TextView) findViewById(R.id.tvLetter); lvShow.setTextFilterEnabled(true); overlay.setVisibility(View.INVISIBLE); getUserInfos(); Log.i("coder", "userInfos.size" + userInfos.size()); adapter = new MyUserInfoAdapter(this, userInfos); lvShow.setAdapter(adapter); myView.setOnTouchingLetterChangedListener(this); } private void getUserInfos() { UserInfo[] userinfoArray = new UserInfo[] { new UserInfo("唐僧", "18765432345", PinyinUtils.getAlpha("唐僧")), new UserInfo("猪师弟", "18765432345", PinyinUtils.getAlpha("猪师弟")), new UserInfo("阿呆", "18765432345", PinyinUtils.getAlpha("阿呆")), new UserInfo("8899", "18765432345", PinyinUtils.getAlpha("8899")), new UserInfo("孙悟空", "18765432345", PinyinUtils.getAlpha("孙悟空")), new UserInfo("阿三", "18765432345", PinyinUtils.getAlpha("阿三")), new UserInfo("张三", "18765432345", PinyinUtils.getAlpha("张三")), new UserInfo("张二B", "18876569008", PinyinUtils.getAlpha("张二B")), new UserInfo("阿三", "18765432345", PinyinUtils.getAlpha("阿三")), new UserInfo("张三", "18765432345", PinyinUtils.getAlpha("张三")), new UserInfo("张二B", "18876569008", PinyinUtils.getAlpha("张二B")), new UserInfo("阿三", "18765432345", PinyinUtils.getAlpha("阿三")), new UserInfo("张三", "18765432345", PinyinUtils.getAlpha("张三")), new UserInfo("张二B", "18876569008", PinyinUtils.getAlpha("张二B")), new UserInfo("阿三", "18765432345", PinyinUtils.getAlpha("阿三")), new UserInfo("张三", "18765432345", PinyinUtils.getAlpha("张三")), new UserInfo("张二B", "18876569008", PinyinUtils.getAlpha("张二B")), new UserInfo("李四", "18909876545", PinyinUtils.getAlpha("李四")), new UserInfo("王小二", "18909876545", PinyinUtils.getAlpha("王小二")), new UserInfo("张三丰", "18909876545", PinyinUtils.getAlpha("张三丰")), new UserInfo("郭靖", "18909876545", PinyinUtils.getAlpha("郭靖")), new UserInfo("张无忌", "18909876545", PinyinUtils.getAlpha("张无忌")), new UserInfo("黄小贤", "18909876545", PinyinUtils.getAlpha("黄小贤")) }; Arrays.sort(userinfoArray, new PinyinComparator()); userInfos = Arrays.asList(userinfoArray); } private Handler handler = new Handler() { }; private class OverlayThread implements Runnable { public void run() { overlay.setVisibility(View.GONE); } } @Override public void onTouchingLetterChanged(String s) { Log.i("coder", "s:" + s); overlay.setText(s); overlay.setVisibility(View.VISIBLE); handler.removeCallbacks(overlayThread); handler.postDelayed(overlayThread, 1000); if (alphaIndexer(s) > 0) { int position = alphaIndexer(s); Log.i("coder", "position:" + position); lvShow.setSelection(position); } } public int alphaIndexer(String s) { int position = 0; for (int i = 0; i < userInfos.size(); i++) { if (userInfos.get(i).getPy().startsWith(s)) { position = i; break; } } Log.i("coder", "i" + position + userInfos.get(position)); return position; } }
好了这样的一效果就算完成了,也希望大家能分享更多的东西出来,大家一起成长一起学习!
如需转载引用请注明出处:http://blog.csdn.net/jiahui524
原文地址:http://www.rocket5studios.com/tutorials/make-a-2d-game-in-unity3d-using-only-free-tools-part-1/
原版翻译,转载请注明出处:http://blog.csdn.net/ariel7321/article/details/7765479
该系列讲座一共有五节:
第一节 工具和插件介绍
第二节 制作关卡1的界面
第三节 创建人物动画
第四节 创建计分界面
第五节 制作AI敌人
通过这些讲解,我们将重建一个非常经典的游戏Lode Runner。在本节中,我将介绍一些我们需要用到的免费工具和插件,以及如何在Unity中搭建好这些环境,下一节我们才制作游戏。其中的有些免费插件也有付费版本,付费的有更高级的功能。
Unity3D
Unity3D不但能做出非常出色的3D游戏,如果配合一些额外的插件和脚本的话同样可以做出令人满意的2D游戏的。本讲座中,我们将使用免费版本的Unity3D,可以将游戏发布到PC和网页上。但是如果用付费版本的Unity3D将本游戏移植到iPhone或Android手机上,那也是很容易的。
Orthello 2D framework
现在有不少专门给Unity3D做的精灵插件,其中最流行的就是Sprite Manager 2,我以前用过。但最近想找个替代的插件,我想试试Orthello。一些人说它不太好用,但是作为一个免费插件,它的功能是很棒的。
iTween
这是一个专门制作各种动画的插件,实际上是我开始一个新项目第一个会装的插件。
A*Pathfinding Project
A* Pathfinding可能是用的最广的在Unity3D上的寻路系统插件了,它有免费版本,非常好用。
TexturePacker
这是一个独立的应用软件,它可以很容易的帮你管理精灵图。
1. 安装最新版本的Unity3D,然后创建一个新的项目:File--->New Project,然后点击Browse...按钮选一个项目存储路径,输入项目名称后保存,然后直接点击create按钮创建项目,这里不需要选择任何资源包。
2. 在项目视图里创建一个文件夹,命名为“Scenes”。然后将当前的场景保存在这个文件夹下, File -> Save Scene As,命名为“Level1”。
1. 打开Asset Store, Window -> Asset Store,搜索“orthello 2d”,然后就点击下载就好了。或者去orthello官网,下载最新版本,解压后然后双击orthello.unitypackage。
2. 当Import Package窗口出现时,确保所有选项都选了,然后点击Import。过几秒种就可以在项目视图里看到“Orthello”了。
Orthello官网有很多相关信息,你需要去看看。下面我就简化了步骤,帮你开始用起来。
记住:在每个scene中,你都需要重复以下步骤,才能使Orthello在每个Scene中工作。
1. 在unity的项目视图里,进入 Orthello -> Objects,然后将OT prefab拖到Scene中或是Hierarchy中。
OT prefab充当一个父亲角色,我们之后要加入到scene中的动画和精灵容器都来自它。将OT prefab加入到scene中后,就会自动对摄像机做一些改变,使之可以恰当的为2D游戏服务。主要的变化就是将摄像机变为了正交投影相机,大小改为了332.
1. 打开Asset Store, Window -> Asset Store,搜索“iTween”,然后就点击下载就好了。
2. 当Import Package窗口出现时,确保所有选项都选了,然后点击Import。过几秒种就可以在项目视图里看到“iTween”了。
当我在写这篇文章时,unity的asset store还没有免费版本的A*Pathfinding可以下载。
1. 到期官网下载,下载后的文件名为:PathfindingProject_Free.unitypackage
2. 双击此文件,会出现Import Package窗口,确保所有选项都选了,然后点击Import。过几秒种就可以在项目视图里看到“AstarPathfindingProject”了。
详细的初始化步骤请参见 A* Pathfinding Documentation的getting started,这里我简化了步骤。
1. 创建一个新的空游戏物体GameObject -> Create Empty。
2. 确保position中的x、y、z值都是0,然后命名为“A*”。
3. 给A*添加一个A*路径脚本 Component -> Pathfinding -> Pathfinder
4. 在Inspector中你会看到 “Do you want to enable Javascript support?”,因为后面的脚本我们都有C#,所以选择“No”。
如果按照我上面的步骤设置unity,最后就会看到如下图所示的设置: