[GitHub开源]Android自定义View实现微信打飞机游戏

本文介绍如何使用自定义View实现类似微信打飞机的游戏,包括飞机移动、子弹发射及碰撞检测等功能,并通过GitHub开源了全部源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写了很多自定义View理论方面的文章,具体可以参见《Android中自定义View、ViewGroup理论基础详解》 。 理论指导实践,本博文演示了如何通过自定义View实现微信打飞机游戏。

全部源码已经开源到GitHub,如果觉得不错,欢迎大家Star和Fork!

GitHub: https://github.com/iSpring/GamePlane/


游戏说明

  1. 飞机一直发射子弹,用手指滑动可以改变飞机的位置
  2. 不同的敌机抗击打能力不同,当敌机被击中一定子弹数量时会爆炸,爆炸有动画效果
  3. 每隔一段时间都会有双发子弹或炸弹等道具奖励
  4. 获得双发子弹之后,子弹变为双发
  5. 获得炸弹道具之后,可以通过双击将屏幕内的所有敌机炸毁

    这里写图片描述

    这里写图片描述


实现

  • 我们定义了Sprite类,即精灵类,游戏中的飞机、子弹、奖励道具等都是继承自该类,我们通过moveTo()、move()等方法控制精灵的位置,通过beforeDraw()、onDraw()、afterDraw()实现相应的绘图逻辑。精灵类及其子类继承如下所示:

    这里写图片描述

  • GameView是我们自定义的View类,主要重写了onDraw()onTouchEvent()方法。onDraw()源码如下所示:

    @Override
    protected void onDraw(Canvas canvas) {
        //我们在每一帧都检测是否满足延迟触发单击事件的条件
        if(isSingleClick()){
            onSingleClick(touchX, touchY);
        }
    
        super.onDraw(canvas);
    
        if(status == STATUS_GAME_STARTED){
            drawGameStarted(canvas);
        }else if(status == STATUS_GAME_PAUSED){
            drawGamePaused(canvas);
        }else if(status == STATUS_GAME_OVER){
            drawGameOver(canvas);
        }
    }

    在某一时刻GameView有三种状态:游戏开始STATUS_GAME_STARTED、游戏暂停STATUS_GAME_PAUSED和游戏结束STATUS_GAME_OVER。在不同的状态下我们会调用不同的绘制方法,这几个方法中都会调用方法postInvalidate(),这样驱动着View不断重绘,进而不断调用onDraw()方法实现游戏的动态效果。关于绘图技巧,可以参见另一篇博文《Android中Canvas绘图基础详解(附源码下载)》

  • 我们也重写了GameView的onTouchEvent()方法。由于View只支持单击事件,而不支持双击事件,所以我们自己定义了一个resolveTouchType()方法,通过这个方法可以合成我们自己想要的事件类型,比如双击事件。我们记录MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP的时间,一次单击事件由ACTION_DOWN和ACTION_UP两个事件合成,假设从ACTION_DOWN到ACTION_UP间隔小于200毫秒,我们就认为发生了一次单击事件。一次双击事件由两个点击事件合成,两个单击事件之间小于300毫秒,我们就认为发生了一次双击事件。在触发了双击事件的时候,我们就会触发炸弹,将屏幕内的敌机都炸毁。当处于ACTION_MOVE状态时,我们就通过event.getX()event.getY()改变战斗机的位置。关于MotionEvent的详细信息可以参另一篇博文《Android中TouchEvent触摸事件机制》

  • 我们还为GameView提供了start()、pause()、resume()和destroy()等方法,使其具备类似于Activity的生命周期,方便在Activity中对GameView进行状态管理。

  • 小敌机类,体积小,抗打击能力低;中敌机类,体积中等,抗打击能力中等;大敌机类,体积大,抗打击能力强。当敌机销毁的时候,我们使用了爆炸效果,使用了如下的图片:
    这里写图片描述

    这张图片演示了爆炸从开始到结束14个阶段的效果图,我们用两帧绘制爆炸的一个阶段,这样完整绘制一个爆炸效果需要28帧,在绘制完最后一个阶段之后,Explosion类会销毁自己。

