Mi a hiba a kóddal? (C# kicsit bonyolult lehet, v agyis nekem az)
Egy Snake játékon dolgozom. Az elmélet az lenne, hogy míg 1 pixelt arré megy a kukac feje addig a progi lerakjon egy új "lapot" ezáltal törölve a régi helyzetet. De nem rak le új lapot, hanem csak folyamatosan csíkot húz a kígyó.
A kód ez lenne:
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;
namespace Snake
{
public struct SnakePart
{
public Rectangle snakeRec;
public Bitmap snakeBitMap;
public Point middlePoint;
public Point upMiddle;
public Point downMiddle;
public Point leftMiddle;
public Point rightMiddle;
public Point turnPoint;
public Point Direction;
}
public partial class Form1 : Form
{
Bitmap myBitmap;
Bitmap originalBitmap;
Graphics g;
Bitmap SnakeHead;
//Point pont = new Point(150, 150);
int min = 0;
int max = 341;
int Counter = 0;
Random X = new Random();
Point celpont = new Point(20, 20);
Point currentDir = new Point();
private Keys m_keys;
SnakePart[] snakePart = new SnakePart[30];
public Form1()
{
InitializeComponent();
myBitmap = new Bitmap(this.Width, this.Height);
originalBitmap = new Bitmap(this.Width, this.Height);
SnakeHead = new Bitmap("kukac\\kigyo.png");
Bitmap snakeBitmap = new Bitmap(20, 20);
for (int x = 0; x < this.Width - 1; x++)
for (int y = 0; y < this.Height - 1; y++)
originalBitmap.SetPixel(x, y, Color.Gray);
for(int x = 0; x < 10; x++)
for (int y = 0; y < 10; y++)
snakeBitmap.SetPixel(x, y, Color.Blue);
myBitmap = originalBitmap;
g = Graphics.FromImage(myBitmap);
celpont.X = X.Next(min, max);
celpont.Y = X.Next(min, max);
timer1.Interval = 1;
timer1.Enabled = true;
timer1.Start();
timer1.Tick += new EventHandler(timer1_Tick);
AddSnakePart(new Point(50, 60), new Point(1, 0), SnakeHead, new Point(-1, -1));
//DrawSnakeParts();
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
m_keys = e.KeyCode;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (m_keys == Keys.Left)
{
currentDir = new Point(-1, 0);
}
if (m_keys == Keys.Right)
{
currentDir = new Point(1, 0);
}
if (m_keys == Keys.Up)
{
currentDir = new Point(0, -1);
}
if (m_keys == Keys.Down)
{
currentDir = new Point(0, 1);
}
UpdateSnakeParts();
DrawSnakeParts();
}
private void AddSnakePart(Point currentMiddlePoint, Point Direction, Bitmap SnakeBitMap, Point turnPoint)
{
Rectangle currentSnakePart = new Rectangle();
if (Direction == new Point(0, -1))
{
currentSnakePart = new Rectangle(currentMiddlePoint.X - 10, currentMiddlePoint.Y + 10, 20, 20);
}
else if (Direction == new Point(0, 1))//Itt a lefele irányt vizsgáljuk
{
currentSnakePart = new Rectangle(currentMiddlePoint.X - 10, currentMiddlePoint.Y - 10, 20, 20);
}
else if (Direction == new Point(-1, 0))//Itt a balra irányt vizsgáljuk
{
currentSnakePart = new Rectangle(currentMiddlePoint.X + 10, currentMiddlePoint.Y - 10, 20, 20);
}
else if (Direction == new Point(1, 0))//Itt a jobbra irányt vizsgáljuk
{
currentSnakePart = new Rectangle(currentMiddlePoint.X - 10, currentMiddlePoint.Y + 10, 20, 20);
}
snakePart[Counter].snakeRec = currentSnakePart;
snakePart[Counter].middlePoint = new Point(currentSnakePart.Left + currentSnakePart.Width / 2, currentSnakePart.Top + currentSnakePart.Height / 2);
snakePart[Counter].leftMiddle = new Point(snakePart[Counter].middlePoint.X - 10, snakePart[Counter].middlePoint.Y);
snakePart[Counter].upMiddle = new Point(snakePart[Counter].middlePoint.X, snakePart[Counter].middlePoint.Y - 10);
snakePart[Counter].downMiddle = new Point(snakePart[Counter].middlePoint.X, snakePart[Counter].middlePoint.Y + 10);
snakePart[Counter].rightMiddle = new Point(snakePart[Counter].middlePoint.X + 10, snakePart[Counter].middlePoint.Y);
snakePart[Counter].snakeBitMap = SnakeBitMap;
snakePart[Counter].turnPoint = turnPoint;
snakePart[Counter].Direction = Direction;
}
private void DrawSnakeParts()
{
for (int x = 0; x < this.Width - 1; x++)
for (int y = 0; y < this.Height - 1; y++)
{
//myBitmap.SetPixel(x, y, Color.Gray);
}
myBitmap = ClearBitmap(myBitmap); ;
g.DrawImage(snakePart[Counter].snakeBitMap, snakePart[Counter].snakeRec);
pictureBox1.Image = originalBitmap;
}
private void UpdateSnakeParts()
{
snakePart[Counter].Direction = currentDir;
snakePart[Counter].snakeRec.X += currentDir.X;
snakePart[Counter].snakeRec.Y += currentDir.Y;
snakePart[Counter].middlePoint = new Point(snakePart[Counter].snakeRec.Left + snakePart[Counter].snakeRec.Width / 2, snakePart[Counter].snakeRec.Top + snakePart[Counter].snakeRec.Height / 2);
snakePart[Counter].leftMiddle = new Point(snakePart[Counter].middlePoint.X - 10, snakePart[Counter].middlePoint.Y);
snakePart[Counter].upMiddle = new Point(snakePart[Counter].middlePoint.X, snakePart[Counter].middlePoint.Y - 10);
snakePart[Counter].downMiddle = new Point(snakePart[Counter].middlePoint.X, snakePart[Counter].middlePoint.Y + 10);
snakePart[Counter].rightMiddle = new Point(snakePart[Counter].middlePoint.X + 10, snakePart[Counter].middlePoint.Y);
}
private Bitmap ClearBitmap(Bitmap bitmapToClear)
{
bitmapToClear = originalBitmap;
return bitmapToClear;
}
}
}
Nem kellenek alternatív megoldások, persze azokat is köszönöm, ha valaki azzal szeretett volna segíteni, de nekem ennek a kódnak a hibája érdekelne most. Köszönöm előre :)
public Form1()
kb. a forráskód elején van ez
ez után szerintem kell pontosvessző...
a programozásban ilyen hiányosságok is okozhatják a program hibáját...
valamint még a vége felé
private void DrawSnakeParts()
Első válaszolónak mondom, hogy oda nem kell pontosvessző az egy metódus, persze azért köszönöm :)
másodiknak mondom, az a sor benne van a progiban, de neked is köszönöm, h igyekszel, viszont így sajna még minnig nincs meg a hiba. :(
Erre én csak azt tudom mondani hogy azta k. Va:D
BárcsK fele így programoznék
mióta programozol¿
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!