前提・実現したいこと
visualstudioのC#でアプリケーションを作成しています。
アプリの最初にスタートボタンを配置し,クリックされたらボタンが消え、アプリを起動させたいです。
発生している問題・エラーメッセージ
ボタンをVisible = false;で非表示にしたら、その後のアプリのキー入力が反応しませんでした。
なので、非表示では無く、そのボタン自体を閉じ(終了)たいです。
エラーはありません。
該当のソースコード
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using System.IO; 11 12namespace blockbreking_v2 13{ 14 public partial class Form1 : Form 15 { 16 Racket racket; 17 Ball ball; 18 static int numOfBlocks = 20; 19 Block[] blocks = new Block[numOfBlocks]; 20 public static int score; 21 22 Random random = new Random(); 23 bool rightKey = false, leftKey = false; 24 25 private void Initialize() 26 { 27 racket = new Racket(new Rectangle(pictureBox1.Width / 2 - 25, pictureBox1.Height - 10, 50, 10), 0, 0, 0, 10); 28 ball = new Ball(new Rectangle(0, 0, 10, 10), 0, 255, 0, new Point(7, 8)); 29 30 int drawX = 10, drawY = 40; 31 for (int i = 0; i < blocks.Length; i++) 32 { 33 blocks[i] = new Block(new Rectangle(drawX, drawY, 25, 10), random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)); 34 drawX += 100; 35 if (drawX >= pictureBox1.Width - 25) 36 { 37 drawX = 10; 38 drawY += 30; 39 } 40 } 41 score = 0; 42 43 } 44 public Form1() 45 { 46 InitializeComponent(); 47 Initialize(); 48 } 49 50 private void timer1_Tick(object sender, EventArgs e) 51 { 52 pictureBox1.Invalidate(); 53 } 54 55 private void Form1_KeyDown(object sender, KeyEventArgs e) 56 { 57 if (e.KeyCode == Keys.Right) 58 rightKey = true; 59 if (e.KeyCode == Keys.Left) 60 leftKey = true; 61 } 62 63 private void Form1_KeyUp(object sender, KeyEventArgs e) 64 { 65 if (e.KeyCode == Keys.Right) 66 rightKey = false; 67 if (e.KeyCode == Keys.Left) 68 leftKey = false; 69 } 70 71 private void startSToolStripMenuItem_Click(object sender, EventArgs e) 72 { 73 timer1.Enabled = true; 74 Initialize(); 75 } 76 77 private void saveSToolStripMenuItem_Click(object sender, EventArgs e) 78 { 79 if (saveFileDialog1.ShowDialog() == DialogResult.OK) 80 { 81 Encoding enc = Encoding.GetEncoding("Shift_JIS"); 82 using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, enc)) 83 { 84 sw.Write(score); 85 } 86 } 87 } 88 89 private void button1_Click(object sender, EventArgs e) 90 { 91 92 timer1.Enabled = true; 93 Initialize(); 94 95 } 96 97 private void pictureBox1_Paint(object sender, PaintEventArgs e) 98 { 99 if (rightKey) 100 racket.MoveRight(pictureBox1.Width); 101 if (leftKey) 102 racket.MoveLeft(); 103 racket.DrawImage(e.Graphics); 104 ball.CalcSpeed(new Point(pictureBox1.Width, pictureBox1.Height), racket.GetPosition()); 105 foreach (Block b in blocks) 106 { 107 if (!b.Hit(ball.GetPosition())) 108 b.DrawImage(e.Graphics); 109 else 110 { 111 score += 10; 112 toolStripStatusLabel1.Text = score.ToString(); 113 if (score == 200) 114 { 115 timer1.Enabled = false; 116 float x = 140.0F; 117 float y = 70.0F; 118 float width = 200.0F; 119 float height = 50.0F; 120 RectangleF drawRect = new RectangleF(x, y, width, height); 121 Font drawFont = new Font("Arial", 30); 122 e.Graphics.FillRectangle(Brushes.Gold, x, y, width, height); 123 e.Graphics.DrawString(" Clear", drawFont, Brushes.DeepSkyBlue, drawRect); 124 } 125 } 126 } 127 ball.Move(); 128 ball.DrawImage(e.Graphics); 129 if (!ball.JudgeFail(new Point(pictureBox1.Width, pictureBox1.Height))) 130 { 131 timer1.Enabled = false; 132 float x = 140.0F; 133 float y = 70.0F; 134 float width = 200.0F; 135 float height = 50.0F; 136 RectangleF drawRect = new RectangleF(x, y, width, height); 137 Font drawFont = new Font("Arial", 30); 138 e.Graphics.FillRectangle(Brushes.Black, x, y, width, height); 139 e.Graphics.DrawString(" Fail!", drawFont, Brushes.Red, drawRect); 140 } 141 } 142 143 } 144 class ParentClass 145 { 146 protected Rectangle position; 147 protected SolidBrush brush; 148 protected bool visible = true; 149 150 public ParentClass(Rectangle position, int r, int g, int b) 151 { 152 this.position = position; 153 brush = new SolidBrush(Color.FromArgb(r, g, b)); 154 } 155 public virtual bool Hit(Rectangle obstaclePosition) 156 { 157 if (position.IntersectsWith(obstaclePosition) && visible) 158 { 159 return true; 160 } 161 else 162 163 return false; 164 165 } 166 public Rectangle GetPosition() 167 { 168 return position; 169 } 170 public void SetPosition(Rectangle position) 171 { 172 this.position = position; 173 } 174 public bool GetVisible() 175 { 176 return visible; 177 } 178 public virtual void DrawImage(Graphics g) 179 { 180 if (visible) 181 g.FillRectangle(brush, position); 182 } 183 } 184 class Block : ParentClass 185 { 186 public Block(Rectangle position, int r, int b, int g) : base(position, r, g, b) 187 { 188 } 189 public override bool Hit(Rectangle obstaclePosition) 190 { 191 if (position.IntersectsWith(obstaclePosition) && visible) 192 { 193 visible = false;//ブロックを見えなくする 194 return true; 195 } 196 else 197 { 198 return false; 199 } 200 } 201 } 202 203 class Racket : ParentClass 204 { 205 int speed;//ラケットのスピード 206 public Racket(Rectangle position, int r, int g, int b, int speed) : base(position, r, g, b) 207 { 208 this.speed = speed*3; 209 } 210 public void MoveRight(int width) 211 { 212 if (position.X + speed <= width - position.Width) 213 position.X += speed; 214 else 215 position.X = width - position.Width; 216 } 217 public void MoveLeft() 218 { 219 if (position.X - speed >= 0) 220 position.X -= speed; 221 else 222 position.X = 0; 223 } 224 } 225 226 class Ball : ParentClass 227 { 228 bool preHit; 229 Point speed; 230 231 public Ball(Rectangle position, int r, int g, int b, Point speed) : base(position, r, g, b) 232 { 233 this.position = position; 234 this.speed = speed; 235 preHit = false; 236 } 237 public void CalcSpeed(Point pictureBocSize, Rectangle obstaclePosition) 238 { 239 if (position.IntersectsWith(obstaclePosition) && !preHit) 240 { 241 double degree = Math.Atan2(position.Y + position.Height / 2 - speed.Y - (obstaclePosition.Y + obstaclePosition.Height / 2), position.X + position.Width / 2 - speed.X - (obstaclePosition.X + obstaclePosition.Width / 2)); 242 double racketDegree = Math.Atan2(obstaclePosition.Height, obstaclePosition.Width); 243 if (degree >= racketDegree && degree <= racketDegree) 244 speed.X = -speed.X; 245 else 246 speed.Y = -speed.Y; 247 preHit = true; 248 } 249 else 250 preHit = false; 251 if (position.Y + speed.Y < 0) 252 speed.Y = -speed.Y; 253 if (position.X + speed.X > pictureBocSize.X - position.Width) 254 speed.X = -speed.X; 255 if (position.X + speed.X < 0) 256 speed.X = -speed.X; 257 } 258 public void Move() 259 { 260 int score = Form1.score; 261 if (score >= 0&& score <= 60) 262 { 263 position.X += speed.X ; 264 position.Y += speed.Y ; 265 } 266 else if(score >= 70 && score <= 130) 267 { 268 position.X += speed.X * 2; 269 position.Y += speed.Y * 2; 270 } 271 else 272 { 273 position.X += speed.X * 3; 274 position.Y += speed.Y * 3; 275 } 276 277 } 278 public bool JudgeFail(Point pictureBoxSize) 279 { 280 if (position.Y > pictureBoxSize.Y) 281 return false; 282 else 283 return true; 284 } 285 public override void DrawImage(Graphics g) 286 { 287 g.FillEllipse(brush, position); 288 } 289 } 290 291} 292
試したこと
this.closeを試しましたが、アプリケーション自体が閉じてしまい、スタートボタンを閉じることができませんでした。
補足情報(FW/ツールのバージョンなど)
visualstudio2019 windows form apprication
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/30 10:30
2020/06/30 10:33
2020/06/30 12:52
2020/06/30 13:15
2020/07/02 00:46
2020/07/02 07:22
2020/07/04 04:26