hi
nachdem ich hier auf ein raycasting projekt gestossen bin wollte ich mich selbst daran versuchen (diesmal in c#). leider hakt es noch etwas. vor allem kommt als bild (bisher nur rudimentär und einfarbig) nicht genu das raus was ich will. vllt könnte mir einer etwas auf die sprünge helfen?
Ich weiß, das mit dem threading ist net besonders elegant aber es ist 100 % nur vorläufig!
im anhang nen screen wies bisher ausschaut
nachdem ich hier auf ein raycasting projekt gestossen bin wollte ich mich selbst daran versuchen (diesmal in c#). leider hakt es noch etwas. vor allem kommt als bild (bisher nur rudimentär und einfarbig) nicht genu das raus was ich will. vllt könnte mir einer etwas auf die sprünge helfen?
Ich weiß, das mit dem threading ist net besonders elegant aber es ist 100 % nur vorläufig!
im anhang nen screen wies bisher ausschaut
C#-Quellcode
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- namespace RayCasting
- {
- public partial class Form1 : Form
- {
- const int wid = 6;
- private int[,] field;
- double fieldAngle = 60.0F;
- double gridSize = 64.0F;
- Point playerPosition = new Point(64*3+32, 64*4+32);
- public Form1()
- {
- InitializeComponent();
- field = new int[wid, wid]{
- {1,1,1,1,1,1},
- {1,0,0,0,0,0},
- {1,0,0,1,0,0},
- {1,0,0,0,0,0},
- {1,0,0,0,0,0},
- {1,1,1,1,1,1}};
- System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ThreadFunction));
- t.Start((object)this.CreateGraphics());
- }
- private double DTR(double angle)
- {
- return Math.PI * angle / 180.0;
- }
- void ThreadFunction(object o)
- {
- Graphics g = (Graphics)o;
- double px = 160+32, py = 160+64+64+64;
- const double blockSize = 64;
- double fieldWidth = 60;
- double lookDirection = 0;
- double ay, ax, gx, gy, bx, by;
- double delta = fieldWidth / this.ClientSize.Width;
- while (true)
- {
- System.Threading.Thread.Sleep(500);
- g.Clear(Color.White);
- py++;
- for (int ray = 0; ray < this.ClientSize.Width; ray++)
- {
- // Horizontal Intersections
- double actAngle = lookDirection - (fieldWidth / 2.0) + delta * ray;
- ay = py - (py % blockSize);
- ax = px - (Math.Tan(DTR(actAngle) * (py % blockSize)));
- gy = Math.Floor(ay / blockSize) -1;
- gx = Math.Floor(ax / blockSize);
- if (gy < 0 ||gx < 0|| gx >= wid ||gy >= wid)
- break;
- while (field[(int)gx,(int)gy] != 1)
- {
- ay -= blockSize;
- ax -= Math.Tan(DTR(actAngle)) * blockSize;
- gy = Math.Floor(ay / blockSize) - 1;
- gx = Math.Floor(ax / blockSize);
- if (gy < 0 || gx < 0 || gx >= wid || gy >= wid)
- {
- goto leave;
- }
- }
- double distHori = Math.Sqrt(Math.Pow(px - ax, 2) + Math.Pow(py- ay, 2));
- double distVert;
- // vertical Intersections
- bx = px - (px % blockSize);
- by = py - (Math.Tan(DTR(actAngle) * (px % blockSize)));
- gy = Math.Floor(by / blockSize) - 1;
- gx = Math.Floor(bx / blockSize);
- if (gy < 0 || gx < 0 || gx >= wid || gy >= wid)
- {
- goto leave;
- }
- while (field[(int)gx, (int)gy] != 1)
- {
- bx -= blockSize;
- by -= blockSize / (Math.Tan(DTR(actAngle))) ;
- gy = Math.Floor(ay / blockSize) - 1;
- gx = Math.Floor(ax / blockSize);
- if (gy < 0 || gx < 0 || gx >= wid || gy >= wid)
- {
- goto leave;
- }
- }
- distVert = Math.Sqrt(Math.Pow(px - bx, 2) + Math.Pow(py - by, 2));
- double dist;
- if (distVert < distHori)
- dist = distVert;
- else
- dist = distHori;
- float h = 10000 / ((float)dist);
- try
- {
- g.DrawLine(new Pen(Brushes.Red), ray, this.ClientSize.Height / 2F - (h / 2.0F), ray, this.ClientSize.Height / 2F + h / 2.0F);
- }
- catch (Exception)
- {
- return;
- }
- }
- leave:
- ;
- }
- }
- }
- }