全部源码已经开源到GitHub,如果觉得不错,欢迎大家Star和Fork!

GitHub: https://github.com/iSpring/GamePlane/

### 关于在 Android Studio 中实现类似微信聊天功能的免费资源或教程 在 Android Studio 中实现类似微信聊天功能,可以参考以下内容和方法。以下是详细的介绍和相关代码示例。 #### 1. 创建项目 创建一个新的 Android 项目时,需要按照以下步骤进行: - 打开 Android Studio。 - 选择 "Create New Project"。 - 在 "Create New Project" 对话框中,输入项目名称、选择存储位置等信息[^1]。 - 选择最低支持的 Android 版本,并选择一个适合的活动模板(例如,Empty Activity)。 - 点击 "Finish" 创建新的 Android 项目。 #### 2. 设计界面 设计登录界面、密码输入界面、手机登录界面以及聊天界面,可以通过 XML 文件完成布局设计。例如,聊天界面可以使用 `RecyclerView` 来展示消息列表。 ```xml <!-- activity_chat.xml --> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerViewMessages" android:layout_width="0dp" android:layout_height="0dp" android:padding="8dp" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toTopOf="@+id/editTextMessage" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" /> <EditText android:id="@+id/editTextMessage" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="Enter message" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toStartOf="@+id/buttonSend" /> <Button android:id="@+id/buttonSend" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Send" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> ``` #### 3. 实现消息传递逻辑 为了实现消息的发送和接收,可以使用 `RecyclerView.Adapter` 来管理消息列表。以下是示例代码: ```java // MessageAdapter.java public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.MessageViewHolder> { private List<String> messages; public MessageAdapter(List<String> messages) { this.messages = messages; } @NonNull @Override public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_message, parent, false); return new MessageViewHolder(view); } @Override public void onBindViewHolder(@NonNull MessageViewHolder holder, int position) { holder.textViewMessage.setText(messages.get(position)); } @Override public int getItemCount() { return messages.size(); } static class MessageViewHolder extends RecyclerView.ViewHolder { TextView textViewMessage; public MessageViewHolder(@NonNull View itemView) { super(itemView); textViewMessage = itemView.findViewById(R.id.textViewMessage); } } } ``` #### 4. 处理点击事件 通过继承 `AppCompatActivity` 并实现 `View.OnClickListener` 接口,可以处理视图的点击事件[^2]。例如,当用户点击 "Send" 按钮时,将消息添加到消息列表中。 ```java // MainActivity.java public class MainActivity extends AppCompatActivity implements View.OnClickListener { private RecyclerView recyclerViewMessages; private EditText editTextMessage; private Button buttonSend; private List<String> messages; private MessageAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_chat); recyclerViewMessages = findViewById(R.id.recyclerViewMessages); editTextMessage = findViewById(R.id.editTextMessage); buttonSend = findViewById(R.id.buttonSend); messages = new ArrayList<>(); adapter = new MessageAdapter(messages); recyclerViewMessages.setAdapter(adapter); recyclerViewMessages.setLayoutManager(new LinearLayoutManager(this)); buttonSend.setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.buttonSend) { String message = editTextMessage.getText().toString(); if (!message.isEmpty()) { messages.add(message); adapter.notifyDataSetChanged(); recyclerViewMessages.smoothScrollToPosition(messages.size() - 1); editTextMessage.setText(""); } } } } ``` #### 5. 跳转功能 如果需要实现从一个界面跳转到另一个界面的功能,可以使用 `Intent`。例如,从登录界面跳转到聊天界面[^3]。 ```java Intent intent = new Intent(CurrentActivity.this, ChatActivity.class); startActivity(intent); ``` ### 免费资源和教程推荐 以下是一些免费资源和教程,可以帮助你更深入地学习如何在 Android Studio 中实现类似微信的聊天功能: 1. **官方文档**:Android 官方文档提供了关于 `RecyclerView` 和 `Intent` 的详细说明。 2. **YouTube 教程**:搜索 "Android Studio chat application tutorial" 可以找到许多免费的教学视频。 3. **GitHub 项目**:在 GitHub 上搜索 "Android chat app",可以找到许多开源项目作为参考。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值