|
OK Thanks for your answers.
I understand a bit better, but yet I am still missing some parts.
Let's say we have a class called MyClass
So if we want to use foreach instruction, My Class must implement IEnumerable.
And then because IEnumerable contains GetEnumerator() signature, we have to implement that method in MyClass.
And because GetEnumerator() returns an IEnumerator, we need to implement IEnumerator interface as well (Reset(), MoveNext(), Current()). Is that correct?
But why does my Wrox book say:
Here is an extract of my wrox book:
<<
- To iterate over a class, use a method called GetEnumerator() with a return type of IEnumerator.
- To iterate over a class member, such as a method, use IEnumerable.
>>
I am confused
And why does the following code works without implementing IEnumerable???
<br />
using System;<br />
using System.Collections;<br />
using System.Collections.Generic;<br />
using System.Linq;<br />
using System.Text;<br />
<br />
namespace Ch11Ex03<br />
{<br />
public class Primes<br />
{<br />
private long min;<br />
private long max;<br />
<br />
public Primes(): this(2, 100)<br />
{<br />
}<br />
<br />
public Primes(long minimum, long maximum)<br />
{<br />
if (min < 2)<br />
{<br />
min = 2;<br />
}<br />
else<br />
{<br />
min = minimum;<br />
}<br />
max = maximum;<br />
}<br />
<br />
public IEnumerator GetEnumerator()<br />
{<br />
for (long possiblePrime = min; possiblePrime <= max; possiblePrime++)<br />
{<br />
bool isPrime = true;<br />
for (long possibleFactor = 2; possibleFactor <=<br />
(long)Math.Floor(Math.Sqrt(possiblePrime)); possibleFactor++)<br />
{<br />
long remainderAfterDivision = possiblePrime % possibleFactor;<br />
if (remainderAfterDivision == 0)<br />
{<br />
isPrime = false;<br />
break;<br />
}<br />
}<br />
if (isPrime)<br />
{<br />
yield return possiblePrime;<br />
}<br />
}<br />
}<br />
}<br />
}
<br />
class Program<br />
{<br />
static void Main(string[] args)<br />
{<br />
Primes primesFrom2To1000 = new Primes(2, 1000);<br />
foreach (long i in primesFrom2To1000)<br />
{<br />
Console.Write("{0} ", i);<br />
}<br />
Console.ReadKey();<br />
}<br />
}<br />
|
|
|
|
|
I have a simple 2d map (similar to classic sonic look) however I am not sure how to make my character walk up the map as it is not flat land (has slanted flooring).
I have though of per pixel detection but this sounds sloppy and expensive just for the flooring.
I have also though of polygon based collision however I only know how to find the slope of the two points but cant figure out how to change the sprites y position so that it can moove up the slope. The only way i can get it to work is by having many polygons plotting each point to make up the slope but its not very fun this way.
I read but did not find it helpful as the sprite just moves to the next way points y axis !
|
|
|
|
|
Are you working with XNA? There are some pretty good sprite tutorials that can help you out with this. The RPG tutorial that was posted at xnatutorial.com a few years ago did a pretty good job of assisting with making partial tile movements (would allow your character to move to its destination tile in framerate based increments so that he would go through a sprite based walk cycle) Let me see if I can find the link for you...or maybe someone else will beat me to it.
[Edit: I had the wrong tutorial site in mind. XNATutorial was not it, and I can't remember the exact location of it at the moment. If I recall it, I'll try and post the location. But, until then, you might want to check here[^]
[Edit: I remembered the location of the original tutorial I was thinking of, but this is gonna be a bummer. It was at www.ziggyware.com and Ziggy hasn't had the site up in over a year. He had some trouble with hackers and finally just shut the thing down. Hopefully that other tutorial list will give you the information you need]
"I need build Skynet. Plz send code"
modified on Monday, May 24, 2010 3:01 PM
|
|
|
|
|
Hmmm....another thought...without a tutorial. Have you thought of rotating your character based upon the slope of the "terrain" and set it's bottom left corner to snap to the top left corner of the ground? (Assuming that your Sonic runs on top of the ground, of course )
...That would put your character at the correct x location, ground his "back" point correctly and then the rotation of the character based upon the terrain slope should produce an effect that would keep him in contact with the ground as if he were running on a flat surface (Assuming your math is correct)
"I need build Skynet. Plz send code"
|
|
|
|
|
To follow up, the method that I posted earlier will work if your terrain is a constant slope, but you'll have to do something special for areas where the slope changes (i.e. the tile that transitions from 'flat' to 'hilly') That could be done by keeping a Stack of the 3 tiles that your character is interacting with.
Let's create a section of terrain, listing the slopes in left to right sequence
float[] terrain = new float[10];
terrain[0] = 0.0;
terrain[1] = 0.0;
terrain[2] = 0.0;
terrain[3] = 0.5;
terrain[4] = 0.5;
terrain[5] = 0.5;
terrain[6] = 0.0;
terrain[7] = -0.5;
terrain[8] = -0.5;
terrain[9] = 0.0;
So, if you can visualize this, it would be a section of flat ground, followed by a hill that has a slope of 1/2 that rises for 3 tiles, flattens off for 1 tile and then descends at 1/2 for 2 tiles.
You could want to maintain a "frame" of reference via a stack with the 3 tiles that are being interacted with. There is the tile that you are standing on, the tile behind you, and the tile in front of you. Pressing the -> arrow would move him forward. Pressing the <- arrow would obviously perform the reverse. Let's deal only with "forward" movement for this example.
Whenever your player tells Sonic to "move forward" the rotation that you apply to him will be contingent upon "Current Tile Slope" AND "Next Tile Slope"
...that way, if your player decides to stop him while one foot is still on the "Current Tile" but the lead foot is on "Next Tile" you will still maintain believable contact with the ground. Once Sonic's trailing foot is completely upon "Next Tile", your stack should shift to the next tile so that the "frame" refers to the next tuple of slopes.
So, to walk through this scenario (this is a barebones algorithm. There are more moving parts to it that are contingent upon your game specifics)
(Calling your player "Sonic" for brevity)
Note that I am saying "debounced" step to indicate that your player is not holding the forward movement button down. Your game loop needs to process ONE forward command...to explain the base case. "Holding down the button" will just loop the ONE forward command until the button is released, obviously.
setup)Let's say Sonic is standing on square 3. Your frame would contain {0, 0, 0.5}
KeyValuePair<int, float>[] frame = new KeyValuePair<int, float>[3];
frame[0] = new KeyValuePair<2, terrain[2]>();
frame[1] = new KeyValuePair<3, terrain[3]>();
frame[2] = new KeyValuePair<4, terrain[4]>();
1)Player issues a debounced step forward. (Issue one step forward) Sonic would advance one step in your walk cycle animation.
2)Check width of Sonic with width of tile, compare Sonic's trailing point + step offset to width of tile.
3)If ((Sonic's trailing foot position + Sonic's width) > tile width) his lead foot has moved to the next tile. You need to use "This Tile"s slope for trailing foot and "Next Tile"s slope for leading foot to determine the rotation that needs to be applied.
float rotateZ = CalculateRotation(frame[1], frame[2]);
Sonic.Rotate(rotateZ);
4)If (Sonic's trailing foot position > (tile width + Sonic's width)) then the trailing foot has moved away from "This square" Cycle your frame to track a new square as "This Tile"
OffsetFrame(1);
Sonic.Rotate(CalculateRotation(frame[1], frame[2]));
public void OffsetFrame(int offset)
{
frame[0] = new KeyValuePair<((int)frame[0].Key + 1), terrain[(int)frame[0].Key +1]>();
frame[0] = new KeyValuePair<((int)frame[1].Key + 1), terrain[(int)frame[1].Key +1]>();
frame[0] = new KeyValuePair<((int)frame[2].Key + 1), terrain[(int)frame[2].Key +1]>();
}
5)Loop 1-4
So, again for simplicity's sake, let's say that each debounced forward step moves your character from square to square "a la Frogger style". Your frame would look as such, starting with "This Tile" referencing square 3.
Frame: {0, 0, 0.5}
[Step forward]
Frame: {0, 0.5, 0.5}
[Step forward]
Frame: {0.5, 0.5, 0.5}
[Step forward]
Frame: {0.5, 0.5, 0}
[Step forward]
Frame: {0.5, 0, -0.5}
Get the idea? You're dealing with a sprite based walkcycle and multiple pitch terrain collision, so there are more details that are specific to your game but that should get you started in a direction that will at least get you moving. The "Frogger" example is to illustrate what I mean to do when Sonic's trailing foot moves onto a new square, but you won't be moving square by square. You'll be moving a partial square for each forward command to indicate a single step. Hope it's clear where the two examples above meet together to provide you with smooth, animated sprite movement.
"I need build Skynet. Plz send code"
modified on Wednesday, May 26, 2010 11:05 AM
|
|
|
|
|
Thank you for you help I understand this concept better !
|
|
|
|
|
|
I think your code is getting confused by SelectionChanged events that indicate something got deselected. When you click an unselected item, you are likely to get two events: one indicating nothing is selected (which you may want to ignore, but it needs code to do that), then one indicating the new selection.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
That would make sense if these were standard controls. But they are custom controls based on System.Windows.Forms.UserControl -- not inherited from any actual list control like a ListBox. My SelectionChanged() event is a very tightly-coded event that only fires when a value is assigned.
|
|
|
|
|
please do not remove a question, it is against the forum guidelines and considered rude. If your problem is solved or no longer relevant to you, leave it as is, but add a marker (such as "solved") to the subject line. If you found the solution yourself, do not hesitate to publish it in the thread, so others can also benefit from it.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
I apologize. If it's against forum guidelines, then why is a delete option even available?
I removed the question because the more I dug the more confused I got. I decided that I really don't know what the heck is going on and need to do a lot more digging.
I thought it would be more courteous to remove the thread altogether than to have people waste their time reading it only to get to the point where I say "never mind, I don't know what I'm talking about".
|
|
|
|
|
well, the remove widget removes a question completely if it has no replies; there is no harm in that.
and it replaces the question by "question removed" when there are replies; it really shouldn't be available under those conditions.
Removing the head of a thread leaves a sloppy thread; leaving it there may still result in new replies, maybe containing a link to the perfect article dealing with the subject.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Since there was no "remove" widget available, I was hoping that "delete" on the thread root would accomplish the same thing. Seems like the forum codebase itself could use a little tightening
|
|
|
|
|
While in VS2005 and working with a crystal report, I have encountered two problems I believe are related. First problem is that all my crystal report menu items are doubled and sometimes quadrupled. Meaning that if I have a report opened for editing, and press the Crystal Reports menu item, all the submenu items are in there 4 times. The same thing happens if I right-click on an item on the report.
The second ithing I noticed is that when I do an build on my application setup, I get 190 warning errors, indicating that I have duplicate objects in the target location, for instance, (Warning 1 Two or more objects have the same target location ('[toolbar]\removeallfield_over.gif') )
I think this have something to do with the fact that I first install the .net crystal addon, then later install the full blown 11.5 CR and then the R2 update.
My application runs fine, with no errors, however, I would like the resolve the minor inconviences. Any ideas out there?
Ken
|
|
|
|
|
Hi
I have a server app which handles multiple Ethernet camera. The server sends a video streams to a client application which is then displayed on screen. The problem is that I am recieving corrupt frames quite regularly at the client end. An example of a frame is below,
[][Corrupt frame]
I am using TCP to send the images. Anyone got any ideas of what could be causing this?
Thanx
|
|
|
|
|
The image shown seems to contain the superposition of three images.
Maybe those three subimages are real, and the purpose of the system is to offer such superposition. If not, then something is wrong.
Nobody can tell what is wrong when:
- we don't know what you want the system to do (if there are three camera's, where should the three images go?)
- we don't know anything about how your system has been implemented.
Maybe the right answer is: you have a bad pointer in line 42.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
modified on Monday, May 24, 2010 4:07 PM
|
|
|
|
|
Luc Pattyn wrote: bad pointer in line 42
OMG Luc you kill me.
Why is common sense not common?
Never argue with an idiot. They will drag you down to their level where they are an expert.
Sometimes it takes a lot of work to be lazy
Individuality is fine, as long as we do it together - F. Burns
|
|
|
|
|
DaveIf this helped, please vote & accept answer!
Binging is like googling, it just feels dirtier. (Pete O'Hanlon)
BTW, in software, hope and pray is not a viable strategy. (Luc Pattyn)
|
|
|
|
|
Sorry for the lack of info. Ill try to explain what I am doing.
I have a server application that is connected to mutltiple ethernet cameras. The server application is responsible for recording video and redirecting the camera streams. The client application is used to view the live camera streams and recorded video. When sending the live stream from the server to the client applications I get the wierd behavour shown in the image. The image shows frames from 2 cameras.
I was thinking that it was caused by a race condition somewhere at first. But after testing the applications over a busier network the corruption of the frames seems to increase. So maybe it has somthing to do with TCP.
|
|
|
|
|
Hi,
I have the picture box in which i draw the rectangle (using graphics paint) and inside that rectangle I typed some name using label box and stored the work, have done.(for this please ref: http://www.codeproject.com/Messages/3474995/How-can-save-picturebox-image-using-menustrip.aspx[])
When I opened the saved Image the position of text I typed in the label box not in the position where I try to place (on screen). It's saving the text in some other position.
How to co-ordinate the resolution using c#.
Image bac;
Bitmap myBitmap;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (mybitmap == null)
{
mybitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height, pictureBox1.CreateGraphics());
}
rect = new Rectangle(e.X, e.Y, 0, 0);
this.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
switch (e.Button)
{
case MouseButtons.Left:
{
rect = new Rectangle(rect.Left, rect.Top, e.X - rect.Left, e.Y - rect.Top);
this.Invalidate();
break;
}
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (mybitmap == null)
{
return;
}
using (Pen pen = new Pen(Color.Red, 2))
{
using (Graphics g = Graphics.FromImage(mybitmap))
{
e.Graphics.DrawRectangle(pen, rect);
if (label1.TextAlign == ContentAlignment.TopLeft)
{
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), label1.Bounds);
g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), label1.Bounds);
mybitmap.PixelFormat);
}
else if (label1.TextAlign == ContentAlignment.TopCenter)
{
SizeF size = e.Graphics.MeasureString(label1.Text, label1.Font);
float left = ((float)this.Width + label1.Left) / 2 - size.Width / 2;
RectangleF rect1 = new RectangleF(left, (float)label1.Top, size.Width, label1.Height);
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect1);
}
else
{
SizeF size = e.Graphics.MeasureString(label1.Text, label1.Font);
float left = (float)label1.Width - size.Width + label1.Left;
RectangleF rect1 = new RectangleF(left, (float)label1.Top, size.Width, label1.Height);
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect1);
}
}
}
}
private void saveToolStripMenuItem_Click(object sender, EventArgs e)
{
if (mybitmap != null)
{
SaveFileDialog SaveFD1 = new SaveFileDialog();
SaveFD1.FileName = "";
SaveFD1.InitialDirectory = "C";
SaveFD1.Title = "save file Name";
SaveFD1.Filter = "JPG|*.jpg|Bmp|*.bmp";
if (SaveFD1.ShowDialog() == DialogResult.OK)
{
System.IO.Stream filename = (System.IO.FileStream)SaveFD1.OpenFile();
int r = SaveFD1.FileName.Length;
for (int r1 = 0; r1<=r;)
{
if (SaveFD1.FileName[r1] != '.')
r1++;
else
{
r = r1;
break;
}
}
if (SaveFD1.FileName[++r] == 'j')
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Jpeg);
}
else if (SaveFD1.FileName[r] == 'b')
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Jpeg);
}
else
{
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap, 0, 0);
}
bac.Save(filename, ImageFormat.Png);
}
filename.Close();
}
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFD.FileName = "";
OpenFD.Title = "open image";
OpenFD.InitialDirectory = "C";
OpenFD.Filter = "JPEG|*.jpg|Bmp|*.bmp|All Files|*.*.*";
if (OpenFD.ShowDialog() == DialogResult.OK)
{
file = OpenFD.FileName;
bac = Image.FromFile(file);
pictureBox1.Image = bac;
pictureBox1.Invalidate();
}
}
|
|
|
|
|
Hi,
IMO that is all wrong from the very start. A Control_Paint handler is supposed to paint the control to the screen, yours modifies an image and does not paint to the screen at all.
This is how I would probably tackle this:
1. I'd have a Compose method that creates the composite image, by allocating a Bitmap of the right size, calling CreateGraphics() on it; then using that Graphics to paint the image and the rectangle and the text into the Bitmap.
2. I would call the Compose method when the composition has to change, which is unrelated to the user deciding to see, not see, scroll it.
3. Then show that Bitmap to the user; as I don't like PictureBox much, I probably would use a Panel of the right size, and use Graphics.DrawImage in its Paint handler.
The main advantages of such approach are:
- all parts of the composition are dealt with in the same way, they share the coordinate system, the mouse actions (if any), etc. No hassle with a PictureBox that may zoom/pan/center/fill the image, and treat everything else you draw on top of it in a different way.
- the composite image is available at all times; you can easily save it to disk, and to a database.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
1. I'd have a Compose method that creates the composite image, by allocating a Bitmap of the right size, calling CreateGraphics() on it; then using that Graphics to paint the image and the rectangle and the text into the Bitmap.
for this have done the below code in mouse down event
if (mybitmap == null)
{
mybitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height, pictureBox1.CreateGraphics());
}
is this correct..
and I can't get the 2 and 3rd point. I have place the picture box in side the panel.
Please explain with ex:
I am new to C# (i am learning guy)
|
|
|
|
|
Nivas82 wrote: mybitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height, pictureBox1.CreateGraphics());
That probably is correct and unnecessary, I've never felt a need to do it like that; a simple new Bitmap(pictureBox1.Width, pictureBox1.Height) is sufficient in almost all cases.
If you're new at something, I suggest you read and study the subject. I always recommend studying books, as they tend to be consistent and thorough; I do not recommend a particular book though, that depends on your background and the writing style you prefer.
Once the basics are covered, I recommend reading articles, CodeProject has a lot of very good ones. I did create a little one on graphics you migt find useful: http://www.perceler.com/articles1.php?art=animation1[^]. It does not involve a PictureBox, as I consider that a stupid and pretty useless Control.
Luc Pattyn [Forum Guidelines] [Why QA sucks] [My Articles]
I only read formatted code with indentation, so please use PRE tags for code snippets.
I'm not participating in frackin' Q&A, so if you want my opinion, ask away in a real forum (or on my profile page).
|
|
|
|
|
Hi,
I got the output as i expected. I Place the picture box size with original image size and its works as expected (initially tried with picture box size mode as "zoom") .
replace or add the below code in the previous once at appropriate areas.
In open tool strip menu
pictureBox1.Image = image;
pictureBox1.Size = image.Size;
piturebox paint event
e.Graphics.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect);
g.DrawString(label1.Text, label1.Font, new SolidBrush(label1.ForeColor), rect);
in Save tool tip
bac = pictureBox1.Image;
using (Graphics g = Graphics.FromImage(bac))
{
g.DrawImage(mybitmap,0,0);
}
bac.Save(filename, ImageFormat.Jpeg);
modified on Saturday, May 29, 2010 2:12 AM
|
|
|
|
|
Or you can add the original image width and height to bitmap (without changing the size of the picture box).
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (mybitmap == null)
{
mybitmap = new Bitmap(sz.Width, sz.Height);
}
rect = new Rectangle(e.X, e.Y, 0, 0);
this.Invalidate();
|
|
|
|
|