我试图用C#制作“选择自己的冒险游戏”,但按钮有问题。我有6个按钮,我想将它们重用于故事的每个“页面”上的不同选项。 Program Window
作为示例,我将其用于btn1。
void page1(){
txtStory.Text = "Can you sneak past the enemy?";
btn1.Click += (sender, args) => {
luckCheck();
if (lucky) {page2(); clearButtons();}
else {page3(); clearButtons();}
};
}
void luckCheck(){
int luckTest = gen.Next(1,12);
if (luckTest <= playerLuck) {lucky = true;}
else {lucky = false;}
}
void clearButtons(){
btnN.Text = "";
btnS.Text = "";
btnE.Text = "";
btnW.Text = "";
btn1.Text = "";
btn2.Text = "";
btn3.Text = "";
btn4.Text = "";
btn5.Text = "";
btn6.Text = "";
}
void page2(){
txtStory.Text = "Lucky!";
}
void page3(){
txtStory.Text = "Not Lucky!";
}
即使已转到另一种方法,如果单击btn1,它仍然会从page1重复相同的命令。有没有办法阻止这种情况的发生?就像清除按钮或其他东西的内存一样。
答案 0 :(得分:2)
您遇到的问题是 implementation 'com.theartofdev.edmodo:android-image-cropper:2.7.+'
附加了一个永远不会分离的匿名处理程序方法,因此,每次调用它时,您只会添加越来越多的处理程序。
但是,一旦您开始添加大量页面,该设计将很快消失。
请考虑另一种设计,其中有一个 startCameraAndOptions(); //call to starts you camera with other additional option like gallery.
public void startCameraAndOptions(View view) {
CropImage.activity()
.setGuidelines(CropImageView.Guidelines.ON)
.setActivityTitle("My Crop")
.setCropShape(CropImageView.CropShape.RECTANGLE)
.setCropMenuCropButtonTitle("Done")
// .setRequestedSize(400, 400)
.setAllowRotation(true)
.setOutputCompressQuality(100)
.setCropMenuCropButtonIcon(R.drawable.arrow)
.start(this);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
BitmapDrawable background;
Bitmap bitmap;
ImageView img_preview = (ImageView) findViewById(R.id.img_preview);
// handle result of CropImageActivity
if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
CropImage.ActivityResult result = CropImage.getActivityResult(data);
if (resultCode == RESULT_OK) {
bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), result.getUri());
background = new BitmapDrawable(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
Picasso.get()
.load(result.getOriginalUri())
// .resize(200, 200)
// .centerCrop()
.into(img_preview);
} else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) {
Toast.makeText(this, "Cropping failed: " + result.getError(), Toast.LENGTH_LONG).show();
}
}
}
**/* LAYOUT SECTION */ optional (style it your own way)**
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.hollaport.hollaport.Demo">
<Button
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:id="@+id/trigger"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/camera"/>
<!--<com.theartofdev.edmodo.cropper.CropImageView-->
<!--android:id="@+id/cropImageView"-->
<!--android:layout_width="match_parent"-->
<!--android:layout_height="0dp"-->
<!--android:layout_weight="1"/>-->
<android.support.v7.widget.CardView
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="5dp"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:innerRadius="0dp"
android:shape="rectangle"
android:thicknessRatio="2"
app:cardCornerRadius="0dp">
<ImageView
android:id="@+id/img_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:scaleType="fitXY"/>
</android.support.v7.widget.CardView>
</LinearLayout>
类来表示每个页面。该类将故事作为属性,并包含可能的page1()
(而不是对其中的6个进行硬编码)的集合。 Page
是一个具有Choice
字符串属性和一个Choice
方法的类,如果使用它将被执行。
您的应用程序可以拥有CurrentPage属性,并且您的“选择操作”将需要能够通过更改该页面进行导航。等等...
希望这会有所帮助。
P.S。额外的小费。与其在类字段上返回Description
方法的结果,不如考虑对其进行重新设计以返回结果:
Action
答案 1 :(得分:1)
这里没有详细说明如何更好地构造上面的代码,下面是使用C#7的解决方案。请注意,如何使用Delegate Type Inference
分配一个本地函数来处理然后未分配的事件void page1(){
txtStory.Text = "Can you sneak past the enemy?";
void Btn1Click(object s, EventArgs ev)
{
luckCheck();
if (lucky) {page2(); clearButtons(); btn1.Click -= Btn1Click; }
else {page3(); clearButtons();}
};
btn1.Click += Btn1Click;
void luckCheck(){
int luckTest = gen.Next(1,12);
if (luckTest <= playerLuck) {lucky = true;}
else {lucky = false;}
}
void clearButtons(){
btnN.Text = "";
btnS.Text = "";
btnE.Text = "";
btnW.Text = "";
btn1.Text = "";
btn2.Text = "";
btn3.Text = "";
btn4.Text = "";
btn5.Text = "";
btn6.Text = "";
}
void page2(){
txtStory.Text = "Lucky!";
}
void page3(){
txtStory.Text = "Not Lucky!";
}